summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrederick Yin <fkfd@fkfd.me>2023-07-24 17:31:58 +0800
committerFrederick Yin <fkfd@fkfd.me>2023-07-24 17:38:01 +0800
commitfdbe718c127242d4b524ec15b87c9fd3c6f13593 (patch)
treea0638e492dec0f9d1782dfe954a9e11d48f01f17
parent322073b8ee0a70e37cc69c3d77ad6bc78f99c761 (diff)
Display announcements in same order as course list
-rw-r--r--contents/ui/main.qml45
1 files changed, 40 insertions, 5 deletions
diff --git a/contents/ui/main.qml b/contents/ui/main.qml
index 0c4d57f..e685044 100644
--- a/contents/ui/main.qml
+++ b/contents/ui/main.qml
@@ -53,27 +53,40 @@ Item {
return {id: line.slice(0, spaceIndex), code: line.slice(spaceIndex + 1)}
}
)
+ let courseIndices = {} // reverse look-up table to sort by courses
+ for (let i = 0; i < courses.length; i++) {
+ courseIndices[courses[i].id] = i
+ }
const showSubmittedAssignments = plasmoid.configuration.showSubmittedAssignments
// we need user id to check submission status
callApi("/users/self", 0, user => {
- syncCourses(courses, showSubmittedAssignments, user.id)
+ syncCourses(courses, courseIndices, showSubmittedAssignments, user.id)
})
}
- function syncCourses(courses, showSubmittedAssignments, userId) {
+ // fetch asynchronously, but display in this order:
+ // important -> normal -> finished
+ // when an activity is both important and finished, important takes priority
+ function syncCourses(courses, courseIndices, showSubmittedAssignments, userId) {
announcementsModel.clear()
assignmentsModel.clear()
- let importantCount = {announcements: 0, assignments: 0}
+ let announcementIndices = {
+ important: 0, // actually constant, kept for symmetry
+ normal: 0,
+ finished: 0,
+ }
for (let course of courses) {
+ const courseIdx = courseIndices[course.id]
callApi(`/announcements?context_codes[]=course_${course.id}`, 50, announcements => {
announcements.forEach(announcement => {
const info = {
type: "announcement",
activityId: announcement.id,
+ courseId: course.id,
course: course.code,
title: announcement.title,
url: announcement.html_url,
@@ -81,11 +94,32 @@ Item {
finished: plasmoid.configuration.finishedAnnouncements.includes(announcement.id.toString()),
}
+ // figure out where we insert it into list
+ let idx = 0;
+ let endIdx = 0; // actually past the end
if (info.important) {
- announcementsModel.insert(importantCount.announcements++, info) // place above unimportant ones
+ idx = announcementIndices.important
+ endIdx = announcementIndices.normal
+ announcementIndices.normal++
+ announcementIndices.finished++
+ } else if (!info.finished) {
+ idx = announcementIndices.normal
+ endIdx = announcementIndices.finished
+ announcementIndices.finished++
} else {
- announcementsModel.append(info)
+ idx = announcementIndices.normal
+ endIdx = announcementsModel.count
+ }
+
+ for (; idx < endIdx; idx++) {
+ const annc = announcementsModel.get(idx)
+ if (courseIndices[course.id] < courseIndices[annc.courseId]) {
+ // we are just past the end of this course
+ // insert this announcement here
+ break
+ }
}
+ announcementsModel.insert(idx, info)
})
})
@@ -95,6 +129,7 @@ Item {
const info = {
type: "assignment",
activityId: assignment.id,
+ courseId: course.id,
course: course.code,
title: assignment.name,
dueAt: assignment.due_at || "", // if null, use empty string to suppress errors