// inspector.js — cell details from /api/cell, in the server's groups import { api, el } from './ui.js'; import { fmtLatLon } from './units.js'; export function groupFields(fields) { const groups = new Map(); for (const f of fields) { if (!groups.has(f.group)) groups.set(f.group, []); groups.get(f.group).push(f); } return groups; } export function fmtValue(f) { if (f.text !== undefined) return f.text; const v = Math.abs(f.value) >= 100 ? Math.round(f.value).toLocaleString('en-US') : String(+f.value.toFixed(2)); return f.unit ? `${v} ${f.unit}` : v; } let latest = 0; export async function inspect(box, p, era = '') { const mine = ++latest; box.replaceChildren(el('p', { class: 'muted' }, `Loading ${fmtLatLon(p.lat, p.lon)}…`)); let c; try { c = await api(`api/cell?lat=${p.lat}&lon=${p.lon}${era ? `&era=${encodeURIComponent(era)}` : ''}`); } catch (e) { if (mine === latest) box.replaceChildren(el('p', { class: 'warn' }, `Could not load the cell: ${e.message}`)); throw e; } if (mine !== latest) return; // a newer click won box.replaceChildren( el('p', {}, el('b', {}, fmtLatLon(c.lat, c.lon)), el('br'), el('span', { class: 'muted' }, `H3 cell ${c.cell}`), c.era ? el('br') : null, c.era ? el('span', { class: 'muted' }, c.era.label) : null), ...[...groupFields(c.fields)].map(([group, fs]) => el('div', { class: 'fields' }, el('h4', {}, group), fs.map(f => el('div', {}, el('span', {}, f.label), el('span', {}, fmtValue(f), f.alt ? el('span', { class: 'alt' }, ` · ${f.alt}`) : null)))))); }