implementing dependency management in tui

This commit is contained in:
viljarb
2026-03-24 19:57:45 +01:00
parent 47f1cf8d09
commit 802d379de8
12 changed files with 701 additions and 15 deletions

View File

@@ -180,7 +180,7 @@ func helpBarConfig(view ViewKind) HelpBarConfig {
{Key: "/", Desc: "search"},
{Key: "a", Desc: "add"},
{Key: "c", Desc: "comment"},
{Key: "e/d/s/p/t/A", Desc: "edit"},
{Key: "e/d/s/p/t/A/D", Desc: "edit"},
{Key: "x", Desc: "delete"},
{Key: "q", Desc: "quit"},
{Key: "?", Desc: "help"},
@@ -199,6 +199,7 @@ func helpBarConfig(view ViewKind) HelpBarConfig {
{Key: "p", Desc: "change priority"},
{Key: "t", Desc: "change type"},
{Key: "A", Desc: "change assignee"},
{Key: "D", Desc: "edit dependencies"},
{Key: "q", Desc: "quit"},
{Key: "?", Desc: "help"},
},
@@ -217,7 +218,7 @@ func helpBarConfig(view ViewKind) HelpBarConfig {
{Key: "h/l", Desc: "column"},
{Key: "←/→", Desc: "move"},
{Key: "a", Desc: "add"},
{Key: "e/d/s/p/t/A/", Desc: "edit"},
{Key: "e/d/s/p/t/A/D", Desc: "edit"},
{Key: "x", Desc: "delete"},
{Key: "q", Desc: "quit"},
{Key: "?", Desc: "help"},
@@ -239,6 +240,7 @@ func helpBarConfig(view ViewKind) HelpBarConfig {
{Key: "p", Desc: "change priority"},
{Key: "t", Desc: "change type"},
{Key: "A", Desc: "change assignee"},
{Key: "D", Desc: "manage dependencies"},
{Key: "S", Desc: "select sprint"},
{Key: "n", Desc: "new sprint"},
{Key: "q", Desc: "quit"},

View File

@@ -10,10 +10,11 @@ import (
)
type IssueDetail struct {
viewport viewport.Model
issue models.Issue
comments []*models.Comment
focused bool
viewport viewport.Model
issue models.Issue
comments []*models.Comment
dependencies []*models.Issue
focused bool
}
func NewIssueDetail() IssueDetail {
@@ -34,6 +35,12 @@ func (i *IssueDetail) SetComments(comments []*models.Comment) {
i.refreshContent()
}
// SetDependencies updates the list of dependencies displayed for the current issue.
func (i *IssueDetail) SetDependencies(deps []*models.Issue) {
i.dependencies = deps
i.refreshContent()
}
func (i *IssueDetail) SetSize(width, height int) {
i.viewport = viewport.New(viewport.WithWidth(width), viewport.WithHeight(height))
i.refreshContent()
@@ -82,6 +89,7 @@ func (i *IssueDetail) refreshContent() {
style.LabelStyle.Render("Assignee:") + style.ValueStyle.Render(i.issue.Assignee),
)
dependenciesParts := i.renderDependencies()
descLabel := style.LabelStyle.Render("Description:")
descStyle := style.ValueStyle.Width(contentWidth)
descContent := descStyle.Render(i.issue.Description)
@@ -89,7 +97,9 @@ func (i *IssueDetail) refreshContent() {
commentsLabel := style.LabelStyle.MarginTop(1).Render("Comments:")
var parts []string
parts = append(parts, titleRow, idRow, typeRow, statusRow, closingReasonRow, priorityRow, assigneeRow, descLabel, descContent, commentsLabel)
parts = append(parts, titleRow, idRow, typeRow, statusRow, closingReasonRow, priorityRow, assigneeRow)
parts = append(parts, dependenciesParts...)
parts = append(parts, descLabel, descContent, commentsLabel)
parts = append(parts, i.renderComments()...)
content := lipgloss.JoinVertical(lipgloss.Left, parts...)
@@ -128,6 +138,29 @@ func (i *IssueDetail) ScrollDown(lines int) {
i.viewport.ScrollDown(lines)
}
func (i *IssueDetail) renderDependencies() []string {
depsLabel := style.LabelStyle.Render("Dependencies:")
if len(i.dependencies) == 0 {
return []string{
depsLabel,
style.ValueStyle.Render(" "),
}
}
var lines []string
lines = append(lines, depsLabel)
for _, d := range i.dependencies {
if d == nil {
continue
}
depText := d.ID
if d.Title != "" {
depText += " — " + d.Title
}
lines = append(lines, style.ValueStyle.MarginLeft(1).Render(depText))
}
return lines
}
func (i *IssueDetail) renderComments() []string {
contentWidth := max(i.viewport.Width()-4, 1)

View File

@@ -14,9 +14,10 @@ type CommonKeyMap struct {
ChangeStatus key.Binding
ChangePriority key.Binding
ChangeType key.Binding
ChangeAssignee key.Binding
AddIssue key.Binding
DeleteIssue key.Binding
ChangeAssignee key.Binding
ManageDependencies key.Binding
AddIssue key.Binding
DeleteIssue key.Binding
}
// DefaultCommonKeyMap returns the shared default bindings used by both views.
@@ -62,6 +63,10 @@ func DefaultCommonKeyMap() CommonKeyMap {
key.WithKeys("A"),
key.WithHelp("A", "change assignee"),
),
ManageDependencies: key.NewBinding(
key.WithKeys("D"),
key.WithHelp("D", "edit dependencies"),
),
AddIssue: key.NewBinding(
key.WithKeys("a"),
key.WithHelp("a", "add issue"),