function renderRooms(rooms) { const grid = document.getElementById('rooms-grid'); grid.innerHTML = ''; const isManualSort = document.getElementById('sort-select').value === 'manual' && currentFilterStatus === 'all' && !isSelectMode; rooms.forEach(room => { const progress = getRoomProgress(room); let statusBadgeColor = 'bg-slate-700 text-slate-300'; let ampelBorder = 'border-t-4 border-t-red-500 border-slate-700 shadow-red-500/5'; if (room.status === 'In Arbeit') { statusBadgeColor = 'bg-amber-500/20 text-amber-400 border border-amber-500/30'; ampelBorder = 'border-t-4 border-t-amber-500 border-slate-700 shadow-amber-500/5'; } else if (room.status === 'Fertig') { statusBadgeColor = 'bg-emerald-500/20 text-emerald-400 border border-emerald-500/30'; ampelBorder = 'border-2 border-emerald-500 shadow-emerald-500/20 shadow-lg'; } if (room.is_pinned) { ampelBorder += ' ring-1 ring-amber-400'; } const card = document.createElement('div'); card.dataset.id = room.id; const canDrag = isManualSort; card.draggable = canDrag; card.className = `bg-slate-800 ${ampelBorder} rounded-xl p-5 transition cursor-pointer flex flex-col justify-between shadow-lg relative group`; card.onclick = (e) => { if (e.target.closest('.pin-btn') || e.target.closest('.select-checkbox-container')) return; if (isSelectMode) { toggleRoomSelection(room.id, e); } else { openModal(room); } }; if (canDrag) { card.addEventListener('dragstart', handleDragStart); card.addEventListener('dragover', handleDragOver); card.addEventListener('drop', handleDrop); card.addEventListener('dragend', handleDragEnd); } const isChecked = selectedRoomIds.has(room.id); card.innerHTML = `
${isSelectMode ? `
` : ''} ${room.floor}
${canDrag ? '⋮⋮' : ''}

${room.room_number}

${room.status}
Fortschritt ${progress}%
`; grid.appendChild(card); }); } function openModal(room) { currentRoomId = room.id; document.getElementById('modal-title').textContent = `${room.room_number} (${room.floor})`; document.getElementById('modal-room-number').value = room.room_number; document.getElementById('modal-status-select').value = room.status; document.getElementById('modal-material-select').value = room.material_status || 'Offen'; document.getElementById('modal-notes').value = room.notes || ''; renderModalTasks(room.tasks || []); renderRoomHistory(room); if (typeof renderRoomPhotoComparison === 'function') { renderRoomPhotoComparison(room); } document.getElementById('room-modal').classList.remove('hidden'); } function renderModalTasks(tasks) { const tasksList = document.getElementById('modal-tasks-list'); tasksList.innerHTML = ''; if (!tasks || tasks.length === 0) { tasksList.innerHTML = '

Keine Aufgaben eingetragen. Fügen Sie oben eine neue Aufgabe hinzu.

'; return; } const adminUser = isAdmin(); tasks.forEach(task => { const isUnassigned = !task.assigned_to; let assigneeOptions = ``; allProfiles.forEach(p => { if (p.alias) { const selected = (task.assigned_to === p.id) ? 'selected' : ''; assigneeOptions += ``; } }); const rewardAmount = parseFloat(task.reward_amount || 0); let statusBadgeHTML = ''; if (rewardAmount > 0) { if (task.is_completed && !task.is_approved) { statusBadgeHTML = `💰 ${rewardAmount.toFixed(2)} € (Prüfung)`; } else if (task.is_paid) { statusBadgeHTML = `✅ Ausbezahlt`; } else if (task.is_approved) { statusBadgeHTML = `💰 ${rewardAmount.toFixed(2)} € (Bestätigt)`; } else { statusBadgeHTML = `💰 ${rewardAmount.toFixed(2)} € Vergütung`; } } const taskItem = document.createElement('div'); taskItem.className = "flex flex-col sm:flex-row items-start sm:items-center justify-between bg-slate-900 border border-slate-700 p-3 rounded-lg gap-2"; taskItem.innerHTML = `
${statusBadgeHTML}
${adminUser ? ` ` : ''}
`; tasksList.appendChild(taskItem); }); } function handleDragStart(e) { draggedCard = this; this.classList.add('dragging'); e.dataTransfer.effectAllowed = 'move'; } function handleDragOver(e) { e.preventDefault(); e.dataTransfer.dropEffect = 'move'; } function handleDrop(e) { e.preventDefault(); if (this === draggedCard) return; const grid = document.getElementById('rooms-grid'); const cards = Array.from(grid.children); const draggedIndex = cards.indexOf(draggedCard); const targetIndex = cards.indexOf(this); if (draggedIndex < targetIndex) { this.after(draggedCard); } else { this.before(draggedCard); } saveNewOrder(); } function handleDragEnd() { this.classList.remove('dragging'); draggedCard = null; }