X-Git-Url: http://git.scottworley.com/vopamoi/blobdiff_plain/a1aa43d897067989508bdf46e178cb27fc7464a1..5800003c2aef2d94e7225ef54c7e6eb782ac8514:/vopamoi.ts diff --git a/vopamoi.ts b/vopamoi.ts index 3b0b470..8cdc71f 100644 --- a/vopamoi.ts +++ b/vopamoi.ts @@ -46,7 +46,8 @@ const Model = { task.setAttribute("tabindex", "0"); task.setAttribute("data-created", timestamp); task.setAttribute("data-state", "todo"); - document.getElementById("tasks")!.appendChild(task); + const tasks = document.getElementById("tasks")!; + tasks.insertBefore(task, tasks.firstElementChild); return task; }, @@ -133,7 +134,7 @@ const Model = { if (!target) return null; target.setAttribute("data-priority", `${priority}`); for (const task of document.getElementsByClassName("task")) { - if (task !== target && this.getPriority(task) > priority) { + if (task !== target && this.getPriority(task) < priority) { task.parentElement!.insertBefore(target, task); return target; } @@ -266,6 +267,15 @@ enum CommitOrAbort { } function BrowserUI() { + const viewColors: { [key: string]: string } = { + all: "Gold", + cancelled: "Red", + deleted: "Black", + done: "LawnGreen", + "someday-maybe": "DeepSkyBlue", + todo: "White", + waiting: "MediumOrchid", + }; var currentViewState = "todo"; var taskFocusedBeforeJumpingToInput: HTMLElement | null = null; var lastTagNameEntered = ""; @@ -282,7 +292,7 @@ function BrowserUI() { } input.value = ""; if (event.getModifierState("Control")) { - this.makeTopPriority(task); + this.makeBottomPriority(task); } }, @@ -345,6 +355,17 @@ 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; + }, + firstVisibleTask: function () { for (const task of document.getElementsByClassName("task")) { const state = task.getAttribute("data-state"); @@ -387,10 +408,17 @@ function BrowserUI() { if (dest instanceof HTMLElement) dest.focus(); }, + makeBottomPriority: function (task: Element | null = null) { + if (!task) task = document.activeElement; + if (!task) return; + this.setPriority(task, document.getElementById("tasks")!.lastElementChild, null); + }, + makeTopPriority: function (task: Element | null = null) { if (!task) task = document.activeElement; if (!task) return; - this.setPriority(task, null, document.getElementsByClassName("task")[0]); + ui.setPriority(task.getAttribute("data-created")!, clock.now(), Model.getPriority(task)); + task instanceof HTMLElement && task.focus(); }, moveCursor: function (offset: number): boolean { @@ -419,13 +447,8 @@ 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!); }, @@ -439,14 +462,14 @@ function BrowserUI() { // Change task's priority to be between other tasks a and b. setPriority: function (task: Element, a: Element | null, b: Element | null) { - const aPriority = a === null ? 0 : Model.getPriority(a); - const bPriority = b === null ? clock.now() : Model.getPriority(b); - console.assert(aPriority < bPriority, aPriority, "<", bPriority); - const span = bPriority - aPriority; - const newPriority = aPriority + 0.1 * span + 0.8 * span * Math.random(); - console.assert(aPriority < newPriority && newPriority < bPriority, aPriority, "<", newPriority, "<", bPriority); + const aPriority = a === null ? clock.now() : Model.getPriority(a); + const bPriority = b === null ? 0 : Model.getPriority(b); + console.assert(aPriority > bPriority, aPriority, ">", bPriority); + const span = aPriority - bPriority; + const newPriority = bPriority + 0.1 * span + 0.8 * span * Math.random(); + console.assert(aPriority > newPriority && newPriority > bPriority, aPriority, ">", newPriority, ">", bPriority); const newPriorityRounded = Math.round(newPriority); - const okToRound = aPriority < newPriorityRounded && newPriorityRounded < bPriority; + const okToRound = aPriority > newPriorityRounded && newPriorityRounded > bPriority; ui.setPriority(task.getAttribute("data-created")!, okToRound ? newPriorityRounded : newPriority, Model.getPriority(task)); task instanceof HTMLElement && task.focus(); }, @@ -463,14 +486,14 @@ function BrowserUI() { return ui.setState(createTimestamp, newState, oldState); }, - setView: function (state: string, color: string) { + setView: function (state: string) { const sheet = (document.getElementById("viewStyle") as HTMLStyleElement).sheet!; if (state === "all") { sheet.insertRule(`.task[data-state=deleted] { display: none }`); } else { sheet.insertRule(`.task:not([data-state=${state}]) { display: none }`); } - sheet.insertRule(`:root { --view-state-indicator-color: ${color}; }`); + sheet.insertRule(`:root { --view-state-indicator-color: ${viewColors[state]}; }`); sheet.removeRule(2); sheet.removeRule(2); currentViewState = state; @@ -552,17 +575,17 @@ function handleKey(event: any) { if (event.key == "m") return browserUI.setState("someday-maybe"); } else if (inputState === InputState.V) { inputState = InputState.Root; - if (event.key == "a") return browserUI.setView("all", "Gold"); - if (event.key == "c") return browserUI.setView("cancelled", "Red"); - if (event.key == "d") return browserUI.setView("done", "LawnGreen"); - if (event.key == "q") return browserUI.setView("todo", "White"); + if (event.key == "a") return browserUI.setView("all"); + if (event.key == "c") return browserUI.setView("cancelled"); + 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", "White"); - if (event.key == "w") return browserUI.setView("waiting", "MediumOrchid"); - if (event.key == "x") return browserUI.setView("deleted", "Black"); + if (event.key == "v") return browserUI.setView("todo"); + if (event.key == "w") return browserUI.setView("waiting"); + if (event.key == "x") return browserUI.setView("deleted"); } else if (inputState === InputState.VS) { inputState = InputState.Root; - if (event.key == "m") return browserUI.setView("someday-maybe", "DeepSkyBlue"); + if (event.key == "m") return browserUI.setView("someday-maybe"); } } }