From 213d834e74f870b223fb76ea0183de0c45702adc Mon Sep 17 00:00:00 2001
From: e218736 <147728997+e218736@users.noreply.github.com>
Date: Mon, 26 Feb 2024 15:10:18 +0000
Subject: [PATCH] reorder fav list with keyboard
---
src/web/HTMLOperation.mjs | 4 +-
src/web/waiters/OperationsWaiter.mjs | 70 ++++++++++++++++++++++++++++
2 files changed, 72 insertions(+), 2 deletions(-)
diff --git a/src/web/HTMLOperation.mjs b/src/web/HTMLOperation.mjs
index ae61b58d..7c59b67a 100755
--- a/src/web/HTMLOperation.mjs
+++ b/src/web/HTMLOperation.mjs
@@ -52,14 +52,14 @@ class HTMLOperation {
const infoLink = this.infoURL ? `
${titleFromWikiLink(this.infoURL)}` : "";
html += ` data-container='body' data-toggle='popover' data-placement='right'
- data-content="${this.description}${infoLink}" data-html='true' data-trigger='hover'
+ data-content="${this.description}${infoLink}" data-html='true' data-trigger='hover focus'
data-boundary='viewport'`;
}
html += ">" + this.name;
if (removeIcon) {
- html += "delete";
+ html += "delete";
}
html += "";
diff --git a/src/web/waiters/OperationsWaiter.mjs b/src/web/waiters/OperationsWaiter.mjs
index dee0dd06..b232e3c0 100755
--- a/src/web/waiters/OperationsWaiter.mjs
+++ b/src/web/waiters/OperationsWaiter.mjs
@@ -237,9 +237,16 @@ class OperationsWaiter {
}
const editFavouritesList = document.getElementById("edit-favourites-list");
+ const editFavouritesListElements = editFavouritesList.getElementsByTagName('li');
editFavouritesList.innerHTML = html;
this.removeIntent = false;
+ for (let i = 0; i < editFavouritesListElements.length; i++) {
+ editFavouritesListElements[i].setAttribute("tabindex", "0");
+ editFavouritesListElements[i].addEventListener("keydown", this.ArrowNavFavourites.bind(this), false)
+ editFavouritesListElements[i].firstElementChild.addEventListener("keydown", this.deleteFavourite.bind(this), false)
+ }
+
const editableList = Sortable.create(editFavouritesList, {
filter: ".remove-icon",
onFilter: function (evt) {
@@ -270,6 +277,69 @@ class OperationsWaiter {
}
+ /**
+ * Handler for navigation key press events.
+ * Navigates through the favourites list and corresponding delete buttons.
+ * Move favourites elements up and down with Ctrl + Arrow keys to imite drag and drop mouse functionality.
+ */
+ ArrowNavFavourites(event) {
+ const currentElement = event.target;
+ const nextElement = currentElement.nextElementSibling;
+ const prevElement = currentElement.previousElementSibling;
+ const favouritesList = currentElement.parentNode;
+
+ event.preventDefault();
+ event.stopPropagation();
+ if (event.key === "ArrowDown" && !event.ctrlKey) {
+ if (nextElement === null) {
+ currentElement.parentElement.firstElementChild.focus();
+ } else {
+ nextElement.focus();
+ }
+ } else if (event.key === "ArrowUp" && !event.ctrlKey) {
+ if (prevElement === null) {
+ currentElement.parentElement.lastElementChild.focus();
+ } else {
+ prevElement.focus();
+ }
+ } else if (event.key === "Tab") {
+ currentElement.parentElement.closest(".modal-body").nextElementSibling.getElementsByTagName("Button")[0].focus();
+ } else if (event.key === "ArrowRight" ) {
+ if (currentElement.firstElementChild !== null) {
+ currentElement.firstElementChild.focus();
+ } else {
+ return
+ }
+ } else if (event.key === "ArrowLeft" && (currentElement.classList.contains("remove-icon"))) {
+ currentElement.parentElement.focus();
+ } else if (event.ctrlKey && event.key === "ArrowDown") {
+
+ if (nextElement === null) {
+ favouritesList.insertBefore(currentElement, currentElement.parentElement.firstElementChild)
+ } else {
+ favouritesList.insertBefore(currentElement, nextElement.nextElementSibling)
+ }
+ currentElement.focus();
+ } else if (event.ctrlKey && event.key === "ArrowUp") {
+ favouritesList.insertBefore(currentElement, prevElement)
+ currentElement.focus();
+}
+}
+
+ /**
+ * Handler for save favourites click events.
+ * Saves the selected favourites and reloads them.
+ */
+ deleteFavourite(event) {
+ if (event.key === "Enter") {
+ const el = event.target
+ if (el && el.parentNode) {
+ el.parentNode.remove();
+ }
+ }
+}
+
+
/**
* Handler for save favourites click events.
* Saves the selected favourites and reloads them.