@@ -1546,6 +1612,7 @@ class WebUIRenderer:
function openExportProfileModal() {{ openModal('exportProfileModal'); }}
function openImportLicModal() {{ openModal('importLicModal'); }}
function openPasswordModal() {{ openModal('passwordModal'); }}
+ function openVersionInfoModal() {{ openModal('versionInfoModal'); }}
function downloadLicRequest() {{
window.location.href = '/api/license/export-lic';
@@ -2241,8 +2308,13 @@ class WebUIRenderer:
db_path = config.get("db_path", "logar_state.db")
auth_display = html.escape(str(auth_user or "admin"))
- # Check Best Practice licensing feature
+ # Check Best Practice licensing feature & summary
is_bp_licensed = LicenseManager.is_feature_licensed("best_practices", db_path=db_path, server_state=state)
+ summary = LicenseManager.get_license_summary(state, db_path=db_path)
+ update_status = state.get("update_status", {})
+ update_mode = update_status.get("update_mode") or config.get("update_mode", "official")
+ upstream_url = update_status.get("upstream_url") or config.get("upstream_url", "https://gitea.eibl.tech/api/v1/repos/me0nline/LOGAR/releases/latest")
+ hosted_client_ver = state.get("hosted_client_version") or LOGAR_VERSION
# Query clients and host telemetry
conn = sqlite3.connect(db_path)
@@ -2661,6 +2733,34 @@ class WebUIRenderer:
.logo-title {{ font-size: 20px; font-weight: 800; letter-spacing: -0.5px; color: #fff; }}
.logo-sub {{ font-size: 12px; color: var(--text-muted); margin-top: 2px; }}
+ /* User Dropdown */
+ .user-menu-container {{ position: relative; display: inline-block; }}
+ .user-tag {{
+ display: inline-flex; align-items: center; gap: 8px;
+ padding: 8px 14px; background: #0f172a;
+ border: 1px solid var(--border); border-radius: 8px;
+ font-size: 13px; font-weight: 600; cursor: pointer;
+ user-select: none;
+ }}
+ .user-tag:hover {{ border-color: var(--primary); background: #151c2e; }}
+ .user-dropdown {{
+ display: none; position: absolute; right: 0; top: calc(100% + 6px);
+ background: var(--card); border: 1px solid var(--border);
+ border-radius: 10px; box-shadow: 0 12px 30px rgba(0, 0, 0, 0.6);
+ min-width: 220px; z-index: 200; overflow: hidden;
+ }}
+ .user-menu-container:hover .user-dropdown, .user-menu-container:focus-within .user-dropdown, .user-dropdown.show {{ display: block; }}
+ .user-dropdown-header {{ padding: 10px 14px; font-size: 11px; font-weight: 700; text-transform: uppercase; color: var(--text-muted); background: #0f172a; border-bottom: 1px solid var(--border); }}
+ .user-dropdown-item {{
+ display: flex; align-items: center; gap: 8px; padding: 10px 14px;
+ font-size: 13px; color: var(--text); text-decoration: none; cursor: pointer;
+ border: none; width: 100%; background: transparent; text-align: left;
+ transition: background 0.2s;
+ }}
+ .user-dropdown-item:hover {{ background: rgba(59, 130, 246, 0.1); color: #fff; }}
+ .user-dropdown-item.danger {{ color: #f87171; }}
+ .user-dropdown-item.danger:hover {{ background: rgba(239, 68, 68, 0.15); }}
+
/* Buttons & Badges */
.btn {{
display: inline-flex; align-items: center; gap: 6px;
@@ -2777,9 +2877,17 @@ class WebUIRenderer:
đ Sub-CA & Licensing
-
- đ¤ {auth_display}
-
+