Files
UAS_WEBGIS_CindyDyraIslamay…/03PovertyMapping/assets/js/auth.js
T

170 lines
5.3 KiB
JavaScript

/* ============================================================
auth.js — Authentication and role-based UI management
============================================================ */
'use strict';
// Global user state
let currentUser = null;
let isLoggedIn = false;
let userRole = null;
// ================================================================
// Session check on page load
// ================================================================
async function checkAuth() {
try {
const response = await fetch('api/auth/check.php');
const result = await response.json();
if (result.success && result.data && result.data.logged_in === true) {
isLoggedIn = true;
currentUser = {
id: result.data.user_id,
name: result.data.name,
email: result.data.email,
role: result.data.role
};
userRole = result.data.role;
window.userRole = userRole;
window.currentUser = currentUser;
window.currentUserName = currentUser.name;
return true;
} else {
isLoggedIn = false;
currentUser = null;
userRole = null;
window.userRole = null;
window.currentUser = null;
return false;
}
} catch (error) {
console.error('Auth check failed:', error);
isLoggedIn = false;
return false;
}
}
// ================================================================
// Initialize UI based on user role
// ================================================================
function initUIByRole() {
if (!isLoggedIn || !userRole) {
window.location.href = 'login.html';
return;
}
const isAdmin = (userRole === 'admin');
window.canDelete = isAdmin;
const chartTab = document.querySelector('.nav-tab[data-tab="dashboard"]');
if (chartTab) {
chartTab.style.display = isAdmin ? '' : 'none';
}
const adminPanelBtn = document.querySelector('.btn-admin-panel');
if (adminPanelBtn) {
adminPanelBtn.style.display = ''; // SEMUA USER BISA LIHAT (Field Officer juga)
}
const adminTopBar = document.querySelector('.admin-top-bar');
if (adminTopBar) {
adminTopBar.style.display = isAdmin ? '' : 'none';
}
const userNameEl = document.getElementById('userName');
const userRoleEl = document.getElementById('userRoleDisplay');
if (userNameEl && currentUser) {
userNameEl.textContent = currentUser.name;
}
if (userRoleEl && currentUser) {
const roleLabel = userRole === 'admin' ? 'Admin' : 'Petugas Lapangan';
userRoleEl.textContent = roleLabel;
}
console.log(`UI initialized for role: ${userRole} (Admin: ${isAdmin})`);
}
// ================================================================
// Logout function
// ================================================================
async function logout() {
try {
await fetch('api/auth/check.php?action=logout', {
method: 'POST',
headers: { 'Content-Type': 'application/json' }
});
window.location.href = 'login.html';
} catch (error) {
console.error('Logout error:', error);
window.location.href = 'login.html';
}
}
// ================================================================
// Add logout button to sidebar (only if not already exists)
// ================================================================
function addLogoutButton() {
// CEK: apakah tombol logout sudah ada di HTML (dari index.html)
const existingLogoutBtn = document.querySelector('.sidebar-header .logout-btn, #logoutBtn');
if (existingLogoutBtn) {
console.log('Logout button already exists, skipping dynamic addition');
return; // JANGAN tambahkan tombol baru jika sudah ada
}
// Fallback: jika belum ada, baru tambahkan
const sidebarHeader = document.querySelector('.sidebar-header');
if (!sidebarHeader) return;
const logoutBtn = document.createElement('button');
logoutBtn.id = 'logoutBtn';
logoutBtn.className = 'logout-btn';
logoutBtn.innerHTML = '<i class="fas fa-sign-out-alt"></i>';
logoutBtn.title = 'Logout';
logoutBtn.onclick = logout;
logoutBtn.style.cssText = `
background: none;
border: none;
color: var(--danger);
font-size: 16px;
cursor: pointer;
padding: 5px;
margin-left: 10px;
border-radius: 6px;
transition: all 0.14s;
`;
logoutBtn.onmouseenter = () => logoutBtn.style.backgroundColor = 'rgba(214,50,48,0.1)';
logoutBtn.onmouseleave = () => logoutBtn.style.backgroundColor = 'transparent';
const headerRight = sidebarHeader.querySelector('div[style*="margin-left:auto"]');
if (headerRight) {
headerRight.appendChild(logoutBtn);
}
}
function canDelete() {
return userRole === 'admin';
}
function getUserRole() {
return userRole;
}
function getUserName() {
return currentUser ? currentUser.name : '';
}
window.auth = {
checkAuth,
initUIByRole,
logout,
addLogoutButton,
canDelete,
getUserRole,
getUserName,
currentUser: () => currentUser,
isLoggedIn: () => isLoggedIn,
userRole: () => userRole
};