package views import ( "strconv" "hearthforge/internal/db" "hearthforge/internal/util" g "maragu.dev/gomponents" . "maragu.dev/gomponents/html" ) // LabelBadges shows the labels of an issue or patch, with add and remove // forms when the viewer may manage them. func LabelBadges(labels, repoLabels []db.Label, canManage bool, baseURL string) g.Node { if len(labels) == 0 && !canManage { return nil } var available []db.Label for _, l := range repoLabels { attached := false for _, al := range labels { if al.ID == l.ID { attached = true break } } if !attached { available = append(available, l) } } return Div(Class("issue-labels-row"), g.Map(labels, func(label db.Label) g.Node { return Span(Class("label-badge-wrap"), Span(Class("label-badge"), Style("background:"+label.Color+";color:"+util.LabelTextColor(label.Color)), g.Text(label.Name)), g.If(canManage, Form(Method("POST"), Action(baseURL+"/labels/remove"), Class("label-remove-form"), Input(Type("hidden"), Name("label_id"), Value(strconv.FormatInt(label.ID, 10))), Button(Type("submit"), Class("label-remove-btn"), Title("Remove label"), g.Text("×")), )), ) }), g.If(canManage && len(available) > 0, Form(Method("POST"), Action(baseURL+"/labels/add"), Class("label-add-inline-form"), Select(Name("label_id"), Class("label-select"), g.Map(available, func(label db.Label) g.Node { return Option(Value(strconv.FormatInt(label.ID, 10)), g.Text(label.Name)) }), ), Button(Type("submit"), Class("btn btn-sm btn-secondary"), g.Text("Add label")), )), ) }