implementing dependency management in tui
This commit is contained in:
@@ -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"},
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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"),
|
||||
|
||||
Reference in New Issue
Block a user