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