Change : display
This commit is contained in:
@@ -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 || {};
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
Reference in New Issue
Block a user