+ 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 {
+ const superTask = highestPrioritySuperTask(task);
+ if (superTask !== null) {
+ Model.insertInPriorityOrder(task, superTask);
+ } else {
+ task.classList.add("hide");
+ }
+ }
+ }
+
+ currentTagView = tag;
+ },
+
+ setView: function (state: string) {