61 lines
2.2 KiB
JavaScript
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();
|
|
}
|
|
});
|
|
})();
|