function editBacklog(id, title, desc, status, type) { document.getElementById('editBacklogId').value = id; document.getElementById('editBacklogTitle').value = title; document.getElementById('editBacklogDesc').value = desc; document.getElementById('editBacklogStatus').value = status; document.getElementById('editBacklogType').value = type; const modalEl = document.getElementById('editBacklogModal'); const modal = new bootstrap.Modal(modalEl); modal.show(); } /** * Escape HTML special characters in a string. */ function escapeHtml(unsafe) { return unsafe .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); } /** * Show modal with backlog item details. */ function viewBacklog(id, title, desc, status, type, created) { document.getElementById('viewBacklogTitle').textContent = title; const descEl = document.getElementById('viewBacklogDesc'); const escapedDesc = escapeHtml(desc); descEl.innerHTML = escapedDesc.replace(/\n/g, '
'); const statusBadge = document.getElementById('viewBacklogStatusBadge'); const statusMap = { 'in progress': 'warning', 'done': 'success', 'cancelled': 'secondary' }; statusBadge.textContent = status.charAt(0).toUpperCase() + status.slice(1); statusBadge.className = 'badge bg-' + (statusMap[status] || 'light'); document.getElementById('viewBacklogCreated').textContent = created; const typeMap = { 'bug': 'bi-bug-fill text-danger', 'improvement': 'bi-tools text-success', 'nice-to-have': 'bi-star text-secondary' }; const typeIcon = typeMap[type] || ''; const typeEl = document.getElementById('viewBacklogType'); if (typeIcon) { typeEl.innerHTML = ` ${type.charAt(0).toUpperCase() + type.slice(1)}`; } else { typeEl.textContent = ''; } const modalEl = document.getElementById('viewBacklogModal'); const modal = new bootstrap.Modal(modalEl); modal.show(); }