1
0
Fork 0
mirror of https://github.com/miniflux/v2.git synced 2025-08-01 17:38:37 +00:00

Add keyboard shortcuts for scrolling to top/bottom of the item list

This commit is contained in:
Matt Behrens 2024-03-19 19:30:38 -07:00 committed by GitHub
parent fe8b7a907e
commit 1ea3953271
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
21 changed files with 76 additions and 11 deletions

View file

@ -444,17 +444,31 @@ function goToPage(page, fallbackSelf) {
}
}
function goToPrevious() {
/**
*
* @param {(number|event)} offset - many items to jump for focus.
*/
function goToPrevious(offset) {
if (offset instanceof KeyboardEvent) {
offset = -1;
}
if (isListView()) {
goToListItem(-1);
goToListItem(offset);
} else {
goToPage("previous");
}
}
function goToNext() {
/**
*
* @param {(number|event)} offset - How many items to jump for focus.
*/
function goToNext(offset) {
if (offset instanceof KeyboardEvent) {
offset = 1;
}
if (isListView()) {
goToListItem(1);
goToListItem(offset);
} else {
goToPage("next");
}
@ -482,6 +496,10 @@ function goToFeed() {
}
}
// Sentinel values for specific list navigation
const TOP = 9999;
const BOTTOM = -9999;
/**
* @param {number} offset How many items to jump for focus.
*/
@ -501,8 +519,15 @@ function goToListItem(offset) {
if (items[i].classList.contains("current-item")) {
items[i].classList.remove("current-item");
const index = (i + offset + items.length) % items.length;
const item = items[index];
// By default adjust selection by offset
let itemOffset = (i + offset + items.length) % items.length;
// Allow jumping to top or bottom
if (offset == TOP) {
itemOffset = 0;
} else if (offset == BOTTOM) {
itemOffset = items.length - 1;
}
const item = items[itemOffset];
item.classList.add("current-item");
DomHelper.scrollPageTo(item);

View file

@ -9,6 +9,8 @@ document.addEventListener("DOMContentLoaded", () => {
keyboardHandler.on("g f", goToFeedOrFeeds);
keyboardHandler.on("g c", () => goToPage("categories"));
keyboardHandler.on("g s", () => goToPage("settings"));
keyboardHandler.on("g g", () => goToPrevious(TOP));
keyboardHandler.on("G", () => goToNext(BOTTOM));
keyboardHandler.on("ArrowLeft", goToPrevious);
keyboardHandler.on("ArrowRight", goToNext);
keyboardHandler.on("k", goToPrevious);