Move autocomplete selection using up/down

This commit is contained in:
Shweelan Samson authored and Zaid Abdulla committed 2018-12-27 01:21:18 -08:00
1 parent 4dec8921db
commit 6c57be8e81
2 files changed
+25 -4

No files matched your search

+23 -4
View File
@@ -7,6 +7,7 @@ class Autocomplete {
this.hideTimeout = null; this.hideTimeout = null;
this.visible = false; this.visible = false;
this.default = null; this.default = null;
this.selection = null;
this.container = document.createElement("div"); this.container = document.createElement("div");
this.container.style.position = "absolute"; this.container.style.position = "absolute";
@@ -30,25 +31,34 @@ class Autocomplete {
el.addEventListener("blur", () => { el.addEventListener("blur", () => {
if (this.element !== el) return; if (this.element !== el) return;
if (!this.visible) return; if (!this.visible) return;
this.default = null;
this.hide(); this.hide();
}); });
el.addEventListener("keydown", e => { el.addEventListener("keydown", e => {
if (this.element !== el) return; if (this.element !== el) return;
if (e.key === "Escape") { if (e.key === "Escape") {
this.hide(); if (this.visible) this.hide();
} else if (e.key === "Enter") { } else if (e.key === "Enter") {
if (this.default != null) { if (this.default != null) {
el.value = this.default; el.value = this.default;
e.preventDefault(); e.preventDefault();
this.update(); this.update();
} }
} else if (e.key === "ArrowDown") {
e.preventDefault();
if (this.selection == null) this.selection = 0;
else ++this.selection;
this.update();
} else if (e.key === "ArrowUp") {
e.preventDefault();
--this.selection;
this.update();
} }
}); });
el.addEventListener("input", () => { el.addEventListener("input", () => {
if (this.element !== el) return; if (this.element !== el) return;
this.selection = null;
this.update(); this.update();
}); });
} }
@@ -57,6 +67,7 @@ class Autocomplete {
this.container.style.opacity = 0; this.container.style.opacity = 0;
this.visible = false; this.visible = false;
this.default = null; this.default = null;
this.selection = null;
clearTimeout(this.hideTimeout); clearTimeout(this.hideTimeout);
this.hideTimeout = setTimeout(() => { this.hideTimeout = setTimeout(() => {
this.hideTimeout = null; this.hideTimeout = null;
@@ -94,11 +105,19 @@ class Autocomplete {
this.visible = true; this.visible = true;
} }
if (this.selection != null) {
this.selection =
((this.selection % suggestions.length) + suggestions.length) %
suggestions.length;
this.default = suggestions[this.selection];
} else {
this.default = suggestions[0]; this.default = suggestions[0];
}
for (const suggestion of suggestions) { for (const [idx, suggestion] of suggestions.entries()) {
const e = document.createElement("div"); const e = document.createElement("div");
e.className = "suggestion"; e.classList.add("suggestion");
if (idx === this.selection) e.classList.add("selected");
const t = document.createTextNode(suggestion); const t = document.createTextNode(suggestion);
e.appendChild(t); e.appendChild(t);
e.addEventListener("mousedown", ev => { e.addEventListener("mousedown", ev => {
+2
View File
@@ -638,6 +638,8 @@ span.tag {
transition: opacity var(--fade); transition: opacity var(--fade);
& > .suggestion { & > .suggestion {
padding: 5px; padding: 5px;
&.selected,
&:hover { &:hover {
background-color: var(--color3); background-color: var(--color3);
} }