gantt-lib 0.135.0 → 0.135.2

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.
package/dist/index.js CHANGED
@@ -14020,6 +14020,17 @@ var PLAN_FACT_COLUMN_OVERSCAN = 24;
14020
14020
  var PLAN_FACT_COLUMN_WINDOW_STEP = 14;
14021
14021
  var DEFAULT_INITIAL_VIEWPORT_HEIGHT = 768;
14022
14022
  var DEFAULT_PLAN_FACT_COLUMN_WINDOW = PLAN_FACT_COLUMN_OVERSCAN + PLAN_FACT_COLUMN_WINDOW_STEP;
14023
+ function buildControlledScheduleIdentity(tasks) {
14024
+ return tasks.map((task, index) => [
14025
+ String(index),
14026
+ task.id,
14027
+ String(task.startDate),
14028
+ String(task.endDate),
14029
+ task.type ?? "",
14030
+ task.parentId ?? "",
14031
+ JSON.stringify(task.dependencies ?? [])
14032
+ ].join("\0")).join("");
14033
+ }
14023
14034
  function getInitialScrollViewportHeight(containerHeight, headerHeight) {
14024
14035
  if (containerHeight === void 0) {
14025
14036
  return 0;
@@ -14417,11 +14428,17 @@ function TaskGanttChartInner(props, ref) {
14417
14428
  [resolvedRowContentLines, rowHeight]
14418
14429
  );
14419
14430
  const normalizedTasks = (0, import_react19.useMemo)(() => normalizeHierarchyTasks(tasks), [tasks]);
14431
+ const controlledScheduleIdentity = (0, import_react19.useMemo)(
14432
+ () => buildControlledScheduleIdentity(normalizedTasks),
14433
+ [normalizedTasks]
14434
+ );
14435
+ const previousControlledScheduleIdentityRef = (0, import_react19.useRef)(null);
14436
+ const controlledScheduleChanged = previousControlledScheduleIdentityRef.current !== null && previousControlledScheduleIdentityRef.current !== controlledScheduleIdentity;
14420
14437
  const [previewTasksById, setPreviewTasksById] = (0, import_react19.useState)(/* @__PURE__ */ new Map());
14421
14438
  const previewNormalizedTasks = (0, import_react19.useMemo)(() => {
14422
- if (previewTasksById.size === 0) return normalizedTasks;
14439
+ if (controlledScheduleChanged || previewTasksById.size === 0) return normalizedTasks;
14423
14440
  return normalizedTasks.map((task) => previewTasksById.get(task.id) ?? task);
14424
- }, [normalizedTasks, previewTasksById]);
14441
+ }, [controlledScheduleChanged, normalizedTasks, previewTasksById]);
14425
14442
  const isCustomWeekend = (0, import_react19.useMemo)(
14426
14443
  () => createCustomDayPredicate({ customDays, isWeekend: isWeekend3 }),
14427
14444
  [customDays, isWeekend3]
@@ -14690,6 +14707,18 @@ function TaskGanttChartInner(props, ref) {
14690
14707
  }, [effectiveRowHeight, tasks, visibleTasks]);
14691
14708
  const [dragGuideLines, setDragGuideLines] = (0, import_react19.useState)(null);
14692
14709
  const [draggedTaskOverride, setDraggedTaskOverride] = (0, import_react19.useState)(null);
14710
+ (0, import_react19.useEffect)(() => {
14711
+ const previousIdentity = previousControlledScheduleIdentityRef.current;
14712
+ previousControlledScheduleIdentityRef.current = controlledScheduleIdentity;
14713
+ if (previousIdentity === null || previousIdentity === controlledScheduleIdentity) {
14714
+ return;
14715
+ }
14716
+ previewPositionStore.clear();
14717
+ setCascadeOverrides((current) => current.size === 0 ? current : /* @__PURE__ */ new Map());
14718
+ setPreviewTasksById((current) => current.size === 0 ? current : /* @__PURE__ */ new Map());
14719
+ setDraggedTaskOverride((current) => current === null ? current : null);
14720
+ setDragGuideLines((current) => current === null ? current : null);
14721
+ }, [controlledScheduleIdentity, previewPositionStore]);
14693
14722
  (0, import_react19.useEffect)(() => {
14694
14723
  const result = validateDependencies(tasks);
14695
14724
  setValidationResult(result);
@@ -14891,6 +14920,7 @@ function TaskGanttChartInner(props, ref) {
14891
14920
  onTasksChange?.(normalized);
14892
14921
  }, [onTasksChange, onReorder]);
14893
14922
  const dependencyOverrides = (0, import_react19.useMemo)(() => {
14923
+ if (controlledScheduleChanged) return /* @__PURE__ */ new Map();
14894
14924
  const map = new Map(cascadeOverrides);
14895
14925
  if (draggedTaskOverride) {
14896
14926
  map.set(draggedTaskOverride.taskId, {
@@ -14899,7 +14929,7 @@ function TaskGanttChartInner(props, ref) {
14899
14929
  });
14900
14930
  }
14901
14931
  return map;
14902
- }, [cascadeOverrides, draggedTaskOverride]);
14932
+ }, [cascadeOverrides, controlledScheduleChanged, draggedTaskOverride]);
14903
14933
  const handleCascadeProgress = (0, import_react19.useCallback)((overrides, previewTasks = []) => {
14904
14934
  previewPositionStore.setPositions(overrides);
14905
14935
  const renderedTaskIds = renderedTaskIdsRef.current;
@@ -14916,9 +14946,9 @@ function TaskGanttChartInner(props, ref) {
14916
14946
  });
14917
14947
  }, [previewPositionStore]);
14918
14948
  const previewVisibleTasks = (0, import_react19.useMemo)(() => {
14919
- if (previewTasksById.size === 0) return visibleTasks;
14949
+ if (controlledScheduleChanged || previewTasksById.size === 0) return visibleTasks;
14920
14950
  return visibleTasks.map((task) => previewTasksById.get(task.id) ?? task);
14921
- }, [visibleTasks, previewTasksById]);
14951
+ }, [controlledScheduleChanged, visibleTasks, previewTasksById]);
14922
14952
  const visibleTaskIndexMap = (0, import_react19.useMemo)(
14923
14953
  () => new Map(visibleTasks.map((task, index) => [task.id, index])),
14924
14954
  [visibleTasks]