munin/static/shortcuts.js
2026-10-19 10:13:56 +02:00

61 lines
2.2 KiB
JavaScript

// Tastenkürzel für Leute, die viel pflegen.
//
// / Suchfeld der Seite
// n neuer Eintrag
// e Eintrag bearbeiten
// Strg+Enter Formular speichern (Cmd+Enter auf dem Mac)
//
// Welches Ziel eine Taste hat, steht in der Seite selbst: Ein Link oder Knopf
// mit data-shortcut="n" wird bei "n" ausgelöst. Gibt es keinen — weil die
// Rolle nicht schreiben darf oder die Seite keinen Eintrag zeigt —, passiert
// nichts. So bleiben die Rechte an genau einer Stelle, im Template.
//
// Einzelne Buchstaben gelten nur, wenn gerade kein Eingabefeld den Fokus hat.
// Sonst ließe sich kein "n" mehr tippen. Mit Strg/Alt/Cmd zusammen bleiben sie
// ebenfalls dem Browser überlassen (Strg+N = neues Fenster).
(function () {
"use strict";
function inInputField(element) {
if (!element) {
return false;
}
var tag = element.tagName;
return tag === "INPUT" || tag === "TEXTAREA" || tag === "SELECT" || element.isContentEditable;
}
document.addEventListener("keydown", function (event) {
// Strg+Enter / Cmd+Enter: das Formular abschicken, in dem man gerade
// schreibt — nur bei Formularen, die das wollen (data-shortcut-save).
if (event.key === "Enter" && (event.ctrlKey || event.metaKey)) {
var form = event.target.closest && event.target.closest("form[data-shortcut-save]");
if (form) {
event.preventDefault();
// requestSubmit löst wie ein Klick die Prüfung der Felder und
// das submit-Ereignis aus (wichtig für unsaved.js).
form.requestSubmit();
}
return;
}
if (event.ctrlKey || event.metaKey || event.altKey || inInputField(event.target)) {
return;
}
if (event.key === "/") {
var search = document.querySelector("input[type=search]");
if (search) {
event.preventDefault();
search.focus();
search.select();
}
return;
}
var dest = document.querySelector('[data-shortcut="' + event.key + '"]');
if (dest) {
event.preventDefault();
dest.click();
}
});
})();