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.css.map +1 -1
- package/dist/index.d.mts +31 -17
- package/dist/index.d.ts +31 -17
- package/dist/index.js +293 -86
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +292 -86
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +85 -2
- package/package.json +1 -1
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:
|
|
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: {
|
|
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 [
|
|
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
|
-
|
|
7174
|
-
|
|
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
|
-
|
|
7180
|
-
|
|
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
|
|
7186
|
-
|
|
7187
|
-
|
|
7188
|
-
|
|
7189
|
-
|
|
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
|
-
|
|
7193
|
-
|
|
7194
|
-
|
|
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
|
|
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
|
-
|
|
7204
|
-
dropIndex
|
|
7441
|
+
normalizedTarget
|
|
7205
7442
|
);
|
|
7206
|
-
if (!
|
|
7207
|
-
|
|
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 } =
|
|
7214
|
-
|
|
7215
|
-
|
|
7216
|
-
|
|
7217
|
-
|
|
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
|
-
|
|
7267
|
-
|
|
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
|
-
|
|
7273
|
-
|
|
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: !
|
|
7671
|
-
isDragOver: !
|
|
7672
|
-
|
|
7673
|
-
|
|
7674
|
-
|
|
7675
|
-
|
|
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${!
|
|
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:
|
|
7936
|
+
onDragEnter: reorderDisabled ? void 0 : (e) => {
|
|
7735
7937
|
e.preventDefault();
|
|
7736
|
-
|
|
7938
|
+
setDragOverTarget({ index: visibleTasks.length, placement: "end" });
|
|
7737
7939
|
},
|
|
7738
|
-
onDragOver:
|
|
7940
|
+
onDragOver: reorderDisabled ? void 0 : (e) => {
|
|
7739
7941
|
e.preventDefault();
|
|
7740
7942
|
e.dataTransfer.dropEffect = "move";
|
|
7741
|
-
|
|
7943
|
+
setDragOverTarget({ index: visibleTasks.length, placement: "end" });
|
|
7742
7944
|
},
|
|
7743
|
-
onDragLeave:
|
|
7945
|
+
onDragLeave: reorderDisabled ? void 0 : (e) => {
|
|
7744
7946
|
e.preventDefault();
|
|
7745
|
-
|
|
7947
|
+
setDragOverTarget(null);
|
|
7746
7948
|
},
|
|
7747
|
-
onDrop:
|
|
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
|
-
...
|
|
10885
|
+
...tasksWithoutPromoted.slice(0, insertIndex),
|
|
10681
10886
|
promotedTask,
|
|
10682
|
-
...
|
|
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,
|