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.
Add the instance-wide activity feed to the home page
b355db72f14756ee4d7e2f503eb254ea552aa72e · Keenan Nemetz · 15d ago · parent 67a308ba
Add the instance-wide activity feed to the home page The home page now merges every visible repository's derived feed, caps the merged result at 50 events, and names the repository on each row. The repository list moves to a compact sidebar with its own search, and the existing search-results view is unchanged. Events still come from git, the metadata branch, tags, and the queue; private repositories are excluded by the same read filter as the list.
server/web/templates/home.html +46−6
| @@ -1,16 +1,17 @@ | |||
| 1 | 1 | {{define "index"}} | |
| 2 | 2 | {{template "header" .}} | |
| 3 | {{if .Query}} | ||
| 3 | 4 | <div class="page-head"> | |
| 4 | 5 | <div class="page-head-main"> | |
| 5 | 6 | <h1>Repositories</h1> | |
| 6 | <p class="page-sub">{{if .Query}}Matches for “{{.Query}}”{{else}}Every repository you can read{{end}}</p> | ||
| 7 | <p class="page-sub">Matches for “{{.Query}}”</p> | ||
| 7 | 8 | </div> | |
| 8 | 9 | </div> | |
| 9 | 10 | ||
| 10 | 11 | <form class="filters" method="get" action="/" role="search"> | |
| 11 | 12 | <input type="search" name="q" value="{{.Query}}" placeholder="Search repositories" aria-label="Search repositories"> | |
| 12 | 13 | <button type="submit">{{icon "search"}}Search</button> | |
| 13 | {{if .Query}}<a href="/">clear</a>{{end}} | ||
| 14 | <a href="/">clear</a> | ||
| 14 | 15 | </form> | |
| 15 | 16 | ||
| 16 | 17 | {{if .Repos}} | |
| @@ -28,16 +29,55 @@ | |||
| 28 | 29 | </tbody> | |
| 29 | 30 | </table> | |
| 30 | 31 | </div> | |
| 31 | {{else if .Query}} | ||
| 32 | {{else}} | ||
| 32 | 33 | <div class="empty-state"> | |
| 33 | 34 | <p>No repositories match “{{.Query}}”.</p> | |
| 34 | 35 | <p class="muted">Search looks at repository names and descriptions. Private repositories you cannot read are not included.</p> | |
| 35 | 36 | <a href="/">Clear the search</a> | |
| 36 | 37 | </div> | |
| 38 | {{end}} | ||
| 37 | 39 | {{else}} | |
| 38 | <div class="empty-state"> | ||
| 39 | <p>No repositories yet.</p> | ||
| 40 | <p class="muted">An instance admin can create one.{{if .InstanceAdmin}} <a href="/admin/repos/new">Create a repository</a>.{{end}}</p> | ||
| 40 | <div class="home"> | ||
| 41 | <section class="home-main"> | ||
| 42 | <div class="page-head"> | ||
| 43 | <div class="page-head-main"> | ||
| 44 | <h1>Recent activity</h1> | ||
| 45 | <p class="page-sub">Across every repository you can read.</p> | ||
| 46 | </div> | ||
| 47 | </div> | ||
| 48 | {{if .Events}} | ||
| 49 | {{template "activity_events" .}} | ||
| 50 | {{else if .Repos}} | ||
| 51 | <div class="empty-state"> | ||
| 52 | <p>No activity yet.</p> | ||
| 53 | <p class="muted">Push a commit, open an issue, or queue a run in one of the repositories.</p> | ||
| 54 | </div> | ||
| 55 | {{else}} | ||
| 56 | <div class="empty-state"> | ||
| 57 | <p>No repositories yet.</p> | ||
| 58 | <p class="muted">An instance admin can create one.{{if .InstanceAdmin}} <a href="/admin/repos/new">Create a repository</a>.{{end}}</p> | ||
| 59 | </div> | ||
| 60 | {{end}} | ||
| 61 | </section> | ||
| 62 | |||
| 63 | <aside class="home-side"> | ||
| 64 | <h2>Repositories</h2> | ||
| 65 | <form class="side-search" method="get" action="/" role="search"> | ||
| 66 | <input type="search" name="q" placeholder="Search repositories" aria-label="Search repositories"> | ||
| 67 | </form> | ||
| 68 | {{if .Repos}} | ||
| 69 | <div class="side-list repo-side"> | ||
| 70 | {{range .Repos}} | ||
| 71 | <a class="side-row" href="/r/{{.Name}}"> | ||
| 72 | <span class="row-title">{{.Name}}</span> | ||
| 73 | {{if .Description}}<span class="muted">{{.Description}}</span>{{end}} | ||
| 74 | </a> | ||
| 75 | {{end}} | ||
| 76 | </div> | ||
| 77 | {{else}} | ||
| 78 | <p class="muted">No repositories.</p> | ||
| 79 | {{end}} | ||
| 80 | </aside> | ||
| 41 | 81 | </div> | |
| 42 | 82 | {{end}} | |
| 43 | 83 | {{template "footer" .}} | |