summaryrefslogtreecommitdiffstats
path: root/apps/web-shared/src
diff options
context:
space:
mode:
authorivarlovlie <git@ivarlovlie.no>2022-06-03 00:27:12 +0200
committerivarlovlie <git@ivarlovlie.no>2022-06-03 00:27:12 +0200
commitbac386057a990200112b136674933b0220ac0ea8 (patch)
tree18a945f1e6e7e627cf4982c4d118368dde5c5ed2 /apps/web-shared/src
parent27aa1fc02a477cb4258dc3aacec0a73dd1617d49 (diff)
downloadgreatoffice-bac386057a990200112b136674933b0220ac0ea8.tar.xz
greatoffice-bac386057a990200112b136674933b0220ac0ea8.zip
refactor: Dont loose focus on search input when navigating results
Diffstat (limited to 'apps/web-shared/src')
-rw-r--r--apps/web-shared/src/components/dropdown.svelte50
-rw-r--r--apps/web-shared/src/styles/components/select-autocomplete.scss11
2 files changed, 37 insertions, 24 deletions
diff --git a/apps/web-shared/src/components/dropdown.svelte b/apps/web-shared/src/components/dropdown.svelte
index b5068a7..2cddce9 100644
--- a/apps/web-shared/src/components/dropdown.svelte
+++ b/apps/web-shared/src/components/dropdown.svelte
@@ -25,7 +25,6 @@
const INTERNAL_ID = "__dropdown-" + random_string(5);
- let entriesUlNode;
let searchInputNode;
let searchResults = [];
let searchValue = "";
@@ -34,7 +33,7 @@
let lastKeydownCode = "";
let mouseIsOverDropdown = false;
let mouseIsOverComponent = false;
-
+
$: hasSelection = entries.some((c) => c.selected === true);
$: if (searchValue.trim()) {
showCreationHint = createable && entries.every((c) => search.normalise_value(c.name) !== search.normalise_value(searchValue));
@@ -74,6 +73,7 @@
if (selected && !multiple) {
searchValue = selected.name;
}
+ document.querySelector("#" + INTERNAL_ID + " ul li.focus")?.classList.remove("focus");
showDropdown = false;
}
};
@@ -191,7 +191,7 @@
const spacePressed = event.code === "Space";
const arrowDownPressed = event.code === "ArrowDown";
const searchInputHasFocus = element_has_focus(searchInputNode);
- const focusedEntry = entriesUlNode?.querySelector("li:focus");
+ const focusedEntry = document.querySelector("#" + INTERNAL_ID + " ul .focus");
if (showDropdown && (enterPressed || arrowDownPressed)) {
event.preventDefault();
@@ -204,28 +204,39 @@
}
return;
}
+ if (searchInputHasFocus && enterPressed && showCreationHint) {
+ methods.create_entry(searchValue.trim());
+ return;
+ }
- if (searchInputHasFocus) {
- if (enterPressed && showCreationHint) {
- methods.create_entry(searchValue.trim());
- return;
- }
-
- if (arrowDownPressed) {
- const firstEntry = entriesUlNode.querySelector("li:first-of-type");
- if (firstEntry) {
- firstEntry.focus();
- }
+ if (searchInputHasFocus && !focusedEntry && arrowDownPressed) {
+ const firstEntry = document.querySelector("#" + INTERNAL_ID + " ul li:first-of-type");
+ if (firstEntry) {
+ firstEntry.classList.add("focus");
return;
}
}
if (focusedEntry && (arrowUpPressed || arrowDownPressed)) {
- if (arrowDownPressed && focusedEntry.nextElementSibling) {
- focusedEntry.nextElementSibling.focus();
- } else if (arrowUpPressed && focusedEntry.previousElementSibling) {
- focusedEntry.previousElementSibling.focus();
+ if (arrowDownPressed) {
+ if (focusedEntry.nextElementSibling) {
+ focusedEntry.nextElementSibling.classList.add("focus");
+ focusedEntry.nextElementSibling.scrollIntoView();
+ } else {
+ document.querySelector("#" + INTERNAL_ID + " ul li:first-of-type").classList.add("focus");
+ document.querySelector("#" + INTERNAL_ID + " ul li:first-of-type").scrollIntoView();
+
+ }
+ } else if (arrowUpPressed) {
+ if (focusedEntry.previousElementSibling) {
+ focusedEntry.previousElementSibling.classList.add("focus");
+ focusedEntry.previousElementSibling.scrollIntoView();
+ } else {
+ document.querySelector("#" + INTERNAL_ID + " ul li:last-of-type").classList.add("focus");
+ document.querySelector("#" + INTERNAL_ID + " ul li:last-of-type").scrollIntoView();
+ }
}
+ focusedEntry.classList.remove("focus");
return;
}
@@ -330,8 +341,7 @@
<!-- dropdown -->
<div class="autocomplete__results select-auto__results">
- <ul bind:this={entriesUlNode}
- on:keydown={(event) => event.code.startsWith("Arrow") && event.preventDefault()}
+ <ul on:keydown={(event) => event.code.startsWith("Arrow") && event.preventDefault()}
tabindex="-1"
class="autocomplete__list">
{#if searchResults.length > 0}
diff --git a/apps/web-shared/src/styles/components/select-autocomplete.scss b/apps/web-shared/src/styles/components/select-autocomplete.scss
index 78a0fb0..d5360ff 100644
--- a/apps/web-shared/src/styles/components/select-autocomplete.scss
+++ b/apps/web-shared/src/styles/components/select-autocomplete.scss
@@ -38,7 +38,7 @@ Usage: codyhouse.co/license
white-space: nowrap;
margin-right: 1px;
}
-
+
input[type="text"] {
width: auto;
}
@@ -67,7 +67,8 @@ Usage: codyhouse.co/license
color: var(--color-contrast-low);
}
- &:focus-within {
+ &:focus-within,
+ .focus {
background: var(--color-bg);
box-shadow: inset 0 0 0 1px alpha(var(--color-contrast-lower), 0), 0px 0px 0px 1px var(--color-primary);
outline: none;
@@ -140,7 +141,8 @@ Usage: codyhouse.co/license
background-color: alpha(var(--color-contrast-higher), 0.05);
}
- &:focus {
+ &:focus,
+ &.focus {
outline: none;
background-color: alpha(var(--color-primary), 0.12);
}
@@ -151,7 +153,8 @@ Usage: codyhouse.co/license
padding-right: calc(1em + var(--space-sm));
@include fontSmooth;
- &:focus {
+ &:focus,
+ .focus {
background-color: var(--color-primary-dark);
}