]> git.scottworley.com Git - vopamoi/blobdiff - vopamoi.ts
Don't change state if it's already in that state
[vopamoi] / vopamoi.ts
index a88408f639f3c8663ff16d92f38c4476741d93a3..e997d1c38c8572ed5f60dfe7c5828c4bf5979958 100644 (file)
@@ -21,7 +21,6 @@ const Model = {
     task.setAttribute("tabindex", "0");
     task.setAttribute("data-created", timestamp);
     document.getElementById("tasks")!.appendChild(task);
-    task.focus();
     return task;
   },
 
@@ -32,6 +31,10 @@ const Model = {
     return parseFloat(task.getAttribute("data-created")!);
   },
 
+  getState: function (task: Element): string {
+    return task.getAttribute("data-state") ?? "todo";
+  },
+
   getTask: function (createTimestamp: string) {
     for (const task of document.getElementsByClassName("task")) {
       if (task.getAttribute("data-created") === createTimestamp) {
@@ -47,21 +50,19 @@ const Model = {
     for (const task of document.getElementsByClassName("task")) {
       if (task !== target && this.getPriority(task) > priority) {
         task.parentElement!.insertBefore(target, task);
-        target instanceof HTMLElement && target.focus();
         return target;
       }
     }
     document.getElementById("tasks")!.appendChild(target);
-    target instanceof HTMLElement && target.focus();
     return target;
   },
 
   setState: function (stateTimestamp: string, createTimestamp: string, state: string) {
     const task = this.getTask(createTimestamp);
     if (task) {
-      task.setAttribute(`data-${state}`, stateTimestamp);
+      task.setAttribute("data-state", state);
       if (task instanceof HTMLElement) {
-        task.style.display = "none"; // Until view filtering
+        task.style.display = state == "todo" ? "block" : "none"; // Until view filtering
       }
     }
   },
@@ -120,8 +121,9 @@ const UI = {
     undoLog.push(`Priority ${createTimestamp} ${oldPriority}`);
     return log.recordAndApply(`${Date.now()} Priority ${createTimestamp} ${newPriority}`);
   },
-  setState: function (createTimestamp: string, state: string) {
-    return log.recordAndApply(`${Date.now()} State ${createTimestamp} ${state}`);
+  setState: function (createTimestamp: string, newState: string, oldState: string) {
+    undoLog.push(`State ${createTimestamp} ${oldState}`);
+    return log.recordAndApply(`${Date.now()} State ${createTimestamp} ${newState}`);
   },
   undo: function () {
     if (undoLog.length > 0) {
@@ -135,6 +137,7 @@ const BrowserUI = {
     const input = <HTMLInputElement>document.getElementById("taskName");
     if (input.value) {
       const task = UI.addTask(input.value);
+      if (task && task instanceof HTMLElement) task.focus();
       input.value = "";
       if (event.getModifierState("Control")) {
         this.setPriority(task, null, document.getElementsByClassName("task")[0]);
@@ -207,12 +210,17 @@ const BrowserUI = {
     const newPriorityRounded = Math.round(newPriority);
     const okToRound = aPriority < newPriorityRounded && newPriorityRounded < bPriority;
     UI.setPriority(task.getAttribute("data-created")!, okToRound ? newPriorityRounded : newPriority, Model.getPriority(task));
+    task instanceof HTMLElement && task.focus();
   },
 
-  setState: function (state: string) {
-    const createTimestamp = document.activeElement?.getAttribute("data-created");
+  setState: function (newState: string) {
+    const task = document.activeElement;
+    if (!task) return;
+    const oldState = Model.getState(task);
+    if (newState === oldState) return;
+    const createTimestamp = task.getAttribute("data-created")!;
     this.moveCursor(1) || this.moveCursor(-1);
-    return UI.setState(createTimestamp!, state);
+    return UI.setState(createTimestamp, newState, oldState);
   },
 
   undo: function () {
@@ -234,6 +242,7 @@ function handleKey(event: any) {
     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 == "t") return BrowserUI.setState("todo");
     if (event.key == "X") return BrowserUI.setState("deleted");
     if (event.key == "u") return BrowserUI.undo();
   }