this.firstVisibleTask()?.focus();
}
input.value = "";
- if (currentTagView) {
- ui.addTag(task.getAttribute("data-created")!, currentTagView);
- }
if (event.getModifierState("Control")) {
this.makeBottomPriority(task);
}
task instanceof HTMLElement && task.focus();
},
- moveCursor: function (offset: number): boolean {
+ moveCursorLeft: function () {
+ const active = this.currentTask();
+ if (!active) return false;
+ if (active.parentElement!.classList.contains("task")) {
+ active.parentElement!.focus();
+ }
+ },
+
+ moveCursorRight: function () {
+ (this.currentTask()?.getElementsByClassName("task")[0] as HTMLElement)?.focus();
+ },
+
+ moveCursorVertically: function (offset: number): boolean {
const active = this.currentTask();
if (!active) return false;
const dest = this.visibleTaskAtOffset(active, offset);
resetTagView: function () {
currentTagView = null;
- for (const task of document.getElementsByClassName("task")) {
+ const taskList = document.getElementById("tasks")!;
+ for (const task of Array.from(document.getElementsByClassName("task"))) {
task.classList.remove("hide");
+ if (task.parentElement !== taskList) {
+ Model.insertInPriorityOrder(task, taskList);
+ }
}
},
if (newState === oldState) return;
const createTimestamp = task.getAttribute("data-created")!;
if (currentViewState !== "all" || newState == "deleted") {
- this.moveCursor(1) || this.moveCursor(-1);
+ this.moveCursorVertically(1) || this.moveCursorVertically(-1);
}
return ui.setState(createTimestamp, newState, oldState);
},
- setTagView: function () {
- const target = this.currentTag();
- if (!target) return;
- const tag = target.textContent!;
+ setTagView: function (tag: string | null = null) {
+ if (tag === null) {
+ const target = this.currentTag();
+ if (!target) return;
+ tag = target.textContent!;
+ }
+
+ if (currentTagView !== null) {
+ this.resetTagView();
+ }
+
+ const tasksWithTag = new Map();
for (const task of document.getElementsByClassName("task")) {
+ if (Model.hasTag(task, tag)) {
+ tasksWithTag.set(task.getElementsByClassName("desc")[0].textContent, [Model.getPriority(task), task]);
+ }
+ }
+
+ function highestPrioritySuperTask(t: Element) {
+ var maxPriority = -1;
+ var superTask = null;
+ for (const child of t.getElementsByClassName("tag")) {
+ const e = tasksWithTag.get(child.textContent);
+ if (e !== undefined && e[0] > maxPriority) {
+ maxPriority = e[0];
+ superTask = e[1];
+ }
+ }
+ return superTask;
+ }
+
+ for (const task of Array.from(document.getElementsByClassName("task"))) {
if (Model.hasTag(task, tag)) {
task.classList.remove("hide");
} else {
- task.classList.add("hide");
+ const superTask = highestPrioritySuperTask(task);
+ if (superTask !== null) {
+ Model.insertInPriorityOrder(task, superTask);
+ } else {
+ task.classList.add("hide");
+ }
}
}
+
currentTagView = tag;
},
},
setUntaggedView: function () {
+ if (currentTagView !== null) {
+ this.resetTagView();
+ }
for (const task of document.getElementsByClassName("task")) {
if (task.getElementsByClassName("tag").length === 0) {
task.classList.remove("hide");
if (event.key == "e") return window.scrollBy(0, (inputCount ?? 1) * scrollIncrement);
if (event.key == "y") return window.scrollBy(0, (inputCount ?? 1) * -scrollIncrement);
} else {
- if (event.key == "j") return browserUI.moveCursor(inputCount ?? 1);
- if (event.key == "k") return browserUI.moveCursor(-(inputCount ?? 1));
+ if (event.key == "h") return browserUI.moveCursorLeft();
+ if (event.key == "l") return browserUI.moveCursorRight();
+ if (event.key == "j") return browserUI.moveCursorVertically(inputCount ?? 1);
+ if (event.key == "k") return browserUI.moveCursorVertically(-(inputCount ?? 1));
if (event.key == "J") return browserUI.moveTask(inputCount ?? 1);
if (event.key == "K") return browserUI.moveTask(-(inputCount ?? 1));
if (event.key == "G") return browserUI.jumpCursor(inputCount ?? MAX_SAFE_INTEGER);
if (event.key == "c") return browserUI.setView("cancelled");
if (event.key == "d") return browserUI.setView("done");
if (event.key == "i") return browserUI.setUntaggedView();
+ if (event.key == "p") return browserUI.setTagView("Project");
if (event.key == "q") return browserUI.setView("todo");
if (event.key == "s") return (inputState = InputState.VS);
if (event.key == "T") return browserUI.resetTagView();