Merge pull request #75 from LazyBachelor/LPM-140
LPM-140 The Sprinting Update Adds sprint support across the web UI (board + issue detail), TUI kanban, CLI/REPL, and the Beads-backed storage layer. Changes: Introduces sprint entities in storage and exposes sprint operations via IssueService. Updates web board to support backlog vs. sprint columns, sprint selection, and sprint creation routes. Updates TUI kanban to show backlog + sprint columns and adds sprint selection/creation actions.
This commit is contained in:
@@ -57,52 +57,52 @@ templ IssueDetail(props IssueDetailProps) {
|
||||
templ StatusBadge(status models.Status) {
|
||||
switch status {
|
||||
case "open":
|
||||
<span class="badge badge-info badge-sm">Open</span>
|
||||
<span class="badge badge-info badge-sm whitespace-nowrap">Open</span>
|
||||
case "in_progress":
|
||||
<span class="badge badge-warning badge-sm">In Progress</span>
|
||||
<span class="badge badge-warning badge-sm whitespace-nowrap">In Progress</span>
|
||||
case "ready_to_sprint":
|
||||
<span class="badge badge-primary badge-sm">Ready to sprint</span>
|
||||
<span class="badge badge-primary badge-sm whitespace-nowrap">Ready to sprint</span>
|
||||
case "closed":
|
||||
<span class="badge badge-success badge-sm">Closed</span>
|
||||
<span class="badge badge-success badge-sm whitespace-nowrap">Closed</span>
|
||||
case "blocked":
|
||||
<span class="badge badge-error badge-sm">Blocked</span>
|
||||
<span class="badge badge-error badge-sm whitespace-nowrap">Blocked</span>
|
||||
case "deferred":
|
||||
<span class="badge badge-ghost badge-sm">Deferred</span>
|
||||
<span class="badge badge-ghost badge-sm whitespace-nowrap">Deferred</span>
|
||||
default:
|
||||
<span class="badge badge-ghost badge-sm">{ string(status) }</span>
|
||||
<span class="badge badge-ghost badge-sm whitespace-nowrap">{ string(status) }</span>
|
||||
}
|
||||
}
|
||||
|
||||
templ TypeBadge(issueType models.IssueType) {
|
||||
switch issueType {
|
||||
case "bug":
|
||||
<span class="badge badge-outline badge-error badge-sm">Bug</span>
|
||||
<span class="badge badge-outline badge-error badge-sm whitespace-nowrap">Bug</span>
|
||||
case "feature":
|
||||
<span class="badge badge-outline badge-success badge-sm">Feature</span>
|
||||
<span class="badge badge-outline badge-success badge-sm whitespace-nowrap">Feature</span>
|
||||
case "task":
|
||||
<span class="badge badge-outline badge-info badge-sm">Task</span>
|
||||
<span class="badge badge-outline badge-info badge-sm whitespace-nowrap">Task</span>
|
||||
case "chore":
|
||||
<span class="badge badge-outline badge-warning badge-sm">Chore</span>
|
||||
<span class="badge badge-outline badge-warning badge-sm whitespace-nowrap">Chore</span>
|
||||
case "epic":
|
||||
<span class="badge badge-outline badge-secondary badge-sm">Epic</span>
|
||||
<span class="badge badge-outline badge-secondary badge-sm whitespace-nowrap">Epic</span>
|
||||
default:
|
||||
<span class="badge badge-outline badge-sm">{ string(issueType) }</span>
|
||||
<span class="badge badge-outline badge-sm whitespace-nowrap">{ string(issueType) }</span>
|
||||
}
|
||||
}
|
||||
|
||||
templ PriorityBadge(priority int) {
|
||||
switch priority {
|
||||
case 0:
|
||||
<span class="badge badge-ghost badge-sm">Irrelevant</span>
|
||||
<span class="badge badge-ghost badge-sm whitespace-nowrap">Irrelevant</span>
|
||||
case 1:
|
||||
<span class="badge badge-ghost badge-sm">Low</span>
|
||||
<span class="badge badge-ghost badge-sm whitespace-nowrap">Low</span>
|
||||
case 2:
|
||||
<span class="badge badge-info badge-sm">Normal</span>
|
||||
<span class="badge badge-info badge-sm whitespace-nowrap">Normal</span>
|
||||
case 3:
|
||||
<span class="badge badge-warning badge-sm">High</span>
|
||||
<span class="badge badge-warning badge-sm whitespace-nowrap">High</span>
|
||||
case 4:
|
||||
<span class="badge badge-error badge-sm">Critical</span>
|
||||
<span class="badge badge-error badge-sm whitespace-nowrap">Critical</span>
|
||||
default:
|
||||
<span class="badge badge-ghost badge-sm">{ fmt.Sprintf("P%d", priority) }</span>
|
||||
<span class="badge badge-ghost badge-sm whitespace-nowrap">{ fmt.Sprintf("P%d", priority) }</span>
|
||||
}
|
||||
}
|
||||
|
||||
@@ -202,44 +202,44 @@ func StatusBadge(status models.Status) templ.Component {
|
||||
ctx = templ.ClearChildren(ctx)
|
||||
switch status {
|
||||
case "open":
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "<span class=\"badge badge-info badge-sm\">Open</span>")
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "<span class=\"badge badge-info badge-sm whitespace-nowrap\">Open</span>")
|
||||
if templ_7745c5c3_Err != nil {
|
||||
return templ_7745c5c3_Err
|
||||
}
|
||||
case "in_progress":
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "<span class=\"badge badge-warning badge-sm\">In Progress</span>")
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "<span class=\"badge badge-warning badge-sm whitespace-nowrap\">In Progress</span>")
|
||||
if templ_7745c5c3_Err != nil {
|
||||
return templ_7745c5c3_Err
|
||||
}
|
||||
case "ready_to_sprint":
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "<span class=\"badge badge-primary badge-sm\">Ready to sprint</span>")
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "<span class=\"badge badge-primary badge-sm whitespace-nowrap\">Ready to sprint</span>")
|
||||
if templ_7745c5c3_Err != nil {
|
||||
return templ_7745c5c3_Err
|
||||
}
|
||||
case "closed":
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "<span class=\"badge badge-success badge-sm\">Closed</span>")
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "<span class=\"badge badge-success badge-sm whitespace-nowrap\">Closed</span>")
|
||||
if templ_7745c5c3_Err != nil {
|
||||
return templ_7745c5c3_Err
|
||||
}
|
||||
case "blocked":
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "<span class=\"badge badge-error badge-sm\">Blocked</span>")
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "<span class=\"badge badge-error badge-sm whitespace-nowrap\">Blocked</span>")
|
||||
if templ_7745c5c3_Err != nil {
|
||||
return templ_7745c5c3_Err
|
||||
}
|
||||
case "deferred":
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "<span class=\"badge badge-ghost badge-sm\">Deferred</span>")
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "<span class=\"badge badge-ghost badge-sm whitespace-nowrap\">Deferred</span>")
|
||||
if templ_7745c5c3_Err != nil {
|
||||
return templ_7745c5c3_Err
|
||||
}
|
||||
default:
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "<span class=\"badge badge-ghost badge-sm\">")
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "<span class=\"badge badge-ghost badge-sm whitespace-nowrap\">")
|
||||
if templ_7745c5c3_Err != nil {
|
||||
return templ_7745c5c3_Err
|
||||
}
|
||||
var templ_7745c5c3_Var10 string
|
||||
templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(string(status))
|
||||
if templ_7745c5c3_Err != nil {
|
||||
return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/web/components/issue_detail.templ`, Line: 72, Col: 60}
|
||||
return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/web/components/issue_detail.templ`, Line: 72, Col: 78}
|
||||
}
|
||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10))
|
||||
if templ_7745c5c3_Err != nil {
|
||||
@@ -277,39 +277,39 @@ func TypeBadge(issueType models.IssueType) templ.Component {
|
||||
ctx = templ.ClearChildren(ctx)
|
||||
switch issueType {
|
||||
case "bug":
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "<span class=\"badge badge-outline badge-error badge-sm\">Bug</span>")
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "<span class=\"badge badge-outline badge-error badge-sm whitespace-nowrap\">Bug</span>")
|
||||
if templ_7745c5c3_Err != nil {
|
||||
return templ_7745c5c3_Err
|
||||
}
|
||||
case "feature":
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "<span class=\"badge badge-outline badge-success badge-sm\">Feature</span>")
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "<span class=\"badge badge-outline badge-success badge-sm whitespace-nowrap\">Feature</span>")
|
||||
if templ_7745c5c3_Err != nil {
|
||||
return templ_7745c5c3_Err
|
||||
}
|
||||
case "task":
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "<span class=\"badge badge-outline badge-info badge-sm\">Task</span>")
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "<span class=\"badge badge-outline badge-info badge-sm whitespace-nowrap\">Task</span>")
|
||||
if templ_7745c5c3_Err != nil {
|
||||
return templ_7745c5c3_Err
|
||||
}
|
||||
case "chore":
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "<span class=\"badge badge-outline badge-warning badge-sm\">Chore</span>")
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "<span class=\"badge badge-outline badge-warning badge-sm whitespace-nowrap\">Chore</span>")
|
||||
if templ_7745c5c3_Err != nil {
|
||||
return templ_7745c5c3_Err
|
||||
}
|
||||
case "epic":
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "<span class=\"badge badge-outline badge-secondary badge-sm\">Epic</span>")
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "<span class=\"badge badge-outline badge-secondary badge-sm whitespace-nowrap\">Epic</span>")
|
||||
if templ_7745c5c3_Err != nil {
|
||||
return templ_7745c5c3_Err
|
||||
}
|
||||
default:
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "<span class=\"badge badge-outline badge-sm\">")
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "<span class=\"badge badge-outline badge-sm whitespace-nowrap\">")
|
||||
if templ_7745c5c3_Err != nil {
|
||||
return templ_7745c5c3_Err
|
||||
}
|
||||
var templ_7745c5c3_Var12 string
|
||||
templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(string(issueType))
|
||||
if templ_7745c5c3_Err != nil {
|
||||
return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/web/components/issue_detail.templ`, Line: 89, Col: 65}
|
||||
return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/web/components/issue_detail.templ`, Line: 89, Col: 83}
|
||||
}
|
||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12))
|
||||
if templ_7745c5c3_Err != nil {
|
||||
@@ -347,39 +347,39 @@ func PriorityBadge(priority int) templ.Component {
|
||||
ctx = templ.ClearChildren(ctx)
|
||||
switch priority {
|
||||
case 0:
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "<span class=\"badge badge-ghost badge-sm\">Irrelevant</span>")
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "<span class=\"badge badge-ghost badge-sm whitespace-nowrap\">Irrelevant</span>")
|
||||
if templ_7745c5c3_Err != nil {
|
||||
return templ_7745c5c3_Err
|
||||
}
|
||||
case 1:
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "<span class=\"badge badge-ghost badge-sm\">Low</span>")
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "<span class=\"badge badge-ghost badge-sm whitespace-nowrap\">Low</span>")
|
||||
if templ_7745c5c3_Err != nil {
|
||||
return templ_7745c5c3_Err
|
||||
}
|
||||
case 2:
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "<span class=\"badge badge-info badge-sm\">Normal</span>")
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "<span class=\"badge badge-info badge-sm whitespace-nowrap\">Normal</span>")
|
||||
if templ_7745c5c3_Err != nil {
|
||||
return templ_7745c5c3_Err
|
||||
}
|
||||
case 3:
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "<span class=\"badge badge-warning badge-sm\">High</span>")
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "<span class=\"badge badge-warning badge-sm whitespace-nowrap\">High</span>")
|
||||
if templ_7745c5c3_Err != nil {
|
||||
return templ_7745c5c3_Err
|
||||
}
|
||||
case 4:
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "<span class=\"badge badge-error badge-sm\">Critical</span>")
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "<span class=\"badge badge-error badge-sm whitespace-nowrap\">Critical</span>")
|
||||
if templ_7745c5c3_Err != nil {
|
||||
return templ_7745c5c3_Err
|
||||
}
|
||||
default:
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "<span class=\"badge badge-ghost badge-sm\">")
|
||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "<span class=\"badge badge-ghost badge-sm whitespace-nowrap\">")
|
||||
if templ_7745c5c3_Err != nil {
|
||||
return templ_7745c5c3_Err
|
||||
}
|
||||
var templ_7745c5c3_Var14 string
|
||||
templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("P%d", priority))
|
||||
if templ_7745c5c3_Err != nil {
|
||||
return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/web/components/issue_detail.templ`, Line: 106, Col: 74}
|
||||
return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/web/components/issue_detail.templ`, Line: 106, Col: 92}
|
||||
}
|
||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14))
|
||||
if templ_7745c5c3_Err != nil {
|
||||
|
||||
Reference in New Issue
Block a user