diff --git a/panel/public/assets/js/user.js b/panel/public/assets/js/user.js index a507ba4..01f0f76 100644 --- a/panel/public/assets/js/user.js +++ b/panel/public/assets/js/user.js @@ -1058,35 +1058,34 @@ window.submitChangePassword = async () => { /* ── Docker (#34) ────────────────────────────────────────────────────────── */ async function dockerPage(el) { el.innerHTML = '
No containers yet. Launch an app from the catalog!
+No apps yet. Launch one from the catalog!
| Name | App | Status | Actions | |||||||
|---|---|---|---|---|---|---|---|---|---|---|
| ${Nova.escHtml(c.name)} | -${Nova.escHtml(c.app_key||c.image||'—')} | -${Nova.badge(c.status, c.status==='running'?'green':c.status==='stopped'?'red':'yellow')} | + : `
| App | Status | Created | Actions |
|---|---|---|---|
| ${Nova.escHtml(s.name)} | +${Nova.badge(s.status, statusColor(s.status))} | +${Nova.relTime(s.created_at)} | - ${c.status==='running' - ? ` - ` - : ``} - + ${s.status==='running' + ? `` + : ``} + + |
${Nova.escHtml(r?.data?.logs||'No logs available')}`);
+window.uStackLogs = async (stackId, name) => {
+ Nova.loading('Fetching logs…');
+ const r = await Nova.api('docker', 'stack-action', { method: 'POST', body: { stack_id: stackId, action: 'logs' } });
+ Nova.loadingDone();
+ Nova.modal(`Logs: ${name}`, `${Nova.escHtml(r?.data?.output||'No logs available')}`);
+};
+
+window.uStackRemove = async (stackId, name) => {
+ if (!confirm(`Remove app "${name}"? This will stop and delete its containers and data.`)) return;
+ Nova.loading('Removing app…');
+ const r = await Nova.api('docker', 'remove-stack', { method: 'POST', body: { stack_id: stackId } });
+ Nova.loadingDone();
+ Nova.toast(r?.success ? 'App removed' : (r?.message||'Failed'), r?.success?'success':'error');
+ if (r?.success) await uDockerReloadStacks();
};
window.uDockerLaunchModal = () => uDockerLaunchApp(null);
@@ -1210,11 +1229,9 @@ window.uDockerLaunchApp = async (preselect) => {
Nova.loading(`Launching ${app.name}… this may take a minute`);
const r = await Nova.api('docker', 'launch', { method: 'POST', body: { app_key: key, params } });
Nova.loadingDone();
- Nova.toast(r?.success ? `${app.name} launched!` : (r?.message||'Launch failed'), r?.success?'success':'error');
+ Nova.toast(r?.success ? `${app.name} launching — refresh in a moment to see status` : (r?.message||'Launch failed'), r?.success?'success':'error');
if (r?.success) {
- const cr = await Nova.api('docker', 'containers');
- window._uDockerContainers = cr?.data?.containers || [];
- uDockerTab('my-containers');
+ await uDockerTab('my-apps');
}
};
};