feat(attestation): improve tags suggestion UX, can validate on click

This commit is contained in:
Colin Darie 2023-12-21 11:21:14 +01:00
parent 277b4f4ec8
commit bb19674339
No known key found for this signature in database
GPG key ID: 8C76CADD40253590
2 changed files with 27 additions and 6 deletions

View file

@ -84,6 +84,7 @@ class SuggestionMenu {
destroy() {
this.#popup?.destroy();
this.#element?.remove();
this.#element?.removeEventListener('click', this.handleItemClick);
}
private render() {
@ -94,25 +95,40 @@ class SuggestionMenu {
.map((item, i) => {
return `<li><button class="fr-tag fr-tag--sm" aria-pressed="${
i == this.#selectedIndex ? 'true' : 'false'
}">${item.label}</button></li>`;
}" data-tag-index="${i}">${item.label}</button></li>`;
})
.join('');
this.#element.classList.add('fr-menu__list');
list.innerHTML = html;
const hint =
'<li><span class="fr-hint-text">Tapez le nom dune balise, naviguez avec les flèches du clavier, validez avec Entrée ou en cliquant sur la balise.</span></li>';
list.innerHTML = hint + html;
list.querySelector<HTMLElement>('.selected')?.focus();
}
private createMenu() {
const menu = document.createElement('div');
const list = document.createElement('ul');
menu.classList.add('fr-menu');
list.classList.add('fr-menu__list', 'fr-tags-group');
const list = document.createElement('ul');
list.classList.add('fr-menu__list', 'fr-tag-list');
menu.appendChild(list);
menu.addEventListener('click', this.handleItemClick);
return menu;
}
private handleItemClick = (event: Event) => {
const target = event.target as HTMLElement;
if (!target || target.dataset.tagIndex === undefined) {
return;
}
this.#props.command(this.#props.items[Number(target.dataset.tagIndex)]);
this.#popup?.hide();
};
private up() {
this.#selectedIndex =
(this.#selectedIndex + this.#props.items.length - 1) %
@ -145,6 +161,7 @@ export function createSuggestionMenu(
): Omit<SuggestionOptions<TagSchema>, 'editor'> {
return {
char: '@',
allowSpaces: true,
items: ({ query }) => {
return matchSorter(tags, query, { keys: ['label'] }).slice(0, 6);
},