Initial commit

This commit is contained in:
Porawit Dongwang
2026-09-16 23:20:08 +07:00
commit 0041668dbb
32577 changed files with 3687927 additions and 0 deletions
@@ -0,0 +1,50 @@
// assets/js/location.js
document.addEventListener('DOMContentLoaded', function() {
// Check if the current page is a staff page and if geolocation is supported
if (window.location.search.includes('page=staff')) {
if ("geolocation" in navigator) {
console.log("Geolocation supported. Starting GPS tracking...");
// Watch position updates continuously
navigator.geolocation.watchPosition(
function(position) {
const lat = position.coords.latitude;
const lng = position.coords.longitude;
// Send to server
sendLocationToServer(lat, lng);
},
function(error) {
console.error("Error getting location: ", error);
},
{
enableHighAccuracy: true,
maximumAge: 10000, // 10 seconds
timeout: 5000
}
);
} else {
console.warn("Geolocation is not supported by this browser.");
}
}
});
function sendLocationToServer(lat, lng) {
const formData = new FormData();
formData.append('action', 'update_location');
formData.append('lat', lat);
formData.append('lng', lng);
fetch('api/location.php', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
// Silently succeed
// console.log("Location updated", data);
})
.catch(error => {
console.error('Error updating location:', error);
});
}
@@ -0,0 +1,53 @@
// assets/js/main.js
document.addEventListener('DOMContentLoaded', function() {
// --- Dark Mode System ---
const themeToggleBtn = document.getElementById('themeToggle');
const htmlElement = document.documentElement;
// Check local storage or system preference
if (localStorage.getItem('theme') === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
htmlElement.classList.add('dark');
} else {
htmlElement.classList.remove('dark');
}
if (themeToggleBtn) {
themeToggleBtn.addEventListener('click', function() {
htmlElement.classList.toggle('dark');
if (htmlElement.classList.contains('dark')) {
localStorage.setItem('theme', 'dark');
} else {
localStorage.setItem('theme', 'light');
}
});
}
// --- Loading Button Global Handling ---
// If a button has 'data-loading-text', it will show a spinner when clicked within a form
const forms = document.querySelectorAll('form');
forms.forEach(form => {
form.addEventListener('submit', function(e) {
const submitBtn = form.querySelector('button[type="submit"]');
if (submitBtn) {
// Don't disable immediately if validation is required and fails, but assuming HTML5 validation passes here
submitBtn.classList.add('btn-loading');
// Optional: revert loading state if the form submission is prevented via AJAX in specific page scripts
}
});
});
// --- PWA Service Worker Registration ---
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('sw.js')
.then(registration => {
console.log('ServiceWorker registration successful with scope: ', registration.scope);
})
.catch(err => {
console.log('ServiceWorker registration failed: ', err);
});
});
}
});