diff --git a/README.md b/README.md index 974b6c2..48a4dc6 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,10 @@ npm start Use **Generate / Rotate** if a pairing may have been exposed, then update the extension. Use **Revoke** to immediately disable bridge authentication. +## Camera hierarchy and large deployments + +The sidebar presents collapsed Alta sites, then device groups, then cameras, including explicit fallback nodes for ungrouped, orphaned, unknown, or conflicting metadata. Search opens only matching ancestors and supports full tree keyboard navigation. A fixed-height virtual window keeps the mounted DOM bounded even when thousands of cameras are visible; selection and active-proxy state survive expansion, search, and scrolling. If site or group metadata cannot be loaded, every valid camera remains selectable in the fallback hierarchy and APT shows a warning. + ## Development and verification ```bash @@ -54,7 +58,8 @@ Core files: - `src/proxy-launch.js` — fixed shell-free helper process management - `src/update-policy.js` — exact GitPeji check-only release policy - `preload.js` — narrow context bridge -- `renderer.js`, `index.html`, `styles.css` — non-secret UI +- `device-tree.js`, `sidebar-controller.js`, `sidebar-view.js` — pure hierarchy, interaction state, and bounded DOM adapter +- `renderer.js`, `index.html`, `styles.css` — non-secret UI integration and Alta styling - `chrome-extension/` — stable-ID paired cookie sender - `test/` — pure and end-to-end contract tests diff --git a/device-tree.js b/device-tree.js index aa3f26e..05abce2 100644 --- a/device-tree.js +++ b/device-tree.js @@ -75,7 +75,7 @@ const identity = createIdentity('site', safe, ordinal, siteOccurrences, diagnostics); const site = makeSite(identity.uniqueId, text(safe.name) || identity.canonicalId, ordinal, { canonicalId: identity.canonicalId, - pendingDeletion: safe.pendingDeletion === true, + pendingDeletion: safe.pendingDeletion === true || Boolean(text(safe.pendingDeletionStart)), source: safe, }); sites.push(site); @@ -105,7 +105,7 @@ const group = makeGroup(site, identity.uniqueId, text(safe.name) || identity.canonicalId, ordinal, { canonicalId: identity.canonicalId, rawParentId: parentId, - pendingDeletion: safe.pendingDeletion === true, + pendingDeletion: safe.pendingDeletion === true || Boolean(text(safe.pendingDeletionStart)), source: safe, }); site.groups.push(group); diff --git a/index.html b/index.html index f97b005..66d89d1 100644 --- a/index.html +++ b/index.html @@ -12,13 +12,19 @@