diff --git a/src/dashboard/templates/base.html b/src/dashboard/templates/base.html index 3ce1ee4..70800be 100644 --- a/src/dashboard/templates/base.html +++ b/src/dashboard/templates/base.html @@ -327,7 +327,11 @@ .then(function(data) { var list = document.getElementById('notif-list'); if (!data.length) { - list.innerHTML = '
No recent notifications
'; + list.innerHTML = ''; + var emptyDiv = document.createElement('div'); + emptyDiv.className = 'mc-notif-empty'; + emptyDiv.textContent = 'No recent notifications'; + list.appendChild(emptyDiv); return; } list.innerHTML = ''; diff --git a/src/dashboard/templates/partials/agent_panel_chat.html b/src/dashboard/templates/partials/agent_panel_chat.html index 821e64a..055b678 100644 --- a/src/dashboard/templates/partials/agent_panel_chat.html +++ b/src/dashboard/templates/partials/agent_panel_chat.html @@ -120,14 +120,17 @@ function updateFromData(data) { if (data.is_working && data.current_task) { - statusEl.innerHTML = 'working...'; + statusEl.textContent = 'working...'; + statusEl.style.color = '#ffaa00'; banner.style.display = 'block'; taskTitle.textContent = data.current_task.title; } else if (data.tasks_ahead > 0) { - statusEl.innerHTML = 'queue: ' + data.tasks_ahead + ' ahead'; + statusEl.textContent = 'queue: ' + data.tasks_ahead + ' ahead'; + statusEl.style.color = '#888'; banner.style.display = 'none'; } else { - statusEl.innerHTML = 'ready'; + statusEl.textContent = 'ready'; + statusEl.style.color = '#00ff88'; banner.style.display = 'none'; } } diff --git a/src/dashboard/templates/swarm_live.html b/src/dashboard/templates/swarm_live.html index c299517..0ebd93e 100644 --- a/src/dashboard/templates/swarm_live.html +++ b/src/dashboard/templates/swarm_live.html @@ -198,17 +198,43 @@ function addActivityEvent(evt) { } catch(e) {} } - item.innerHTML = ` -
${icon}
-
-
${label}
- ${desc ? `
${desc}
` : ''} -
- ${time} - ${evt.source || 'system'} -
-
- `; + // Build DOM safely using createElement and textContent + var iconDiv = document.createElement('div'); + iconDiv.className = 'activity-icon'; + iconDiv.textContent = icon; + + var contentDiv = document.createElement('div'); + contentDiv.className = 'activity-content'; + + var labelDiv = document.createElement('div'); + labelDiv.className = 'activity-label'; + labelDiv.textContent = label; + contentDiv.appendChild(labelDiv); + + if (desc) { + var descDiv = document.createElement('div'); + descDiv.className = 'activity-desc'; + descDiv.textContent = desc; + contentDiv.appendChild(descDiv); + } + + var metaDiv = document.createElement('div'); + metaDiv.className = 'activity-meta'; + + var timeSpan = document.createElement('span'); + timeSpan.className = 'activity-time'; + timeSpan.textContent = time; + + var sourceSpan = document.createElement('span'); + sourceSpan.className = 'activity-source'; + sourceSpan.textContent = evt.source || 'system'; + + metaDiv.appendChild(timeSpan); + metaDiv.appendChild(sourceSpan); + contentDiv.appendChild(metaDiv); + + item.appendChild(iconDiv); + item.appendChild(contentDiv); // Add to top container.insertBefore(item, container.firstChild);