/** * javascript/compose.js * * Compose panel: project list + read-only YAML view + up/down/pull, * backed by ajax/compose.php. See that file's header comment — this is * the one panel whose backend shells out to the `podman compose` CLI, * because no REST equivalent for Compose exists in libpod. */ (function () { 'use strict'; const P = window.Podman; let projects = []; let selected = null; function statusChip(status) { const cls = status === 'up' ? 'podman-chip-good' : (status === 'down' ? 'podman-chip-neutral' : 'podman-chip-warn'); return '' + P.escapeHtml(status) + ''; } function renderSidebar() { P.el('compose-sidebar').innerHTML = projects.map(function (p) { return '
' + '
' + P.escapeHtml(p.name) + ' ' + statusChip(p.status) + '
' + '
' + P.escapeHtml(p.path) + '
' + '
'; }).join('') || '
No compose projects under /boot/config/plugins/podman/compose/
'; } function loadYaml(name) { P.el('compose-title').textContent = name + ' / compose.yaml'; P.el('compose-yaml').textContent = 'Loading…'; return P.get('compose', 'get', { project: name }).then(function (data) { P.el('compose-yaml').textContent = data.yaml; }).catch(function (err) { P.el('compose-yaml').textContent = 'Error: ' + err.message; }); } function selectProject(name) { selected = name; renderSidebar(); loadYaml(name); } function loadProjects() { return P.get('compose', 'list').then(function (data) { projects = data; if (!selected && projects.length > 0) selected = projects[0].name; renderSidebar(); if (selected) loadYaml(selected); }).catch(function (err) { P.el('compose-sidebar').innerHTML = '
' + P.escapeHtml(err.message) + '
'; }); } function runAction(action) { if (!selected) return; const btn = P.el('compose-action-' + action); btn.disabled = true; P.post('compose', action, { project: selected }).then(function (data) { alert((data.output || 'Done.').slice(0, 2000)); return loadProjects(); }).catch(function (err) { alert('podman compose ' + action + ' failed: ' + err.message); }).finally(function () { btn.disabled = false; }); } function init() { P.el('compose-sidebar').addEventListener('click', function (e) { const item = e.target.closest('.podman-compose-proj[data-name]'); if (item) selectProject(item.dataset.name); }); P.el('compose-action-up').addEventListener('click', function () { runAction('up'); }); P.el('compose-action-down').addEventListener('click', function () { runAction('down'); }); P.el('compose-action-pull').addEventListener('click', function () { runAction('pull'); }); return loadProjects(); } P.registerPanel('compose', { init: init, refresh: loadProjects }); })();