document.addEventListener('DOMContentLoaded', function() { // Initialize app state if (!localStorage.getItem('shiftMasterData')) { localStorage.setItem('shiftMasterData', JSON.stringify({ workers: [], shifts: [], schedule: [] })); } // Load data from localStorage let appData = JSON.parse(localStorage.getItem('shiftMasterData')); // DOM Elements const addWorkerBtn = document.getElementById('addWorkerBtn'); const workerForm = document.getElementById('workerForm'); const saveWorker = document.getElementById('saveWorker'); const cancelWorker = document.getElementById('cancelWorker'); const workersList = document.getElementById('workersList'); const addShiftBtn = document.getElementById('addShiftBtn'); const shiftForm = document.getElementById('shiftForm'); const saveShift = document.getElementById('saveShift'); const cancelShift = document.getElementById('cancelShift'); const shiftsList = document.getElementById('shiftsList'); const generateSchedule = document.getElementById('generateSchedule'); const scheduleResults = document.getElementById('scheduleResults'); const scheduleTableBody = document.getElementById('scheduleTableBody'); const saveSchedule = document.getElementById('saveSchedule'); // Worker Management addWorkerBtn.addEventListener('click', () => { workerForm.classList.toggle('hidden'); }); cancelWorker.addEventListener('click', () => { workerForm.classList.add('hidden'); document.getElementById('workerName').value = ''; document.querySelectorAll('#workerForm input[type="checkbox"]').forEach(checkbox => { checkbox.checked = false; }); document.getElementById('shiftPreference').value = 'any'; }); saveWorker.addEventListener('click', () => { const name = document.getElementById('workerName').value.trim(); const daysAvailable = Array.from(document.querySelectorAll('#workerForm input[type="checkbox"]:checked')) .map(checkbox => checkbox.id); const shiftPreference = document.getElementById('shiftPreference').value; if (!name) { alert('Please enter a worker name'); return; } const newWorker = { id: Date.now().toString(), name, daysAvailable, shiftPreference }; appData.workers.push(newWorker); saveData(); renderWorkers(); workerForm.classList.add('hidden'); document.getElementById('workerName').value = ''; document.querySelectorAll('#workerForm input[type="checkbox"]').forEach(checkbox => { checkbox.checked = false; }); document.getElementById('shiftPreference').value = 'any'; }); // Shift Management addShiftBtn.addEventListener('click', () => { shiftForm.classList.toggle('hidden'); }); cancelShift.addEventListener('click', () => { shiftForm.classList.add('hidden'); document.getElementById('shiftDate').value = ''; document.getElementById('shiftStart').value = ''; document.getElementById('shiftEnd').value = ''; document.getElementById('shiftRole').value = ''; }); saveShift.addEventListener('click', () => { const date = document.getElementById('shiftDate').value; const start = document.getElementById('shiftStart').value; const end = document.getElementById('shiftEnd').value; const role = document.getElementById('shiftRole').value.trim(); if (!date || !start || !end || !role) { alert('Please fill all shift details'); return; } const newShift = { id: Date.now().toString(), date, start, end, role, assignedWorker: null }; appData.shifts.push(newShift); saveData(); renderShifts(); shiftForm.classList.add('hidden'); document.getElementById('shiftDate').value = ''; document.getElementById('shiftStart').value = ''; document.getElementById('shiftEnd').value = ''; document.getElementById('shiftRole').value = ''; }); // Schedule Generation generateSchedule.addEventListener('click', () => { if (appData.workers.length === 0 || appData.shifts.length === 0) { alert('Please add workers and shifts first'); return; } // Show loading state const spinner = generateSchedule.querySelector('i'); spinner.classList.remove('hidden'); generateSchedule.disabled = true; // Simulate processing time setTimeout(() => { generateScheduleAlgorithm(); spinner.classList.add('hidden'); generateSchedule.disabled = false; scheduleResults.classList.remove('hidden'); }, 1000); }); saveSchedule.addEventListener('click', () => { saveData(); alert('Schedule saved successfully!'); }); // Helper Functions function saveData() { localStorage.setItem('shiftMasterData', JSON.stringify(appData)); } function renderWorkers() { if (appData.workers.length === 0) { workersList.innerHTML = '
No workers added yet
'; return; } workersList.innerHTML = ''; appData.workers.forEach(worker => { const days = worker.daysAvailable.length > 0 ? worker.daysAvailable.join(', ') : 'Not specified'; const preference = worker.shiftPreference === 'any' ? 'Any shift' : worker.shiftPreference.charAt(0).toUpperCase() + worker.shiftPreference.slice(1); const workerElement = document.createElement('div'); workerElement.className = 'worker-card bg-gray-50 p-3 rounded-lg border border-gray-200'; workerElement.innerHTML = `Available: ${days}
Prefers: ${preference}
No shifts created yet
'; return; } shiftsList.innerHTML = ''; appData.shifts.forEach(shift => { const dateObj = new Date(shift.date); const formattedDate = dateObj.toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric' }); const shiftElement = document.createElement('div'); shiftElement.className = 'shift-card bg-gray-50 p-3 rounded-lg border border-gray-200'; shiftElement.innerHTML = `${shift.start} - ${shift.end}
Role: ${shift.role}
${shift.assignedWorker ? `Assigned: ${getWorkerName(shift.assignedWorker)}
` : ''}