// User roles and authentication simulation
let currentUser = {
role: 'staff', // Default to staff view
name: 'Housekeeper'
};
// Check for manager view
function checkUserRole() {
const urlParams = new URLSearchParams(window.location.search);
if (urlParams.has('role') && urlParams.get('role') === 'manager') {
currentUser.role = 'manager';
document.getElementById('manager-view-btn').classList.remove('hidden');
document.getElementById('stats-dashboard').classList.remove('hidden');
}
}
// Room status counters
const statusCounts = {
clean: 0,
dirty: 0,
'in-progress': 0,
maintenance: 0
};
// Shared functionality across pages
document.addEventListener('DOMContentLoaded', function() {
checkUserRole();
// Filter functionality
const filterBtn = document.querySelector('.filter-btn');
const filterDropdown = document.querySelector('.filter-dropdown');
const filterOptions = document.querySelectorAll('.filter-option');
const roomCards = document.querySelectorAll('.room-card');
filterBtn.addEventListener('click', () => {
filterDropdown.classList.toggle('hidden');
});
filterOptions.forEach(option => {
option.addEventListener('click', (e) => {
e.preventDefault();
const status = option.dataset.status;
roomCards.forEach(card => {
if (status === 'all') {
card.style.display = 'block';
} else {
card.style.display = card.classList.contains(`border-${status === 'clean' ? 'green' : status === 'dirty' ? 'red' : status === 'in-progress' ? 'yellow' : 'purple'}-500`) ? 'block' : 'none';
}
});
filterDropdown.classList.add('hidden');
});
});
// Count statuses
document.querySelectorAll('.room-card').forEach(card => {
if (card.classList.contains('border-green-500')) statusCounts.clean++;
else if (card.classList.contains('border-red-500')) statusCounts.dirty++;
else if (card.classList.contains('border-yellow-500')) statusCounts['in-progress']++;
else if (card.classList.contains('border-purple-500')) statusCounts.maintenance++;
});
// Update stats dashboard
document.getElementById('clean-count').textContent = statusCounts.clean;
document.getElementById('dirty-count').textContent = statusCounts.dirty;
document.getElementById('progress-count').textContent = statusCounts['in-progress'];
document.getElementById('maintenance-count').textContent = statusCounts.maintenance;
// Note buttons functionality
document.querySelectorAll('.note-btn').forEach(btn => {
btn.addEventListener('click', (e) => {
e.stopPropagation();
const roomNumber = btn.dataset.room;
const action = btn.dataset.action;
if (action === 'add') {
showNotification(`Note added to Room ${roomNumber}`, 'success');
} else {
showNotification(`Note removed from Room ${roomNumber}`, 'error');
}
});
});
// Manager view button
document.getElementById('manager-view-btn')?.addEventListener('click', () => {
window.location.href = window.location.pathname + '?role=manager';
});
// Initialize tooltips
const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl);
});
// Handle status filter dropdown
const filterButton = document.querySelector('.filter-button');
if (filterButton) {
filterButton.addEventListener('click', function() {
document.querySelector('.filter-dropdown').classList.toggle('hidden');
});
}
// Close dropdown when clicking outside
document.addEventListener('click', function(event) {
if (!event.target.closest('.filter-button') && !event.target.closest('.filter-dropdown')) {
const dropdowns = document.querySelectorAll('.filter-dropdown');
dropdowns.forEach(dropdown => {
dropdown.classList.add('hidden');
});
}
});
});
// Notification system
function showNotification(message, type = 'info') {
const notification = document.createElement('div');
notification.className = `fixed top-4 right-4 z-50 px-6 py-4 rounded-lg shadow-lg flex items-center ${type === 'success' ? 'bg-green-800' : type === 'error' ? 'bg-red-800' : 'bg-primary-700'}`;
notification.innerHTML = `
${message}
`;
document.body.appendChild(notification);
feather.replace();
setTimeout(() => {
notification.classList.add('opacity-0', 'transition-opacity', 'duration-300');
setTimeout(() => notification.remove(), 300);
}, 3000);
}