import { html, PageHeader, Badge, Empty, ConfirmDelete, renderGuard, enc, esc, $val, definePage, getModel, MultiSelectModal, QuickModal } from '/static/hoover/index.js?v=9'; 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`

${name}

${z.target ? 'Target: ' + esc(z.target) : ''}
Interfaces
${ifacesArr.length ? ifacesArr.map(i => html`<${Badge} text=${esc(i)} />`) : html`None`}
Services
${svcsArr.length ? svcsArr.map(s => html`<${Badge} text=${esc(s)} variant="success" />`) : html`None`}
<${ConfirmDelete} url=${'/api/firewall/zones/' + enc(name)} deleteKey=${name} message=${'Delete zone ' + name + '?'} success=${'Zone ' + name + ' deleted'} refresh="firewall" label="Delete" />
`; }); return [ PageHeader({ title: 'Zones', subtitle: 'Firewall zones', actions: html``, }), zoneCards.length ? html`
${zoneCards}
` : Empty({ text: 'No zones configured. Add a zone to get started.' }), ]; }, });