@@ -24,24 +24,16 @@ type Event struct { func (e Event) Render() []*html.Node { // TODO: Make this much nicer. // <div class="list-entry event event-{{.Type}}"> // {{.Icon}} // <div class="event-header"> // <img class="inline-avatar" width="16" height="16" src="{{.Actor.AvatarURL}}"> // {{render (user .Actor)}} {{.Text}} {{render (time .CreatedAt)}} // {{render (avatar .Actor)}} {{render (user .Actor)}} {{.Text}} {{render (time .CreatedAt)}} // </div> // </div> div := htmlg.DivClass("event-header") image := &html.Node{ Type: html.ElementNode, Data: atom.Img.String(), Attr: []html.Attribute{ {Key: atom.Style.String(), Val: "width: 16px; height: 16px; border-radius: 2px; vertical-align: middle; margin-right: 4px;"}, {Key: atom.Src.String(), Val: e.Event.Actor.AvatarURL}, }, } div.AppendChild(image) htmlg.AppendChildren(div, Avatar{User: e.Event.Actor, Size: 16, Inline: true}.Render()...) htmlg.AppendChildren(div, User{e.Event.Actor}.Render()...) div.AppendChild(htmlg.Text(" ")) htmlg.AppendChildren(div, e.text()...) div.AppendChild(htmlg.Text(" ")) htmlg.AppendChildren(div, Time{e.Event.CreatedAt}.Render()...) @@ -70,10 +62,12 @@ func (e Event) icon() *html.Node { icon = octiconssvg.Pencil() case issues.Labeled, issues.Unlabeled: icon = octiconssvg.Tag() case issues.CommentDeleted: icon = octiconssvg.X() case "ReviewRequestedEvent": icon = octiconssvg.Eye() default: icon = octiconssvg.PrimitiveDot() } return &html.Node{ Type: html.ElementNode, Data: atom.Span.String(), @@ -103,10 +97,15 @@ func (e Event) text() []*html.Node { ns = append(ns, Label{Label: *e.Event.Label}.Render()...) ns = append(ns, htmlg.Text(" label")) return ns case issues.CommentDeleted: return []*html.Node{htmlg.Text("deleted a comment")} case "ReviewRequestedEvent": ns := []*html.Node{htmlg.Text("requested a review from ")} ns = append(ns, Avatar{User: e.Event.RequestedReviewer, Size: 16, Inline: true}.Render()...) ns = append(ns, User{e.Event.RequestedReviewer}.Render()...) return ns default: return []*html.Node{htmlg.Text(string(e.Event.Type))} } } @@ -275,30 +274,35 @@ func (u User) Render() []*html.Node { return []*html.Node{a} } // Avatar is an avatar component. type Avatar struct { User users.User Size int // In pixels, e.g., 48. User users.User Size int // In pixels, e.g., 48. Inline bool } func (a Avatar) Render() []*html.Node { // TODO: Make this much nicer. // <a style="..." href="{{.User.HTMLURL}}" tabindex=-1> // <img style="..." width="{{.Size}}" height="{{.Size}}" src="{{.User.AvatarURL}}"> // </a> imgStyle := "border-radius: 3px;" if a.Inline { imgStyle += " vertical-align: middle; margin-right: 4px;" } return []*html.Node{{ Type: html.ElementNode, Data: atom.A.String(), Attr: []html.Attribute{ {Key: atom.Style.String(), Val: "display: inline-block;"}, {Key: atom.Href.String(), Val: a.User.HTMLURL}, {Key: atom.Tabindex.String(), Val: "-1"}, }, FirstChild: &html.Node{ Type: html.ElementNode, Data: atom.Img.String(), Attr: []html.Attribute{ {Key: atom.Style.String(), Val: "border-radius: 3px;"}, {Key: atom.Style.String(), Val: imgStyle}, {Key: atom.Width.String(), Val: fmt.Sprint(a.Size)}, {Key: atom.Height.String(), Val: fmt.Sprint(a.Size)}, {Key: atom.Src.String(), Val: a.User.AvatarURL}, }, },