import { html, PageHeader, Badge, Empty, ConfirmDelete, renderGuard, enc, esc, $val, definePage, getModel, MultiSelectModal, QuickModal } from '/static/hoover/index.js?v=8'; const addZone = QuickModal({ title: 'Add Zone', fields: [ { label: 'Zone name', id: 'zone-name', placeholder: 'e.g. internal' }, { label: 'Target', id: 'zone-target', placeholder: 'default (usually leave as default)' }, ], submit: { url: '/api/firewall/zones', body: () => ({ name: ($val('zone-name') || '').trim(), target: ($val('zone-target') || '').trim() || 'default' }), validate: (b) => !b.name ? 'Zone name required' : null, successMsg: 'Zone created', }, refresh: 'firewall', }); export default definePage({ init() { return { firewall: getModel('firewall'), }; }, render(state) { const guard = renderGuard(state.firewall, 'Zones', 'Firewall zones', state.firewall.data?.zones); if (guard) return guard; const zones = state.firewall.data?.zones?.available || []; const activeZones = state.firewall.data?.zones?.active || {}; const zoneDetails = {}; for (const name of zones) { const activeIfaces = activeZones[name]; zoneDetails[name] = { interfaces: Array.isArray(activeIfaces) ? activeIfaces : [] }; } const zoneCards = Object.entries(zoneDetails).map(([name, zdata]) => { const z = typeof zdata === 'object' ? zdata : {}; const ifacesArr = Array.isArray(z.interfaces) ? z.interfaces : []; const svcsArr = Array.isArray(z.services) ? z.services : []; return html`