import server from "../../services/server.js"; import utils from "../../services/utils.js"; const TPL = `

Keyboard shortcuts

Multiple shortcuts for the same action can be separated by comma.

Action name Shortcuts Default shortcuts Description
`; let globActions; export default class KeyboardShortcutsOptions { constructor() { $("#options-keyboard-shortcuts").html(TPL); $("#options-keyboard-shortcuts-reload-app").on("click", () => utils.reloadApp()); const $table = $("#keyboard-shortcut-table tbody"); server.get('keyboard-actions').then(actions => { globActions = actions; for (const action of actions) { const $tr = $(""); if (action.separator) { $tr.append( $('') .attr("style","background-color: var(--accented-background-color); font-weight: bold;") .text(action.separator) ) } else { $tr.append($("").text(action.actionName)) .append($("").append( $(``) .val(action.effectiveShortcuts.join(", ")) .attr('data-keyboard-action-name', action.actionName) .attr('data-default-keyboard-shortcuts', action.defaultShortcuts.join(", ")) ) ) .append($("").text(action.defaultShortcuts.join(", "))) .append($("").text(action.description)); } $table.append($tr); } }); $table.on('change', 'input.form-control', e => { const $input = $(e.target); const actionName = $input.attr('data-keyboard-action-name'); const shortcuts = $input.val() .replace('+,', "+Comma") .split(",") .map(shortcut => shortcut.replace("+Comma", "+,")) .filter(shortcut => !!shortcut); const opts = {}; opts['keyboardShortcuts' + actionName] = JSON.stringify(shortcuts); server.put('options', opts); }); $("#options-keyboard-shortcuts-set-all-to-default").on('click', async () => { const confirmDialog = await import('../confirm.js'); if (!await confirmDialog.confirm("Do you really want to reset all keyboard shortcuts to the default?")) { return; } $table.find('input.form-control').each(function() { const defaultShortcuts = $(this).attr('data-default-keyboard-shortcuts'); if ($(this).val() !== defaultShortcuts) { $(this) .val(defaultShortcuts) .trigger('change'); } }); }); const $filter = $("#keyboard-shortcut-filter"); $filter.on('keyup', () => { const filter = $filter.val().trim().toLowerCase(); $table.find("tr").each((i, el) => { if (!filter) { $(el).show(); return; } const actionName = $(el).find('input').attr('data-keyboard-action-name'); if (!actionName) { $(el).hide(); return; } const action = globActions.find(act => act.actionName === actionName); if (!action) { $(el).hide(); return; } $(el).toggle(!!( // !! to avoid toggle overloads with different behavior action.actionName.toLowerCase().includes(filter) || action.defaultShortcuts.some(shortcut => shortcut.toLowerCase().includes(filter)) || action.effectiveShortcuts.some(shortcut => shortcut.toLowerCase().includes(filter)) || (action.description && action.description.toLowerCase().includes(filter)) )); }); }); } }