mirror of
https://github.com/ankitects/anki.git
synced 2025-09-19 06:22:22 -04:00
Add some visual for TagAutocomplete
This commit is contained in:
parent
227c41b525
commit
11c6fe880b
3 changed files with 53 additions and 5 deletions
|
@ -30,6 +30,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
class:btn-night={nightMode}
|
class:btn-night={nightMode}
|
||||||
title={tooltip}
|
title={tooltip}
|
||||||
on:click
|
on:click
|
||||||
|
on:mouseenter
|
||||||
on:focus
|
on:focus
|
||||||
on:keydown
|
on:keydown
|
||||||
on:mousedown|preventDefault
|
on:mousedown|preventDefault
|
||||||
|
|
|
@ -15,7 +15,17 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
export { className as class };
|
export { className as class };
|
||||||
|
|
||||||
let autocomplete: Dropdown | undefined;
|
let autocomplete: Dropdown | undefined;
|
||||||
|
let original: string | undefined;
|
||||||
|
|
||||||
let displayed: string[] = [];
|
let displayed: string[] = [];
|
||||||
|
let selected: number | null = null;
|
||||||
|
let active: boolean = false;
|
||||||
|
|
||||||
|
function select(index: number) {
|
||||||
|
selected = index;
|
||||||
|
}
|
||||||
|
|
||||||
|
function choose() {}
|
||||||
|
|
||||||
function switchUpDown(event: KeyboardEvent): void {
|
function switchUpDown(event: KeyboardEvent): void {
|
||||||
const target = event.currentTarget as HTMLButtonElement;
|
const target = event.currentTarget as HTMLButtonElement;
|
||||||
|
@ -37,10 +47,40 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
const updateAutocomplete =
|
const updateAutocomplete =
|
||||||
(createDropdown: (element: HTMLElement) => Dropdown) =>
|
(createDropdown: (element: HTMLElement) => Dropdown) =>
|
||||||
(event: KeyboardEvent): Dropdown => {
|
(event: KeyboardEvent): Dropdown => {
|
||||||
const target = event.target as HTMLElement;
|
const target = event.target as HTMLInputElement;
|
||||||
autocomplete = createDropdown(target);
|
autocomplete = createDropdown(target);
|
||||||
autocomplete.show();
|
autocomplete.show();
|
||||||
|
|
||||||
|
displayed = suggestions;
|
||||||
|
|
||||||
|
if (
|
||||||
|
event.code === "ArrowDown" ||
|
||||||
|
(event.code === "Tab" && event.shiftKey)
|
||||||
|
) {
|
||||||
|
event.preventDefault();
|
||||||
|
if (selected === null) {
|
||||||
|
selected = displayed.length - 1;
|
||||||
|
} else if (selected === 0) {
|
||||||
|
selected = null;
|
||||||
|
} else {
|
||||||
|
selected--;
|
||||||
|
}
|
||||||
|
} else if (event.code === "ArrowUp" || event.code === "Tab") {
|
||||||
|
event.preventDefault();
|
||||||
|
if (selected === null) {
|
||||||
|
selected = 0;
|
||||||
|
} else if (selected >= displayed.length - 1) {
|
||||||
|
selected = null;
|
||||||
|
} else {
|
||||||
|
selected++;
|
||||||
|
}
|
||||||
|
} else if (event.code === "Enter") {
|
||||||
|
event.preventDefault();
|
||||||
|
active = true;
|
||||||
|
} else {
|
||||||
|
original = target.value;
|
||||||
|
}
|
||||||
|
|
||||||
return autocomplete;
|
return autocomplete;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -50,6 +90,8 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
}
|
}
|
||||||
|
|
||||||
autocomplete.hide();
|
autocomplete.hide();
|
||||||
|
selected = null;
|
||||||
|
active = false;
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
@ -57,11 +99,16 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
<slot
|
<slot
|
||||||
updateAutocomplete={updateAutocomplete(createDropdown)}
|
updateAutocomplete={updateAutocomplete(createDropdown)}
|
||||||
{destroyAutocomplete}
|
{destroyAutocomplete}
|
||||||
|
selected={displayed[selected ?? -1]}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<DropdownMenu id={menuId} class={className}>
|
<DropdownMenu id={menuId} class={className}>
|
||||||
{#each suggestions as tag}
|
{#each displayed as tag, i}
|
||||||
<DropdownItem>{tag}</DropdownItem>
|
<DropdownItem
|
||||||
|
class={i === selected ? (active ? "active" : "focus") : ""}
|
||||||
|
on:mouseenter={() => select(i)}
|
||||||
|
on:click>{tag}</DropdownItem
|
||||||
|
>
|
||||||
{/each}
|
{/each}
|
||||||
</DropdownMenu>
|
</DropdownMenu>
|
||||||
</WithDropdownMenu>
|
</WithDropdownMenu>
|
||||||
|
|
|
@ -156,8 +156,8 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
<TagInput
|
<TagInput
|
||||||
bind:input={newInput}
|
bind:input={newInput}
|
||||||
bind:name={newName}
|
bind:name={newName}
|
||||||
on:keydown={() => {}}
|
on:keydown={updateAutocomplete}
|
||||||
on:blur={() => {}}
|
on:blur={destroyAutocomplete}
|
||||||
on:tagupdate={appendTag}
|
on:tagupdate={appendTag}
|
||||||
on:tagadd={appendTag}
|
on:tagadd={appendTag}
|
||||||
on:tagjoinprevious={joinWithLastTag}
|
on:tagjoinprevious={joinWithLastTag}
|
||||||
|
|
Loading…
Reference in a new issue