package server
import (
"fmt"
"html"
"strings"
"github.com/dal/kaos/internal/supervisor"
)
// statusIcons maps folder names to emoji icons.
var statusIcons = map[string]string{
"backlog": "๐ฆ",
"ready": "๐",
"active": "๐",
"review": "๐",
"done": "โ
",
}
// columnOrder defines the display order of columns.
var columnOrder = []string{"backlog", "ready", "active", "review", "done"}
// renderDashboard generates the full dashboard HTML page.
func renderDashboard(columns map[string][]supervisor.Task) string {
var b strings.Builder
b.WriteString(`
KAOS Dashboard
`)
for _, col := range columnOrder {
tasks := columns[col]
icon := statusIcons[col]
b.WriteString(fmt.Sprintf(`
`, col, col))
b.WriteString(fmt.Sprintf(`
%s %s%d
`,
icon, strings.ToUpper(col), len(tasks)))
for _, t := range tasks {
b.WriteString(renderTaskCard(t))
}
b.WriteString("
\n")
}
b.WriteString(`
`)
return b.String()
}
// renderTaskCard generates HTML for a single task card.
func renderTaskCard(t supervisor.Task) string {
var b strings.Builder
b.WriteString(fmt.Sprintf(``,
t.ID, t.ID))
b.WriteString(fmt.Sprintf(`
%s
`, html.EscapeString(t.ID)))
b.WriteString(fmt.Sprintf(`
%s
`, html.EscapeString(t.Title)))
b.WriteString(fmt.Sprintf(`
%s ยท %s
`, html.EscapeString(t.Agent), html.EscapeString(t.Model)))
if len(t.DependsOn) > 0 {
b.WriteString(fmt.Sprintf(`
Zavisi od: %s
`, html.EscapeString(strings.Join(t.DependsOn, ", "))))
}
b.WriteString("
\n")
return b.String()
}
// renderTaskDetail generates HTML fragment for task detail panel.
func renderTaskDetail(t supervisor.Task, content string) string {
var b strings.Builder
b.WriteString(`โ`)
b.WriteString(fmt.Sprintf(`%s: %s
`, html.EscapeString(t.ID), html.EscapeString(t.Title)))
b.WriteString(fmt.Sprintf(`Agent: %s ยท Model: %s ยท Status: %s
`,
html.EscapeString(t.Agent), html.EscapeString(t.Model), html.EscapeString(t.Status)))
if len(t.DependsOn) > 0 {
b.WriteString(fmt.Sprintf(`Zavisi od: %s
`, html.EscapeString(strings.Join(t.DependsOn, ", "))))
}
b.WriteString(fmt.Sprintf(`%s
`, html.EscapeString(content)))
return b.String()
}