Files
2026-09-16 23:20:08 +07:00

113 lines
5.0 KiB
PHP

</main>
<footer class="mt-auto py-6 px-6 lg:px-8 border-t border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 transition-colors">
<div class="flex flex-col md:flex-row justify-between items-center text-sm text-slate-500 dark:text-slate-400">
<div class="mb-2 md:mb-0">
&copy; <?= date('Y') + 543 ?> โรงพยาบาลเกาะสมุย (Samui Hospital). All rights reserved.
</div>
<div class="flex items-center space-x-4">
<span>ระบบจัดการข้อมูลเงินเดือนเจ้าหน้าที่</span>
<div class="mt-4 md:mt-0 flex items-center space-x-4">
<span class="text-sm font-medium text-slate-500 bg-white dark:bg-slate-800 px-3 py-1 rounded-full shadow-sm border border-slate-200 dark:border-slate-700">
v<?= htmlspecialchars((new \app\Models\SystemSettingModel())->getSetting('app_version', '1.0.0')) ?>
</span>
</div>
</div>
</div>
</footer>
</div>
</div>
<!-- SweetAlert2 -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
// Theme Toggle Logic
const themeToggle = document.getElementById('themeToggle');
const themeIcon = document.getElementById('themeIcon');
const html = document.documentElement;
function updateThemeIcon() {
if (html.classList.contains('dark')) {
themeIcon.innerHTML = '<path stroke-linecap="round" stroke-linejoin="round" d="M12 3v2.25m6.364.386-1.591 1.591M21 12h-2.25m-.386 6.364-1.591-1.591M12 18.75V21m-4.773-4.227-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0Z" />';
} else {
themeIcon.innerHTML = '<path stroke-linecap="round" stroke-linejoin="round" d="M21.752 15.002A9.72 9.72 0 0 1 18 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 0 0 3 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 0 0 9.002-5.998Z" />';
}
}
updateThemeIcon();
if (themeToggle) {
themeToggle.addEventListener('click', () => {
html.classList.toggle('dark');
if (html.classList.contains('dark')) {
localStorage.theme = 'dark';
} else {
localStorage.theme = 'light';
}
updateThemeIcon();
});
}
// Sidebar Toggle Logic for Mobile
const sidebarToggle = document.getElementById('sidebarToggle');
const sidebar = document.getElementById('sidebar');
const sidebarOverlay = document.getElementById('sidebarOverlay');
function toggleSidebar() {
sidebar.classList.toggle('-translate-x-full');
if (sidebar.classList.contains('-translate-x-full')) {
sidebarOverlay.classList.remove('opacity-100');
setTimeout(() => sidebarOverlay.classList.add('hidden'), 300);
} else {
sidebarOverlay.classList.remove('hidden');
setTimeout(() => sidebarOverlay.classList.add('opacity-100'), 10);
}
}
if (sidebarToggle) sidebarToggle.addEventListener('click', toggleSidebar);
if (sidebarOverlay) sidebarOverlay.addEventListener('click', toggleSidebar);
// SweetAlert2 Alerts
const Toast = Swal.mixin({
toast: true,
position: 'top-end',
showConfirmButton: false,
timer: 3000,
timerProgressBar: true,
didOpen: (toast) => {
toast.addEventListener('mouseenter', Swal.stopTimer)
toast.addEventListener('mouseleave', Swal.resumeTimer)
}
});
<?php if (isset($_SESSION['error'])): ?>
Toast.fire({
icon: 'error',
title: '<?= htmlspecialchars($_SESSION['error'], ENT_QUOTES, 'UTF-8') ?>'
});
<?php unset($_SESSION['error']); ?>
<?php endif; ?>
<?php if (isset($_SESSION['success'])): ?>
Toast.fire({
icon: 'success',
title: '<?= htmlspecialchars($_SESSION['success'], ENT_QUOTES, 'UTF-8') ?>'
});
<?php unset($_SESSION['success']); ?>
<?php endif; ?>
// PWA Service Worker Registration
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('<?= BASE_URL ?>/public/sw.js')
.then(registration => console.log('SW registered'))
.catch(err => console.log('SW registration failed:', err));
});
}
});
</script>
</body>
</html>