]> git.scottworley.com Git - vopamoi/blobdiff - vopamoi.ts
Nested tag view
[vopamoi] / vopamoi.ts
index bdc8b0d2bf9acffb6bb34416b7fa165ea0227a26..f624db13f4774f2e9e19e32186082a9a75ed00a4 100644 (file)
@@ -474,8 +474,12 @@ function BrowserUI() {
 
     resetTagView: function () {
       currentTagView = null;
-      for (const task of document.getElementsByClassName("task")) {
+      const taskList = document.getElementById("tasks")!;
+      for (const task of Array.from(document.getElementsByClassName("task"))) {
         task.classList.remove("hide");
+        if (task.parentElement !== taskList) {
+          Model.insertInPriorityOrder(task, taskList);
+        }
       }
     },
 
@@ -522,13 +526,44 @@ function BrowserUI() {
       const target = this.currentTag();
       if (!target) return;
       const tag = target.textContent!;
+
+      if (currentTagView !== null) {
+        this.resetTagView();
+      }
+
+      const tasksWithTag = new Map();
       for (const task of document.getElementsByClassName("task")) {
+        if (Model.hasTag(task, tag)) {
+          tasksWithTag.set(task.getElementsByClassName("desc")[0].textContent, [Model.getPriority(task), task]);
+        }
+      }
+
+      function highestPrioritySuperTask(t: Element) {
+        var maxPriority = -1;
+        var superTask = null;
+        for (const child of t.getElementsByClassName("tag")) {
+          const e = tasksWithTag.get(child.textContent);
+          if (e !== undefined && e[0] > maxPriority) {
+            maxPriority = e[0];
+            superTask = e[1];
+          }
+        }
+        return superTask;
+      }
+
+      for (const task of Array.from(document.getElementsByClassName("task"))) {
         if (Model.hasTag(task, tag)) {
           task.classList.remove("hide");
         } else {
-          task.classList.add("hide");
+          const superTask = highestPrioritySuperTask(task);
+          if (superTask !== null) {
+            Model.insertInPriorityOrder(task, superTask);
+          } else {
+            task.classList.add("hide");
+          }
         }
       }
+
       currentTagView = tag;
     },
 
@@ -549,6 +584,9 @@ function BrowserUI() {
     },
 
     setUntaggedView: function () {
+      if (currentTagView !== null) {
+        this.resetTagView();
+      }
       for (const task of document.getElementsByClassName("task")) {
         if (task.getElementsByClassName("tag").length === 0) {
           task.classList.remove("hide");