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.
Make the change request sidebar compact and live
d3dcf54d8b7eb81fcc2b944296329098db7f14f4 · Keenan Nemetz · 11d ago · parent 7137f372
Make the change request sidebar compact and live Move the review and approval explanations into tooltips, show only the state in each section, and use the overview's run rows for checks. The aside now polls a new fragment endpoint so approvals, checks and landing facts appear without a reload.
server/issues_changes_test.go +10
| @@ -392,6 +392,16 @@ func TestRequestSidebarAndDiscussionUpdateWithHtmx(t *testing.T) { | |||
| 392 | 392 | t.Fatalf("approval response is not the expected sidebar (%d):\n%s", resp.StatusCode, body) | |
| 393 | 393 | } | |
| 394 | 394 | ||
| 395 | // The page's poll replaces the whole aside: the landing block and the | ||
| 396 | // sidebar come back together, without a page shell. | ||
| 397 | resp, body = f.htmxGet(t, "/r/"+f.repo+"/requests/"+id+"/aside", writerCookie) | ||
| 398 | if resp.StatusCode != http.StatusOK || strings.Contains(body, "<!doctype html>") || | ||
| 399 | !strings.Contains(body, `id="request-aside"`) || !strings.Contains(body, `id="request-sidebar"`) || | ||
| 400 | !strings.Contains(body, `hx-trigger="every 20s`) || !strings.Contains(body, `class="help"`) || | ||
| 401 | !strings.Contains(body, "What would land") || !strings.Contains(body, "1 of 1 required approval(s).") { | ||
| 402 | t.Fatalf("aside poll is not the expected fragment (%d):\n%s", resp.StatusCode, body) | ||
| 403 | } | ||
| 404 | |||
| 395 | 405 | // Posting a comment replaces only the discussion fragment. | |
| 396 | 406 | resp, body = f.htmxPost(t, "/r/"+f.repo+"/requests/"+id+"/comments", ownerCookie, url.Values{ | |
| 397 | 407 | "csrf": {ownerSess.CSRF}, "body": {"Review note over HTMX.\n"}, | |