78 lines
2.6 KiB
JavaScript
78 lines
2.6 KiB
JavaScript
// Shared front-end behavior, loaded with `defer` from base.html.
|
|
|
|
if ('serviceWorker' in navigator) {
|
|
navigator.serviceWorker.register('/sw.js');
|
|
}
|
|
|
|
// Inject CSRF token into all POST forms
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
var meta = document.querySelector('meta[name="csrf-token"]');
|
|
var token = meta ? meta.content : '';
|
|
document.querySelectorAll('form').forEach(function(form) {
|
|
if (form.method.toLowerCase() === 'post') {
|
|
var inp = document.createElement('input');
|
|
inp.type = 'hidden'; inp.name = 'csrf_token'; inp.value = token;
|
|
form.appendChild(inp);
|
|
}
|
|
});
|
|
});
|
|
|
|
// "Select from list or type new" pattern on add/edit forms
|
|
function metaSelectChanged(sel, inputId) {
|
|
var input = document.getElementById(inputId);
|
|
if (sel.value === '__new__') {
|
|
input.style.display = '';
|
|
input.value = '';
|
|
input.focus();
|
|
} else {
|
|
input.style.display = 'none';
|
|
input.value = sel.value;
|
|
}
|
|
// battery_add defines updateLabelPreview to live-preview generated labels
|
|
if ((inputId === 'brand' || inputId === 'size') && typeof updateLabelPreview === 'function') {
|
|
updateLabelPreview();
|
|
}
|
|
}
|
|
|
|
(function() {
|
|
var modal = document.getElementById('confirm-modal');
|
|
var msgEl = document.getElementById('confirm-modal-msg');
|
|
var okBtn = document.getElementById('confirm-modal-ok');
|
|
var cancelBtn = document.getElementById('confirm-modal-cancel');
|
|
var _cb = null;
|
|
|
|
window.showConfirm = function(msg, onOk, okLabel, okClass) {
|
|
msgEl.textContent = msg;
|
|
okBtn.textContent = okLabel || 'Confirm';
|
|
okBtn.className = 'btn ' + (okClass || 'btn-danger');
|
|
modal.classList.add('open');
|
|
_cb = onOk;
|
|
cancelBtn.focus();
|
|
};
|
|
|
|
function closeModal() { modal.classList.remove('open'); _cb = null; }
|
|
|
|
okBtn.addEventListener('click', function() {
|
|
var cb = _cb; closeModal(); if (cb) cb();
|
|
});
|
|
cancelBtn.addEventListener('click', closeModal);
|
|
modal.addEventListener('click', function(e) { if (e.target === modal) closeModal(); });
|
|
document.addEventListener('keydown', function(e) {
|
|
if (e.key === 'Escape' && modal.classList.contains('open')) closeModal();
|
|
});
|
|
|
|
// Global handler: forms with data-confirm attribute
|
|
document.addEventListener('submit', function(e) {
|
|
var form = e.target;
|
|
var msg = form.dataset.confirm;
|
|
if (!msg || form.dataset.confirmed) return;
|
|
e.preventDefault();
|
|
var okLabel = form.dataset.confirmOk || 'Confirm';
|
|
var okClass = form.dataset.confirmClass || 'btn-danger';
|
|
window.showConfirm(msg, function() {
|
|
form.dataset.confirmed = '1';
|
|
form.submit();
|
|
}, okLabel, okClass);
|
|
});
|
|
}());
|