(
targetTaskPath: string,
above: boolean,
groupKey: string | null,
groupByProperty: string | null,
draggedPath: string,
plugin: TaskNotesPlugin,
options: SortOrderComputationOptions = {}
)
| 560 | * Prepare a sort-order update plan without writing any files yet. |
| 561 | */ |
| 562 | export async function prepareSortOrderUpdate( |
| 563 | targetTaskPath: string, |
| 564 | above: boolean, |
| 565 | groupKey: string | null, |
| 566 | groupByProperty: string | null, |
| 567 | draggedPath: string, |
| 568 | plugin: TaskNotesPlugin, |
| 569 | options: SortOrderComputationOptions = {} |
| 570 | ): Promise<SortOrderPlan> { |
| 571 | const columnTasks = getGroupTasks(groupKey, groupByProperty, plugin, options).filter( |
| 572 | (task) => task.path !== draggedPath |
| 573 | ); |
| 574 | const orderedTasks = getVisibleOrderedTasks(columnTasks, options.visibleTaskPaths, draggedPath); |
| 575 | const sortDirection = inferSortDirection(orderedTasks); |
| 576 | |
| 577 | if (columnTasks.length === 0) { |
| 578 | return { |
| 579 | sortOrder: middleRank().toString(), |
| 580 | additionalWrites: [], |
| 581 | reason: "boundary", |
| 582 | }; |
| 583 | } |
| 584 | |
| 585 | const targetIndex = orderedTasks.findIndex((task) => task.path === targetTaskPath); |
| 586 | if (targetIndex === -1) { |
| 587 | const lastRankedTask = [...orderedTasks].reverse().find((task) => hasValidSortRank(task)); |
| 588 | const lastRank = lastRankedTask ? tryParseSortRank(lastRankedTask.sortOrder) : null; |
| 589 | if (lastRank && !shouldRebalanceRank(lastRank)) { |
| 590 | const sortOrder = rankAfterInDisplay(lastRank, sortDirection).toString(); |
| 591 | if (isCandidateInDisplayPosition(sortOrder, lastRank.toString(), null, sortDirection)) { |
| 592 | return { |
| 593 | sortOrder, |
| 594 | additionalWrites: [], |
| 595 | reason: "boundary", |
| 596 | }; |
| 597 | } |
| 598 | } |
| 599 | |
| 600 | if (orderedTasks.length > 0) { |
| 601 | return createRebalancePlan(orderedTasks, orderedTasks.length - 1, false, sortDirection); |
| 602 | } |
| 603 | |
| 604 | return { |
| 605 | sortOrder: middleRank().toString(), |
| 606 | additionalWrites: [], |
| 607 | reason: "boundary", |
| 608 | }; |
| 609 | } |
| 610 | |
| 611 | const targetTask = orderedTasks[targetIndex]; |
| 612 | const previousTask = targetIndex > 0 ? orderedTasks[targetIndex - 1] : null; |
| 613 | const nextTask = targetIndex < orderedTasks.length - 1 ? orderedTasks[targetIndex + 1] : null; |
| 614 | const targetRank = tryParseSortRank(targetTask.sortOrder); |
| 615 | const previousRank = previousTask ? tryParseSortRank(previousTask.sortOrder) : null; |
| 616 | const nextRank = nextTask ? tryParseSortRank(nextTask.sortOrder) : null; |
| 617 | |
| 618 | if (!targetRank) { |
| 619 | return createRebalancePlan(orderedTasks, targetIndex, above, sortDirection); |
no test coverage detected