"Backup now" and "Open backup center" looked off compared to the rest of the app page — the secondary link sat underlined with a trailing arrow glyph instead of a real button, and neither carried an icon. Re-skins both to use the .btn .btn-primary / .btn .btn-secondary pattern the config Save / Reset buttons use, so the three action surfaces on an app page read as one family. Backup now .btn .btn-primary + upload-cloud SVG (16x16) Open backup center .btn .btn-secondary + external-link SVG (16x16) The "Open backup center" link is now SPA-routed (preventDefault + call navigateToRoute) so clicking it doesn't trigger a full page reload — same behaviour as the deep-link cells in the global Snapshots table. href is still /backup so cmd/ctrl-click and right-click → open-in-new-tab still work the natural way. Applied to both apps-unified-layout.html and the legacy app-content.html since the existing app-page surface lives in both templates. Signed-off-by: librelad <librelad@digitalangels.vip>
117 lines
5.3 KiB
HTML
Executable File
117 lines
5.3 KiB
HTML
Executable File
<!-- App Management Layout -->
|
|
<div class="container">
|
|
<!-- Mobile overlay -->
|
|
<div class="mobile-overlay" id="mobile-overlay"></div>
|
|
|
|
<!-- Sidebar -->
|
|
<div class="sidebar" id="sidebar">
|
|
<!-- Categories will be dynamically generated here -->
|
|
<div id="dynamic-categories"></div>
|
|
</div>
|
|
|
|
<!-- Main content -->
|
|
<div class="main">
|
|
<div class="app-header" id="app-header">
|
|
<!-- App info will be dynamically inserted -->
|
|
</div>
|
|
|
|
<!-- Tabbed Interface -->
|
|
<div class="tabbed-interface">
|
|
<div class="tab-navigation">
|
|
<button class="tab-button active" data-tab="config" onclick="if(window.appTabbedManager) window.appTabbedManager.switchTab('config')">
|
|
<span class="tab-emoji">🛠️</span>
|
|
<span class="tab-name">Config</span>
|
|
</button>
|
|
<button class="tab-button" data-tab="services" onclick="if(window.appTabbedManager) window.appTabbedManager.switchTab('services')">
|
|
<span class="tab-emoji">⚡</span>
|
|
<span class="tab-name">Services</span>
|
|
</button>
|
|
<button class="tab-button" data-tab="tools" style="display: none;" onclick="if(window.appTabbedManager) window.appTabbedManager.switchTab('tools')">
|
|
<span class="tab-emoji">🧰</span>
|
|
<span class="tab-name">Tools</span>
|
|
</button>
|
|
<button class="tab-button" data-tab="routing" style="display: none;" onclick="if(window.appTabbedManager) window.appTabbedManager.switchTab('routing')">
|
|
<span class="tab-emoji">🛡️</span>
|
|
<span class="tab-name">Routing</span>
|
|
</button>
|
|
<button class="tab-button" data-tab="backups" onclick="if(window.appTabbedManager) window.appTabbedManager.switchTab('backups')">
|
|
<span class="tab-emoji">💾</span>
|
|
<span class="tab-name">Backups</span>
|
|
</button>
|
|
</div>
|
|
|
|
<!-- Tab Content -->
|
|
<div class="tab-content">
|
|
<!-- Config Tab -->
|
|
<div class="tab-pane active" id="config-tab">
|
|
<div class="config-section" id="config-section">
|
|
<!-- Config form will be dynamically inserted -->
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Services Tab -->
|
|
<div class="tab-pane" id="services-tab">
|
|
<div class="services-section">
|
|
<div id="services-list" class="services-list">
|
|
<!-- Service rows are rendered here by services-manager.js -->
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Tools Tab -->
|
|
<div class="tab-pane" id="tools-tab">
|
|
<div class="tools-section">
|
|
<div id="tools-list" class="tools-list">
|
|
<!-- Tool buttons are rendered here by tools-manager.js -->
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Routing Tab (Traefik only) -->
|
|
<div class="tab-pane" id="routing-tab">
|
|
<div class="routing-section-wrap">
|
|
<div id="routing-list" class="routing-list">
|
|
<!-- Routing rows rendered by routing-manager.js -->
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Backups Tab -->
|
|
<div class="tab-pane" id="backups-tab">
|
|
<div class="backup-section" id="backup-section">
|
|
<div class="backup-title">
|
|
<div class="backup-title-main">
|
|
<h3>💾 Backups</h3>
|
|
<p>Backups for <span id="backup-app-name">this app</span> across all configured locations.</p>
|
|
</div>
|
|
<div class="backup-title-actions">
|
|
<button type="button" class="btn btn-primary" id="backup-app-card-backup-btn">
|
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
|
|
<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path>
|
|
<polyline points="17 8 12 3 7 8"></polyline>
|
|
<line x1="12" y1="3" x2="12" y2="15"></line>
|
|
</svg>
|
|
Backup now
|
|
</button>
|
|
<a class="btn btn-secondary" href="/backup" onclick="event.preventDefault(); if(window.navigateToRoute){window.navigateToRoute('/backup');}else{window.location.href='/backup';}">
|
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
|
|
<path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path>
|
|
<polyline points="15 3 21 3 21 9"></polyline>
|
|
<line x1="10" y1="14" x2="21" y2="3"></line>
|
|
</svg>
|
|
Open backup center
|
|
</a>
|
|
</div>
|
|
</div>
|
|
<div class="backup-snapshots-container">
|
|
<div class="backup-app-card-status" id="backup-app-card-status">Loading…</div>
|
|
<div class="backup-app-card-snapshots" id="backup-app-card-snapshots"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|