vole
Clone
Read only, no credentials:
https://rodent.software/git/vole.git
Write over SSH with a registered key:
git clone ssh://git@0.0.0.0:2222/vole.git
A free and open-source forge that lives in your Git repo.
Merge change request 01M70WES5ZZDJ6RP226WB11BBZ: Let people rename and remove their own passkeys
keenan · 26m ago
4b8c9e1d
| 1 | {{define "activity"}} |
| 2 | {{template "header" .}} |
| 3 | {{template "repohead" (nav .Page "activity")}} |
| 4 | |
| 5 | <div class="page-head"> |
| 6 | <div class="page-head-main"> |
| 7 | <h1>Activity</h1> |
| 8 | <p class="page-sub">Issues, changes, comments, and releases in one stream.</p> |
| 9 | </div> |
| 10 | </div> |
| 11 | |
| 12 | {{template "activity_feed" .}} |
| 13 | {{template "footer" .}} |
| 14 | {{end}} |
| 15 | |
| 16 | {{define "activity_feed"}} |
| 17 | <div id="activity-feed"> |
| 18 | {{/* One row: kind chips and the actor/assignee pickers on the left, the clear |
| 19 | action on the right. The chips sit inside the form so a filter change |
| 20 | keeps the kind. */}} |
| 21 | <form class="filters" method="get" action="/{{.Name}}/activity" hx-get="/{{.Name}}/activity" hx-target="#activity-feed" hx-swap="outerHTML" hx-push-url="true"> |
| 22 | <div class="chips" hx-boost="true" hx-target="#activity-feed" hx-swap="outerHTML" hx-push-url="true"> |
| 23 | <a class="chip{{if eq .Kind ""}} active{{end}}" href="/{{.Name}}/activity?kind=all{{if .Actor}}&actor={{urlquery .Actor}}{{end}}{{if .Assignee}}&assignee={{urlquery .Assignee}}{{end}}">{{icon "activity"}}All</a> |
| 24 | <a class="chip{{if eq .Kind "issue"}} active{{end}}" href="/{{.Name}}/activity?kind=issues{{if .Actor}}&actor={{urlquery .Actor}}{{end}}{{if .Assignee}}&assignee={{urlquery .Assignee}}{{end}}">{{icon "circle-dot"}}Issues</a> |
| 25 | <a class="chip{{if eq .Kind "change"}} active{{end}}" href="/{{.Name}}/activity?kind=changes{{if .Actor}}&actor={{urlquery .Actor}}{{end}}{{if .Assignee}}&assignee={{urlquery .Assignee}}{{end}}">{{icon "git-pull-request"}}Changes</a> |
| 26 | <a class="chip{{if eq .Kind "release"}} active{{end}}" href="/{{.Name}}/activity?kind=releases{{if .Actor}}&actor={{urlquery .Actor}}{{end}}{{if .Assignee}}&assignee={{urlquery .Assignee}}{{end}}">{{icon "tag"}}Releases</a> |
| 27 | </div> |
| 28 | <input type="hidden" name="kind" value="{{.Kind}}"> |
| 29 | <label class="filter-field"> |
| 30 | <span class="filter-label">Actor</span> |
| 31 | <select name="actor" data-autosubmit> |
| 32 | <option value="">Anyone</option> |
| 33 | {{range .Actors}}<option value="{{.Name}}"{{if eq .Name $.Actor}} selected{{end}}>{{.Label}}</option>{{end}} |
| 34 | </select> |
| 35 | </label> |
| 36 | {{if .Assignees}} |
| 37 | <label class="filter-field"> |
| 38 | <span class="filter-label">Assignee</span> |
| 39 | <select name="assignee" data-autosubmit> |
| 40 | <option value="">Anyone</option> |
| 41 | {{range .Assignees}}<option value="{{.}}"{{if eq . $.Assignee}} selected{{end}}>{{who .}}</option>{{end}} |
| 42 | </select> |
| 43 | </label> |
| 44 | {{end}} |
| 45 | {{if or .Actor .Assignee}}<div class="filters-search"><a class="button secondary" href="/{{.Name}}/activity{{if .Kind}}?kind={{.Kind}}{{end}}">{{icon "x"}}Clear</a></div>{{end}} |
| 46 | </form> |
| 47 | |
| 48 | {{if .Events}} |
| 49 | {{template "activity_events" .}} |
| 50 | {{template "pager" .Pager}} |
| 51 | {{else}} |
| 52 | <div class="empty-state"> |
| 53 | {{if or .Actor .Assignee}} |
| 54 | <p>No activity matches these filters.</p> |
| 55 | <p class="muted">Clear the filters or choose another type.</p> |
| 56 | {{else}} |
| 57 | <p>No activity yet.</p> |
| 58 | <p class="muted">Push a commit, open an issue, or queue a run.</p> |
| 59 | {{end}} |
| 60 | </div> |
| 61 | {{end}} |
| 62 | </div> |
| 63 | {{end}} |
| 64 | |
| 65 | {{define "activity_events"}} |
| 66 | <div class="activity-list"> |
| 67 | {{range .Events}} |
| 68 | <article class="activity-event"> |
| 69 | <span class="activity-icon {{.Kind}}" aria-hidden="true">{{icon .Icon}}</span> |
| 70 | <div class="activity-body"> |
| 71 | <a class="activity-title" href="{{.URL}}">{{.Title}}</a> |
| 72 | <div class="activity-meta"> |
| 73 | {{if .Repo}}<a href="/{{.Repo}}">{{.Repo}}</a> · {{end}}{{if .Actor}}{{if .ActorName}}{{template "userlink" (user .ActorName)}}{{else}}{{.Actor}}{{end}} · {{end}}{{.Detail}} · {{since .Time.Unix}} |
| 74 | </div> |
| 75 | </div> |
| 76 | </article> |
| 77 | {{end}} |
| 78 | </div> |
| 79 | {{end}} |
| 80 |