37970-vm/assets/js/main.js
Flatlogic Bot e29ef2dff4 v2
2026-01-30 14:21:32 +00:00

87 lines
3.6 KiB
JavaScript

// Service Worker Registration for Offline Capability
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/sw.js')
.then(reg => {
console.log('Service Worker registered');
// Check for updates
reg.onupdatefound = () => {
const installingWorker = reg.installing;
installingWorker.onstatechange = () => {
if (installingWorker.state === 'installed' && navigator.serviceWorker.controller) {
console.log('New content is available; please refresh.');
}
};
};
})
.catch(err => console.log('Service Worker registration failed', err));
});
}
// Online/Offline Status
window.addEventListener('online', updateOnlineStatus);
window.addEventListener('offline', updateOnlineStatus);
function updateOnlineStatus() {
const status = navigator.onLine ? 'online' : 'offline';
console.log('Status changed to:', status);
// Create/Update UI indicator if it doesn't exist
let indicator = document.getElementById('offline-indicator');
if (!navigator.onLine) {
if (!indicator) {
indicator = document.createElement('div');
indicator.id = 'offline-indicator';
indicator.className = 'alert alert-warning fixed-bottom m-0 text-center rounded-0';
indicator.style.zIndex = '9999';
indicator.innerHTML = '<i class="bi bi-wifi-off me-2"></i> You are currently offline. Changes will be synced when you reconnect.';
document.body.appendChild(indicator);
}
} else {
if (indicator) {
indicator.remove();
// Show brief "Back online" message
const onlineToast = document.createElement('div');
onlineToast.className = 'alert alert-success fixed-bottom m-0 text-center rounded-0';
onlineToast.style.zIndex = '9999';
onlineToast.innerHTML = '<i class="bi bi-wifi me-2"></i> Back online! Syncing data...';
document.body.appendChild(onlineToast);
setTimeout(() => onlineToast.remove(), 3000);
}
}
}
// Initial check
document.addEventListener('DOMContentLoaded', () => {
updateOnlineStatus();
// Attendance Table Search (Re-initialize if present)
const learnerSearch = document.getElementById('learnerSearch');
if (learnerSearch) {
learnerSearch.addEventListener('keyup', function() {
let filter = this.value.toUpperCase();
let rows = document.querySelector("#learnersTable tbody").rows;
for (let i = 0; i < rows.length; i++) {
let nameCol = rows[i].cells[0].textContent.toUpperCase();
let idCol = rows[i].cells[2].textContent.toUpperCase();
if (nameCol.indexOf(filter) > -1 || idCol.indexOf(filter) > -1) {
rows[i].style.display = "";
} else {
rows[i].style.display = "none";
}
}
});
}
// Attendance Toggle Feedback
const tableRows = document.querySelectorAll('#learnersTable tbody tr');
tableRows.forEach(row => {
const inputs = row.querySelectorAll('input[type="radio"]');
inputs.forEach(input => {
input.addEventListener('change', () => {
row.classList.add('table-light');
setTimeout(() => row.classList.remove('table-light'), 500);
});
});
});
});