| 1 | {{define "collaboration" }}{{$view := repoView .Query}}{{$data := asMap .Event}}{{$coordinate := printf "30617:%s:%s" (.Query.Get "owner" ) (.Query.Get "repo" )}}{{$issues := or (eq $view "issues" ) (eq $view "issue" )}} |
| 2 | {{if or (eq $view "issues" ) (eq $view "prs" )}}<section id="collaboration-list" > |
| 3 | <h1>{{if $issues}}Issues{{else}}Pull requests{{end}}</h1> |
| 4 | <form method="get" action="/repo" id="collaboration-filter" > |
| 5 | <input type="hidden" name="owner" value="{{.Query.Get " owner"}}" ><input type="hidden" name="repo" value="{{.Query.Get " repo"}}" ><input type="hidden" name="view" value="{{$view}}" > |
| 6 | {{$states := strs "open" "merged" "closed" "draft" }}{{if $issues}}{{$states = strs "open" "resolved" "closed" "draft" }}{{end}}<label>Status <select name="status" ><option value="" >all</option>{{range $state := $states}}<option value="{{$state}}" {{if eq ($.Query.Get "status" ) $state}} selected{{end}}>{{$state}}</option>{{end}}</select></label> |
| 7 | <label>Search <input name="q" value="{{.Query.Get " q"}}" ></label><label>Label <input name="label" value="{{.Query.Get " label"}}" ></label><button>Filter</button> |
| 8 | </form> |
| 9 | {{$items := collabItems .Event}}{{if $items}}<table id="rows" > |
| 10 | <thead><tr><th>status</th><th>title</th><th>author</th><th>opened</th></tr></thead> |
| 11 | <tbody>{{range $item := $items}}{{$item := asMap $item}}{{$s := collabProposal $item $.Actor (index $data "can_approve" )}}<tr{{if $s.Shown}} data-state="{{$s.State}}" {{end}}><td>{{index $item "status" }}</td><td><a href="{{if $issues}}{{repoURL $.Query " issue" (str (index $item " id"))}}{{else}}{{repoURL $.Query " pr" (str (index $item " id"))}}{{end}}" >{{index $item "title" }}</a>{{if $s.Shown}} <small>proposed | {{$s.State}}</small>{{end}}{{with collabLabels $item}} <small>{{join . ", " }}</small>{{end}}</td><td>{{template "nostrName" (str (index $item "author" ))}}</td><td><time datetime="{{datetime (index $item " created_at")}}" >{{when (index $item "created_at" )}}</time></td></tr> |
| 12 | {{end}}</tbody></table>{{else}}<p>No matching {{if $issues}}issues{{else}}pull requests{{end}}.</p>{{end}} |
| 13 | {{with index $data "next_cursor" }}<p id="pages" ><a href="{{browsePageURL " /repo" $.Query " cursor" .}}" >next page</a></p>{{end}} |
| 14 | {{if .Actor}}<details id="collaboration-new" ><summary>{{if $issues}}New issue{{else}}New pull request{{end}}</summary> |
| 15 | <nostr-compose kind="{{if $issues}}1621{{else}}1618{{end}}" coordinate="{{$coordinate}}" > |
| 16 | <label>Title <input name="title" required maxlength="300" ></label><label>Labels <input name="labels" placeholder="bug, help wanted" ></label> |
| 17 | {{if not $issues}}<label>Commit <input name="commit" required pattern="[0-9a-f]{40}" ></label><label>Clone URL <input name="clone" type="url" required placeholder="https://example.com/project.git" ></label><label>Merge base <input name="merge-base" pattern="[0-9a-f]{40}" ></label>{{end}} |
| 18 | <label>Description <textarea name="content" required></textarea></label><button>Sign and publish</button> |
| 19 | </nostr-compose><noscript><p>JavaScript and a connected signer are required to publish.</p></noscript></details>{{else}}<p><a href="{{signinURL .Base .Path .Query}}" >Sign in</a> to start a conversation.</p>{{end}} |
| 20 | </section> |
| 21 | {{else}}{{$item := asMap (index $data "item" )}}{{$diff := reviewDiff .Event .Query .Actor}}{{$anchor := reviewAnchor .Query}}<section id="collaboration-detail" > |
| 22 | <p><a href="{{if $issues}}{{repoURL .Query " issues" " "}}{{else}}{{repoURL .Query " prs" " "}}{{end}}" >{{if $issues}}All issues{{else}}All pull requests{{end}}</a></p> |
| 23 | <h1>{{index $item "title" }}</h1> |
| 24 | <p>{{index $item "status" }} by {{template "nostrName" (str (index $item "author" ))}} <time datetime="{{datetime (index $item " created_at")}}" >{{when (index $item "created_at" )}}</time></p> |
| 25 | {{with collabLabels $item}}<p>Labels: {{join . ", " }}</p>{{end}} |
| 26 | {{$can := index $data "can_approve" }}{{template "collaborationProposal" (collabProposal $item .Actor $can)}}<article id="collaboration-body" >{{markdown (str (index $item "content" ))}}</article> |
| 27 | {{if not $issues}}<h2>Changes</h2>{{if index $data "diff_unavailable" }}<p>{{index $data "diff_unavailable" }}. The diff will be available after the required commits have been synchronized.</p>{{else}}<diff-view><table><tbody> |
| 28 | {{range $line := $diff.Lines}}<tr id="D{{$line.Number}}" ><td><a href="#D{{$line.Number}}" >{{$line.Number}}</a></td><td><code>{{$line.HTML}}</code>{{with $line.CommentURL}} <small><a href="{{.}}" >comment</a></small>{{end}}</td></tr> |
| 29 | {{range $c := $line.Comments}}{{$r := asMap $c}}<tr><td></td><td>{{template "collaborationProposal" (collabProposal $r $.Actor $can)}}{{template "nostrEvent" $c}}{{if $.Actor}}<details><summary>Reply to this comment</summary><nostr-compose kind="1111" coordinate="{{$coordinate}}" root="{{index $item " id"}}" root-pubkey="{{index $item " author"}}" root-kind="{{index $item " kind"}}" parent="{{index $r " id"}}" parent-pubkey="{{index $r " pubkey"}}" parent-kind="1111" ><label>Reply <textarea name="content" required></textarea></label><button>Sign and reply</button></nostr-compose></details>{{end}}</td></tr> |
| 30 | {{end}}{{end}}</tbody>{{if $diff.Truncated}}<tfoot><tr><td colspan="2" >Diff preview truncated (256 KiB or 10,000 lines).</td></tr></tfoot>{{end}}</table></diff-view>{{if index $data "diff_truncated" }}<p>This diff is truncated. Clone the repository to review the complete change.</p>{{end}}{{end}}{{end}} |
| 31 | <h2>Conversation</h2> |
| 32 | {{$replies := $diff.Thread}}{{if $replies}}<ol id="events" > |
| 33 | {{range $reply := $replies}}{{$r := asMap $reply}}<li>{{template "collaborationProposal" (collabProposal $r $.Actor $can)}}{{template "nostrEvent" $reply}}{{with reviewLabel $reply}}<p><small>on {{.}}</small></p>{{end}} |
| 34 | {{if $.Actor}}<details><summary>Reply to this comment</summary><nostr-compose kind="1111" coordinate="{{$coordinate}}" root="{{index $item " id"}}" root-pubkey="{{index $item " author"}}" root-kind="{{index $item " kind"}}" parent="{{index $r " id"}}" parent-pubkey="{{index $r " pubkey"}}" parent-kind="1111" ><label>Reply <textarea name="content" required></textarea></label><button>Sign and reply</button></nostr-compose></details>{{end}}</li> |
| 35 | {{end}}</ol>{{else}}<p>No replies yet.</p>{{end}} |
| 36 | {{with index $data "reply_cursor" }}<p id="pages" ><a href="{{browsePageURL " /repo" $.Query " cursor" .}}" >older replies</a></p>{{end}} |
| 37 | {{if .Actor}}<h2>Reply</h2>{{with $anchor}}<p id="reply-anchor" >Commenting on <code>{{.File}}</code> line {{.Line}} ({{.Side}} side). <a href="{{repoURL $.Query " pr" (str (index $item " id"))}}" >Comment on the whole change instead</a></p>{{end}}<nostr-compose id="reply-compose" kind="1111" coordinate="{{$coordinate}}" root="{{index $item " id"}}" root-pubkey="{{index $item " author"}}" root-kind="{{index $item " kind"}}" >{{with $anchor}}<input type="hidden" name="file" value="{{.File}}" ><input type="hidden" name="line" value="{{.Line}}" ><input type="hidden" name="side" value="{{.Side}}" >{{end}}<label>Comment <textarea name="content" required></textarea></label><button>Sign and reply</button></nostr-compose> |
| 38 | {{if index $data "can_status" }}<details id="status-controls" ><summary>Change status</summary><nostr-compose kind="status" coordinate="{{$coordinate}}" root="{{index $item " id"}}" root-pubkey="{{index $item " author"}}" root-kind="{{index $item " kind"}}" ><label>Status <select name="status" ><option value="1630" >Reopen</option><option value="1631" >{{if $issues}}Resolve{{else}}Mark merged{{end}}</option><option value="1632" >Close</option><option value="1633" >Draft</option></select></label><label>Comment <textarea name="content" ></textarea></label><button>Sign and update</button></nostr-compose></details>{{end}} |
| 39 | <noscript><p>JavaScript and a connected signer are required to publish.</p></noscript>{{else}}<p><a href="{{signinURL .Base .Path .Query}}" >Sign in</a> to reply.</p>{{end}} |
| 40 | </section>{{end}}{{end}} |
| 41 | |
| 42 | {{/* collaborationProposal is the bar above a proposed issue, pull request or comment: its state for the people who may see it, with the decision for those who may make it. */}} |
| 43 | {{define "collaborationProposal" }}{{if .Shown}}<collaboration-proposal data-state="{{.State}}" >Proposed by {{template "nostrName" .Author}} | {{.State}}{{if .By}} {{when .At}} by {{template "nostrName" .By}}{{end}}{{if .Decide}}<nostr-react event="{{.ID}}" pubkey="{{.Author}}" kind="{{.Kind}}" ><button name="reaction" value="+" >Accept</button><button name="reaction" value="-" >Reject</button></nostr-react>{{end}}</collaboration-proposal> |
| 44 | {{end}}{{end}} |