A home page at /, and members create their own boards #194
Labels
No labels
No milestone
No project
No assignees
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Grandiras/Ponente#194
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Part of #190; needs #192 and #193. This is the step a member sees:
/stops being the default board and becomes the place you start from, and making a board stops being something you ask an admin for.Design it in Lunacy first (
design/Ponente.free): desktop, phone, and the empty state, in both themes. The page is a launchpad, not a dashboard —docs/brand.mdon dense copy applies to it more than to anything else in the app.The page
BoardPalettecolour. Counts on the tile (open cards, yours, due soon) only if they can be had without decrypting every card on every board for every visit — checkdocs/data.mdbefore promising them; a tile with a name and a colour is a fine first version./. This reverses theHomeHrefdecision indocs/boards-and-permissions.md, whose reason was that a bare path meant the default board and so quietly moved people onto somebody else's./is no longer a board, so the reason is gone; the board title beside it is still the switcher.What goes away
The default board ("first in switcher order"),
LastBoardExceptionand theboard.noneempty state: having no boards is now an ordinary state with a button on it. The bare board-scoped paths lose their meaning with it —/calendarbecomes the general calendar (/calendar/allexists already),/boardgoes home./resumes, but only from outsideThe table in #190 is the spec. A document request for
/carryingSec-Fetch-Site: none— typed, bookmarked, launched — with a remembered page other than/is redirected there, through the same validated path/launchuses (#191). Anything else renders the home page: a click from inside the app, a reload of it, a browser that does not send the header. Visiting the home page records/like any other place, which is what makes reloading it stay put./launchremains, as an alias, for installs that already have it. The remarks onLastPagethat explain why/must never restore are the ones to rewrite.Migrating
A bookmark of
/used to mean a board and now means "where I was", which for anybody with one board is the same place./board/{id}links are untouched. Nothing in the database moves in this step.Tests and docs
A new
home.spec.js: tiles are the boardsBoardAccessallows and no others; creating a board lands on it as its admin and nobody else sees it; the four rows of the resume table (a plaingotois a navigation from outside and a click on the wordmark is one from inside, so both halves are reachable without faking a header).boards.spec.jsand everything that assumes/is a board will need a look —devLoginlands there. Docs:boards-and-permissions.md,ui.md,orientation.md's routes, and a changelog line in both locales.🤖 On it — the reply will link the full session transcript.
Now write home.spec.js:
The run reported an error after replying: This operation was aborted
→ Opened PR: #203
⏱ 45m 4s · 298 steps · $2.1451 · tokens: 2348.7k in / 93.7k out (+58200.3k cache-read) · Go: 5h 88% · wk 60% · mo 32% ⚠️
📜 Full session transcript
@claude-bot Please redo this.
🤖 On it — follow along in the action run; the reply will link the full session transcript.
📜 Live transcript — updating every ~5 minutes while the task runs.
Redone from scratch on
main— branchclaude/issue-194(PR #203 was closed, nothing reused from it).What
/is nowA tile per board you can see, wearing the colour
BoardPalettealready gives it on the general calendar, plus the way to one more. Everything a tile says is structure, which is what makes the page affordable on the address every visit starts at:BoardService.GetTilesAsyncis three queries for the whole list (the boards, a count per column, the grant rows) and decrypts nothing but each board's own name. That is also the line it stops at — "due soon" cannot be had, becauseCard.DueDateis ciphertext and the only route to it is decrypting every card on every board, every visit. The little picture is a track per column and a dash per card; who else sees a board is said in words and faces (Everyone / Only you / a face stack), never with a lock.The six Home frames from #199 were the spec — I read the copy and the geometry out of
design/Ponente.freedirectly and copied the strings back intoLocaleService(home.*), which closes the exceptiondocs/frontend.mdrecorded. I could not open Lunacy from CI, so the canvas itself is untouched; the pass it now needs is filed below.A board a member makes is
Restrictedto them, with their own admin grant — starting something of your own is not an act of publishing — and still arrives with To Do / Doing / Done. The seeded board stays everyone's./admin/boardsis gone (it redirects home), and the Admin flyout it lived in opened onto a single row after that, so it is a plain Members link now, on the desktop row and in the phone sheet.On a phone the bar's first cell is Home when you are off a board and Board when you are on one; the way back from a board is a row in the account sheet, since the wordmark is not in that bar. The canvas could not show that case.
/resumes, but only from outsideLastPage.ResumeFromOutside+ a middleware inProgram.cs(an endpoint can't do it — a literalMapGet("/")outranks the Blazor router's catch-all). All four rows of #190's table behave, checked in a real browser.The service worker silently broke it, and that is the thing worth knowing.
service-worker.jsintercepted navigations and re-issued them withfetch(event.request)— a request made by the worker, so Chromium computes its own Fetch Metadata for it and the server sawSec-Fetch-Site: same-originwhere the member's navigation saidnone. With a worker installed,/resumed for nobody who had been here before, which is precisely the audience. Fixed with navigation preload (navigationPreload.enable()+await event.preloadResponse); Safari has none, and there/launch— still the manifest'sstart_url— is unaffected because a redirect is not a rule about headers.Also gone
The default board (
GetDefaultAsync,BoardOutcome.None,board.none),LastBoardException,HomeHref, and the bare board-scoped paths:/calendaris the general calendar, and an.icslink with noboardnow means every board rather than 404ing a subscription that has been syncing for a year.Verified
dotnet buildanddotnet test Ponente.sln— 493 pass,DocumentationTestsincluded.home.spec.js's second member, bothrequests.spec.jsflows), 2 hard-codelocalhost:8090(i18n,share), 1 needs the stub forge, 1 is the phone timeline ordering (passes on a clean board; this run leaves ~60 cards behind because the psql teardown can't reach a container), and 1 is the search box's centring — which I reproduced onmainat 31px before touching anything, so it is filed rather than fixed.home.spec.js;helpers/boards.jsnow holds go-home/open-board/create/delete, which eight spec files had each copied.prefs.spec.js,board-entrance.spec.jsandshare.spec.jsneeded real fixes beyond the mechanical ones (an old/?card=link shape, the entrance measuring a board it no longer landed on). One thing fixed in passing:mobile.spec.jsreferenced an undefinedtagsLink, which is aReferenceErroronmain.boards-and-permissions.md(a new home page section and the reversed decisions, with their reasons),ui.md(the resume rule and the service-worker trap),orientation.md,data.md,calendar.md,frontend.md,testing.md,CLAUDE.md. Changelog in both locales — condensed to stay inside the seven-line cap, which meant merging two earlier bullets.⏱ 75m 19s · 361 turns · tokens: 593.4k in / 227.6k out (+129476.4k cache-read)
📜 Full session transcript
→ Opened PR: #204
→ Filed follow-up issue #205: The header's search box drifts off centre once the account side has four links
→ Filed follow-up issue #206: Bring the Lunacy canvas back in step with the home page and the admin nav