X-Git-Url: http://git.scottworley.com/vopamoi/blobdiff_plain/ada060d76e8d158ee56aee89402a674e3a82be9f..b56a37d31873fa82e6196cde9479b689a14e4629:/vopamoi.ts diff --git a/vopamoi.ts b/vopamoi.ts index 94c26e6..a3b7824 100644 --- a/vopamoi.ts +++ b/vopamoi.ts @@ -149,39 +149,43 @@ function Log(prefix: string = "vp-") { } const log = Log(); -const undoLog: string[] = []; -const UI = { - addTask: function (description: string): Element { - const now = clock.now(); - undoLog.push(`State ${now} deleted`); - return log.recordAndApply(`${now} Create ${description}`); - }, - edit: function (createTimestamp: string, newDescription: string, oldDescription: string) { - undoLog.push(`Edit ${createTimestamp} ${oldDescription}`); - return log.recordAndApply(`${clock.now()} Edit ${createTimestamp} ${newDescription}`); - }, - setPriority: function (createTimestamp: string, newPriority: number, oldPriority: number) { - undoLog.push(`Priority ${createTimestamp} ${oldPriority}`); - return log.recordAndApply(`${clock.now()} Priority ${createTimestamp} ${newPriority}`); - }, - setState: function (createTimestamp: string, newState: string, oldState: string) { - undoLog.push(`State ${createTimestamp} ${oldState}`); - return log.recordAndApply(`${clock.now()} State ${createTimestamp} ${newState}`); - }, - undo: function () { - if (undoLog.length > 0) { - return log.recordAndApply(`${clock.now()} ${undoLog.pop()}`); - } - }, -}; +function UI() { + const undoLog: string[] = []; + return { + addTask: function (description: string): Element { + const now = clock.now(); + undoLog.push(`State ${now} deleted`); + return log.recordAndApply(`${now} Create ${description}`); + }, + edit: function (createTimestamp: string, newDescription: string, oldDescription: string) { + undoLog.push(`Edit ${createTimestamp} ${oldDescription}`); + return log.recordAndApply(`${clock.now()} Edit ${createTimestamp} ${newDescription}`); + }, + setPriority: function (createTimestamp: string, newPriority: number, oldPriority: number) { + undoLog.push(`Priority ${createTimestamp} ${oldPriority}`); + return log.recordAndApply(`${clock.now()} Priority ${createTimestamp} ${newPriority}`); + }, + setState: function (createTimestamp: string, newState: string, oldState: string) { + undoLog.push(`State ${createTimestamp} ${oldState}`); + return log.recordAndApply(`${clock.now()} State ${createTimestamp} ${newState}`); + }, + undo: function () { + if (undoLog.length > 0) { + return log.recordAndApply(`${clock.now()} ${undoLog.pop()}`); + } + }, + }; +} +const ui = UI(); function BrowserUI() { + var currentViewState = "todo"; return { addTask: function (event: KeyboardEvent) { const input = document.getElementById("taskName"); if (input.value) { - const task = UI.addTask(input.value); + const task = ui.addTask(input.value); if (task && task instanceof HTMLElement) task.focus(); input.value = ""; if (event.getModifierState("Control")) { @@ -217,13 +221,13 @@ function BrowserUI() { if (newDescription === oldDescription) { task.textContent = oldDescription; } else { - UI.edit(task.getAttribute("data-created")!, newDescription, oldDescription); + ui.edit(task.getAttribute("data-created")!, newDescription, oldDescription); } }, firstVisibleTask: function () { for (const task of document.getElementsByClassName("task")) { - if (task instanceof HTMLElement && task.getAttribute("data-state")! === "todo") { + if (task instanceof HTMLElement && task.getAttribute("data-state") === currentViewState) { return task; } } @@ -241,7 +245,7 @@ function BrowserUI() { while (true) { cursor = increment > 0 ? cursor.nextElementSibling : cursor.previousElementSibling; if (!cursor || !(cursor instanceof HTMLElement)) break; - if (cursor.getAttribute("data-state")! === "todo") { + if (cursor.getAttribute("data-state")! === currentViewState) { offset -= increment; valid_cursor = cursor; } @@ -285,7 +289,7 @@ function BrowserUI() { console.assert(aPriority < newPriority && newPriority < bPriority, aPriority, "<", newPriority, "<", bPriority); const newPriorityRounded = Math.round(newPriority); const okToRound = aPriority < newPriorityRounded && newPriorityRounded < bPriority; - UI.setPriority(task.getAttribute("data-created")!, okToRound ? newPriorityRounded : newPriority, Model.getPriority(task)); + ui.setPriority(task.getAttribute("data-created")!, okToRound ? newPriorityRounded : newPriority, Model.getPriority(task)); task instanceof HTMLElement && task.focus(); }, @@ -296,11 +300,21 @@ function BrowserUI() { if (newState === oldState) return; const createTimestamp = task.getAttribute("data-created")!; this.moveCursor(1) || this.moveCursor(-1); - return UI.setState(createTimestamp, newState, oldState); + return ui.setState(createTimestamp, newState, oldState); + }, + + setView: function (state: string) { + const sheet = (document.getElementById("viewStyle") as HTMLStyleElement).sheet!; + sheet.insertRule(`.task:not([data-state=${state}]) { display: none }`); + sheet.removeRule(1); + currentViewState = state; + if (document.activeElement?.getAttribute("data-state") !== state) { + this.firstVisibleTask()?.focus(); + } }, undo: function () { - const ret = UI.undo(); + const ret = ui.undo(); if (ret && ret instanceof HTMLElement) ret.focus(); }, }; @@ -327,17 +341,23 @@ function handleKey(event: any) { if (event.key == "J") return browserUI.moveTask(1); if (event.key == "K") return browserUI.moveTask(-1); if (event.key == "n") return browserUI.focusTaskNameInput(event); - if (event.key == "s") return browserUI.setState("someday-maybe"); - if (event.key == "w") return browserUI.setState("waiting"); - if (event.key == "d") return browserUI.setState("done"); if (event.key == "c") return browserUI.setState("cancelled"); + if (event.key == "d") return browserUI.setState("done"); + if (event.key == "s") return browserUI.setState("someday-maybe"); if (event.key == "t") return browserUI.setState("todo"); + if (event.key == "w") return browserUI.setState("waiting"); if (event.key == "X") return browserUI.setState("deleted"); if (event.key == "u") return browserUI.undo(); if (event.key == "e") return browserUI.beginEdit(event); if (event.key == "v") return (inputState = InputState.View); } else if (inputState === InputState.View) { - return (inputState = InputState.Command); + inputState = InputState.Command; + if (event.key == "c") return browserUI.setView("cancelled"); + if (event.key == "d") return browserUI.setView("done"); + if (event.key == "s") return browserUI.setView("someday-maybe"); + if (event.key == "t") return browserUI.setView("todo"); + if (event.key == "w") return browserUI.setView("waiting"); + if (event.key == "x") return browserUI.setView("deleted"); } } }