gantt-lib 0.118.0 → 0.118.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
@@ -7666,11 +7666,13 @@ var TaskList = ({
7666
7666
  const [pendingInsert, setPendingInsert] = (0, import_react13.useState)(null);
7667
7667
  const [draggingIndex, setDraggingIndex] = (0, import_react13.useState)(null);
7668
7668
  const [dragOverTarget, setDragOverTarget] = (0, import_react13.useState)(null);
7669
+ const [isBeforeFirstDropZoneActive, setIsBeforeFirstDropZoneActive] = (0, import_react13.useState)(false);
7669
7670
  const dragOriginIndexRef = (0, import_react13.useRef)(null);
7670
7671
  const dragTaskIdRef = (0, import_react13.useRef)(null);
7671
7672
  const clearDragState = (0, import_react13.useCallback)(() => {
7672
7673
  setDraggingIndex(null);
7673
7674
  setDragOverTarget(null);
7675
+ setIsBeforeFirstDropZoneActive(false);
7674
7676
  dragOriginIndexRef.current = null;
7675
7677
  dragTaskIdRef.current = null;
7676
7678
  }, []);
@@ -7721,18 +7723,18 @@ var TaskList = ({
7721
7723
  }
7722
7724
  return target;
7723
7725
  }, [orderedTasks, visibleTasks]);
7724
- const handleDragOver = (0, import_react13.useCallback)((index, e) => {
7726
+ const handleDragOver = (0, import_react13.useCallback)((index, e, forcedPlacement) => {
7725
7727
  e.preventDefault();
7726
7728
  const draggedTaskId = dragTaskIdRef.current;
7727
7729
  if (!draggedTaskId) return;
7728
- const rawPlacement = getDropPlacementFromEvent(e);
7730
+ const rawPlacement = forcedPlacement ?? getDropPlacementFromEvent(e);
7729
7731
  const isSelfTopBefore = visibleTasks[index]?.id === draggedTaskId && rawPlacement === "before";
7730
7732
  if (isSelfTopBefore) {
7731
7733
  setDragOverTarget(null);
7732
7734
  e.dataTransfer.dropEffect = "none";
7733
7735
  return;
7734
7736
  }
7735
- const isFirstChildTopAfterParent = rawPlacement === "before" && visibleTasks[index]?.parentId === visibleTasks[index - 1]?.id;
7737
+ const isFirstChildTopAfterParent = index > 0 && rawPlacement === "before" && visibleTasks[index]?.parentId === visibleTasks[index - 1]?.id;
7736
7738
  if (isFirstChildTopAfterParent) {
7737
7739
  setDragOverTarget(null);
7738
7740
  e.dataTransfer.dropEffect = "none";
@@ -7773,7 +7775,7 @@ var TaskList = ({
7773
7775
  isDirectChildDrop: normalizedTarget.placement === "after" && reorderPlan.inferredParentId === targetTask.id
7774
7776
  });
7775
7777
  }, [isValidParentDrop, normalizeDropTarget, orderedTasks, visibleTasks]);
7776
- const handleDrop = (0, import_react13.useCallback)((dropIndex, e) => {
7778
+ const handleDrop = (0, import_react13.useCallback)((dropIndex, e, forcedPlacement) => {
7777
7779
  e.preventDefault();
7778
7780
  const originVisibleIndex = dragOriginIndexRef.current;
7779
7781
  const movedTaskId = dragTaskIdRef.current;
@@ -7781,13 +7783,13 @@ var TaskList = ({
7781
7783
  clearDragState();
7782
7784
  return;
7783
7785
  }
7784
- const rawPlacement = dropIndex >= visibleTasks.length ? "end" : getDropPlacementFromEvent(e);
7786
+ const rawPlacement = dropIndex >= visibleTasks.length ? "end" : forcedPlacement ?? getDropPlacementFromEvent(e);
7785
7787
  const isSelfTopBefore = dropIndex < visibleTasks.length && visibleTasks[dropIndex]?.id === movedTaskId && rawPlacement === "before";
7786
7788
  if (isSelfTopBefore) {
7787
7789
  clearDragState();
7788
7790
  return;
7789
7791
  }
7790
- const isFirstChildTopAfterParent = dropIndex < visibleTasks.length && rawPlacement === "before" && visibleTasks[dropIndex]?.parentId === visibleTasks[dropIndex - 1]?.id;
7792
+ const isFirstChildTopAfterParent = dropIndex < visibleTasks.length && dropIndex > 0 && rawPlacement === "before" && visibleTasks[dropIndex]?.parentId === visibleTasks[dropIndex - 1]?.id;
7791
7793
  if (isFirstChildTopAfterParent) {
7792
7794
  clearDragState();
7793
7795
  return;
@@ -7840,9 +7842,18 @@ var TaskList = ({
7840
7842
  onTaskSelect?.(moved.id);
7841
7843
  clearDragState();
7842
7844
  }, [orderedTasks, visibleTasks, onReorder, onTaskSelect, isValidParentDrop, clearDragState, normalizeDropTarget]);
7845
+ const handleBeforeFirstDragOver = (0, import_react13.useCallback)((e) => {
7846
+ const draggedTaskId = dragTaskIdRef.current;
7847
+ const firstTask = visibleTasks[0];
7848
+ const descendantIds = draggedTaskId ? new Set(getAllDescendants2(draggedTaskId, orderedTasks).map((task) => task.id)) : /* @__PURE__ */ new Set();
7849
+ const isValidBeforeFirstDrop = !!draggedTaskId && !!firstTask && firstTask.id !== draggedTaskId && !descendantIds.has(firstTask.id) && isValidParentDrop(draggedTaskId, 0);
7850
+ setIsBeforeFirstDropZoneActive(isValidBeforeFirstDrop);
7851
+ handleDragOver(0, e, "before");
7852
+ }, [handleDragOver, isValidParentDrop, orderedTasks, visibleTasks]);
7843
7853
  const handleDragEnd = (0, import_react13.useCallback)(() => {
7844
7854
  clearDragState();
7845
7855
  }, [clearDragState]);
7856
+ const shouldShowBeforeFirstDropZone = !reorderDisabled && visibleTasks.length > 0 && draggingIndex !== null && draggingIndex > 0;
7846
7857
  const handleConfirmNewTask = (0, import_react13.useCallback)((name) => {
7847
7858
  const range = buildDefaultTaskDateRange(getTodayISODate(), {
7848
7859
  businessDays,
@@ -8210,6 +8221,19 @@ var TaskList = ({
8210
8221
  position: "relative"
8211
8222
  },
8212
8223
  children: [
8224
+ shouldShowBeforeFirstDropZone && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
8225
+ "div",
8226
+ {
8227
+ className: [
8228
+ "gantt-tl-before-first-drop-zone",
8229
+ isBeforeFirstDropZoneActive ? "gantt-tl-before-first-drop-zone-active" : ""
8230
+ ].filter(Boolean).join(" "),
8231
+ onDragEnter: handleBeforeFirstDragOver,
8232
+ onDragOver: handleBeforeFirstDragOver,
8233
+ onDragLeave: () => setIsBeforeFirstDropZoneActive(false),
8234
+ onDrop: (e) => handleDrop(0, e, "before")
8235
+ }
8236
+ ),
8213
8237
  renderedVisibleTasks.map(({ task, index }) => {
8214
8238
  const previousVisibleTask = index > 0 ? visibleTasks[index - 1] : void 0;
8215
8239
  const canDemoteTask = index === 0 || !task.parentId || previousVisibleTask?.id !== task.parentId;
@@ -10847,6 +10871,7 @@ function PlanFactRowInner({
10847
10871
  className: joinClasses2(
10848
10872
  "gantt-pf-cell",
10849
10873
  `gantt-pf-cell-${kind}`,
10874
+ todayDateIndex === dateIndex && "gantt-pf-cell-today",
10850
10875
  !isParent && planned && kind === "plan" && "gantt-pf-cell-planned",
10851
10876
  !isParent && value !== void 0 && "gantt-pf-cell-hasValue",
10852
10877
  !isParent && (isFactBelowPlan || isPastDueMissingFact) && "gantt-pf-cell-factWarning",
@@ -12565,7 +12590,11 @@ function TaskGanttChartInner(props, ref) {
12565
12590
  return t;
12566
12591
  });
12567
12592
  }
12568
- const normalized = normalizeHierarchyTasks(updated);
12593
+ const orderedForCallback = updated.map((task, index) => ({
12594
+ ...task,
12595
+ sortOrder: index
12596
+ }));
12597
+ const normalized = normalizeHierarchyTasks(orderedForCallback);
12569
12598
  if (onReorder) {
12570
12599
  onReorder(normalized, movedTaskId, inferredParentId);
12571
12600
  return;