Skip to content

web app: UX quick wins for the browser dashboard#108

Merged
jonathan-pap merged 2 commits into
mainfrom
feat/webapp-ux-polish
May 27, 2026
Merged

web app: UX quick wins for the browser dashboard#108
jonathan-pap merged 2 commits into
mainfrom
feat/webapp-ux-polish

Conversation

@jonathan-pap
Copy link
Copy Markdown
Owner

Summary

Eight UX polish improvements to the browser dashboard. All follow the existing data-action + delegated-listener + escHtml/escAttr patterns — no new framework, no runtime deps, no shape changes to data.

Search & filtering

  • Debounced search inputs (~140 ms, per-input keys) so fast typing doesn't re-render whole tables or re-rank the typeahead every keystroke.
  • "No results" empty states on Measures + Columns with context-aware messaging (search match / no unused left / empty model), plus an inline Clear search link via a new clear-filter action.

Lineage typeahead

  • Full keyboard nav: ↓/↑ move a highlight, Enter opens the highlighted (or first) hit, Esc dismisses. Enter mid-debounce flushes a synchronous render so it always picks.
  • Theme-aware highlight via var(--row-hover) + accent bar.

Discoverability

  • Brief Loaded · N tables · N measures · X KB · Y ms stat shown on the overlay before it dismisses (~800 ms).
  • Global / shortcut: jump to Lineage and focus the typeahead (classic site-search idiom; ignored while typing in inputs).
  • Auto-focus + select the search box when switching to Measures/Columns (mirrors the Lineage tab pattern).
  • Copy DAX-reference button on Source-Map rows with ✓ feedback; shared copyText() helper.

Test plan

  • npm run build:browser clean — both tsc passes succeed, bundle reassembled (379 → 381 KB).
  • New identifiers verified inlined into docs/index.html + docs/browser/entry.js.
  • npm test green (377/377 — web-app changes don't affect node tests).
  • Manual smoke test (npm run serve:browser):
    • Press / anywhere → Lineage tab focused with search active.
    • Type in Measures search → search empties cleanly with Clear link; click clears and re-renders.
    • Type in Lineage search → ↓ moves highlight, Enter opens, Esc dismisses.
    • Reload → see the brief "Loaded · …" stat before the overlay dismisses.
    • Click ⎘ on a Source-Map row → DAX reference on clipboard.

🤖 Generated with Claude Code

jonathan-pap and others added 2 commits May 27, 2026 10:19
Eight polish improvements following the existing data-action +
delegated-listener + escHtml/escAttr patterns.

Search & filtering
- Debounced search inputs (~140ms, per-input keys) so fast typing
  doesn't re-render whole tables or re-rank the typeahead on every
  keystroke.
- "No results" empty states on Measures + Columns with context-aware
  messaging (search match / no unused left / empty model), plus an
  inline Clear-search link via a new clear-filter action that also
  cancels any pending debounce.

Lineage typeahead
- Keyboard navigation: ArrowDown/Up move a highlight through hits,
  Enter opens the highlighted or first hit, Esc dismisses. Enter
  mid-debounce flushes a synchronous render so it always picks.
- Theme-aware highlight style via var(--row-hover) plus an accent bar.

Discoverability
- Brief "Loaded - N tables - N measures - X KB - Y ms" stat shown on
  the overlay before it dismisses, plus a matching console.log.
- Global "/" shortcut: jump to Lineage and focus the typeahead
  (classic site-search idiom; ignored while typing in inputs).
- Auto-focus + select the search box when switching to Measures or
  Columns (mirrors the Lineage tab pattern).
- Copy DAX-reference button on Source-Map rows with check confirmation,
  plus a shared copyText helper with clipboard/execCommand fallback.

Build clean (npm run build:browser); new identifiers verified inlined
into docs/index.html and docs/browser/entry.js. No new tests since
there is no client-test suite.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Two new HTML strings added in the previous commit used string concat
('<x data-table="' + esc(...) + '" ...') around data-* attributes. The
render-xss-fuzz structural test scans the inlined bundle source for
single-quotes inside data-* attribute patterns and asserts none exist
(the inlined script is part of the rendered HTML it inspects).

Convert both spots to template literals — same rule the lineage
typeahead already follows (renderLineageSearchResults). Affected:
- the new copy-DAX-reference button on Source-Map rows
- the new Clear-search link inside tableEmptyRow

372/372 tests pass locally now.
@jonathan-pap jonathan-pap merged commit 3a9e76a into main May 27, 2026
3 checks passed
@jonathan-pap jonathan-pap deleted the feat/webapp-ux-polish branch May 27, 2026 08:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant