Change : display

This commit is contained in:
2026-06-21 18:05:52 +01:00
parent 6ee29a462e
commit 9b2bc907aa
4 changed files with 227 additions and 41 deletions

View File

@@ -115,36 +115,71 @@
<div class="form-section">
<div class="form-section-title">STEP 3 — SELECT APPS TO RESTORE</div>
<p style="color:var(--text3); font-size:12px; margin-bottom:10px;">
All apps are restored by default. Uncheck the ones you don't want touched —
only the checked apps will be restored, and they're force-restored even if
currently running and healthy.
<p class="app-picker-note">
<i class="fas fa-info-circle"></i>
All apps are selected by default. Uncheck any app you want to leave untouched —
only checked apps will be restored, and they are force-restored even if currently running and healthy.
</p>
<div id="apps-checkbox-group" style="display:flex; flex-wrap:wrap; gap:8px;">
<label class="radio-card small" style="cursor:pointer;">
<input type="checkbox" value="frappe" checked style="margin-right:6px;">
<span>🧾 Frappe / ERPNext</span>
<div class="app-picker-grid" id="apps-checkbox-group">
<label class="app-picker-card">
<input type="checkbox" value="frappe" checked>
<div class="app-picker-body">
<span class="app-picker-icon">🧾</span>
<div>
<div class="app-picker-name">Frappe / ERPNext</div>
<div class="app-picker-desc">ERP & business suite</div>
</div>
<span class="app-picker-check"><i class="fas fa-check"></i></span>
</div>
</label>
<label class="radio-card small" style="cursor:pointer;">
<input type="checkbox" value="odoo" checked style="margin-right:6px;">
<span>🟣 Odoo</span>
<label class="app-picker-card">
<input type="checkbox" value="odoo" checked>
<div class="app-picker-body">
<span class="app-picker-icon">🟣</span>
<div>
<div class="app-picker-name">Odoo</div>
<div class="app-picker-desc">CRM, inventory & accounting</div>
</div>
<span class="app-picker-check"><i class="fas fa-check"></i></span>
</div>
</label>
<label class="radio-card small" style="cursor:pointer;">
<input type="checkbox" value="nextcloud" checked style="margin-right:6px;">
<span>☁️ Nextcloud</span>
<label class="app-picker-card">
<input type="checkbox" value="nextcloud" checked>
<div class="app-picker-body">
<span class="app-picker-icon">☁️</span>
<div>
<div class="app-picker-name">Nextcloud</div>
<div class="app-picker-desc">Files & collaboration</div>
</div>
<span class="app-picker-check"><i class="fas fa-check"></i></span>
</div>
</label>
<label class="radio-card small" style="cursor:pointer;">
<input type="checkbox" value="mautic" checked style="margin-right:6px;">
<span>📣 Mautic</span>
<label class="app-picker-card">
<input type="checkbox" value="mautic" checked>
<div class="app-picker-body">
<span class="app-picker-icon">📣</span>
<div>
<div class="app-picker-name">Mautic</div>
<div class="app-picker-desc">Marketing automation</div>
</div>
<span class="app-picker-check"><i class="fas fa-check"></i></span>
</div>
</label>
<label class="radio-card small" style="cursor:pointer;">
<input type="checkbox" value="n8n" checked style="margin-right:6px;">
<span>🔁 n8n</span>
<label class="app-picker-card">
<input type="checkbox" value="n8n" checked>
<div class="app-picker-body">
<span class="app-picker-icon">🔁</span>
<div>
<div class="app-picker-name">n8n</div>
<div class="app-picker-desc">Workflow automation</div>
</div>
<span class="app-picker-check"><i class="fas fa-check"></i></span>
</div>
</label>
</div>
<div style="margin-top:10px; display:flex; gap:8px;">
<button type="button" class="btn btn-sm" onclick="nvSetAllApps(true)">Select All</button>
<button type="button" class="btn btn-sm" onclick="nvSetAllApps(false)">Select None</button>
<div class="app-picker-actions">
<button type="button" class="btn btn-sm btn-ghost" onclick="nvSetAllApps(true)"><i class="fas fa-check-double"></i> Select All</button>
<button type="button" class="btn btn-sm btn-ghost" onclick="nvSetAllApps(false)"><i class="fas fa-ban"></i> Select None</button>
</div>
</div>
@@ -340,6 +375,7 @@ async function nvLaunchRestore() {
// ── Init ──────────────────────────────────────────────────────────────────────
document.addEventListener('DOMContentLoaded', () => {
loadCloudSelect();
nvUpdateRestoreWarning();
// Handle prefill from URL params (e.g. clicking Restore from backups page)
const pf = window.restorePrefill || {};

View File

@@ -22,10 +22,23 @@
</div>
<div class="users-grid" id="users-grid">
{% for u in users %}
<div class="user-card" onclick="loadUserContainers('{{ u.name }}')">
<div class="user-card-top"><div class="user-avatar" style="background:#3b82f6">{{ u.name[0].upper() }}</div><div><div class="user-name">{{ u.name }}</div><div class="user-uid">uid {{ u.uid }}</div></div></div>
<div class="user-tags">{% if u.has_docker %}<span class="user-tag docker"><i class="fab fa-docker"></i> docker</span>{% endif %}{% if u.linger %}<span class="user-tag linger">linger</span>{% endif %}{% if u.has_vdisk %}<span class="user-tag" style="background:rgba(34,211,238,0.12);color:var(--cyan);">💾 vdisk</span>{% endif %}</div>
<div class="user-stats"><div class="user-stat">Disk: <strong>{{ u.disk_used }}</strong></div><div class="user-stat">Ctrs: <strong>{{ u.container_count }}</strong></div></div>
<div class="user-card" data-user="{{ u.name }}" onclick="loadUserContainers('{{ u.name }}')">
<div class="user-card-top">
<div class="user-avatar" style="background:#3b82f6">{{ u.name[0].upper() }}</div>
<div>
<div class="user-name">{{ u.name }}</div>
<div class="user-uid">uid {{ u.uid }}</div>
</div>
</div>
<div class="user-tags">
{% if u.has_docker %}<span class="user-tag docker"><i class="fab fa-docker"></i> docker</span>{% endif %}
{% if u.linger %}<span class="user-tag linger"><i class="fas fa-clock"></i> linger</span>{% endif %}
{% if u.has_vdisk %}<span class="user-tag vdisk"><i class="fas fa-hard-drive"></i> vdisk</span>{% endif %}
</div>
<div class="user-stats">
<div class="user-stat"><span class="user-stat-label">Disk</span><strong>{{ u.disk_used }}</strong></div>
<div class="user-stat"><span class="user-stat-label">Containers</span><strong>{{ u.container_count }}</strong></div>
</div>
</div>
{% else %}
<div class="empty-state" style="grid-column:1/-1"><i class="fas fa-user-slash"></i>No non-system users</div>
@@ -36,9 +49,24 @@
<div class="card" id="user-detail-panel" style="display:none;">
<div class="card-header">
<div class="card-title"><i class="fas fa-cube"></i> <span id="user-detail-title">Containers</span></div>
<div style="display:flex;gap:8px;"><button class="btn btn-ghost btn-sm" style="color:var(--red);" onclick="deleteUser()"><i class="fas fa-trash"></i> Delete</button><button class="btn btn-ghost btn-sm" onclick="document.getElementById('user-detail-panel').style.display='none'"></button></div>
<div style="display:flex;gap:8px;">
<button class="btn btn-ghost btn-sm" style="color:var(--red);" onclick="deleteUser()"><i class="fas fa-trash"></i> Delete</button>
<button class="btn btn-ghost btn-sm" onclick="document.getElementById('user-detail-panel').style.display='none'; document.querySelectorAll('.user-card.selected').forEach(c=>c.classList.remove('selected'))" title="Close"></button>
</div>
</div>
<div class="user-detail-table-wrap">
<table class="ct-table user-containers-table">
<thead>
<tr>
<th>NAME</th>
<th>STATUS</th>
<th>IMAGE</th>
<th>PORTS</th>
</tr>
</thead>
<tbody id="user-containers-body"></tbody>
</table>
</div>
<div style="overflow-x:auto;"><table class="ct-table"><thead><tr><th>NAME</th><th>STATUS</th><th>IMAGE</th><th>PORTS</th></tr></thead><tbody id="user-containers-body"></tbody></table></div>
<div id="user-action-result" class="alert" style="margin-top:14px;"></div>
</div>
{% endblock %}