MCPcopy Create free account
hub / github.com/callumalpass/tasknotes / prepareSortOrderUpdate

Function prepareSortOrderUpdate

src/bases/sortOrderUtils.ts:562–694  ·  view source on GitHub ↗
(
	targetTaskPath: string,
	above: boolean,
	groupKey: string | null,
	groupByProperty: string | null,
	draggedPath: string,
	plugin: TaskNotesPlugin,
	options: SortOrderComputationOptions = {}
)

Source from the content-addressed store, hash-verified

560 * Prepare a sort-order update plan without writing any files yet.
561 */
562export 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);

Callers 3

handleTaskDropMethod · 0.90
handleSortOrderDropMethod · 0.90

Calls 14

getGroupTasksFunction · 0.85
getVisibleOrderedTasksFunction · 0.85
inferSortDirectionFunction · 0.85
middleRankFunction · 0.85
hasValidSortRankFunction · 0.85
tryParseSortRankFunction · 0.85
shouldRebalanceRankFunction · 0.85
rankAfterInDisplayFunction · 0.85
createRebalancePlanFunction · 0.85
compareInDisplayOrderFunction · 0.85
rankBeforeInDisplayFunction · 0.85

Tested by

no test coverage detected