X-Git-Url: http://git.scottworley.com/vopamoi/blobdiff_plain/267376878a35c6548d3b3bf2ea70cc2344450da5..4c9b0554f34d5cec1d4edea51880438081615757:/vopamoi.ts?ds=sidebyside diff --git a/vopamoi.ts b/vopamoi.ts index 5916d0a..366edd6 100644 --- a/vopamoi.ts +++ b/vopamoi.ts @@ -29,6 +29,12 @@ function Clock() { } const clock = Clock(); +// Returns a promise for a hue based on a hash of the string +function hashHue(str: string) { + // Using crypto for this is overkill + return crypto.subtle.digest("SHA-256", new TextEncoder().encode(str)).then((buf) => (new Uint16Array(buf)[0] * 360) / 2 ** 16); +} + const Model = { addTask: function (timestamp: string, description: string): Element { const task = document.createElement("div"); @@ -53,6 +59,13 @@ const Model = { tag.appendChild(document.createTextNode(tagName)); tag.classList.add("tag"); tag.setAttribute("tabindex", "0"); + hashHue(tagName).then((hue) => (tag.style.backgroundColor = `hsl(${hue},90%,45%)`)); + for (const child of task.getElementsByClassName("tag")) { + if (tagName > child.textContent!) { + task.insertBefore(tag, child); + return tag; + } + } task.appendChild(tag); return tag; }, @@ -222,18 +235,17 @@ function BrowserUI() { return { addTask: function (event: KeyboardEvent) { const input = document.getElementById("taskName"); - if (input.value) { - const task = ui.addTask(input.value); - if (currentViewState === "todo") { - task instanceof HTMLElement && task.focus(); - } else if (this.returnFocusAfterInput()) { - } else { - this.firstVisibleTask()?.focus(); - } - input.value = ""; - if (event.getModifierState("Control")) { - this.setPriority(task, null, document.getElementsByClassName("task")[0]); - } + if (input.value.match(/^ *$/)) return; + const task = ui.addTask(input.value); + if (currentViewState === "todo") { + task instanceof HTMLElement && task.focus(); + } else if (this.returnFocusAfterInput()) { + } else { + this.firstVisibleTask()?.focus(); + } + input.value = ""; + if (event.getModifierState("Control")) { + this.setPriority(task, null, document.getElementsByClassName("task")[0]); } }, @@ -275,7 +287,7 @@ function BrowserUI() { task.removeChild(input); task.removeAttribute("data-description"); task.focus(); - if (newDescription === oldDescription || resolution === CommitOrAbort.Abort) { + if (resolution === CommitOrAbort.Abort || newDescription.match(/^ *$/) || newDescription === oldDescription) { desc.textContent = oldDescription; } else { ui.edit(task.getAttribute("data-created")!, newDescription, oldDescription); @@ -289,7 +301,7 @@ function BrowserUI() { input.removeEventListener("blur", this.completeTagEdit); task.removeChild(input); task.focus(); - if (resolution === CommitOrAbort.Commit && newTagName && !Model.hasTag(task, newTagName)) { + if (resolution === CommitOrAbort.Commit && !newTagName.match(/^ *$/) && !Model.hasTag(task, newTagName)) { ui.addTag(task.getAttribute("data-created")!, newTagName); lastTagNameEntered = newTagName; } @@ -384,10 +396,12 @@ function BrowserUI() { return ui.setState(createTimestamp, newState, oldState); }, - setView: function (state: string) { + setView: function (state: string, color: string) { const sheet = (document.getElementById("viewStyle") as HTMLStyleElement).sheet!; sheet.insertRule(`.task:not([data-state=${state}]) { display: none }`); - sheet.removeRule(1); + sheet.insertRule(`:root { --view-state-indicator-color: ${color}; }`); + sheet.removeRule(2); + sheet.removeRule(2); currentViewState = state; if (document.activeElement?.getAttribute("data-state") !== state) { this.firstVisibleTask()?.focus(); @@ -439,18 +453,19 @@ function handleKey(event: any) { if (event.key == "v") return (inputState = InputState.View); } else if (inputState === InputState.View) { inputState = InputState.Command; - 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 browserUI.setView("someday-maybe"); - if (event.key == "w") return browserUI.setView("waiting"); - if (event.key == "x") return browserUI.setView("deleted"); + 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 == "s") return browserUI.setView("someday-maybe", "DeepSkyBlue"); + 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"); } } } function browserInit() { - document.body.addEventListener("keydown", handleKey, { capture: false }); log.replay(); browserUI.firstVisibleTask()?.focus(); + document.body.addEventListener("keydown", handleKey, { capture: false }); }