Reworks the browse menu/tree interaction into a declarative, contextually honest model and moves view settings onto a toolbar — the menu is the UI to the system, so it should be familiar, inviting, and only ever offer what applies. New declarative menu model (browse/js/menu-model.js): - Every action is one descriptor with a TYPE predicate (appliesTo) and a CAPABILITY predicate (enabled)+tooltip. Row/pane menus are projections over it; separators are derived from group changes. Designed data-shaped so a future server-sourced manifest (zddc.zip) can supply/extend it. - Hybrid visibility: type-inapplicable actions are OMITTED (New folder on a file, Expand on a file); permission/role/tier-gated actions are SHOWN DISABLED with a reason — so a lower tier sees what a higher role unlocks. - Roles are NOT hardcoded: ordinary actions gate on the verbs the server returns (node.verbs / path_verbs), so any operator-defined role works. Only the two intrinsically-special tiers are recognised by name — site admin (is_super_admin) and project/subtree admin (path_is_admin), surfaced as the "Edit access rules…" item; both come from the existing /.profile/access. - The headline fix: New folder / New markdown file no longer appear on file rows (they target a folder or the current dir). events.js: deletes the ~350-line inline buildTreeRowMenu/buildPaneMenu/ SORT_BY_ITEMS; opens menus via menuModel projections through one openRowMenuFor /openPaneMenu path shared by right-click, the hover kebab, and the keyboard menu key (ContextMenu / Shift+F10). Injects action impls via menuModel.configure to avoid a circular dep. Prefetches the scope /.profile/access (memoised) on load/rescope/refresh/popstate so menus never fetch at open time. Discoverability + a11y: a per-row ⋯ kebab (tree.js + new icon-ellipsis sprite, revealed on hover/selection/focus) opens the same menu; keyboard menu key supported. Toolbar: Sort + Show-hidden moved OUT of per-row right-click menus into the tree-pane toolbar, plus New folder / New file buttons (act on the current dir, greyed with a reason when create access is lacking). Help copy updated. Icons: dropped the 3 stray emoji from menu items (consistent, VS Code/Finder style); only new sprite is the kebab's icon-ellipsis. Tests: +5 browse specs (file row omits New-folder; folder row shows it; a read-only server node greys Rename with a "write access" tooltip via a pure menuModel unit; toolbar Sort/Show-hidden drive state + New buttons present; kebab and Shift+F10 both open the menu). All 23 browse+conflict+diff green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| css | ||
| js | ||
| build.sh | ||
| README.md | ||
| template.html | ||
browse — directory listing tool
Generic file browser for any directory. Designed to work with ZDDC archives but useful for any folder. Single-file HTML, no install.
How it's used
Two modes, auto-detected at page load:
-
Online (zddc-server backed). When this HTML is served by zddc-server at a folder URL — which it is by default for any directory under
ZDDC_ROOTthat doesn't have anindex.html— the JS queries the same URL withAccept: application/jsonto load the directory's listing and renders it as a sortable, filterable table. -
Local (FileSystemAccessAPI). Click "Select Directory" in the header to pick any folder on your computer. Works in Chromium-based browsers (Chrome, Edge, Brave, etc.). No server required; the directory is read directly from disk.
What it does
- Lists files and folders with name, size, type (extension), and modified date.
- Click a folder to expand inline. Children load lazily on first expand.
- Click a column header to sort by that column. Click again to reverse.
- Type in the filter to narrow to entries whose name contains the substring.
- Click any file to open it in a new tab — for server-backed pages,
this routes through zddc-server's normal handler (so an
.archiveredirect, an apps cascade override, etc. all work as expected).
Design notes
- No ZDDC-specific filtering. This tool is intentionally
domain-agnostic. The companion
archivetool layers ZDDC parsing (project / status / revision filters, tracking-number resolution) on top of the same listing API. Usearchivewhen you want ZDDC semantics; usebrowsewhen you just want to see what's in a folder. - Default at directory URLs. zddc-server's
directory.goserves the embedded browse.html bytes for any directory request withAccept: text/htmland noindex.htmlpresent. This means a user navigating to any folder underZDDC_ROOTgets a usable browser without anyone having to drop a file into the archive. - Apps cascade override. Like every other ZDDC tool, the
served
browse.htmlcan be overridden per-folder via a.zddc apps:entry. The default is the embedded copy from the binary; operators can pin a specific version or URL if they want.