diff options
author | Frederick Yin <fkfd@fkfd.me> | 2023-07-25 15:57:05 +0800 |
---|---|---|
committer | Frederick Yin <fkfd@fkfd.me> | 2023-07-25 15:57:05 +0800 |
commit | 681f3ad2cd1163dbd049b4e917c4631541d3bb89 (patch) | |
tree | 07e357b816f300b20ef9cb20d440b887d45b88c5 /contents/ui/activity.js | |
parent | f42fed01e1a9d7edea0282926cee3383cf05788e (diff) |
Move JavaScript functions out of ActivityView.qml
Diffstat (limited to 'contents/ui/activity.js')
-rw-r--r-- | contents/ui/activity.js | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/contents/ui/activity.js b/contents/ui/activity.js new file mode 100644 index 0000000..890082e --- /dev/null +++ b/contents/ui/activity.js @@ -0,0 +1,76 @@ +function sameDay(due, now) { + return ( + due.getFullYear() == now.getFullYear() && + due.getMonth() == now.getMonth() && + due.getDate() == now.getDate() + ) +} + +function dayDiff(due, now, stopAt) { + // due and now are both Date objects + // if due has the same day as now (i.e. due is today), return 0 + // if due is tomorrow, return 1, the day after that 2, yesterday -1, etc. + // when the absolute value of diff reaches stopAt, return stopAt + let diff = 0 + const step = (due > now) ? 1 : -1 + while (!sameDay(due, now)) { + now.setDate(now.getDate() + step) + diff += step + if (Math.abs(diff) >= stopAt) { + return stopAt + } + } + return diff +} + +function humanDue(isoDue) { + // converts ISO 8601 datetime string to relative time, e.g. tomorrow midnight + const daysOfWeek = [ + i18n("Sunday"), + i18n("Monday"), + i18n("Tuesday"), + i18n("Wednesday"), + i18n("Thursday"), + i18n("Friday"), + i18n("Saturday"), + ] + + try { + let due = new Date(isoDue) + if (due.toString() == "Invalid Date") { + console.warn(`Cannot parse due date: ${isoDue}`) + return isoDue + } + + let now = new Date() + const pastDue = (due <= now) + const dayDifference = dayDiff(due, now, 8) + let humanDueString = "" + + if (dayDifference <= -2) { + humanDueString = Qt.formatDate(due) + } else if (dayDifference == -1) { + humanDueString = i18n("Yesterday") + } else if (dayDifference == 0) { + humanDueString = i18n("Today") + } else if (dayDifference == 1) { + humanDueString = i18n("Tomorrow") + } else if (dayDifference <= 6) { + humanDueString = daysOfWeek[due.getDay()] + } else { + humanDueString = Qt.formatDate(due) + } + + humanDueString += " " + Qt.formatTime(due) + return humanDueString + } catch (e) { + return isoDue // screw it + } +} + +function dueLabelText() { + if (type != "assignment") { return "" } + if (submitted) { return i18n("Submitted") } + if (!dueAt) { return i18n("Due date not announced") } + return i18n("Due: ") + humanDue(dueAt) +} |