Fix #430: organizations tab #434

Merged
crueber merged 1 commit from fix/issue-430 into main 2026-09-13 03:57:30 +00:00
Owner

Client-only: /:owner/organizations renders view="orgs" (new OwnerOrganizations) with the #423 membership list moved verbatim from the profile rail (links to /:org, explicit "No organizations" empty state, loading preserved, same memberorgs:{owner} key — no backend change). OwnerTabs reads Profile | Repositories | Organizations with the same classes/active-underline/aria-current on all three routes (three-way pathname derivation); isOrg hides the third tab on org profiles (#370 email-principal rationale). /:owner goes rail-free (the issue's planner's call). Route registered static-before-dynamic with the reservation note (an org literally named "organizations" loses its UI page, client-only — same class as #422 repositories and /orgs/new). Absorbs the remainder of #423 (backend endpoint stays; cross-ref comment posted there). No new deps. Docs: 12_web_ui.md §2.3 route table + FIXED decision; features/01 membership-move decision (law 12). Tests: new web/test/unit/owner-orgs-tab-430.test.js (8 tests: route order + reservation, three-way derivation, third-tab shape, isOrg gating, verbatim move, rail-free profile, exports, badge) + two #422 pin updates; node --test web/test/unit/*.test.js 903 total / 901 pass / 2 fail (both pre-existing live-server smoke tests, identical on pristine origin/main); vite build green.

Client-only: /:owner/organizations renders view="orgs" (new OwnerOrganizations) with the #423 membership list moved verbatim from the profile rail (links to /:org, explicit "No organizations" empty state, loading preserved, same memberorgs:{owner} key — no backend change). OwnerTabs reads Profile | Repositories | Organizations with the same classes/active-underline/aria-current on all three routes (three-way pathname derivation); isOrg hides the third tab on org profiles (#370 email-principal rationale). /:owner goes rail-free (the issue's planner's call). Route registered static-before-dynamic with the reservation note (an org literally named "organizations" loses its UI page, client-only — same class as #422 repositories and /orgs/new). Absorbs the remainder of #423 (backend endpoint stays; cross-ref comment posted there). No new deps. Docs: 12_web_ui.md §2.3 route table + FIXED decision; features/01 membership-move decision (law 12). Tests: new web/test/unit/owner-orgs-tab-430.test.js (8 tests: route order + reservation, three-way derivation, third-tab shape, isOrg gating, verbatim move, rail-free profile, exports, badge) + two #422 pin updates; node --test web/test/unit/*.test.js 903 total / 901 pass / 2 fail (both pre-existing live-server smoke tests, identical on pristine origin/main); vite build green.
/:owner/organizations renders view="orgs" (OwnerOrganizations): the #423
membership list moves verbatim from the profile rail into the dedicated
tab (links to /:org, explicit "No organizations" empty state, loading
preserved, same memberorgs:{owner} key). OwnerTabs reads Profile |
Repositories | Organizations with the same classes/active-underline/
aria-current on all three routes; isOrg hides the third tab on org
profiles (#370 email-principal rationale). /:owner goes rail-free
(planner's call). Client-only: index.jsx route (static-before-dynamic,
reservation note — an org literally named "organizations" loses its UI
page) + Repos.jsx views; no backend change, no new deps.

Docs: 12_web_ui.md §2.3 route table + FIXED decision; features/01
membership-move decision (law 12). Absorbs the remainder of #423.

Headless cover: new owner-orgs-tab-430.test.js (8 tests) + #422 pin
updates; node --test 903 total / 901 pass / 2 pre-existing live-server
smoke failures (identical on pristine origin/main); vite build green.
Sign in to join this conversation.
No description provided.