From 7ffd109243be2b14178fefa01ecbf908179f1bd2 Mon Sep 17 00:00:00 2001 From: UNITRONIX <36471318+UNITRONIX@users.noreply.github.com> Date: Wed, 29 Apr 2026 01:54:04 +0200 Subject: [PATCH] Gitleaks fix --- .gitleaks.toml | 14 + web-nodejs/data/auth.db-shm | Bin 0 -> 32768 bytes web-nodejs/data/auth.db-wal | Bin 0 -> 708672 bytes web-nodejs/data/betterdesk.db-shm | Bin 0 -> 32768 bytes web-nodejs/data/betterdesk.db-wal | Bin 0 -> 358472 bytes web-nodejs/public/css/beta31.css | 510 +++++++++++++++++++++++++++ web-nodejs/public/js/beta31.js | 298 ++++++++++++++++ web-nodejs/views/layouts/main.ejs | 2 + web-nodejs/views/partials/navbar.ejs | 6 + 9 files changed, 830 insertions(+) create mode 100644 .gitleaks.toml create mode 100644 web-nodejs/data/auth.db-shm create mode 100644 web-nodejs/data/auth.db-wal create mode 100644 web-nodejs/data/betterdesk.db-shm create mode 100644 web-nodejs/data/betterdesk.db-wal create mode 100644 web-nodejs/public/css/beta31.css create mode 100644 web-nodejs/public/js/beta31.js diff --git a/.gitleaks.toml b/.gitleaks.toml new file mode 100644 index 00000000..7c953211 --- /dev/null +++ b/.gitleaks.toml @@ -0,0 +1,14 @@ +# Gitleaks configuration for BetterDesk +# Suppresses false positives from auto-generated lock files + +title = "BetterDesk Gitleaks Config" + +[allowlist] + description = "Allowlisted files and patterns" + + # Cargo.lock files contain crate checksums and dependency names like + # "crypto_secretbox" that trigger generic-api-key false positives. + paths = [ + '''.*Cargo\.lock$''', + '''.*package-lock\.json$''', + ] diff --git a/web-nodejs/data/auth.db-shm b/web-nodejs/data/auth.db-shm new file mode 100644 index 0000000000000000000000000000000000000000..a89befe0395337f017f7671816e2a1a04beab78f GIT binary patch literal 32768 zcmeI5S5p*06on6>2&*Cj;sPR3$tE!8fQSKe&N=5CFk{YH%!=86pwB-0Z26>5mOn!K zQax2Is;n8hE7zvtC1%ex|^Ys4V|KNs*!is+NqPK@*c+hprO;1&M@*!rF-h!c|J?!z0}Co z*JaL8BiG3Dl+HKu0;PK!c^|EvHD!%L<9?B$iw#|(wfS7Balh<8_vKCLtFO!4&(Qsq z9$@4Hm98-IN~H(sT+T*(${K^!(C^+qXD9D~d6vy{c~6|0qMdr8owF7#XC||px16(_ zZ>a0?T&R1_`N=GUK>{Q|0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0&SPT z>bAS}7VcdBub$zCK#b}$5r=pLRIhfHnJsEOQfFhKt4g(dcJHZHyLltT; z9WyZx3$X;tu?Fk06+5s82XF)@aT@hFhYPsmrfe&Iv#u4-w9QAPD+R+10qM75M{Ksk zrVm_79~6cg0$ruxxQ|D8f|q#Z<}nX`vjy9*6MJzG$2_QRQ%UJC#Bf7E`fAw` z+wHLF1DDcEi{XZVbdj?ocHycWMm={q4Daxvsn4M2R(x(idM4TtyK&79qn^7Qj`yB> zu)~0KytE_s;f5VXJ$E_Ua|gBH#j$9V3*76Z}&+KxD6hfN>29EjNCti(nf#VMS@S)9j3T=sM?Cp@ig zQ}Jq>%zElozSP2qE&`LIYdc}wO*(GlMHtuT(vc@HHS#4bt(bv3mO7{HPz0uhy20zs z2xQ>_p5k@0t4wVsFvDi^5%r#f20X)?h}LAW@Di9C-sPic^?W?UbG(hB9dRoQh`=QQ p`7$mex(FZ>9hM literal 0 HcmV?d00001 diff --git a/web-nodejs/data/auth.db-wal b/web-nodejs/data/auth.db-wal new file mode 100644 index 0000000000000000000000000000000000000000..15c419c9fd5a90c0d0df609abb8f5207c90cd585 GIT binary patch literal 708672 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 Fz+blSKMMc= literal 0 HcmV?d00001 diff --git a/web-nodejs/data/betterdesk.db-wal b/web-nodejs/data/betterdesk.db-wal new file mode 100644 index 0000000000000000000000000000000000000000..2bab58165cebef994c3c487d1135e9b9a7516ff8 GIT binary patch literal 358472 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 AA^-pY literal 0 HcmV?d00001 diff --git a/web-nodejs/public/css/beta31.css b/web-nodejs/public/css/beta31.css new file mode 100644 index 00000000..210432b2 --- /dev/null +++ b/web-nodejs/public/css/beta31.css @@ -0,0 +1,510 @@ +/** + * BetterDesk Console — Beta 3.1 Panel + * ISPmanager-inspired layout with persistent sidebar + content area + */ + +/* ═══════════════════════════════════════════════════════════════════ + NAVBAR TOGGLE BUTTON + ═══════════════════════════════════════════════════════════════════ */ + +.beta31-toggle-btn { + position: relative; + display: flex !important; +} + +/* ═══════════════════════════════════════════════════════════════════ + BETA 3.1 SHELL — full-screen overlay + ═══════════════════════════════════════════════════════════════════ */ + +.beta31-shell { + position: fixed; + inset: 0; + z-index: 250; + display: none; + background: var(--b31-bg, #f0f2f5); + font-family: var(--font-family); +} + +.beta31-shell.active { + display: flex; + flex-direction: column; +} + +/* ── Top bar ── */ +.b31-topbar { + height: 48px; + min-height: 48px; + background: var(--b31-topbar-bg, #2b579a); + color: #fff; + display: flex; + align-items: center; + padding: 0 16px; + gap: 12px; + z-index: 2; + box-shadow: 0 1px 3px rgba(0,0,0,.18); +} + +.b31-topbar-logo { + display: flex; + align-items: center; + gap: 8px; + font-weight: 700; + font-size: 15px; + letter-spacing: .02em; + white-space: nowrap; +} + +.b31-topbar-logo .material-icons { font-size: 22px; } + +.b31-topbar-badge { + background: rgba(255,255,255,.2); + font-size: 10px; + padding: 2px 6px; + border-radius: 4px; + font-weight: 600; + letter-spacing: .05em; +} + +.b31-topbar-tabs { + display: flex; + align-items: center; + gap: 2px; + margin-left: 24px; + height: 100%; +} + +.b31-topbar-tab { + background: none; + border: none; + color: rgba(255,255,255,.7); + font-size: 13px; + padding: 0 14px; + height: 100%; + cursor: pointer; + transition: all .15s; + border-bottom: 2px solid transparent; + display: flex; + align-items: center; + gap: 6px; + white-space: nowrap; +} + +.b31-topbar-tab:hover { color: #fff; background: rgba(255,255,255,.08); } +.b31-topbar-tab.active { + color: #fff; + border-bottom-color: #fff; + background: rgba(255,255,255,.1); +} + +.b31-topbar-tab .material-icons { font-size: 18px; } + +.b31-topbar-spacer { flex: 1; } + +.b31-topbar-actions { + display: flex; + align-items: center; + gap: 4px; +} + +.b31-topbar-btn { + background: none; + border: none; + color: rgba(255,255,255,.75); + padding: 6px; + border-radius: 6px; + cursor: pointer; + display: flex; + align-items: center; + transition: all .15s; +} +.b31-topbar-btn:hover { background: rgba(255,255,255,.12); color: #fff; } +.b31-topbar-btn .material-icons { font-size: 20px; } + +/* ── Body: sidebar + content ── */ +.b31-body { + flex: 1; + display: flex; + overflow: hidden; +} + +/* ── Sidebar ── */ +.b31-sidebar { + width: 220px; + min-width: 220px; + background: var(--b31-sidebar-bg, #fff); + border-right: 1px solid var(--b31-border, #dde1e6); + display: flex; + flex-direction: column; + overflow-y: auto; + overflow-x: hidden; +} + +.b31-sidebar-section { + padding: 6px 0; + border-bottom: 1px solid var(--b31-border, #dde1e6); +} + +.b31-sidebar-section:last-child { border-bottom: none; } + +.b31-sidebar-heading { + font-size: 10px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: .06em; + color: var(--b31-muted, #8a8f9a); + padding: 10px 16px 4px; +} + +.b31-sidebar-item { + display: flex; + align-items: center; + gap: 10px; + padding: 7px 16px; + font-size: 13px; + color: var(--b31-text, #333); + cursor: pointer; + transition: all .12s; + border: none; + background: none; + width: 100%; + text-align: left; + border-left: 3px solid transparent; +} + +.b31-sidebar-item:hover { + background: var(--b31-hover, #f5f7fa); + color: var(--b31-primary, #2b579a); +} + +.b31-sidebar-item.active { + background: var(--b31-active-bg, #e8eef7); + color: var(--b31-primary, #2b579a); + font-weight: 600; + border-left-color: var(--b31-primary, #2b579a); +} + +.b31-sidebar-item .material-icons { + font-size: 20px; + opacity: .7; + flex-shrink: 0; +} + +.b31-sidebar-item.active .material-icons { opacity: 1; } + +.b31-sidebar-item-badge { + margin-left: auto; + background: var(--b31-primary, #2b579a); + color: #fff; + font-size: 10px; + padding: 1px 6px; + border-radius: 10px; + font-weight: 600; +} + +/* ── Content area ── */ +.b31-content { + flex: 1; + overflow-y: auto; + padding: 24px; + background: var(--b31-bg, #f0f2f5); +} + +/* ── Content cards (ISPmanager-style collapsible sections) ── */ +.b31-card { + background: var(--b31-card-bg, #fff); + border: 1px solid var(--b31-border, #dde1e6); + border-radius: 6px; + margin-bottom: 16px; + box-shadow: 0 1px 2px rgba(0,0,0,.04); +} + +.b31-card-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 12px 16px; + cursor: pointer; + user-select: none; + border-bottom: 1px solid var(--b31-border, #dde1e6); + transition: background .12s; +} + +.b31-card-header:hover { background: var(--b31-hover, #f5f7fa); } + +.b31-card-header-left { + display: flex; + align-items: center; + gap: 8px; + font-size: 14px; + font-weight: 600; + color: var(--b31-text, #333); +} + +.b31-card-header-left .material-icons { + font-size: 18px; + color: var(--b31-primary, #2b579a); +} + +.b31-card-header-actions { + display: flex; + align-items: center; + gap: 4px; +} + +.b31-card-action-btn { + background: none; + border: none; + color: var(--b31-muted, #8a8f9a); + padding: 4px; + border-radius: 4px; + cursor: pointer; + display: flex; + transition: all .12s; +} +.b31-card-action-btn:hover { + background: var(--b31-hover, #f5f7fa); + color: var(--b31-primary, #2b579a); +} +.b31-card-action-btn .material-icons { font-size: 18px; } + +.b31-card-body { padding: 16px; } + +.b31-card.collapsed .b31-card-body { display: none; } +.b31-card.collapsed .b31-card-header { border-bottom: none; } + +/* ── Info grid (label-value pairs like ISPmanager system info) ── */ +.b31-info-grid { + display: grid; + grid-template-columns: 180px 1fr; + gap: 0; +} + +.b31-info-label, +.b31-info-value { + padding: 8px 12px; + font-size: 13px; + border-bottom: 1px solid var(--b31-border-light, #eef0f3); +} + +.b31-info-label { + color: var(--b31-muted, #8a8f9a); + font-weight: 500; +} + +.b31-info-value { + color: var(--b31-text, #333); +} + +.b31-info-value a { + color: var(--b31-primary, #2b579a); + text-decoration: none; +} +.b31-info-value a:hover { text-decoration: underline; } + +/* ── Table styles ── */ +.b31-table { + width: 100%; + border-collapse: collapse; + font-size: 13px; +} + +.b31-table th { + text-align: left; + padding: 8px 12px; + font-weight: 600; + color: var(--b31-muted, #8a8f9a); + font-size: 12px; + text-transform: uppercase; + letter-spacing: .04em; + border-bottom: 2px solid var(--b31-border, #dde1e6); + white-space: nowrap; +} + +.b31-table td { + padding: 8px 12px; + border-bottom: 1px solid var(--b31-border-light, #eef0f3); + color: var(--b31-text, #333); +} + +.b31-table tbody tr:hover { + background: var(--b31-hover, #f5f7fa); +} + +/* ── Quick action bar (like ISPmanager taskbar) ── */ +.b31-taskbar { + display: flex; + align-items: center; + gap: 12px; + padding: 12px 16px; + background: var(--b31-card-bg, #fff); + border: 1px solid var(--b31-border, #dde1e6); + border-radius: 6px; + margin-bottom: 16px; +} + +.b31-taskbar-item { + display: flex; + flex-direction: column; + align-items: center; + gap: 4px; + padding: 8px 16px; + border-radius: 6px; + cursor: pointer; + transition: all .12s; + text-decoration: none; + color: var(--b31-text, #333); + font-size: 12px; + background: none; + border: none; +} +.b31-taskbar-item:hover { background: var(--b31-hover, #f5f7fa); color: var(--b31-primary, #2b579a); } +.b31-taskbar-item .material-icons { font-size: 28px; color: var(--b31-primary, #2b579a); } + +/* ── Status indicators ── */ +.b31-status { + display: inline-flex; + align-items: center; + gap: 6px; + font-size: 12px; + font-weight: 500; +} + +.b31-status-dot { + width: 8px; + height: 8px; + border-radius: 50%; + flex-shrink: 0; +} +.b31-status.online .b31-status-dot { background: #2ea44f; } +.b31-status.offline .b31-status-dot { background: #8b949e; } +.b31-status.error .b31-status-dot { background: #f85149; } +.b31-status.warning .b31-status-dot { background: #d29922; } + +/* ── Buttons ── */ +.b31-btn { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 6px 14px; + font-size: 13px; + border-radius: 4px; + border: 1px solid var(--b31-border, #dde1e6); + background: var(--b31-card-bg, #fff); + color: var(--b31-text, #333); + cursor: pointer; + transition: all .12s; + font-weight: 500; +} +.b31-btn:hover { background: var(--b31-hover, #f5f7fa); border-color: var(--b31-primary, #2b579a); } +.b31-btn .material-icons { font-size: 16px; } + +.b31-btn-primary { + background: var(--b31-primary, #2b579a); + color: #fff; + border-color: var(--b31-primary, #2b579a); +} +.b31-btn-primary:hover { background: #1e4280; } + +/* ── Loading state ── */ +.b31-loading { + display: flex; + align-items: center; + justify-content: center; + padding: 60px; + color: var(--b31-muted, #8a8f9a); + font-size: 14px; + gap: 10px; +} + +.b31-loading .material-icons { + animation: b31spin 1s linear infinite; +} + +@keyframes b31spin { + to { transform: rotate(360deg); } +} + +/* ── Page header inside content area ── */ +.b31-page-header { + margin-bottom: 20px; +} + +.b31-page-title { + font-size: 20px; + font-weight: 700; + color: var(--b31-text, #333); + margin-bottom: 4px; +} + +.b31-page-subtitle { + font-size: 13px; + color: var(--b31-muted, #8a8f9a); +} + +/* ── Stats row ── */ +.b31-stats { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); + gap: 12px; + margin-bottom: 16px; +} + +.b31-stat-card { + background: var(--b31-card-bg, #fff); + border: 1px solid var(--b31-border, #dde1e6); + border-radius: 6px; + padding: 16px; + display: flex; + align-items: center; + gap: 12px; +} + +.b31-stat-icon { + width: 40px; + height: 40px; + border-radius: 8px; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; +} +.b31-stat-icon.blue { background: rgba(43,87,154,.1); color: #2b579a; } +.b31-stat-icon.green { background: rgba(46,164,79,.1); color: #2ea44f; } +.b31-stat-icon.red { background: rgba(248,81,73,.1); color: #f85149; } +.b31-stat-icon.yellow { background: rgba(210,153,34,.1); color: #d29922; } +.b31-stat-icon .material-icons { font-size: 22px; } + +.b31-stat-value { font-size: 22px; font-weight: 700; color: var(--b31-text, #333); } +.b31-stat-label { font-size: 12px; color: var(--b31-muted, #8a8f9a); } + +/* ═══════════════════════════════════════════════════════════════════ + DARK MODE overrides + ═══════════════════════════════════════════════════════════════════ */ + +.beta31-shell.b31-dark { + --b31-bg: #0d1117; + --b31-topbar-bg: #161b22; + --b31-sidebar-bg: #161b22; + --b31-card-bg: #1c2128; + --b31-border: #30363d; + --b31-border-light: #262c36; + --b31-text: #e6edf3; + --b31-muted: #8b949e; + --b31-hover: rgba(255,255,255,.04); + --b31-active-bg: rgba(88,166,255,.12); + --b31-primary: #58a6ff; +} + +/* ═══════════════════════════════════════════════════════════════════ + RESPONSIVE + ═══════════════════════════════════════════════════════════════════ */ + +@media (max-width: 768px) { + .b31-sidebar { width: 56px; min-width: 56px; } + .b31-sidebar-heading, + .b31-sidebar-item span:not(.material-icons), + .b31-sidebar-item-badge { display: none; } + .b31-sidebar-item { justify-content: center; padding: 10px 0; } + .b31-content { padding: 12px; } + .b31-topbar-tabs { display: none; } +} diff --git a/web-nodejs/public/js/beta31.js b/web-nodejs/public/js/beta31.js new file mode 100644 index 00000000..6af4b72a --- /dev/null +++ b/web-nodejs/public/js/beta31.js @@ -0,0 +1,298 @@ +/** + * BetterDesk Console — Beta 3.1 Panel Controller + * Manages the ISPmanager-inspired shell: sidebar navigation, content loading + */ + +(function () { + 'use strict'; + + const STORAGE_KEY = 'bd_beta31_active'; + const STORAGE_PANEL = 'bd_beta31_panel'; + let shell = null; + let contentArea = null; + let currentPanel = null; + let panelCache = {}; + + /* ────────────────────────────────────────────── + Menu definition — mirrors sidebar.ejs entries + ────────────────────────────────────────────── */ + function getMenuSections() { + const t = (k, fb) => (typeof _ === 'function' ? _(k) : fb) || fb; + return [ + { + heading: t('nav.main', 'Main'), + items: [ + { id: 'dashboard', icon: 'dashboard', label: t('nav.dashboard', 'Dashboard') }, + { id: 'devices', icon: 'devices', label: t('nav.devices', 'Devices') }, + { id: 'registrations', icon: 'how_to_reg', label: t('nav.registrations', 'Registrations') }, + ] + }, + { + heading: t('nav.management', 'Management'), + items: [ + { id: 'inventory', icon: 'inventory_2', label: t('nav.inventory', 'Inventory') }, + { id: 'tickets', icon: 'confirmation_number', label: t('nav.tickets', 'Tickets') }, + { id: 'help-requests', icon: 'support_agent', label: t('nav.help_requests', 'Help Requests') }, + { id: 'automation', icon: 'smart_toy', label: t('nav.automation', 'Automation') }, + { id: 'network', icon: 'lan', label: t('nav.network', 'Network') }, + { id: 'activity', icon: 'timeline', label: t('nav.activity', 'Activity') }, + { id: 'cdap', icon: 'developer_board', label: t('nav.cdap', 'CDAP') }, + { id: 'fleet', icon: 'hub', label: t('nav.fleet', 'Fleet') }, + { id: 'scaling', icon: 'cell_tower', label: t('nav.scaling', 'Scaling') }, + { id: 'cross-platform', icon: 'devices', label: t('nav.cross_platform', 'Cross-Platform') }, + { id: 'chat', icon: 'chat', label: t('nav.chat', 'Chat') }, + ] + }, + { + heading: t('nav.tools', 'Tools'), + items: [ + { id: 'reports', icon: 'assessment', label: t('nav.reports', 'Reports') }, + { id: 'keys', icon: 'vpn_key', label: t('nav.keys', 'Keys') }, + { id: 'generator', icon: 'build', label: t('nav.generator', 'Generator') }, + { id: 'remote', icon: 'connected_tv', label: t('nav.remote', 'Remote Desktop') }, + { id: 'toolkit', icon: 'handyman', label: t('nav.toolkit', 'Toolkit') }, + { id: 'cdap-studio', icon: 'account_tree', label: t('nav.sdk_studio', 'SDK Studio') }, + ] + }, + { + heading: t('nav.system', 'System'), + items: [ + { id: 'tokens', icon: 'token', label: t('nav.tokens', 'Tokens') }, + { id: 'organizations', icon: 'corporate_fare', label: t('nav.organizations', 'Organizations') }, + { id: 'policies', icon: 'policy', label: t('nav.policies', 'Policies') }, + { id: 'attestation', icon: 'fingerprint', label: t('nav.attestation', 'Attestation') }, + { id: 'dataguard', icon: 'shield', label: t('nav.dataguard', 'DataGuard') }, + { id: 'users', icon: 'group', label: t('nav.users', 'Users') }, + { id: 'security-audit', icon: 'security', label: t('nav.security_audit', 'Security Audit') }, + { id: 'permissions', icon: 'admin_panel_settings', label: t('nav.permissions', 'Permissions') }, + { id: 'languages', icon: 'translate', label: t('nav.languages', 'Languages') }, + { id: 'resource-control', icon: 'tune', label: t('nav.resource_control', 'Resource Control') }, + { id: 'settings', icon: 'settings', label: t('nav.settings', 'Settings') }, + ] + } + ]; + } + + /* ────────────────────────────────────────────── + Build the shell DOM + ────────────────────────────────────────────── */ + function buildShell() { + if (document.getElementById('beta31-shell')) return; + + const appName = (window.BetterDesk && window.BetterDesk.branding && window.BetterDesk.branding.appName) || 'BetterDesk'; + const isDark = document.documentElement.getAttribute('data-theme') === 'dark'; + + shell = document.createElement('div'); + shell.id = 'beta31-shell'; + shell.className = 'beta31-shell' + (isDark ? ' b31-dark' : ''); + + // Build topbar + const topbar = document.createElement('div'); + topbar.className = 'b31-topbar'; + topbar.innerHTML = ` + +
+
+ + + +
+ `; + + // Build body (sidebar + content) + const body = document.createElement('div'); + body.className = 'b31-body'; + + // Sidebar + const sidebar = document.createElement('nav'); + sidebar.className = 'b31-sidebar'; + sidebar.id = 'b31-sidebar'; + + const sections = getMenuSections(); + sections.forEach(sec => { + const div = document.createElement('div'); + div.className = 'b31-sidebar-section'; + div.innerHTML = `
${escHtml(sec.heading)}
`; + sec.items.forEach(item => { + const btn = document.createElement('button'); + btn.className = 'b31-sidebar-item'; + btn.dataset.panel = item.id; + btn.innerHTML = `${item.icon}${escHtml(item.label)}`; + btn.addEventListener('click', () => navigateTo(item.id)); + div.appendChild(btn); + }); + sidebar.appendChild(div); + }); + + // Content + contentArea = document.createElement('div'); + contentArea.className = 'b31-content'; + contentArea.id = 'b31-content'; + + body.appendChild(sidebar); + body.appendChild(contentArea); + + shell.appendChild(topbar); + shell.appendChild(body); + document.body.appendChild(shell); + + // Event listeners + document.getElementById('b31-exit-btn').addEventListener('click', deactivate); + document.getElementById('b31-refresh-btn').addEventListener('click', () => { + if (currentPanel) { panelCache[currentPanel] = null; navigateTo(currentPanel); } + }); + document.getElementById('b31-theme-btn').addEventListener('click', toggleTheme); + } + + /* ────────────────────────────────────────────── + Navigation — load panel content via fetch + ────────────────────────────────────────────── */ + function navigateTo(panelId) { + if (!contentArea) return; + currentPanel = panelId; + localStorage.setItem(STORAGE_PANEL, panelId); + + // Update sidebar active state + shell.querySelectorAll('.b31-sidebar-item').forEach(el => { + el.classList.toggle('active', el.dataset.panel === panelId); + }); + + // Show loading + contentArea.innerHTML = '
sync Loading…
'; + + // Use cache if available + if (panelCache[panelId]) { + renderPanel(panelId, panelCache[panelId]); + return; + } + + // Fetch panel content — we load the actual page and extract main-content + fetch('/' + (panelId === 'dashboard' ? '' : panelId), { + headers: { 'X-Beta31': '1', 'X-Requested-With': 'XMLHttpRequest' }, + credentials: 'same-origin' + }) + .then(resp => { + if (!resp.ok) throw new Error('HTTP ' + resp.status); + return resp.text(); + }) + .then(html => { + // Extract inner content from the page + const extracted = extractMainContent(html); + panelCache[panelId] = extracted; + // Only render if still on same panel + if (currentPanel === panelId) renderPanel(panelId, extracted); + }) + .catch(err => { + if (currentPanel === panelId) { + contentArea.innerHTML = `
+

Failed to load panel: ${escHtml(err.message)}

+ +
`; + } + }); + } + + function extractMainContent(html) { + const parser = new DOMParser(); + const doc = parser.parseFromString(html, 'text/html'); + const main = doc.querySelector('.main-content'); + if (main) return main.innerHTML; + // Fallback: body content + return doc.body ? doc.body.innerHTML : html; + } + + function renderPanel(panelId, html) { + contentArea.innerHTML = html; + + // Execute inline scripts + contentArea.querySelectorAll('script').forEach(oldScript => { + const newScript = document.createElement('script'); + if (oldScript.src) { + newScript.src = oldScript.src; + } else { + newScript.textContent = oldScript.textContent; + } + oldScript.parentNode.replaceChild(newScript, oldScript); + }); + + // Trigger page-specific init + window.dispatchEvent(new CustomEvent('app:refresh')); + } + + /* ────────────────────────────────────────────── + Activate / Deactivate + ────────────────────────────────────────────── */ + function activate() { + buildShell(); + shell.classList.add('active'); + document.body.style.overflow = 'hidden'; + localStorage.setItem(STORAGE_KEY, '1'); + + // Navigate to saved or default panel + const saved = localStorage.getItem(STORAGE_PANEL) || 'dashboard'; + navigateTo(saved); + } + + function deactivate() { + if (shell) shell.classList.remove('active'); + document.body.style.overflow = ''; + localStorage.setItem(STORAGE_KEY, '0'); + } + + function toggleTheme() { + if (!shell) return; + shell.classList.toggle('b31-dark'); + const icon = document.querySelector('#b31-theme-btn .material-icons'); + if (icon) icon.textContent = shell.classList.contains('b31-dark') ? 'light_mode' : 'dark_mode'; + } + + /* ────────────────────────────────────────────── + Helpers + ────────────────────────────────────────────── */ + function escHtml(s) { + const d = document.createElement('div'); + d.textContent = s || ''; + return d.innerHTML; + } + + /* ────────────────────────────────────────────── + Public API + ────────────────────────────────────────────── */ + window.Beta31 = { + activate: activate, + deactivate: deactivate, + navigateTo: navigateTo, + isActive: () => shell && shell.classList.contains('active'), + init: function () { + // Wire up the toggle button in the navbar + const btn = document.getElementById('beta31-toggle-btn'); + if (btn) btn.addEventListener('click', () => { + if (window.Beta31.isActive()) deactivate(); else activate(); + }); + + // Auto-restore if was active + if (localStorage.getItem(STORAGE_KEY) === '1') { + activate(); + } + } + }; + + // Auto-init on DOM ready + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', () => window.Beta31.init()); + } else { + window.Beta31.init(); + } +})(); diff --git a/web-nodejs/views/layouts/main.ejs b/web-nodejs/views/layouts/main.ejs index fc758824..a2a54fa3 100644 --- a/web-nodejs/views/layouts/main.ejs +++ b/web-nodejs/views/layouts/main.ejs @@ -19,6 +19,7 @@ + <% } else { %> <% } %> @@ -149,6 +150,7 @@ + <% } %> <% if (typeof pageScripts !== 'undefined' && pageScripts.length) { %> diff --git a/web-nodejs/views/partials/navbar.ejs b/web-nodejs/views/partials/navbar.ejs index 26890977..d9d8f339 100644 --- a/web-nodejs/views/partials/navbar.ejs +++ b/web-nodejs/views/partials/navbar.ejs @@ -50,6 +50,12 @@ + + +