/** Zone / District and Village / Location master pages. */ (function () { const kind = document.body.getAttribute('data-masters'); if (!kind) return; const isZones = kind === 'zones'; let rows = []; let zones = []; const wrap = document.getElementById('masters-table-wrap'); const modal = document.getElementById('masters-modal'); const form = document.getElementById('masters-form'); const idEl = document.getElementById('masters-id'); const nameEl = document.getElementById('masters-name'); const zoneEl = document.getElementById('masters-zone'); const titleEl = document.getElementById('masters-modal-title'); function openModal(edit) { idEl.value = edit ? String(edit.id) : ''; nameEl.value = edit ? edit.name : ''; if (titleEl) { titleEl.textContent = edit ? (isZones ? 'Edit zone' : 'Edit location') : (isZones ? 'Add zone' : 'Add location'); } if (zoneEl) { zoneEl.innerHTML = zones.map((z) => ``).join(''); if (edit?.zoneId) zoneEl.value = String(edit.zoneId); } modal?.classList.remove('hidden'); nameEl?.focus(); } function closeModal() { modal?.classList.add('hidden'); form?.reset(); } function filtered() { const q = (document.getElementById('masters-filter')?.value || '').trim().toLowerCase(); const zoneId = document.getElementById('masters-zone-filter')?.value || ''; return rows.filter((r) => { if (q && !`${r.name} ${r.zoneName || ''}`.toLowerCase().includes(q)) return false; if (zoneId && String(r.zoneId) !== zoneId) return false; return true; }); } function render() { const list = filtered(); if (!wrap) return; if (!rows.length) { wrap.innerHTML = `
No ${isZones ? 'zones' : 'locations'} yet. Add one to get started.
`; return; } if (!list.length) { wrap.innerHTML = 'No rows match this search.
'; return; } wrap.innerHTML = `| Name | ${isZones ? 'Locations | ' : 'Zone / District | '}|
|---|---|---|---|
| ${escapeHtml(r.name)} | ${isZones ? (r.villageCount ?? 0) : escapeHtml(r.zoneName || '—')} |
Loading…
'; try { if (isZones) { const data = await ddaApi('GET', '/api/dda/masters/zones'); rows = data.zones || []; } else { const data = await ddaApi('GET', '/api/dda/masters/villages'); rows = data.villages || []; zones = data.zones || []; const filter = document.getElementById('masters-zone-filter'); if (filter) { const prev = filter.value; filter.innerHTML = '' + zones.map((z) => ``).join(''); if ([...filter.options].some((o) => o.value === prev)) filter.value = prev; } } render(); } catch (err) { wrap.innerHTML = `${escapeHtml(err.message || 'Could not load.')}
`; } } document.getElementById('btn-masters-new')?.addEventListener('click', () => openModal(null)); document.getElementById('masters-modal-close')?.addEventListener('click', closeModal); modal?.addEventListener('click', (e) => { if (e.target === modal) closeModal(); }); document.getElementById('masters-filter')?.addEventListener('input', render); document.getElementById('masters-zone-filter')?.addEventListener('change', render); form?.addEventListener('submit', async (e) => { e.preventDefault(); const id = idEl.value; const name = nameEl.value.trim(); if (!name) return; const body = isZones ? { name } : { name, zone_id: Number(zoneEl.value) }; try { if (id) { await ddaApi('PUT', isZones ? `/api/dda/masters/zones/${id}` : `/api/dda/masters/villages/${id}`, { body: JSON.stringify(body), }); showDdaSuccess?.('Updated.'); } else { await ddaApi('POST', isZones ? '/api/dda/masters/zones' : '/api/dda/masters/villages', { body: JSON.stringify(body), }); showDdaSuccess?.('Added.'); } closeModal(); await load(); } catch (err) { showDdaError?.(err.message || 'Could not save.'); } }); load(); })();