Repo header owner link should go to /:owner/repositories (repos list), not the profile — sweep other owner-link surfaces #445

Closed
opened 2026-09-13 13:37:48 +00:00 by crueber · 3 comments
Owner

Owner links in the repo header should go to /:owner/repositories, not the profile

What's requested

The owner name in the repo page header (the <owner> / <repo> breadcrumb in repo-header) currently links to /${params.owner} — the owner profile page. Forgejo links the owner segment of the repo-page breadcrumb to the owner's repositories list (/:owner/repositories). Change the header owner link target accordingly, and sweep the other owner-name-link surfaces for consistency.

Evidence (current tree)

  • Repo header breadcrumb (the ask) — web/src/pages/Repo.jsx:549:
    <A class="hover:underline" href={/${params.owner}}>{params.owner}</A> links to the profile, not /${params.owner}/repositories.

The /:owner/repositories route and the owner tabs (Profile / Repositories / Organizations) already exist — web/src/index.jsx:79 (<Route path="/:owner/repositories" component={OwnerRepositories} />) and OwnerTabs in web/src/pages/Repos.jsx:107-159. So this is pure link-target wiring; no backend change, no new route.

Surface Location Current target Suggested verdict
Repo header breadcrumb Repo.jsx:549 /${owner} Change to /${owner}/repositories (the ask)
Explore page owner section heading Owners.jsx:71 /${owner} Change to /${owner}/repositories — the heading is a repository group, the repos tab is the natural destination
Explore "+N more" link Owners.jsx:105 /${owner} Change to /${owner}/repositories — "more" of what the section shows (repos)
"forked from <owner>" in repo header Repo.jsx:573 /${fork_parent} Implementer's call: GitHub links to the repo, not the owner — but walhub links the owner portion of fork_parent only. If it stays an owner link, use /:owner/repositories for consistency
Org link in profile Organizations tab Repos.jsx:602 /${org} Implementer's call: a plain org-name link to the org profile is fine (orgs have no /repositories tab distinction today); leaving as-is is acceptable
Team page back link Team.jsx:41 /${org} Leave as-is (org profile is the correct parent)
Owner tabs "Profile" tab Repos.jsx:126 /${owner} Leave as-is — this IS the profile link

Architecture notes

  • Owners are not store objects — just repos/<owner>/ prefixes; the owner name here is a display string and the routes already exist, so nothing server-side is involved.
  • The OwnerTabs active-tab derivation (Repos.jsx:112-117) keys off the pathname; linking the repo-header owner to /:owner/repositories lands the viewer on the Repositories tab with correct active state — verify that in acceptance.

Acceptance criteria

  • Repo header owner name links to /:owner/repositories; repo name still links to /${owner}/${repo}.
  • Explore (Owners.jsx) section heading and "+N more" link to /:owner/repositories.
  • The forked-from and org-name links are either updated or explicitly kept, with the choice noted in the PR.
  • Landing on /:owner/repositories from the repo header shows the Repositories tab as active (aria-current="page").
  • No server changes; no new routes.
# Owner links in the repo header should go to /:owner/repositories, not the profile ## What's requested The owner name in the repo page header (the `<owner> / <repo>` breadcrumb in `repo-header`) currently links to `/${params.owner}` — the owner **profile** page. Forgejo links the owner segment of the repo-page breadcrumb to the owner's **repositories list** (`/:owner/repositories`). Change the header owner link target accordingly, and sweep the other owner-name-link surfaces for consistency. ## Evidence (current tree) - **Repo header breadcrumb (the ask)** — `web/src/pages/Repo.jsx:549`: `<A class="hover:underline" href={`/${params.owner}`}>{params.owner}</A>` links to the profile, not `/${params.owner}/repositories`. The `/:owner/repositories` route and the owner tabs (Profile / Repositories / Organizations) already exist — `web/src/index.jsx:79` (`<Route path="/:owner/repositories" component={OwnerRepositories} />`) and `OwnerTabs` in `web/src/pages/Repos.jsx:107-159`. So this is pure link-target wiring; no backend change, no new route. ## Consistency sweep — other surfaces that link an owner name (static read, current tree) | Surface | Location | Current target | Suggested verdict | |---|---|---|---| | Repo header breadcrumb | `Repo.jsx:549` | `/${owner}` | **Change to `/${owner}/repositories`** (the ask) | | Explore page owner section heading | `Owners.jsx:71` | `/${owner}` | Change to `/${owner}/repositories` — the heading is a repository group, the repos tab is the natural destination | | Explore "+N more" link | `Owners.jsx:105` | `/${owner}` | Change to `/${owner}/repositories` — "more" of what the section shows (repos) | | "forked from `<owner>`" in repo header | `Repo.jsx:573` | `/${fork_parent}` | Implementer's call: GitHub links to the repo, not the owner — but walhub links the owner portion of `fork_parent` only. If it stays an owner link, use `/:owner/repositories` for consistency | | Org link in profile Organizations tab | `Repos.jsx:602` | `/${org}` | Implementer's call: a plain org-name link to the org profile is fine (orgs have no `/repositories` tab distinction today); leaving as-is is acceptable | | Team page back link | `Team.jsx:41` | `/${org}` | Leave as-is (org profile is the correct parent) | | Owner tabs "Profile" tab | `Repos.jsx:126` | `/${owner}` | Leave as-is — this IS the profile link | ## Architecture notes - Owners are not store objects — just `repos/<owner>/` prefixes; the owner name here is a display string and the routes already exist, so nothing server-side is involved. - The `OwnerTabs` active-tab derivation (`Repos.jsx:112-117`) keys off the pathname; linking the repo-header owner to `/:owner/repositories` lands the viewer on the Repositories tab with correct active state — verify that in acceptance. ## Acceptance criteria - [ ] Repo header owner name links to `/:owner/repositories`; repo name still links to `/${owner}/${repo}`. - [ ] Explore (Owners.jsx) section heading and "+N more" link to `/:owner/repositories`. - [ ] The forked-from and org-name links are either updated or explicitly kept, with the choice noted in the PR. - [ ] Landing on `/:owner/repositories` from the repo header shows the Repositories tab as active (`aria-current="page"`). - [ ] No server changes; no new routes.
crueber added this to the v1 milestone 2026-09-13 13:37:54 +00:00
crueber added
issues
and removed
fork
labels 2026-09-13 13:38:26 +00:00
Author
Owner

Fixed by #453 (#453): breadcrumb owner + explore heading + "+N more" → /:owner/repositories. Forked-from, org-name, Team back link, and Profile tab explicitly kept (noted in PR + pinned by test). No server changes.

Fixed by #453 (https://git.packden.us/crueber/walhub/pulls/453): breadcrumb owner + explore heading + "+N more" → /:owner/repositories. Forked-from, org-name, Team back link, and Profile tab explicitly kept (noted in PR + pinned by test). No server changes.
Author
Owner

REVIEW PR #453 (fix/issue-445) — verified head-to-head in scratch worktrees, all 5 acceptance criteria PASS.

CRITERION RESULTS (file:line on branch):
(1) Breadcrumb owner -> /:owner/repositories (Repo.jsx:553), repo name still -> /${full()} (Repo.jsx:554). PASS.
(2) Explore heading (Owners.jsx:73) + '+N more' (Owners.jsx:109) both -> /${owner}/repositories (exactly 2 hits, zero bare /${props.owner} left in Owners.jsx). PASS.
(3) Kept-surfaces, each verified by grep + test pin: forked-from stays /${fork_parent} (Repo.jsx:577) — fork_parent is an owner/repo pointer so this IS the parent-repo page = GitHub behavior, correct to keep; Organizations-tab org links stay /${org} (Repos.jsx:613); Team back link stays /${org()} (Team.jsx:41); Profile tab stays /${props.owner} (Repos.jsx:129, the ONLY bare-owner href left in the SPA). PASS.
(4) OwnerTabs derivation (Repos.jsx:112-117) maps /${owner}/repositories -> 'repos' with aria-current='page' — no code change needed, pinned by test. PASS.
(5) No server changes (zero .go files in diff), no new routes, no dep changes (no package/lock churn). PASS. Docs: Law-12 entry present and accurate after my correction (see below). No browser run — node tests + source reasoning only, noted explicitly per review instructions.

HEAD-TO-HEAD FULL SUITE (node --test web/test/unit/*.test.js, node_modules symlinked first in both):

  • PR branch: 950 total / 948 pass / 2 fail
  • Pristine origin/main: 944 total / 942 pass / 2 fail
  • Failing sets IDENTICAL by name (both smoke.test.js live-server subtests: 'built SPA shell is served at / and /setup', 'hashed assets...' — need a live Go server; still fail with a freshly built dist, so environmental/pre-existing). +6 net new tests (owner-links-445.test.js 6/6 green), zero PR-caused failures. NOTE: this contradicts the PR description's '830/815/15' claim — those numbers do not reproduce; likely measured without the node_modules symlink (unresolved imports inflate failures). I corrected the Law-12 entry to the verified numbers.
  • vite build green + esbuild SDK bundle green in PR scratch (ran vite/esbuild binaries directly; pnpm wrapper refuses the symlinked node_modules — scratch-only quirk, not a repo issue).

SMALL FIX PUSHED to origin/fix/issue-445 (commit b0476d9): Law-12 entry test counts 830/815/15 (+14-file failure list) -> verified 950/948/2 (2 live-server smoke failures); full suite re-run after the edit confirms 950/948/2. Docs-only change; logic untouched.

MERGE RECOMMENDATION: ready to merge (after CI confirms; browser proof remains open per the shared-daemon loopback guard, same as stated in the PR).

REVIEW PR #453 (fix/issue-445) — verified head-to-head in scratch worktrees, all 5 acceptance criteria PASS. CRITERION RESULTS (file:line on branch): (1) Breadcrumb owner -> /:owner/repositories (Repo.jsx:553), repo name still -> /${full()} (Repo.jsx:554). PASS. (2) Explore heading (Owners.jsx:73) + '+N more' (Owners.jsx:109) both -> /${owner}/repositories (exactly 2 hits, zero bare /${props.owner} left in Owners.jsx). PASS. (3) Kept-surfaces, each verified by grep + test pin: forked-from stays /${fork_parent} (Repo.jsx:577) — fork_parent is an owner/repo pointer so this IS the parent-repo page = GitHub behavior, correct to keep; Organizations-tab org links stay /${org} (Repos.jsx:613); Team back link stays /${org()} (Team.jsx:41); Profile tab stays /${props.owner} (Repos.jsx:129, the ONLY bare-owner href left in the SPA). PASS. (4) OwnerTabs derivation (Repos.jsx:112-117) maps /${owner}/repositories -> 'repos' with aria-current='page' — no code change needed, pinned by test. PASS. (5) No server changes (zero .go files in diff), no new routes, no dep changes (no package/lock churn). PASS. Docs: Law-12 entry present and accurate after my correction (see below). No browser run — node tests + source reasoning only, noted explicitly per review instructions. HEAD-TO-HEAD FULL SUITE (node --test web/test/unit/*.test.js, node_modules symlinked first in both): - PR branch: 950 total / 948 pass / 2 fail - Pristine origin/main: 944 total / 942 pass / 2 fail - Failing sets IDENTICAL by name (both smoke.test.js live-server subtests: 'built SPA shell is served at / and /setup', 'hashed assets...' — need a live Go server; still fail with a freshly built dist, so environmental/pre-existing). +6 net new tests (owner-links-445.test.js 6/6 green), zero PR-caused failures. NOTE: this contradicts the PR description's '830/815/15' claim — those numbers do not reproduce; likely measured without the node_modules symlink (unresolved imports inflate failures). I corrected the Law-12 entry to the verified numbers. - vite build green + esbuild SDK bundle green in PR scratch (ran vite/esbuild binaries directly; pnpm wrapper refuses the symlinked node_modules — scratch-only quirk, not a repo issue). SMALL FIX PUSHED to origin/fix/issue-445 (commit b0476d9): Law-12 entry test counts 830/815/15 (+14-file failure list) -> verified 950/948/2 (2 live-server smoke failures); full suite re-run after the edit confirms 950/948/2. Docs-only change; logic untouched. MERGE RECOMMENDATION: ready to merge (after CI confirms; browser proof remains open per the shared-daemon loopback guard, same as stated in the PR).
Author
Owner

Fixed by PR #453 (review clean + test-count doc fix by reviewer; all 5 criteria pass, kept-surfaces verified), merged. Closing.

Fixed by PR #453 (review clean + test-count doc fix by reviewer; all 5 criteria pass, kept-surfaces verified), merged. Closing.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
crueber/walhub#445
No description provided.