Files
mailgoserver/internal/webui/templates/webmail_shortcuts.html
T

75 lines
3.5 KiB
HTML

{{define "webmail_shortcuts"}}
<style>
.msg-row-selected { outline: 2px solid #6ea8fe; outline-offset: -2px; background-color: rgba(110, 168, 254, 0.12); }
</style>
<script>
// Keyboard shortcuts for the folder list (j/k/Enter/o/c//) and the single-message
// view (c/r/a/f/#). Feature-detects which page it's on by which elements exist,
// so one shared partial covers both without a page-specific flag.
(function() {
function isTypingTarget(el) {
if (!el) return false;
const tag = el.tagName;
return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || el.isContentEditable;
}
document.addEventListener('keydown', function(e) {
if (e.metaKey || e.ctrlKey || e.altKey) return;
if (isTypingTarget(document.activeElement)) return;
const rows = Array.from(document.querySelectorAll('.msg-row:not(.msg-row-older)'));
const searchInput = document.getElementById('mailSearchInput');
if (e.key === '/') {
if (searchInput) { e.preventDefault(); searchInput.focus(); }
return;
}
if (e.key === 'c' && typeof openCompose === 'function') {
e.preventDefault();
openCompose('/webmail/mail/compose');
return;
}
// --- Folder list: j/k select, Enter/o open, #/Delete trash the selected row.
if (rows.length) {
let idx = rows.findIndex(function(r) { return r.classList.contains('msg-row-selected'); });
if (e.key === 'j' || e.key === 'k') {
e.preventDefault();
if (idx >= 0) rows[idx].classList.remove('msg-row-selected');
idx = e.key === 'j' ? Math.min(idx + 1, rows.length - 1) : Math.max(idx - 1, 0);
rows[idx].classList.add('msg-row-selected');
rows[idx].scrollIntoView({ block: 'nearest' });
return;
}
if ((e.key === 'Enter' || e.key === 'o') && idx >= 0) {
e.preventDefault();
const link = rows[idx].querySelector('a[href]');
if (link) window.location = link.href;
return;
}
if ((e.key === '#' || e.key === 'Delete') && idx >= 0) {
e.preventDefault();
const deleteBtn = rows[idx].querySelector('form[action*="/delete"] button[type=submit]');
if (deleteBtn) deleteBtn.click();
return;
}
}
// --- Single-message view: r/a/f reply/reply-all/forward, #/Delete trash.
const replyBtn = document.getElementById('replyBtn');
if (replyBtn) {
if (e.key === 'r') { e.preventDefault(); replyBtn.click(); return; }
if (e.key === 'a') { e.preventDefault(); document.getElementById('replyAllBtn').click(); return; }
if (e.key === 'f') { e.preventDefault(); document.getElementById('forwardBtn').click(); return; }
if (e.key === '#' || e.key === 'Delete') {
e.preventDefault();
const deleteBtn = document.querySelector('form[action*="/delete"] button[type=submit]');
if (deleteBtn) deleteBtn.click();
return;
}
}
});
})();
</script>
{{end}}