Displays a gold badge next to the latest commit hash when the backend
returns a commitsBehind count greater than zero.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The Backup Directory field in the Nextcloud integration card gains a
Browse button that opens an inline panel with: breadcrumb navigation,
scrollable directory list, and a Select button to pick the current path.
Falls back to manual text entry.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Backups tab shows last-run status, expandable run history with per-item
breakdown (db/vol, size, status), and a Run Now trigger button.
Settings Nextcloud card gains a Backup Directory field.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Portal sidebar was rendering nothing for the history app entry because
History was missing from the Lucide icon map.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Maintenance (Wrench) and Reports (BarChart2) icons were missing from
the hardcoded iconMap, causing those app tiles to show no icon.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
When an app is open, the sidebar collapses to a 44px strip with a
chevron button. Clicking it opens the full sidebar as a fixed overlay
with a backdrop that closes on click. Also closes automatically when
the user interacts with / navigates within the iframe (window blur).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Wire /admin/settings route and sidebar link; proxy /settings/api/ to the
new settings service at 10.10.10.116. Admin can configure integration
credentials and manage Newbook room ordering from the portal.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sidebar now renders uncategorised apps flat and categorised apps in
collapsible accordion sections; active category stays expanded. Dashboard
groups tiles under category section headings.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- index.css: light body (#f4f5f7), white cards, sidebar stays dark navy
- AppIcon.tsx: Lucide icon lookup component for app tiles and nav
- Sidebar.tsx: Lucide nav icons (LayoutGrid, Users, Activity, LogOut)
- Dashboard.tsx: white cards with shadows, coloured Lucide app icons
- AdminMonitor.tsx: light theme throughout, Lucide tab icons,
better status colours for light backgrounds
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Defaults to 'Number Four at Stow'. Replaces hardcoded 'Hotel Number Four'
and 'HNF Manage' in sidebar, login page, and browser title. Other hotels
set VITE_HOTEL_NAME in their /opt/portal/.env before rebuilding.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Uptime tab now polls /deploy/health-status (parallel HTTP checks) and
shows a status grid with response times. Removes broken Kuma sub-path
nginx locations. Auto-refreshes every 30s.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The service worker was intercepting iframe navigation to app paths
(/notices/, /kitchen/ etc.) and serving the portal's cached index.html
before the request reached nginx — causing the 🚧 EmbeddedFallback.
Only apply the fallback to portal routes; everything else goes to network.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Portal's nginx is the actual entry point (original NPM proxies the whole
domain to the portal LXC). App paths need to be proxied here, not in the
stack NPM. Same pattern as /api/auth/ which already works.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
An un-routed app path falls back to serving the portal, which would otherwise
load the whole shell inside itself endlessly. Detect self-embedding and show a
'not available yet' placeholder instead.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>