Init
This commit is contained in:
@@ -0,0 +1,179 @@
|
||||
const POCKETBASE_URL = 'https://pocketbase.ccllc.pro';
|
||||
|
||||
// Initialize PocketBase client
|
||||
const pb = new PocketBase(POCKETBASE_URL);
|
||||
|
||||
// Check authentication and load user data
|
||||
async function initDashboard() {
|
||||
// Load auth from cookies first
|
||||
try {
|
||||
pb.authStore.loadFromCookie(document.cookie);
|
||||
} catch (e) {
|
||||
console.error('Error loading from cookie:', e);
|
||||
}
|
||||
|
||||
// If not valid from cookie, try loading from localStorage
|
||||
if (!pb.authStore.isValid) {
|
||||
const storedToken = localStorage.getItem('pb_auth_token');
|
||||
const storedModel = localStorage.getItem('pb_auth_model');
|
||||
|
||||
if (storedToken && storedModel) {
|
||||
try {
|
||||
pb.authStore.save(storedToken, JSON.parse(storedModel));
|
||||
} catch (e) {
|
||||
console.error('Error loading from localStorage:', e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check if user is authenticated
|
||||
if (!pb.authStore.isValid) {
|
||||
// Try to refresh the token if we have a token but it's expired
|
||||
if (pb.authStore.token) {
|
||||
try {
|
||||
await pb.collection('users').authRefresh();
|
||||
// Update localStorage after refresh
|
||||
if (pb.authStore.token && pb.authStore.model) {
|
||||
localStorage.setItem('pb_auth_token', pb.authStore.token);
|
||||
localStorage.setItem('pb_auth_model', JSON.stringify(pb.authStore.model));
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('Token refresh failed:', e);
|
||||
// If refresh fails, clear everything and redirect to login
|
||||
pb.authStore.clear();
|
||||
localStorage.removeItem('pb_auth_token');
|
||||
localStorage.removeItem('pb_auth_model');
|
||||
window.location.href = '/index.html';
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
// No token at all, redirect to login
|
||||
localStorage.removeItem('pb_auth_token');
|
||||
localStorage.removeItem('pb_auth_model');
|
||||
window.location.href = '/index.html';
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
// Display user information
|
||||
const user = pb.authStore.model;
|
||||
if (user) {
|
||||
const userEmailElement = document.getElementById('userEmail');
|
||||
const userNameElement = document.getElementById('userName');
|
||||
|
||||
if (userEmailElement) {
|
||||
userEmailElement.textContent = user.email || 'User';
|
||||
}
|
||||
if (userNameElement) {
|
||||
userNameElement.textContent = user.username || user.email || 'User';
|
||||
}
|
||||
} else {
|
||||
// No user model, redirect to login
|
||||
console.error('No user model found');
|
||||
pb.authStore.clear();
|
||||
localStorage.removeItem('pb_auth_token');
|
||||
localStorage.removeItem('pb_auth_model');
|
||||
window.location.href = '/index.html';
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Dashboard init error:', error);
|
||||
pb.authStore.clear();
|
||||
localStorage.removeItem('pb_auth_token');
|
||||
localStorage.removeItem('pb_auth_model');
|
||||
window.location.href = '/index.html';
|
||||
}
|
||||
}
|
||||
|
||||
// Get auth token for API requests
|
||||
function getAuthToken() {
|
||||
return pb.authStore.token || localStorage.getItem('pb_auth_token') || '';
|
||||
}
|
||||
|
||||
// Load dashboard statistics
|
||||
async function loadStats() {
|
||||
try {
|
||||
const token = getAuthToken();
|
||||
if (!token) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Load employees stats
|
||||
try {
|
||||
const employeesResponse = await fetch('/api/employees?page=1&perPage=1000', {
|
||||
headers: {
|
||||
'Authorization': `Bearer ${token}`,
|
||||
},
|
||||
});
|
||||
|
||||
if (employeesResponse.ok) {
|
||||
const employeesData = await employeesResponse.json();
|
||||
const totalEmployeesElement = document.getElementById('totalEmployees');
|
||||
if (totalEmployeesElement) {
|
||||
totalEmployeesElement.innerHTML = employeesData.totalItems || 0;
|
||||
}
|
||||
|
||||
// Count active employees (those with Type = "Employee")
|
||||
const activeCount = employeesData.items?.filter(emp => emp.Type === 'Employee').length || 0;
|
||||
const activeEmployeesElement = document.getElementById('activeEmployees');
|
||||
if (activeEmployeesElement) {
|
||||
activeEmployeesElement.innerHTML = activeCount;
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error loading employee stats:', error);
|
||||
}
|
||||
|
||||
// Load reports stats
|
||||
try {
|
||||
const reportsResponse = await fetch('/api/reports?page=1&perPage=1', {
|
||||
headers: {
|
||||
'Authorization': `Bearer ${token}`,
|
||||
},
|
||||
});
|
||||
|
||||
if (reportsResponse.ok) {
|
||||
const reportsData = await reportsResponse.json();
|
||||
const totalReportsElement = document.getElementById('totalReports');
|
||||
if (totalReportsElement) {
|
||||
totalReportsElement.innerHTML = reportsData.totalItems || 0;
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error loading report stats:', error);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error loading stats:', error);
|
||||
}
|
||||
}
|
||||
|
||||
// Handle logout
|
||||
function handleLogout() {
|
||||
const logoutButton = document.getElementById('logoutButton');
|
||||
|
||||
if (logoutButton) {
|
||||
logoutButton.addEventListener('click', async () => {
|
||||
try {
|
||||
await pb.authStore.clear();
|
||||
localStorage.removeItem('pb_auth_token');
|
||||
localStorage.removeItem('pb_auth_model');
|
||||
window.location.href = '/index.html';
|
||||
} catch (error) {
|
||||
console.error('Logout error:', error);
|
||||
// Clear auth store anyway
|
||||
pb.authStore.clear();
|
||||
localStorage.removeItem('pb_auth_token');
|
||||
localStorage.removeItem('pb_auth_model');
|
||||
window.location.href = '/index.html';
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Initialize dashboard when page loads
|
||||
document.addEventListener('DOMContentLoaded', async () => {
|
||||
await initDashboard();
|
||||
handleLogout();
|
||||
loadStats();
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user