← Design · c140
qdash-todos.md
Web bugs the QGUIkit port fixed (c140 D12)
Contents
2026-11-12. For: whoever next works the qdash UI (../qcontrol/crates/qdash/ui, feat/new-pages) or the layer's DataTable. Why: replicate-first ran one way. The native port measured each qdash page before drawing it, found these, fixed them on the QGUIkit surface and filed nothing back. Mark ruled (D12) that they go back as qdash todos. qdash keeps its todos in Mark's Logseq blocks, which this session does not write, so they wait here, ready to file.
1. Open rows close on sort (the layer's DataTable)
- Web:
- Each expand row keeps its own open ref.
- A sort, or a refresh that re-keys the rows, closes every open row.
- QGUIkit's fix:
- The page holds the open keys on the rows' stable ids, so a sort or a refresh no longer closes a row.
- Recorded in
../qnative/crates/layer/src/scorecard.rs:84and qnative c2's CYCLE.md (the table stretch,5a9915e).
- Where to fix it:
q-nuxt-layer/components/data/Table.vue(#details). Key the open state onrowKey, not on the row's position. It is a layer release.
2. The initial sort matches no column label
- Web:
- The listing's
initialSortnames a key that no column carries. - The table opens unsorted, and no header shows the sort.
- The listing's
- Pages:
- Providers' and Models' ledgers (QGUIkit sorts by tokens);
- the Skills page's Installs ledger (QGUIkit sorts by sessions).
- QGUIkit's fix:
- qnative c2 CYCLE.md:167 ("Models sorts by tokens; qdash's initial sort matches no label");
crates/app/src/pages/provider.rs:9;crates/app/src/pages/skill.rs:10.
- Where to fix it: each page's
initialSortin the qdash UI. Then check whetherTable.vueshould warn wheninitialSortmatches no column.
3. The Models subtitle claims all-time for a windowed feed
- Web: the Models listing's subtitle says all-time, while the feed under it is windowed by the period.
- QGUIkit's fix: qnative c2 CYCLE.md:190 ("The listing subtitle no longer claims all-time for a windowed feed").
- Where to fix it: the Models listing page in the qdash UI. Say the window the feed is read in.
4. The empty table box stays light in dark mode (the layer's DataTable)
- Web:
Table.vue's empty state drawsbg-grey-200, a fixed #E8E8E8, so in dark mode it is a light box on a dark page. - QGUIkit's fix: qnative c8 (
be4545f) draws it with thesurface-sunken-deeperrole, the same #E8E8E8 in light and #2B2A2A in dark. - Where to fix it:
q-nuxt-layer/components/data/Table.vue's#emptytemplate. Replacebg-grey-200with the role's class. It is a layer release.
5. The Tools band shows zeros while it loads, and when qdash is down
- Found by:
spec-measure's states pass (--states loading,failed), not by the port. Seespecs/tools.spec.md§ States, read 2026-11-12. - Web:
- While every
/api/request is held: the band's machines read "0", "0 builtin · 0 mcp · 0 skill" and "none denied" beside the skeleton bars. - When every request is refused: the banner says "Can't reach qdash — showing nothing rather than a guess", and the band below it still shows "0".
- A zero that was never read breaks R31 (honest states): it is a number the page did not serve.
- While every
- Where to fix it: the Tools listing's band in the qdash UI. Its machines should take
null(DataMachine's loading value) until the feed answers, and the failed state when it doesn't, as the ledger below already does. Check the other Inventory listings' bands for the same pattern.