munin/static/tastenkuerzel.js

61 lines
2.3 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-kuerzel="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 imEingabefeld(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-kuerzel-speichern).
if (event.key === "Enter" && (event.ctrlKey || event.metaKey)) {
var form = event.target.closest && event.target.closest("form[data-kuerzel-speichern]");
if (form) {
event.preventDefault();
// requestSubmit löst wie ein Klick die Prüfung der Felder und
// das submit-Ereignis aus (wichtig für ungespeichert.js).
form.requestSubmit();
}
return;
}
if (event.ctrlKey || event.metaKey || event.altKey || imEingabefeld(event.target)) {
return;
}
if (event.key === "/") {
var suche = document.querySelector("input[type=search]");
if (suche) {
event.preventDefault();
suche.focus();
suche.select();
}
return;
}
var ziel = document.querySelector('[data-kuerzel="' + event.key + '"]');
if (ziel) {
event.preventDefault();
ziel.click();
}
});
})();