Repository navigation
feat(console): the Notes page lists the notes of a workspace and where they went (FRU-245) - #313
Conversation
There was a problem hiding this comment.
Score de confiance : 3/5 ·
🔍 Une revue plus poussée est conseillée : Vérifier que la route GET /notes du worker applique bien les filtres mine, place et stage et renvoie la forme de counts attendue, car la page en dépend entièrement.
Commentez @sakuga-review review balanced (environ 5 centimes) ou @sakuga-review review heavy (10 centimes à 1 dollar).
Niveau lite · anthropic/claude-haiku-5.5 · 0,009 $ · Le résumé, le diagramme et la liste des constats sont à la fin de la description de la PR.
|
Reply to the lite review of 1. « Only my notes » sends a value the worker may ignore (P1): the route of #306 filters on it. In 2. « Previous » keeps a wrong offset after a reload (P2): the range shown is never wrong.
3. « Clear the filters » can run a phantom search (P2): the pending search cannot bring a filter back.
|
|
@sakuga-review review balanced |
There was a problem hiding this comment.
Score de confiance : 3/5 ·
Niveau balanced · anthropic/claude-sonnet-5.5 · 0,180 $ · Le résumé, le diagramme et la liste des constats sont à la fin de la description de la PR.
…e they went (FRU-245) Screen 10 of the mockup, read from the index of the notes (FRU-244): the chips of where the notes went, a search, the lists of the site and the status, « Only my notes », a table of the first 64 characters of each note with its page and « Show on the page », its status, its author, where it went with its reference, and « Send again » for an address that did not take it. The pages follow the cursor of the route. The filters live in the address. A read again keeps the rows on the screen, so nothing that a pointer can reach moves while it is on its way. The rail gets its « Notes » entry, and the Sites screen its link « see where every note went ». The kit gets a Checkbox and a search field. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…nswers it (FRU-245) The reference and the address of the issue are at the top of a note, a guest gets no place at all, and the name of a REST connector is its address. A guest reads no column « Went to ». « Show on the page » opens the note by the id the widget gave it, or by its issue, or opens the page alone: the id of the route is opaque. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
… it (FRU-245) Asked by the balanced review: after a reload or from a shared link, the cursors before the page are not known. The test opens the second page by its address, reads its range, presses « Previous », and finds the first page with no cursor and no offset left in the address. Co-Authored-By: Claude Opus 5.5 <[email protected]>
The route of #306, as merged, searches no reference for a guest (SEARCHED_WITHOUT_TRACKER). The field said « or the reference » to them; it now says « Search the text or the page ». Co-Authored-By: Claude Opus 5.5 <[email protected]>
9c8553e to
0f8f118
Compare
|
Rebased by hand on One commit on top, Locally on The two review threads are answered in place ( |
There was a problem hiding this comment.
Score de confiance : 4/5 ·
Niveau lite · anthropic/claude-haiku-5.5 · 0,011 $ · Le résumé, le diagramme et la liste des constats sont à la fin de la description de la PR.
|
Reply to the lite review of « Une livraison abandonnée s'affiche comme « Pas encore livrée » » (P2): true, and kept on purpose for this PR. Nothing pushed here. The two states lead to the same action: « Send again » sends both, through |
Not critical (one screen of the console, and two short additions to the kit). Base
main: #306 (FRU-244), the route it reads, is merged. The shape is read from the code of #306 (apps/worker/src/console-notes.ts), not only from the message that announced it:refandurlsit at the top of a note, a guest gets noplace, the id is opaque, and pages go by a cursor.Screen 10 of the mockup. Mathieu's decision on Q6, 2026-10-13: Fruitback keeps an index of the notes and the first 64 characters of each one, never its text. The page shows those 64 characters, and the whole note is read in the tracker or on the page.
What it is
The rail gets its « Notes » entry, between « Sites » and « Connectors » (
SECTIONS,built: true). The Sites screen gets the end of its sentence: « Connect a tracker or see where every note went ».Chips (
role="group", « Where the notes went »,aria-pressed): « All », then each place that has notes, in the order of the sources of the workspace, then « In Fruitback ». They use the kitFilterChipin its three states.Filters:
Choice, compact, hidden label);Checkbox).They live in the address (
place,site,stage,mine,q,cursor,from): a reload keeps the view, and a filter goes back to the first page.The table (960 px at the least), with one row per note:
« Send again » (owner and admin) for a note that an address did not take. It is disabled while the request is on its way. When it works, the list is read again and the row loses its « Not delivered yet ». When it is refused, the row says « Fruitback did not answer. Try again. ».
Pages (
nav, « Pages of notes »): « 1 to 8 of 44 », « Previous », « Next ». The route pages by cursor, so the screen keeps the cursors of the pages before for « Previous ». A reload starts that list again: « Previous » then goes back to the first page.States the mockup does not draw:
Nothing that a pointer can reach moves (FRU-271, #294–#296)
A read made again keeps the rows on the screen until its answer replaces them. Only the first read says « Loading… ». The test « while a filter is read, the rows stay and nothing a pointer can reach moves » holds the answer to a filter. It then checks that the eight rows are still there, that there is no « Loading… », and that the chips, the search, « Send again » and « Next » have not moved. Then it releases the answer.
A defect found on the way, and its proof
A list chosen while the search waits its 300 ms was undone when the search landed (and the other way round). The setter of React Router builds from the address of the render that made it. The screen now keeps the last address it wrote, and takes the address of React Router only when it changes. Test: « a list chosen while the search waits its 300 ms is kept when the search lands ». With the functional setter of React Router, it fails (
?q=mug, the status lost). It passes 4 times in a row now.Gaps with the mockup, and why
counts.undelivered) and does not filter them: a chip that chooses nothing would be a false button. The rows still say « Not delivered yet ». Asked of fru-console:place=undelivered.excerpt,page,site,stage,reference(SEARCHED), not the author. Asked of fru-console; the sentence of the mockup comes back if it does.seed, not sent yet by #306), then by its issue, else the page aloneseedfield.Boxes at 1440 (macOS):
Captures, 1440 and 390, in
agent-coord/scratch/fru-sf-workspace/fru-245/(they cannot be uploaded):notes-list,notes-list-fr,notes-loading,notes-none,notes-no-match,notes-failed,notes-guest,notes-member,notes-status-open,notes-hover-chip,notes-hover-row,notes-focus2, each-1440.pngand-390.png.Kit (owner fru-sf-entree, asked on the chat, added here for want of an answer)
Checkbox {label, checked, onChange}inui.tsx(the HeroUI Checkbox) and.kit-checkboxinapp.css: a box of 16 px with the border of a control, ink when ticked, its words at 14 px 8 px after it, on a line of 40 px. A native<input>is refused in a screen.Fieldtakestype="search".French added
Proof
e2e/console-notes.spec.ts, 15 tests, on stubs at the shape of feat(worker): the list of the notes of a workspace, its filters, its search, and Send again (FRU-244) #306. They cover:console-frame(the rail has five sections, and the room of the Notes page is 1240 px, capped at what the rail leaves),console-narrow(Notes at 390 and 320),console-sites(the new link). Every other console spec passes locally.console-sitesandconsole-notesnow set the clock of the browser to noon of a fixed day for the test that reads « 2 h ago ». The specs merged with feat(console): the Sites table has the six columns of the mockup and the legend of the statuses (FRU-270) #302 would have read « Yesterday » between midnight and two in the morning.Not verified
🤖 Generated with Claude Code
Sakuga Review · Score de confiance : 4/5
Mergeable après un regard sur le constat mineur : aucun défaut bloquant n'apparaît dans le diff lu, mais le libellé d'une livraison abandonnée reste à vérifier.
Constats
apps/console/app/routes/notes.tsx:466Le type IndexedNote distingue delivery.state « waiting » et « gave-up », mais NoteRow n'en lit jamais l'état : une note dont le worker a cessé d'essayer affiche le même libellé « Not delivered yet » qu'une note encore en attente. Le constat ne touche que l'affichage : le bouton « Send again » reste disponible dans les deux cas. Correction : Lire delivery.state dans NoteRow et afficher pour « gave-up » le libellé qui dit que Fruitback a arrêté d'essayer, en gardant « Send again ».
Résumé
La PR ajoute la page Notes de la console (route w/:workspace/notes), ses filtres dans l'adresse, la pagination par curseur, le renvoi d'une note non livrée et une case à cocher du kit, puis relie la page Sites à la nouvelle page. J'ai relu la route, la page, le kit et les tests E2E modifiés ; la logique de lecture et de filtrage ne montre pas de défaut certain. Je n'ai pas vérifié le worker (la route /notes et ses compteurs) ni les fichiers de traduction au-delà des clés ajoutées.
Non relu
Revues (1) · Dernier commit relu : fix(console): a guest's search on Notes says wh... · Niveau
lite·anthropic/claude-haiku-5.5· 0,011 $