X-Git-Url: http://git.scottworley.com/vopamoi/blobdiff_plain/c2226333bbb69b5110aa5feaf839347321dca9ee..32808c9a5b8154746bf98339e58ed827c399a9d3:/vopamoi.ts diff --git a/vopamoi.ts b/vopamoi.ts index 7777f36..a114959 100644 --- a/vopamoi.ts +++ b/vopamoi.ts @@ -297,9 +297,8 @@ function BrowserUI() { }, beginEdit: function (event: Event) { - var task = document.activeElement; + const task = this.currentTask(); if (!task) return; - if (task.classList.contains("tag")) task = task.parentElement!; const input = document.createElement("input"); const desc = task.getElementsByClassName("desc")[0]; const oldDescription = desc.textContent!; @@ -313,7 +312,7 @@ function BrowserUI() { }, beginTagEdit: function (event: Event) { - const task = document.activeElement; + const task = this.currentTask(); if (!task) return; const input = document.createElement("input"); input.classList.add("tag"); @@ -355,19 +354,39 @@ function BrowserUI() { } }, + currentTag: function (): Element | null { + var target = document.activeElement; + if (!target) return null; + if (target.classList.contains("task")) { + const tags = target.getElementsByClassName("tag"); + target = tags[tags.length - 1]; + } + if (!target || !target.classList.contains("tag")) return null; + return target; + }, + + currentTask: function (): HTMLElement | null { + var target = document.activeElement; + if (!target) return null; + if (target.classList.contains("tag")) target = target.parentElement!; + return target as HTMLElement; + }, + firstVisibleTask: function () { for (const task of document.getElementsByClassName("task")) { const state = task.getAttribute("data-state"); - if (task instanceof HTMLElement && (state === currentViewState || (currentViewState === "all" && state !== "deleted"))) { + if ( + task instanceof HTMLElement && + (state === currentViewState || (currentViewState === "all" && state !== "deleted")) && + !task.classList.contains("hide") + ) { return task; } } }, focusTaskNameInput: function (event: Event) { - if (document.activeElement instanceof HTMLElement) { - taskFocusedBeforeJumpingToInput = document.activeElement; - } + taskFocusedBeforeJumpingToInput = this.currentTask(); document.getElementById("taskName")!.focus(); window.scroll(0, 0); event.preventDefault(); @@ -381,7 +400,10 @@ function BrowserUI() { cursor = increment > 0 ? cursor.nextElementSibling : cursor.previousElementSibling; if (!cursor || !(cursor instanceof HTMLElement)) break; const state = cursor.getAttribute("data-state")!; - if (state === currentViewState || (currentViewState === "all" && state !== "deleted")) { + if ( + (state === currentViewState || (currentViewState === "all" && state !== "deleted")) && + !cursor.classList.contains("hide") + ) { offset -= increment; valid_cursor = cursor; } @@ -398,20 +420,20 @@ function BrowserUI() { }, makeBottomPriority: function (task: Element | null = null) { - if (!task) task = document.activeElement; + if (!task) task = this.currentTask(); if (!task) return; this.setPriority(task, document.getElementById("tasks")!.lastElementChild, null); }, makeTopPriority: function (task: Element | null = null) { - if (!task) task = document.activeElement; + if (!task) task = this.currentTask(); if (!task) return; ui.setPriority(task.getAttribute("data-created")!, clock.now(), Model.getPriority(task)); task instanceof HTMLElement && task.focus(); }, moveCursor: function (offset: number): boolean { - const active = document.activeElement; + const active = this.currentTask(); if (!active) return false; const dest = this.visibleTaskAtOffset(active, offset); if (dest !== active && dest instanceof HTMLElement) { @@ -422,7 +444,7 @@ function BrowserUI() { }, moveTask: function (offset: number) { - const active = document.activeElement; + const active = this.currentTask(); if (!active) return; const dest = this.visibleTaskAtOffset(active, offset); if (dest === active) return; // Already extremal @@ -436,16 +458,22 @@ function BrowserUI() { }, removeTag: function () { - var target = document.activeElement; + const target = this.currentTag(); if (!target) return; - if (target.classList.contains("task")) { - const tags = target.getElementsByClassName("tag"); - target = tags[tags.length - 1]; - } - if (!target || !target.classList.contains("tag")) return; ui.removeTag(target.parentElement!.getAttribute("data-created")!, target.textContent!); }, + resetTagView: function () { + for (const task of document.getElementsByClassName("task")) { + task.classList.remove("hide"); + } + }, + + resetView: function () { + this.setView("todo"); + this.resetTagView(); + }, + returnFocusAfterInput: function (): boolean { if (taskFocusedBeforeJumpingToInput) { taskFocusedBeforeJumpingToInput.focus(); @@ -469,7 +497,7 @@ function BrowserUI() { }, setState: function (newState: string) { - const task = document.activeElement; + const task = this.currentTask(); if (!task) return; const oldState = task.getAttribute("data-state")!; if (newState === oldState) return; @@ -480,6 +508,19 @@ function BrowserUI() { return ui.setState(createTimestamp, newState, oldState); }, + setTagView: function () { + const target = this.currentTag(); + if (!target) return; + const tag = target.textContent!; + for (const task of document.getElementsByClassName("task")) { + if (Model.hasTag(task, tag)) { + task.classList.remove("hide"); + } else { + task.classList.add("hide"); + } + } + }, + setView: function (state: string) { const sheet = (document.getElementById("viewStyle") as HTMLStyleElement).sheet!; if (state === "all") { @@ -491,7 +532,7 @@ function BrowserUI() { sheet.removeRule(2); sheet.removeRule(2); currentViewState = state; - if (document.activeElement?.getAttribute("data-state") !== state) { + if (this.currentTask()?.getAttribute("data-state") !== state) { this.firstVisibleTask()?.focus(); } }, @@ -574,7 +615,9 @@ function handleKey(event: any) { if (event.key == "d") return browserUI.setView("done"); if (event.key == "q") return browserUI.setView("todo"); if (event.key == "s") return (inputState = InputState.VS); - if (event.key == "v") return browserUI.setView("todo"); + if (event.key == "T") return browserUI.resetTagView(); + if (event.key == "t") return browserUI.setTagView(); + if (event.key == "v") return browserUI.resetView(); if (event.key == "w") return browserUI.setView("waiting"); if (event.key == "x") return browserUI.setView("deleted"); } else if (inputState === InputState.VS) {