gantt-lib 0.104.2 → 0.105.1

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.mjs CHANGED
@@ -3530,6 +3530,29 @@ function getDescendantIds(taskId, tasks) {
3530
3530
  collect(taskId);
3531
3531
  return descendants;
3532
3532
  }
3533
+ function isTaskParent2(taskId, tasks) {
3534
+ return tasks.some((task) => task.parentId === taskId);
3535
+ }
3536
+ function getSubtreeEndIndex(taskId, tasks) {
3537
+ const descendantIds = new Set(getDescendantIds(taskId, tasks));
3538
+ const taskIndex = tasks.findIndex((task) => task.id === taskId);
3539
+ if (taskIndex === -1) return -1;
3540
+ let endIndex = taskIndex;
3541
+ for (let index = taskIndex + 1; index < tasks.length; index += 1) {
3542
+ if (!descendantIds.has(tasks[index].id)) break;
3543
+ endIndex = index;
3544
+ }
3545
+ return endIndex;
3546
+ }
3547
+ function getNearestVisibleSiblingBefore(visibleTasks, movedIds, startIndex) {
3548
+ for (let index = startIndex; index >= 0; index -= 1) {
3549
+ const candidate = visibleTasks[index];
3550
+ if (candidate && !movedIds.has(candidate.id)) {
3551
+ return candidate;
3552
+ }
3553
+ }
3554
+ return null;
3555
+ }
3533
3556
  function getVisibleReorderPosition(orderedTasks, visibleTasks, movedTaskId, originVisibleIndex, dropVisibleIndex) {
3534
3557
  const originOrderedIndex = orderedTasks.findIndex((task) => task.id === movedTaskId);
3535
3558
  if (originOrderedIndex === -1) {
@@ -3563,6 +3586,99 @@ function getVisibleReorderPosition(orderedTasks, visibleTasks, movedTaskId, orig
3563
3586
  insertIndex
3564
3587
  };
3565
3588
  }
3589
+ function getVisibleReorderPlan(orderedTasks, visibleTasks, movedTaskId, target) {
3590
+ const originOrderedIndex = orderedTasks.findIndex((task) => task.id === movedTaskId);
3591
+ if (originOrderedIndex === -1) {
3592
+ return null;
3593
+ }
3594
+ const descendantIds = getDescendantIds(movedTaskId, orderedTasks);
3595
+ const movedIds = /* @__PURE__ */ new Set([movedTaskId, ...descendantIds]);
3596
+ const reorderedWithoutMoved = orderedTasks.filter((task) => !movedIds.has(task.id));
3597
+ const movedTask = orderedTasks[originOrderedIndex];
3598
+ if (target.placement === "end" || target.index >= visibleTasks.length) {
3599
+ return {
3600
+ originOrderedIndex,
3601
+ insertIndex: reorderedWithoutMoved.length,
3602
+ inferredParentId: void 0
3603
+ };
3604
+ }
3605
+ const targetTask = visibleTasks[target.index];
3606
+ const previousVisibleTask = getNearestVisibleSiblingBefore(
3607
+ visibleTasks,
3608
+ movedIds,
3609
+ target.index - 1
3610
+ );
3611
+ if (!targetTask) {
3612
+ return null;
3613
+ }
3614
+ if (movedIds.has(targetTask.id)) {
3615
+ return null;
3616
+ }
3617
+ const targetIndex = reorderedWithoutMoved.findIndex((task) => task.id === targetTask.id);
3618
+ if (targetIndex === -1) {
3619
+ return null;
3620
+ }
3621
+ let insertIndex = targetIndex;
3622
+ let inferredParentId;
3623
+ switch (target.placement) {
3624
+ case "before": {
3625
+ insertIndex = targetIndex;
3626
+ inferredParentId = targetTask.parentId || void 0;
3627
+ if (!targetTask.parentId && previousVisibleTask?.parentId) {
3628
+ const isDetachingFromSameGroup = movedTask.parentId === previousVisibleTask.parentId;
3629
+ if (isDetachingFromSameGroup) {
3630
+ const previousEndIndex = getSubtreeEndIndex(previousVisibleTask.id, reorderedWithoutMoved);
3631
+ inferredParentId = void 0;
3632
+ insertIndex = previousEndIndex === -1 ? targetIndex : previousEndIndex + 1;
3633
+ }
3634
+ }
3635
+ break;
3636
+ }
3637
+ case "inside": {
3638
+ if (isTaskParent2(targetTask.id, orderedTasks)) {
3639
+ return null;
3640
+ }
3641
+ inferredParentId = targetTask.id;
3642
+ if (!inferredParentId || movedIds.has(inferredParentId)) {
3643
+ return null;
3644
+ }
3645
+ if (movedTask.parentId === inferredParentId) {
3646
+ return null;
3647
+ }
3648
+ const anchorEndIndex = getSubtreeEndIndex(targetTask.id, reorderedWithoutMoved);
3649
+ insertIndex = anchorEndIndex === -1 ? targetIndex + 1 : anchorEndIndex + 1;
3650
+ break;
3651
+ }
3652
+ case "after": {
3653
+ const nextVisibleTask = visibleTasks[target.index + 1];
3654
+ const hasVisibleChildBelow = nextVisibleTask?.parentId === targetTask.id;
3655
+ if (hasVisibleChildBelow) {
3656
+ inferredParentId = targetTask.id;
3657
+ insertIndex = targetIndex + 1;
3658
+ } else {
3659
+ inferredParentId = targetTask.parentId || void 0;
3660
+ const targetEndIndex = getSubtreeEndIndex(targetTask.id, reorderedWithoutMoved);
3661
+ insertIndex = targetEndIndex === -1 ? targetIndex + 1 : targetEndIndex + 1;
3662
+ }
3663
+ break;
3664
+ }
3665
+ default: {
3666
+ return {
3667
+ originOrderedIndex,
3668
+ insertIndex: reorderedWithoutMoved.length,
3669
+ inferredParentId: void 0
3670
+ };
3671
+ }
3672
+ }
3673
+ if (inferredParentId && movedIds.has(inferredParentId)) {
3674
+ return null;
3675
+ }
3676
+ return {
3677
+ originOrderedIndex,
3678
+ insertIndex,
3679
+ inferredParentId
3680
+ };
3681
+ }
3566
3682
 
3567
3683
  // src/components/ui/Popover.tsx
3568
3684
  import * as RadixPopover from "@radix-ui/react-popover";
@@ -4705,6 +4821,9 @@ var TaskListRow = React9.memo(
4705
4821
  editingTaskId,
4706
4822
  isDragging = false,
4707
4823
  isDragOver = false,
4824
+ dragOverPlacement = null,
4825
+ isNestedDropTarget = false,
4826
+ isDirectChildDropTarget = false,
4708
4827
  onDragStart,
4709
4828
  onDragOver,
4710
4829
  onDrop,
@@ -5579,7 +5698,7 @@ var TaskListRow = React9.memo(
5579
5698
  const numberCell = /* @__PURE__ */ jsxs9(
5580
5699
  "div",
5581
5700
  {
5582
- className: "gantt-tl-cell gantt-tl-cell-number",
5701
+ className: `gantt-tl-cell gantt-tl-cell-number${onDragStart ? " gantt-tl-cell-number-reorderable" : ""}`,
5583
5702
  style: getColumnStyle("number", 40),
5584
5703
  onClick: handleNumberClick,
5585
5704
  children: [
@@ -5603,6 +5722,16 @@ var TaskListRow = React9.memo(
5603
5722
  );
5604
5723
  const nameTriggerPaddingLeft = isParent ? `${nestingDepth * 20 + 28}px` : nestingDepth > 0 ? `${nestingDepth * 20 + 8}px` : void 0;
5605
5724
  const nameInputPaddingLeft = nestingDepth > 0 ? `${nestingDepth * 20 + 8}px` : void 0;
5725
+ const nestedDropIndicatorLeft = (() => {
5726
+ const numberColumnWidth = resolvedColumns?.find((col) => col.id === "number")?.width ?? 40;
5727
+ const nestedAxisDepth = Math.max(0, nestingDepth - 1);
5728
+ return `${numberColumnWidth + nestedAxisDepth * 20 + 9}px`;
5729
+ })();
5730
+ const nestedInsideDropIndicatorLeft = (() => {
5731
+ const numberColumnWidth = resolvedColumns?.find((col) => col.id === "number")?.width ?? 40;
5732
+ const nestedAxisDepth = Math.max(0, nestingDepth);
5733
+ return `${numberColumnWidth + nestedAxisDepth * 20 + 9}px`;
5734
+ })();
5606
5735
  const nameCell = /* @__PURE__ */ jsxs9("div", { className: "gantt-tl-cell gantt-tl-cell-name", style: getColumnStyle("name", 200), children: [
5607
5736
  isChild && !editingName && /* @__PURE__ */ jsxs9(Fragment2, { children: [
5608
5737
  !isFilterHideMode && /* @__PURE__ */ jsxs9(Fragment2, { children: [
@@ -6367,12 +6496,20 @@ var TaskListRow = React9.memo(
6367
6496
  isSourceRow ? "gantt-tl-row-picking-self" : "",
6368
6497
  isDragging ? "gantt-tl-row-dragging" : "",
6369
6498
  isDragOver ? "gantt-tl-row-drag-over" : "",
6499
+ isDragOver && dragOverPlacement ? `gantt-tl-row-drag-over-${dragOverPlacement}` : "",
6500
+ isDragOver && isNestedDropTarget ? "gantt-tl-row-drag-over-nested" : "",
6501
+ isDragOver && isDirectChildDropTarget ? "gantt-tl-row-drag-over-direct-child" : "",
6370
6502
  isChild ? "gantt-tl-row-child" : "",
6371
6503
  isParent ? "gantt-tl-row-parent" : "",
6372
6504
  `gantt-tl-row-level-${rowFillLevel}`,
6373
6505
  isTotalRow ? "gantt-tl-row-total" : ""
6374
6506
  ].filter(Boolean).join(" "),
6375
- style: { height: `${rowHeight}px`, position: "relative" },
6507
+ style: {
6508
+ height: `${rowHeight}px`,
6509
+ position: "relative",
6510
+ "--gantt-tl-nested-drop-left": nestedDropIndicatorLeft,
6511
+ "--gantt-tl-nested-inside-drop-left": nestedInsideDropIndicatorLeft
6512
+ },
6376
6513
  "data-gantt-task-row-id": task.id,
6377
6514
  onClick: handleRowClickInternal,
6378
6515
  onKeyDown: handleRowKeyDown,
@@ -6728,6 +6865,23 @@ function duplicateTaskSubtree(anchorTaskId, orderedTasks) {
6728
6865
  ...orderedTasks.slice(insertIndex)
6729
6866
  ];
6730
6867
  }
6868
+ var DRAG_ZONE_EDGE_RATIO = 0.28;
6869
+ function getDropPlacementFromEvent(e) {
6870
+ const rect = e.currentTarget.getBoundingClientRect();
6871
+ const ratio = rect.height > 0 ? (e.clientY - rect.top) / rect.height : 0.5;
6872
+ if (ratio <= DRAG_ZONE_EDGE_RATIO) return "before";
6873
+ if (ratio >= 1 - DRAG_ZONE_EDGE_RATIO) return "after";
6874
+ return "inside";
6875
+ }
6876
+ function getNearestVisibleDropAnchorBefore(visibleTasks, movedIds, startIndex) {
6877
+ for (let index = startIndex; index >= 0; index -= 1) {
6878
+ const candidate = visibleTasks[index];
6879
+ if (candidate && !movedIds.has(candidate.id)) {
6880
+ return { task: candidate, index };
6881
+ }
6882
+ }
6883
+ return null;
6884
+ }
6731
6885
  function getTaskNumber(tasks, taskIndex) {
6732
6886
  const task = tasks[taskIndex];
6733
6887
  if (!task) return "";
@@ -6814,6 +6968,7 @@ var TaskList = ({
6814
6968
  onInsertAfter,
6815
6969
  onReorder,
6816
6970
  disableTaskDrag = false,
6971
+ disableTaskListReorder = false,
6817
6972
  editingTaskId: propEditingTaskId,
6818
6973
  enableAddTask = true,
6819
6974
  defaultTaskDurationDays = DEFAULT_TASK_DURATION_DAYS,
@@ -6843,6 +6998,7 @@ var TaskList = ({
6843
6998
  taskDateChangeMode = "preserve-duration",
6844
6999
  onTaskDateChangeModeChange
6845
7000
  }) => {
7001
+ const reorderDisabled = disableTaskListReorder || disableTaskDrag;
6846
7002
  const [internalSelectedTaskIds, setInternalSelectedTaskIds] = useState6(/* @__PURE__ */ new Set());
6847
7003
  const [activeCustomCell, setActiveCustomCell] = useState6(null);
6848
7004
  const [columnWidthOverrides, setColumnWidthOverrides] = useState6(() => normalizeColumnWidthMap(taskListColumnWidths));
@@ -7139,9 +7295,15 @@ var TaskList = ({
7139
7295
  const [isCreating, setIsCreating] = useState6(false);
7140
7296
  const [pendingInsert, setPendingInsert] = useState6(null);
7141
7297
  const [draggingIndex, setDraggingIndex] = useState6(null);
7142
- const [dragOverIndex, setDragOverIndex] = useState6(null);
7298
+ const [dragOverTarget, setDragOverTarget] = useState6(null);
7143
7299
  const dragOriginIndexRef = useRef6(null);
7144
7300
  const dragTaskIdRef = useRef6(null);
7301
+ const clearDragState = useCallback5(() => {
7302
+ setDraggingIndex(null);
7303
+ setDragOverTarget(null);
7304
+ dragOriginIndexRef.current = null;
7305
+ dragTaskIdRef.current = null;
7306
+ }, []);
7145
7307
  const isValidParentDrop = useCallback5((draggedTaskId, dropIndex) => {
7146
7308
  if (!isTaskParent(draggedTaskId, tasks)) {
7147
7309
  return true;
@@ -7166,59 +7328,129 @@ var TaskList = ({
7166
7328
  dragOriginIndexRef.current = index;
7167
7329
  dragTaskIdRef.current = visibleTasks[index]?.id ?? null;
7168
7330
  }, [visibleTasks]);
7331
+ const normalizeDropTarget = useCallback5((movedTaskId, target) => {
7332
+ if (target.placement !== "before" || target.index <= 0 || target.index >= visibleTasks.length) {
7333
+ return target;
7334
+ }
7335
+ const descendantIds = new Set(getAllDescendants2(movedTaskId, orderedTasks).map((task) => task.id));
7336
+ const movedIds = /* @__PURE__ */ new Set([movedTaskId, ...descendantIds]);
7337
+ const targetTask = visibleTasks[target.index];
7338
+ if (targetTask?.id === movedTaskId) {
7339
+ return target;
7340
+ }
7341
+ const previousAnchor = getNearestVisibleDropAnchorBefore(visibleTasks, movedIds, target.index - 1);
7342
+ if (!targetTask || !previousAnchor) {
7343
+ return target;
7344
+ }
7345
+ const isEquivalentSiblingGap = (targetTask.parentId || void 0) === (previousAnchor.task.parentId || void 0);
7346
+ if (isEquivalentSiblingGap) {
7347
+ return {
7348
+ index: previousAnchor.index,
7349
+ placement: "after"
7350
+ };
7351
+ }
7352
+ return target;
7353
+ }, [orderedTasks, visibleTasks]);
7169
7354
  const handleDragOver = useCallback5((index, e) => {
7170
7355
  e.preventDefault();
7171
7356
  const draggedTaskId = dragTaskIdRef.current;
7172
7357
  if (!draggedTaskId) return;
7173
- if (!isValidParentDrop(draggedTaskId, index)) {
7174
- setDragOverIndex(null);
7358
+ const rawPlacement = getDropPlacementFromEvent(e);
7359
+ const isSelfTopBefore = visibleTasks[index]?.id === draggedTaskId && rawPlacement === "before";
7360
+ if (isSelfTopBefore) {
7361
+ setDragOverTarget(null);
7362
+ e.dataTransfer.dropEffect = "none";
7363
+ return;
7364
+ }
7365
+ const isFirstChildTopAfterParent = rawPlacement === "before" && visibleTasks[index]?.parentId === visibleTasks[index - 1]?.id;
7366
+ if (isFirstChildTopAfterParent) {
7367
+ setDragOverTarget(null);
7368
+ e.dataTransfer.dropEffect = "none";
7369
+ return;
7370
+ }
7371
+ const normalizedTarget = normalizeDropTarget(draggedTaskId, {
7372
+ index,
7373
+ placement: rawPlacement
7374
+ });
7375
+ const targetTask = visibleTasks[normalizedTarget.index];
7376
+ if (!targetTask || !isValidParentDrop(draggedTaskId, normalizedTarget.index)) {
7377
+ setDragOverTarget(null);
7378
+ e.dataTransfer.dropEffect = "none";
7379
+ return;
7380
+ }
7381
+ const reorderPlan = getVisibleReorderPlan(
7382
+ orderedTasks,
7383
+ visibleTasks,
7384
+ draggedTaskId,
7385
+ normalizedTarget
7386
+ );
7387
+ if (!reorderPlan) {
7388
+ setDragOverTarget(null);
7389
+ e.dataTransfer.dropEffect = "none";
7390
+ return;
7391
+ }
7392
+ const moved = orderedTasks[reorderPlan.originOrderedIndex];
7393
+ const currentParentId = moved?.parentId || void 0;
7394
+ if (reorderPlan.insertIndex === reorderPlan.originOrderedIndex && reorderPlan.inferredParentId === currentParentId) {
7395
+ setDragOverTarget(null);
7175
7396
  e.dataTransfer.dropEffect = "none";
7176
7397
  return;
7177
7398
  }
7178
7399
  e.dataTransfer.dropEffect = "move";
7179
- setDragOverIndex(index);
7180
- }, [isValidParentDrop]);
7400
+ setDragOverTarget({
7401
+ ...normalizedTarget,
7402
+ inferredParentId: reorderPlan.inferredParentId,
7403
+ isDirectChildDrop: normalizedTarget.placement === "after" && reorderPlan.inferredParentId === targetTask.id
7404
+ });
7405
+ }, [isValidParentDrop, normalizeDropTarget, orderedTasks, visibleTasks]);
7181
7406
  const handleDrop = useCallback5((dropIndex, e) => {
7182
7407
  e.preventDefault();
7183
7408
  const originVisibleIndex = dragOriginIndexRef.current;
7184
7409
  const movedTaskId = dragTaskIdRef.current;
7185
- if (originVisibleIndex === null || movedTaskId === null || originVisibleIndex === dropIndex) {
7186
- setDraggingIndex(null);
7187
- setDragOverIndex(null);
7188
- dragOriginIndexRef.current = null;
7189
- dragTaskIdRef.current = null;
7410
+ if (originVisibleIndex === null || movedTaskId === null) {
7411
+ clearDragState();
7412
+ return;
7413
+ }
7414
+ const rawPlacement = dropIndex >= visibleTasks.length ? "end" : getDropPlacementFromEvent(e);
7415
+ const isSelfTopBefore = dropIndex < visibleTasks.length && visibleTasks[dropIndex]?.id === movedTaskId && rawPlacement === "before";
7416
+ if (isSelfTopBefore) {
7417
+ clearDragState();
7190
7418
  return;
7191
7419
  }
7192
- if (!isValidParentDrop(movedTaskId, dropIndex)) {
7193
- setDraggingIndex(null);
7194
- setDragOverIndex(null);
7195
- dragOriginIndexRef.current = null;
7196
- dragTaskIdRef.current = null;
7420
+ const isFirstChildTopAfterParent = dropIndex < visibleTasks.length && rawPlacement === "before" && visibleTasks[dropIndex]?.parentId === visibleTasks[dropIndex - 1]?.id;
7421
+ if (isFirstChildTopAfterParent) {
7422
+ clearDragState();
7197
7423
  return;
7198
7424
  }
7199
- const reorderPosition = getVisibleReorderPosition(
7425
+ const normalizedTarget = dropIndex >= visibleTasks.length ? { index: dropIndex, placement: "end" } : normalizeDropTarget(movedTaskId, {
7426
+ index: dropIndex,
7427
+ placement: rawPlacement
7428
+ });
7429
+ if (originVisibleIndex === normalizedTarget.index && normalizedTarget.placement === "before") {
7430
+ clearDragState();
7431
+ return;
7432
+ }
7433
+ if (!isValidParentDrop(movedTaskId, normalizedTarget.index)) {
7434
+ clearDragState();
7435
+ return;
7436
+ }
7437
+ const reorderPlan = getVisibleReorderPlan(
7200
7438
  orderedTasks,
7201
7439
  visibleTasks,
7202
7440
  movedTaskId,
7203
- originVisibleIndex,
7204
- dropIndex
7441
+ normalizedTarget
7205
7442
  );
7206
- if (!reorderPosition) {
7207
- setDraggingIndex(null);
7208
- setDragOverIndex(null);
7209
- dragOriginIndexRef.current = null;
7210
- dragTaskIdRef.current = null;
7443
+ if (!reorderPlan) {
7444
+ clearDragState();
7211
7445
  return;
7212
7446
  }
7213
- const { originOrderedIndex, insertIndex } = reorderPosition;
7214
- if (insertIndex === originOrderedIndex) {
7215
- setDraggingIndex(null);
7216
- setDragOverIndex(null);
7217
- dragOriginIndexRef.current = null;
7218
- dragTaskIdRef.current = null;
7447
+ const { originOrderedIndex, insertIndex, inferredParentId } = reorderPlan;
7448
+ const moved = orderedTasks[originOrderedIndex];
7449
+ const currentParentId = moved.parentId || void 0;
7450
+ if (insertIndex === originOrderedIndex && inferredParentId === currentParentId) {
7451
+ clearDragState();
7219
7452
  return;
7220
7453
  }
7221
- const moved = orderedTasks[originOrderedIndex];
7222
7454
  const hasChildren = isTaskParent(moved.id, orderedTasks);
7223
7455
  let subtree;
7224
7456
  let subtreeCount;
@@ -7233,47 +7465,14 @@ var TaskList = ({
7233
7465
  const reordered = [...orderedTasks];
7234
7466
  reordered.splice(originOrderedIndex, subtreeCount);
7235
7467
  const adjustedInsertIndex = insertIndex;
7236
- let inferredParentId;
7237
- if (moved.parentId) {
7238
- const parentIndex = reordered.findIndex((t) => t.id === moved.parentId);
7239
- if (parentIndex === -1) {
7240
- inferredParentId = void 0;
7241
- } else {
7242
- const numSiblings = reordered.filter((t) => t.parentId === moved.parentId).length;
7243
- const groupEnd = parentIndex + numSiblings;
7244
- if (adjustedInsertIndex <= parentIndex || adjustedInsertIndex > groupEnd) {
7245
- inferredParentId = void 0;
7246
- } else {
7247
- inferredParentId = moved.parentId;
7248
- }
7249
- }
7250
- } else {
7251
- }
7252
7468
  reordered.splice(adjustedInsertIndex, 0, ...subtree);
7253
- if (!moved.parentId && !hasChildren) {
7254
- const taskAbove = adjustedInsertIndex > 0 ? reordered[adjustedInsertIndex - 1] : null;
7255
- const taskBelow = adjustedInsertIndex < reordered.length - 1 ? reordered[adjustedInsertIndex + 1] : null;
7256
- if (taskAbove && taskBelow && taskBelow.parentId === taskAbove.id) {
7257
- inferredParentId = taskAbove.id;
7258
- } else if (taskAbove && taskBelow && taskAbove.parentId && taskAbove.parentId === taskBelow.parentId) {
7259
- inferredParentId = taskAbove.parentId;
7260
- } else if (!taskAbove && taskBelow && taskBelow.parentId) {
7261
- inferredParentId = taskBelow.parentId;
7262
- }
7263
- }
7264
7469
  onReorder?.(reordered, moved.id, inferredParentId);
7265
7470
  onTaskSelect?.(moved.id);
7266
- setDraggingIndex(null);
7267
- setDragOverIndex(null);
7268
- dragOriginIndexRef.current = null;
7269
- dragTaskIdRef.current = null;
7270
- }, [orderedTasks, visibleTasks, onReorder, onTaskSelect]);
7471
+ clearDragState();
7472
+ }, [orderedTasks, visibleTasks, onReorder, onTaskSelect, isValidParentDrop, clearDragState, normalizeDropTarget]);
7271
7473
  const handleDragEnd = useCallback5(() => {
7272
- setDraggingIndex(null);
7273
- setDragOverIndex(null);
7274
- dragOriginIndexRef.current = null;
7275
- dragTaskIdRef.current = null;
7276
- }, []);
7474
+ clearDragState();
7475
+ }, [clearDragState]);
7277
7476
  const handleConfirmNewTask = useCallback5((name) => {
7278
7477
  const range = buildDefaultTaskDateRange(getTodayISODate(), {
7279
7478
  businessDays,
@@ -7667,12 +7866,15 @@ var TaskList = ({
7667
7866
  onAdd,
7668
7867
  onInsertAfter: handleStartInsertAfter,
7669
7868
  editingTaskId: propEditingTaskId,
7670
- isDragging: !disableTaskDrag && draggingIndex === index,
7671
- isDragOver: !disableTaskDrag && dragOverIndex === index,
7672
- onDragStart: disableTaskDrag ? void 0 : handleDragStart,
7673
- onDragOver: disableTaskDrag ? void 0 : handleDragOver,
7674
- onDrop: disableTaskDrag ? void 0 : handleDrop,
7675
- onDragEnd: disableTaskDrag ? void 0 : handleDragEnd,
7869
+ isDragging: !reorderDisabled && draggingIndex === index,
7870
+ isDragOver: !reorderDisabled && dragOverTarget?.index === index,
7871
+ dragOverPlacement: !reorderDisabled && dragOverTarget?.index === index && dragOverTarget.placement !== "end" ? dragOverTarget.placement : null,
7872
+ isNestedDropTarget: !reorderDisabled && dragOverTarget?.index === index && !!dragOverTarget.inferredParentId,
7873
+ isDirectChildDropTarget: !reorderDisabled && dragOverTarget?.index === index && !!dragOverTarget.isDirectChildDrop,
7874
+ onDragStart: reorderDisabled ? void 0 : handleDragStart,
7875
+ onDragOver: reorderDisabled ? void 0 : handleDragOver,
7876
+ onDrop: reorderDisabled ? void 0 : handleDrop,
7877
+ onDragEnd: reorderDisabled ? void 0 : handleDragEnd,
7676
7878
  collapsedParentIds,
7677
7879
  onToggleCollapse: handleToggleCollapse,
7678
7880
  onPromoteTask,
@@ -7726,25 +7928,25 @@ var TaskList = ({
7726
7928
  enableAddTask && onAdd && !isCreating && !pendingInsert && /* @__PURE__ */ jsx14(
7727
7929
  "button",
7728
7930
  {
7729
- className: `gantt-tl-add-btn${!disableTaskDrag && dragOverIndex === visibleTasks.length ? " gantt-tl-add-btn-drag-over" : ""}`,
7931
+ className: `gantt-tl-add-btn${!reorderDisabled && dragOverTarget?.index === visibleTasks.length ? " gantt-tl-add-btn-drag-over" : ""}`,
7730
7932
  onClick: () => {
7731
7933
  setPendingInsert(null);
7732
7934
  setIsCreating(true);
7733
7935
  },
7734
- onDragEnter: disableTaskDrag ? void 0 : (e) => {
7936
+ onDragEnter: reorderDisabled ? void 0 : (e) => {
7735
7937
  e.preventDefault();
7736
- setDragOverIndex(visibleTasks.length);
7938
+ setDragOverTarget({ index: visibleTasks.length, placement: "end" });
7737
7939
  },
7738
- onDragOver: disableTaskDrag ? void 0 : (e) => {
7940
+ onDragOver: reorderDisabled ? void 0 : (e) => {
7739
7941
  e.preventDefault();
7740
7942
  e.dataTransfer.dropEffect = "move";
7741
- setDragOverIndex(visibleTasks.length);
7943
+ setDragOverTarget({ index: visibleTasks.length, placement: "end" });
7742
7944
  },
7743
- onDragLeave: disableTaskDrag ? void 0 : (e) => {
7945
+ onDragLeave: reorderDisabled ? void 0 : (e) => {
7744
7946
  e.preventDefault();
7745
- setDragOverIndex(null);
7947
+ setDragOverTarget(null);
7746
7948
  },
7747
- onDrop: disableTaskDrag ? void 0 : (e) => {
7949
+ onDrop: reorderDisabled ? void 0 : (e) => {
7748
7950
  e.preventDefault();
7749
7951
  handleDrop(visibleTasks.length, e);
7750
7952
  },
@@ -10169,6 +10371,7 @@ function TaskGanttChartInner(props, ref) {
10169
10371
  onDelete,
10170
10372
  onInsertAfter,
10171
10373
  onReorder,
10374
+ disableTaskListReorder = false,
10172
10375
  onPromoteTask,
10173
10376
  onDemoteTask,
10174
10377
  onUngroupTask,
@@ -10676,10 +10879,12 @@ function TaskGanttChartInner(props, ref) {
10676
10879
  onTasksChange?.([promotedTask]);
10677
10880
  return;
10678
10881
  }
10882
+ const tasksWithoutPromoted = tasks.filter((t) => t.id !== taskId);
10883
+ const insertIndex = lastSiblingIndex.index;
10679
10884
  const reorderedTasks = normalizeHierarchyTasks([
10680
- ...tasks.filter((t) => t.id !== taskId).slice(0, lastSiblingIndex.index + 1),
10885
+ ...tasksWithoutPromoted.slice(0, insertIndex),
10681
10886
  promotedTask,
10682
- ...tasks.filter((t) => t.id !== taskId).slice(lastSiblingIndex.index + 1)
10887
+ ...tasksWithoutPromoted.slice(insertIndex)
10683
10888
  ]);
10684
10889
  onTasksChange?.(reorderedTasks);
10685
10890
  }, [tasks, onTasksChange, onPromoteTask]);
@@ -10833,7 +11038,7 @@ function TaskGanttChartInner(props, ref) {
10833
11038
  onDelete: handleDelete,
10834
11039
  onInsertAfter: handleInsertAfter,
10835
11040
  onReorder: handleReorder,
10836
- disableTaskDrag,
11041
+ disableTaskDrag: disableTaskListReorder,
10837
11042
  editingTaskId,
10838
11043
  enableAddTask,
10839
11044
  defaultTaskDurationDays,
@@ -11124,6 +11329,7 @@ export {
11124
11329
  getSuccessorChain,
11125
11330
  getTaskDuration,
11126
11331
  getTransitiveCascadeChain,
11332
+ getVisibleReorderPlan,
11127
11333
  getVisibleReorderPosition,
11128
11334
  getWeekBlocks,
11129
11335
  getWeekSpans,