package routes import ( "fmt" "github.com/LazyBachelor/LazyPM/internal/models" "github.com/LazyBachelor/LazyPM/pkg/web/components/base" ) type DashboardProps struct { Issues []*models.Issue SelectedIssue *models.Issue BaseURL string QueryParam string EmptyText string } templ Dashboard(props DashboardProps) { @BaseLayout() { @DashboardContent(props) } } templ DashboardContent(props DashboardProps) { {{ selectedID := "" if props.SelectedIssue != nil { selectedID = props.SelectedIssue.ID } issuesJSON, _ := templ.JSONString(props.Issues) xData := fmt.Sprintf(`{ selectedId: %q, issues: %s, getStatusClass(s) { switch(s) { case 'open': return 'badge-info'; case 'in_progress': return 'badge-warning'; case 'closed': return 'badge-success'; case 'blocked': return 'badge-error'; default: return 'badge-ghost'; } }, getTypeClass(t) { switch(t) { case 'bug': return 'badge-outline badge-error'; case 'feature': return 'badge-outline badge-success'; case 'task': return 'badge-outline badge-info'; case 'chore': return 'badge-outline badge-warning'; case 'epic': return 'badge-outline badge-secondary'; default: return 'badge-outline'; } }, getPriorityClass(p) { p = parseInt(p); switch(p) { case 0: case 1: return 'badge-ghost'; case 2: return 'badge-info'; case 3: return 'badge-warning'; case 4: return 'badge-error'; default: return 'badge-ghost'; } }, formatStatus(s) { return (s || '').replace(/_/g, ' ').replace(/\\b\\w/g, l => l.toUpperCase()); }, formatType(t) { return (t || '').charAt(0).toUpperCase() + (t || '').slice(1); }, formatPriority(p) { p = parseInt(p); switch(p) { case 0: return 'Irrelevant'; case 1: return 'Low'; case 2: return 'Normal'; case 3: return 'High'; case 4: return 'Critical'; default: return 'P'+p; } } }`, selectedID, issuesJSON) }}
@DashboardIssueList(props.Issues, selectedID)
} templ DashboardIssueList(issues []*models.Issue, selectedID string) {
@base.Table( []templ.Component{ base.PlainText("ID"), base.PlainText("Title"), base.PlainText("Status"), base.PlainText("Type"), base.PlainText("Priority"), }, []templ.Component{ DashboardIssueRows(issues, selectedID), }, templ.Attributes{}, )
} templ DashboardIssueRows(issues []*models.Issue, selectedID string) { if len(issues) == 0 { No issues } for _, issue := range issues { { issue.ID } i.id === '%s')?.title || %q`, issue.ID, issue.Title) }> ' + formatStatus(issues.find(i => i.id === '%s')?.status || '%s') + ''`, issue.ID, issue.ID, issue.Status) }> ' + formatType(issues.find(i => i.id === '%s')?.issue_type || '%s') + ''`, issue.ID, issue.ID, issue.IssueType) }> ' + formatPriority(issues.find(i => i.id === '%s')?.priority || %d) + ''`, issue.ID, issue.ID, issue.Priority) }> } }