/** * javascript/networks.js * * Networks panel: table + create/remove, backed by ajax/networks.php. */ (function () { 'use strict'; const P = window.Podman; let networks = []; function rowHtml(n) { const nameCell = n.isDefault ? '' + P.escapeHtml(n.name) + ' (default)' : P.escapeHtml(n.name); const removeDisabled = n.isDefault || n.containers > 0; return '' + '' + '' + nameCell + '' + '' + P.escapeHtml(n.driver) + '' + '' + P.escapeHtml(n.subnet || '—') + '' + '' + P.escapeHtml(n.gateway || '—') + '' + '' + n.containers + '' + '' + ''; } function render() { const tbody = P.el('networks-tbody'); tbody.innerHTML = networks.length ? networks.map(rowHtml).join('') : 'No networks.'; } function load() { const tbody = P.el('networks-tbody'); tbody.innerHTML = P.loadingRow(6); return P.get('networks', 'list').then(function (data) { networks = data; render(); }).catch(function (err) { tbody.innerHTML = P.errorRow(6, err.message); }); } function init() { P.el('networks-create-btn').addEventListener('click', function () { const name = prompt('New network name:'); if (!name) return; const subnet = prompt('Subnet (optional, e.g. 10.89.2.0/24):') || undefined; P.post('networks', 'create', { name: name, driver: 'bridge', subnet: subnet }).then(load).catch(function (err) { alert('Create failed: ' + err.message); }); }); P.el('networks-tbody').addEventListener('click', function (e) { const btn = e.target.closest('button[data-action="remove"]'); if (!btn || btn.disabled) return; const name = btn.closest('tr').dataset.name; if (!confirm('Remove network "' + name + '"?')) return; btn.disabled = true; P.post('networks', 'remove', { name: name }).then(load).catch(function (err) { alert('Remove failed: ' + err.message); btn.disabled = false; }); }); return load(); } P.registerPanel('networks', { init: init, refresh: load }); })();