1
0
Fork 0
mirror of https://github.com/maybe-finance/maybe.git synced 2025-07-20 13:49:39 +02:00
Maybe/app/javascript/controllers/list_keyboard_navigation_controller.js
Sergey Tyan e79ff94f6c
Improve account modal keyboard navigation (#424)
* Add back button support to account keyboard navigation and autofocus text input on the form

* Wrap modal content with keyboard navigation controller
2024-02-11 13:17:03 -06:00

39 lines
1.1 KiB
JavaScript

import { Controller } from "@hotwired/stimulus"
// Connects to data-controller="list-keyboard-navigation"
export default class extends Controller {
focusPrevious() {
this.focusLinkTargetInDirection(-1)
}
focusNext() {
this.focusLinkTargetInDirection(1)
}
focusLinkTargetInDirection(direction) {
const element = this.getLinkTargetInDirection(direction)
element?.focus()
}
getLinkTargetInDirection(direction) {
const indexOfLastFocus = this.indexOfLastFocus()
let nextIndex = (indexOfLastFocus + direction) % this.focusableLinks.length
if (nextIndex < 0) nextIndex = this.focusableLinks.length - 1
return this.focusableLinks[nextIndex]
}
indexOfLastFocus(targets = this.focusableLinks) {
const indexOfActiveElement = targets.indexOf(document.activeElement)
if (indexOfActiveElement !== -1) {
return indexOfActiveElement
} else {
return targets.findIndex(target => target.getAttribute("tabindex") === "0")
}
}
get focusableLinks() {
return Array.from(this.element.querySelectorAll("a[href]"))
}
}