@@ -1705,6 +1714,12 @@ html, body {
+
@@ -5417,7 +5432,15 @@ var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Arr
// the same UX for anything else and for non-zddc-server backends.
async function fetchServerChildren(path) {
if (!path.endsWith('/')) path += '/';
- var resp = await fetch(path, {
+ // ?hidden=1 surfaces .-prefixed and _-prefixed entries when the
+ // user has flipped the "Show hidden" toggle. The server still
+ // ACL-gates per-entry, so this is purely additive — anyone
+ // without read on the parent dir already sees nothing.
+ var url = path;
+ if (window.app && window.app.state && window.app.state.showHidden) {
+ url += (url.indexOf('?') === -1 ? '?' : '&') + 'hidden=1';
+ }
+ var resp = await fetch(url, {
headers: { 'Accept': 'application/json' },
credentials: 'same-origin'
});
@@ -7610,6 +7633,21 @@ var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Arr
});
}
+ // "Show hidden" checkbox — toggles state.showHidden, which the
+ // loader reads to append ?hidden=1 to listing requests. Re-uses
+ // the existing refreshListing flow so the tree pulls a fresh
+ // listing. ACL is still server-side; this just relaxes the
+ // client-visible filter for entries the user is already
+ // allowed to read.
+ var hiddenCb = document.getElementById('showHidden');
+ if (hiddenCb) {
+ hiddenCb.checked = !!state.showHidden;
+ hiddenCb.addEventListener('change', function () {
+ state.showHidden = hiddenCb.checked;
+ refreshListing();
+ });
+ }
+
// No view-mode buttons; mode is derived from the URL on every
// scope change (resolveViewMode below). Pass-through for the
// initial path.
diff --git a/zddc/internal/apps/embedded/classifier.html b/zddc/internal/apps/embedded/classifier.html
index 67236e9..7f72bd1 100644
--- a/zddc/internal/apps/embedded/classifier.html
+++ b/zddc/internal/apps/embedded/classifier.html
@@ -1681,7 +1681,7 @@ body.help-open .app-header {