Skip to content

connections: folder filter box, keyboard tree navigation and ARIA roles - #272

Closed
jseifeddine wants to merge 2 commits into
sol1:mainfrom
jseifeddine:ux/connections-folder-filter-keyboard
Closed

jseifeddine wants to merge 2 commits into
sol1:mainfrom
jseifeddine:ux/connections-folder-filter-keyboard

Conversation

@jseifeddine

@jseifeddine jseifeddine commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Builds on #271 (ux/connections-sidebar-scroll-selection); its own change is the last commit, the compare on the fork: jseifeddine/rustguac@ux/connections-sidebar-scroll-selection...ux/connections-folder-filter-keyboard. The branch carries #271 until they merge into main, so the Files tab shows them too.

Part 2/3 of #254.

Live filter (name, path, description; ancestors of a match kept visible) persisted in sessionStorage; role=tree/treeitem, aria-selected/expanded, roving tabindex; arrows, Home/End, Enter/Space, Left/Right; f focuses the filter as / focuses the search.

Testing

  • Browser: connections-folder-filter.spec.mjs.
  • Manual: type part of a tenant name, arrow down, Enter: that folder opens; a screen reader announces the tree.

…ion feedback

connections: sticky self-scrolling sidebar, flush-left folder rows (sol1#254)

With 20+ customer folders the sidebar shared the page scroll with the
entries table, so picking a folder far down the list changed content off
screen, and every leaf row was pushed ~90px in by a hidden chevron
placeholder while names were ellipsised.

- .sidebar is position: sticky with its own thin scrollbar and
  max-height tied to the viewport; .main keeps scrolling with the page.
- The FOLDERS header is wrapped in .sidebar-pin together with a new
  empty #sidebar-tools slot, both pinned at the top of the sidebar.
- buildFolderNode() renders a .tree-chevron only for folders with
  children; leaves get no placeholder (removed the .tree-chevron.leaf
  rule), so rows start right after the 3px accent bar.
- Name, entry-count pill (.folder-count, now just the number with a
  data-count attribute and "N entries" title) and a smaller scope glyph
  share one line; description sits beneath at --fz-xs; rows are ~40px.
- Nested .tree-children indent 14px behind the existing dashed guide.

All new CSS is in one block at the end of the page's <style>.

connections: selection feedback and in-place sidebar updates (sol1#254)

With a long folder list, clicking a folder appeared to do nothing: the
entries table was off screen, the only loading state was a text swap,
and nothing drew the eye to the changed title. loadEntries() also
called renderFolders() just to update one count badge, rebuilding the
whole sidebar on every click.

- Jump to the entries header when the shown folder changes (smooth,
  'auto' under prefers-reduced-motion); never on initial load, live
  refresh, forceRefresh after a mutation or search clear.
- .changed on #entries-header replays a 350ms title slide-in and an
  accent underline flash on the action bar; cleared on animationend.
- Skeleton table (4 shimmering rows, same geometry as the real table)
  while entries are fetched from the server; the cached path renders
  immediately with no skeleton.
- updateFolderCount() swaps the number in the existing .folder-count
  badge in place; renderFolders() only as a fallback when the badge
  does not exist yet.
- renderFolders() is wrapped (not edited) to preserve the sidebar
  scroll position across rebuilds and to reveal the selected row within
  the sidebar (nearest, no page scroll) when the selection changes or
  after loadFolders() rebuilds the tree.

tests: sidebar scrolls on its own, selected folder marked and kept in view (sol1#254)
connections: folder filter box, keyboard tree navigation and ARIA roles (sol1#254)

The sidebar lists one folder per customer and gets long. Add a live
filter box (name, path, description; loaded subfolders included, with
ancestors of a match kept visible) mounted in a new #sidebar-tools div,
persisted in sessionStorage so live refreshes keep it. Make the tree
keyboard-navigable (arrows, Home/End, Enter/Space, Left/Right to
collapse/expand) with role=tree/treeitem, aria-selected/expanded and a
roving tabindex, and add an 'f' shortcut that mirrors the '/' one.

Implemented by post-processing the DOM renderFolders() builds and by
wrapping that function; its body is unchanged.

tests: folder filter box, ARIA tree and keyboard navigation (sol1#254)
@jseifeddine
jseifeddine force-pushed the ux/connections-folder-filter-keyboard branch from 6f23069 to 7e60c25 Compare October 13, 2026 07:04
@davekempe

Copy link
Copy Markdown
Member

Merged into main as 13cb6ce 9d7d675 thanks Jad. Looks good on our canary.

@davekempe davekempe closed this Oct 13, 2026
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.

2 participants