summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/milestones/milestone_utils.js
blob: 3ae5e67613885f80034af91027788228e7aafa84 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import { parsePikadayDate } from '~/lib/utils/datetime_utility';

/**
 * This method is to be used with `Array.prototype.sort` function
 * where array contains milestones with `due_date`/`dueDate` and/or
 * `expired` properties.
 * This method sorts given milestone params based on their expiration
 * status by putting expired milestones at the bottom and upcoming
 * milestones at the top of the list.
 *
 * @param {object} milestoneA
 * @param {object} milestoneB
 */
export function sortMilestonesByDueDate(milestoneA, milestoneB) {
  const rawDueDateA = milestoneA.due_date || milestoneA.dueDate;
  const rawDueDateB = milestoneB.due_date || milestoneB.dueDate;
  const dueDateA = rawDueDateA ? parsePikadayDate(rawDueDateA) : null;
  const dueDateB = rawDueDateB ? parsePikadayDate(rawDueDateB) : null;
  const expiredA = milestoneA.expired || Date.now() > dueDateA?.getTime();
  const expiredB = milestoneB.expired || Date.now() > dueDateB?.getTime();

  // Move all expired milestones to the bottom.
  if (expiredA) return 1;
  if (expiredB) return -1;

  // Move milestones without due dates just above expired milestones.
  if (!dueDateA) return 1;
  if (!dueDateB) return -1;

  // Sort by due date in ascending order.
  return dueDateA - dueDateB;
}