]> git.scottworley.com Git - vopamoi/blobdiff - vopamoi.ts
"vp" to view the tag "Project"
[vopamoi] / vopamoi.ts
index bdc8b0d2bf9acffb6bb34416b7fa165ea0227a26..f13e5790b9cef86c431f780e4d3103f2e682d71c 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);
+        }
       }
     },
 
@@ -518,17 +522,50 @@ function BrowserUI() {
       return ui.setState(createTimestamp, newState, oldState);
     },
 
-    setTagView: function () {
-      const target = this.currentTag();
-      if (!target) return;
-      const tag = target.textContent!;
+    setTagView: function (tag: string | null = null) {
+      if (tag === null) {
+        const target = this.currentTag();
+        if (!target) return;
+        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 +586,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");
@@ -635,6 +675,7 @@ function handleKey(event: any) {
       if (event.key == "c") return browserUI.setView("cancelled");
       if (event.key == "d") return browserUI.setView("done");
       if (event.key == "i") return browserUI.setUntaggedView();
+      if (event.key == "p") return browserUI.setTagView("Project");
       if (event.key == "q") return browserUI.setView("todo");
       if (event.key == "s") return (inputState = InputState.VS);
       if (event.key == "T") return browserUI.resetTagView();