Sign in

Search issue titles and bodies, change requests and comments. Private repositories you cannot read are not included.

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.

Build out the forge web UI

f09ef39efe44de693748053a7b596ef328fcf06b · Keenan Nemetz · 15d ago · parent 70b70264

Build out the forge web UI

Turn the web surface into a compact, server-rendered forge with HTMX as the
progressive dynamic layer.

- Split templates and assets into embedded files; add a tokenised dark theme,
  Lucide icons, and vendored HTMX.
- Add the repository Overview page and a separate chronological Activity feed
  with type filters and HTMX fragment updates.
- Finish the issue and change workflows: create pages, comments, close/reopen,
  labels and assignees, approval, discussion, line-anchored review comments,
  and HTMX list filters.
- Add syntax-highlighted blobs, contributor/statistics derivation, branch-aware
  code browsing, and a repository Runs list.
- Add a loopback-only development login for local write testing, with explicit
  configuration and listener checks.
- Extend tests for the new pages, fragments, labels, assignees, anchors, and
  development login.

server/web/templates/activity.html +49

@@ -0,0 +1,49 @@
1 {{define "activity"}}
2 {{template "header" .}}
3 {{template "repohead" (nav .Name "activity")}}
4
5 <div class="page-head">
6 <div>
7 <h1>Activity</h1>
8 <p class="page-sub">Commits, issues, changes, releases, and runs 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 <div class="chips" hx-boost="true" hx-target="#activity-feed" hx-swap="outerHTML" hx-push-url="true">
19 <a class="chip{{if eq .Kind ""}} active{{end}}" href="/r/{{.Name}}/activity?kind=all">{{icon "activity"}}All</a>
20 <a class="chip{{if eq .Kind "commit"}} active{{end}}" href="/r/{{.Name}}/activity?kind=commits">{{icon "git-commit-horizontal"}}Commits</a>
21 <a class="chip{{if eq .Kind "issue"}} active{{end}}" href="/r/{{.Name}}/activity?kind=issues">{{icon "circle-dot"}}Issues</a>
22 <a class="chip{{if eq .Kind "change"}} active{{end}}" href="/r/{{.Name}}/activity?kind=changes">{{icon "git-pull-request"}}Changes</a>
23 <a class="chip{{if eq .Kind "release"}} active{{end}}" href="/r/{{.Name}}/activity?kind=releases">{{icon "tag"}}Releases</a>
24 <a class="chip{{if eq .Kind "run"}} active{{end}}" href="/r/{{.Name}}/activity?kind=runs">{{icon "play"}}Runs</a>
25 </div>
26
27 {{if .Events}}
28 <div class="activity-list">
29 {{range .Events}}
30 <article class="activity-event">
31 <span class="activity-icon {{.Kind}}" aria-hidden="true">{{icon .Icon}}</span>
32 <div class="activity-body">
33 <a class="activity-title" href="{{.URL}}">{{.Title}}</a>
34 <div class="activity-meta">
35 {{.Detail}}{{if .Actor}} · {{.Actor}}{{end}} · {{since .Time.Unix}}
36 {{if .Badge}} · <span class="status {{.BadgeClass}}">{{.Badge}}</span>{{end}}
37 </div>
38 </div>
39 </article>
40 {{end}}
41 </div>
42 {{else}}
43 <div class="empty-state">
44 <p>No activity yet.</p>
45 <p class="muted">Push a commit, open an issue, or queue a run.</p>
46 </div>
47 {{end}}
48 </div>
49 {{end}}