X-Git-Url: http://git.scottworley.com/vopamoi/blobdiff_plain/246ed96550c1820ab47860314f117aaf334bc0cb..e0c49063e71dd24fce0f57a5e9ad1287b8073341:/vopamoi.ts diff --git a/vopamoi.ts b/vopamoi.ts index 47c421d..926a1f0 100644 --- a/vopamoi.ts +++ b/vopamoi.ts @@ -310,6 +310,11 @@ enum CommitOrAbort { Abort, } +interface TagFilter { + description: string; + include: (task: Element) => boolean; +} + function BrowserUI() { const viewColors: { [key: string]: string } = { all: "Gold", @@ -320,7 +325,7 @@ function BrowserUI() { todo: "White", waiting: "MediumOrchid", }; - var currentTagView: string | null = null; + var currentTagFilter: TagFilter | null = null; var currentViewState = "todo"; var taskFocusedBeforeJumpingToInput: HTMLElement | null = null; var lastTagNameEntered = ""; @@ -561,7 +566,7 @@ function BrowserUI() { }, resetTagView: function () { - currentTagView = null; + currentTagFilter = null; this.setTitle(); const taskList = document.getElementById("tasks")!; for (const task of Array.from(document.getElementsByClassName("task"))) { @@ -611,20 +616,14 @@ function BrowserUI() { return ui.setState(createTimestamp, newState, oldState); }, - setTagView: function (tag: string | null = null) { - if (tag === null) { - const target = this.currentTag(); - if (!target) return; - tag = target.textContent!; - } - - if (currentTagView !== null) { + setTagFilter: function (filter: TagFilter) { + if (currentTagFilter !== null) { this.resetTagView(); } const tasksWithTag = new Map(); for (const task of document.getElementsByClassName("task")) { - if (model.hasTag(task, tag)) { + if (filter.include(task)) { tasksWithTag.set(task.getElementsByClassName("desc")[0].textContent, [model.getPriority(task), task]); } } @@ -643,7 +642,7 @@ function BrowserUI() { } for (const task of Array.from(document.getElementsByClassName("task"))) { - if (model.hasTag(task, tag)) { + if (filter.include(task)) { task.classList.remove("hide"); } else { const superTask = highestPrioritySuperTask(task); @@ -655,12 +654,21 @@ function BrowserUI() { } } - currentTagView = tag; + currentTagFilter = filter; this.setTitle(); }, + setTagView: function (tag: string | null = null) { + if (tag === null) { + const target = this.currentTag(); + if (!target) return; + tag = target.textContent!; + } + this.setTagFilter({description: tag, include: task => !!model.hasTag(task, tag!)}); + }, + setTitle: function () { - document.title = "Vopamoi: " + currentViewState + (currentTagView ? ": " + currentTagView : ""); + document.title = "Vopamoi: " + currentViewState + (currentTagFilter ? ": " + currentTagFilter.description : ""); }, setView: function (state: string) { @@ -681,7 +689,7 @@ function BrowserUI() { }, setUntaggedView: function () { - if (currentTagView !== null) { + if (currentTagFilter !== null) { this.resetTagView(); } for (const task of document.getElementsByClassName("task")) {