You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
3.0 KiB
120 lines
3.0 KiB
// Page navigation methods called by shortcuts
|
|
const state = {
|
|
active_menu: 1,
|
|
menu_selector: '.main-menu-item',
|
|
menu_active_selector: '.active',
|
|
};
|
|
|
|
export function moveFocusLeft() {
|
|
moveFocusLeftRight('left');
|
|
}
|
|
|
|
export function moveFocusRight() {
|
|
moveFocusLeftRight('right');
|
|
}
|
|
|
|
export function moveFocusDown() {
|
|
moveFocusUpDown('down');
|
|
}
|
|
|
|
export function moveFocusUp() {
|
|
moveFocusUpDown('up');
|
|
}
|
|
|
|
// Navigate to whatever item has been selected in the UI by other shortcuts
|
|
export function enterFocused() {
|
|
const activeMainMenuItem = document.querySelector(state.menu_selector + '.focus a');
|
|
if (activeMainMenuItem) {
|
|
return (location.href = activeMainMenuItem.getAttribute('href'));
|
|
}
|
|
|
|
const activeUnit = document.querySelector(
|
|
'.js-unit.focus .units-table-row-actions .shortcut-enter a'
|
|
);
|
|
if (activeUnit) {
|
|
location.href = activeUnit.getAttribute('href');
|
|
}
|
|
}
|
|
|
|
// Either click or follow a link based on the data-key-action attribute
|
|
export function executeShortcut(elm) {
|
|
const action = elm.dataset.keyAction;
|
|
if (action === 'js') {
|
|
return elm.querySelector('.data-controls').click();
|
|
}
|
|
|
|
if (action === 'href') {
|
|
location.href = elm.querySelector('a').getAttribute('href');
|
|
}
|
|
}
|
|
|
|
function moveFocusLeftRight(direction) {
|
|
const menuSelector = state.menu_selector;
|
|
const activeSelector = state.menu_active_selector;
|
|
const menuItems = Array.from(document.querySelectorAll(menuSelector));
|
|
const currentFocused = document.querySelector(`${menuSelector}.focus`);
|
|
const currentActive = document.querySelector(menuSelector + activeSelector);
|
|
let index = menuItems.indexOf(currentFocused);
|
|
|
|
if (index === -1) {
|
|
index = menuItems.indexOf(currentActive);
|
|
}
|
|
|
|
menuItems.forEach((item) => item.classList.remove('focus'));
|
|
|
|
if (direction === 'left') {
|
|
if (index > 0) {
|
|
menuItems[index - 1].classList.add('focus');
|
|
} else {
|
|
switchMenu('last');
|
|
}
|
|
} else if (direction === 'right') {
|
|
if (index < menuItems.length - 1) {
|
|
menuItems[index + 1].classList.add('focus');
|
|
} else {
|
|
switchMenu('first');
|
|
}
|
|
}
|
|
}
|
|
|
|
function moveFocusUpDown(direction) {
|
|
const units = Array.from(document.querySelectorAll('.js-unit'));
|
|
const currentFocused = document.querySelector('.js-unit.focus');
|
|
let index = units.indexOf(currentFocused);
|
|
|
|
if (index === -1) {
|
|
index = 0;
|
|
}
|
|
|
|
if (direction === 'up' && index > 0) {
|
|
index--;
|
|
} else if (direction === 'down' && index < units.length - 1) {
|
|
index++;
|
|
} else {
|
|
return;
|
|
}
|
|
|
|
if (currentFocused) {
|
|
currentFocused.classList.remove('focus');
|
|
}
|
|
|
|
units[index].classList.add('focus');
|
|
|
|
window.scrollTo({
|
|
top: units[index].getBoundingClientRect().top - 200 + window.scrollY,
|
|
behavior: 'smooth',
|
|
});
|
|
}
|
|
|
|
function switchMenu(position = 'first') {
|
|
if (state.active_menu === 0) {
|
|
state.active_menu = 1;
|
|
state.menu_selector = '.main-menu-item';
|
|
state.menu_active_selector = '.active';
|
|
|
|
const menuItems = document.querySelectorAll(state.menu_selector);
|
|
const focusedIndex = position === 'first' ? 0 : menuItems.length - 1;
|
|
menuItems[focusedIndex].classList.add('focus');
|
|
}
|
|
}
|