Files

99 lines
3.4 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();
});
// Apply URL params as initial filter state on battery_list and device_list
document.addEventListener('DOMContentLoaded', function() {
var params = new URLSearchParams(window.location.search);
var statusParam = params.get('status');
if (statusParam !== null) {
var statusSel = document.getElementById('filter-status');
if (statusSel && typeof applyFilters === 'function') {
statusSel.value = statusParam;
applyFilters();
}
}
var fillParam = params.get('fill');
if (fillParam !== null) {
var fillSel = document.getElementById('filter-fill');
if (fillSel && typeof applyDeviceFilters === 'function') {
fillSel.value = fillParam;
applyDeviceFilters();
}
}
});
// 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);
});
}());