gantt-task-react-powern 0.4.98 → 0.5.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.
@@ -6,3 +6,4 @@ export declare function getCriticalPaths(leafTasks: Task[]): any[][];
6
6
  export declare function computeCriticalPath(taskID: string, taskMap: {}): void;
7
7
  export declare function uncolorAll(tasks: Task[]): void;
8
8
  export declare function colorPath(path: Task[], color: string, tasks: Task[], criticalPathType: string): void;
9
+ export declare const getParentWbs: (wbs: string) => string | undefined;
package/dist/index.js CHANGED
@@ -433,6 +433,18 @@ var TaskListTableDefault = function TaskListTableDefault(_ref) {
433
433
  return t.id;
434
434
  }));
435
435
  }, [leafTasks]);
436
+
437
+ var hasSelectedAncestor = function hasSelectedAncestor(taskId, selectedSet, allTasks) {
438
+ var task = allTasks.find(function (t) {
439
+ return t.id === taskId;
440
+ });
441
+ if (!task) return false;
442
+ var parentWbs = getParentWbs(task.id);
443
+ if (!parentWbs) return false;
444
+ if (selectedSet.has(parentWbs)) return true;
445
+ return hasSelectedAncestor(parentWbs, selectedSet, allTasks);
446
+ };
447
+
436
448
  return React__default.createElement("div", {
437
449
  className: styles$1.taskListWrapper,
438
450
  style: {
@@ -451,6 +463,7 @@ var TaskListTableDefault = function TaskListTableDefault(_ref) {
451
463
  }
452
464
 
453
465
  var isSelected = selectedTasks.includes(t.id);
466
+ var isAncestorSelected = hasSelectedAncestor(t.id, new Set(selectedTasks), tasks);
454
467
  return React__default.createElement("div", {
455
468
  className: t.type === "milestone" ? styles$1.taskListMilestoneRow : scheduleType === "lookAhead" ? styles$1.taskListLookAheadRow : styles$1.taskListTableRow,
456
469
  style: {
@@ -476,6 +489,7 @@ var TaskListTableDefault = function TaskListTableDefault(_ref) {
476
489
  }, React__default.createElement("input", {
477
490
  type: "checkbox",
478
491
  checked: isSelected,
492
+ disabled: isAncestorSelected,
479
493
  onChange: function onChange(e) {
480
494
  return onTaskSelect(t.id, e.target.checked);
481
495
  }
@@ -740,7 +754,12 @@ var TaskList = function TaskList(_ref) {
740
754
  selectedTasks = _useState[0],
741
755
  setSelectedTasks = _useState[1];
742
756
 
757
+ var _useState2 = React.useState([]),
758
+ pendingTaskSelect = _useState2[0],
759
+ setPendingTaskSelect = _useState2[1];
760
+
743
761
  var prevSelectedTasksRef = React.useRef([]);
762
+ var expandedTasks = React.useRef([]);
744
763
  React.useEffect(function () {
745
764
  if (horizontalContainerRef.current) {
746
765
  horizontalContainerRef.current.scrollTop = scrollY;
@@ -755,28 +774,116 @@ var TaskList = function TaskList(_ref) {
755
774
  onMultiSelect(selectedTaskObjects);
756
775
  }
757
776
  }, [selectedTasks, tasks, onMultiSelect]);
777
+ React.useEffect(function () {
778
+ if (pendingTaskSelect.length === 0) return;
779
+ var newSelected = new Set(selectedTasks);
780
+ pendingTaskSelect.forEach(function (_ref2) {
781
+ var taskId = _ref2.taskId,
782
+ selected = _ref2.selected;
783
+
784
+ if (selected) {
785
+ recursiveOpen(taskId, tasks);
786
+ var descendants = getDescendants(taskId, tasks);
787
+ newSelected.add(taskId);
788
+ descendants.forEach(function (d) {
789
+ return newSelected.add(d);
790
+ });
791
+ } else {
792
+ var _descendants = getDescendants(taskId, tasks);
758
793
 
759
- var handleTaskSelect = function handleTaskSelect(taskId, selected) {
760
- if (selected) {
761
- setSelectedTasks(function (prev) {
762
- return [].concat(prev, [taskId]);
763
- });
764
- } else {
765
- setSelectedTasks(function (prev) {
766
- return prev.filter(function (id) {
767
- return id !== taskId;
794
+ newSelected["delete"](taskId);
795
+
796
+ _descendants.forEach(function (d) {
797
+ return newSelected["delete"](d);
768
798
  });
799
+ }
800
+ });
801
+ setSelectedTasks(Array.from(newSelected));
802
+ setPendingTaskSelect([]);
803
+ }, [pendingTaskSelect]);
804
+ React.useEffect(function () {
805
+ expandedTasks.current = expandedTasks.current.filter(function (id) {
806
+ var t = tasks.find(function (task) {
807
+ return task.id === id;
769
808
  });
809
+ return t && !t.hideChildren;
810
+ });
811
+ if (selectedTasks.length === 0) return;
812
+ var newSelected = new Set();
813
+ selectedTasks.forEach(function (taskId) {
814
+ if (tasks.find(function (t) {
815
+ return t.id === taskId;
816
+ })) {
817
+ recursiveOpen(taskId, tasks);
818
+ newSelected.add(taskId);
819
+ var descendants = getDescendants(taskId, tasks);
820
+ descendants.forEach(function (d) {
821
+ return newSelected.add(d);
822
+ });
823
+ }
824
+ });
825
+ var newSelectedArray = Array.from(newSelected);
826
+
827
+ if (JSON.stringify(newSelectedArray) !== JSON.stringify(selectedTasks)) {
828
+ setSelectedTasks(newSelectedArray);
770
829
  }
830
+ }, [tasks.length]);
831
+
832
+ var getDescendants = function getDescendants(taskId, allTasks) {
833
+ var task = allTasks.find(function (t) {
834
+ return t.id === taskId;
835
+ });
836
+ if (!task) return [];
837
+ var children = allTasks.filter(function (t) {
838
+ return getParentWbs(t.id) === taskId;
839
+ });
840
+ return children.flatMap(function (child) {
841
+ return [child.id].concat(getDescendants(child.id, allTasks));
842
+ });
843
+ };
844
+
845
+ var recursiveOpen = function recursiveOpen(taskId, allTasks) {
846
+ var task = allTasks.find(function (t) {
847
+ return t.id === taskId;
848
+ });
849
+ if (!task) return;
850
+
851
+ if (!expandedTasks.current.includes(taskId) && task.hideChildren) {
852
+ onExpanderClick(task);
853
+ expandedTasks.current = [].concat(expandedTasks.current, [taskId]);
854
+ }
855
+
856
+ var children = allTasks.filter(function (t) {
857
+ return getParentWbs(t.id) === taskId;
858
+ });
859
+ children.forEach(function (c) {
860
+ return recursiveOpen(c.id, allTasks);
861
+ });
862
+ };
863
+
864
+ var handleTaskSelect = function handleTaskSelect(taskId, selected) {
865
+ setPendingTaskSelect(function (prev) {
866
+ return [].concat(prev, [{
867
+ taskId: taskId,
868
+ selected: selected
869
+ }]);
870
+ });
771
871
  };
772
872
 
773
873
  var handleSelectAll = function handleSelectAll(selected) {
774
874
  if (selected) {
775
- setSelectedTasks(tasks.map(function (task) {
776
- return task.id;
875
+ var topLevelTasks = tasks.filter(function (task) {
876
+ return !getParentWbs(task.id);
877
+ });
878
+ setPendingTaskSelect(topLevelTasks.map(function (task) {
879
+ return {
880
+ taskId: task.id,
881
+ selected: true
882
+ };
777
883
  }));
778
884
  } else {
779
885
  setSelectedTasks([]);
886
+ setPendingTaskSelect([]);
780
887
  }
781
888
  };
782
889
 
@@ -3498,6 +3605,11 @@ function colorPath(path, color, tasks, criticalPathType) {
3498
3605
  _loop(_i7);
3499
3606
  }
3500
3607
  }
3608
+ var getParentWbs = function getParentWbs(wbs) {
3609
+ var segments = wbs.split('.');
3610
+ if (segments.length <= 1) return undefined;
3611
+ return segments.slice(0, -1).join('.');
3612
+ };
3501
3613
 
3502
3614
  exports.Gantt = Gantt;
3503
3615
  exports.getCriticalPaths = getCriticalPaths;