/* Områder (regioner) — administrasjon av områder med områdeansvarlig, og tildeling av automater til område. Automatene sorteres i områder for enklere kontroll (filter/gruppering på oversikten + bulk-redigering). */ const AreasPage = ({ lang, tenant, dataVersion, onReload }) => { const no = lang === 'no'; const activeTenant = tenant || { id: '__all__' }; const [areas, setAreas] = React.useState(DATA.AREAS || []); const [editing, setEditing] = React.useState(null); // null | 'new' | area const [busy, setBusy] = React.useState(false); const machines = React.useMemo(() => { const all = DATA.machines || []; if (activeTenant.id === '__all__') return all; return all.filter(m => m.tenantId === activeTenant.id); }, [activeTenant.id, dataVersion]); const tenantId = activeTenant.id !== '__all__' ? activeTenant.id : (machines[0] && machines[0].tenantId) || null; const refresh = React.useCallback(async () => { const list = await window.api.areasList( activeTenant.id !== '__all__' ? activeTenant.id : null); setAreas(list); DATA.AREAS = list; }, [activeTenant.id]); React.useEffect(() => { refresh().catch(() => {}); }, [refresh, dataVersion]); const assignArea = async (machineId, areaId) => { setBusy(true); try { await window.api.updateAutomat(machineId, { area_id: areaId }); const m = (DATA.machines || []).find(x => x.id === machineId); if (m) { m.areaId = areaId || null; m.areaName = areaId ? (areas.find(a => a.id === areaId) || {}).name : null; } await refresh(); } catch (e) { alert(e.message); } finally { setBusy(false); } }; const remove = async (a) => { if (!confirm(no ? `Slette området «${a.name}»? Automatene beholdes.` : `Delete area “${a.name}”? Machines are kept.`)) return; try { await window.api.areaDelete(a.id); await refresh(); } catch (e) { alert(e.message); } }; return (

{no ? 'Områder' : 'Areas'}

{no ? 'Sortér automatene i områder med områdeansvarlig' : 'Group machines into areas with a responsible person'}
{/* Områdeliste med ansvarlig */}

{no ? 'Områder' : 'Areas'}

{areas.map(a => ( ))} {areas.length === 0 && ( )}
{no ? 'Område' : 'Area'} {no ? 'Ansvarlig' : 'Responsible'} {no ? 'Mobil' : 'Mobile'} {no ? 'Automater' : 'Machines'}
{a.name} {a.responsible_name || '—'} {a.responsible_mobile || '—'} {a.automat_count}
{no ? 'Ingen områder ennå — opprett det første.' : 'No areas yet.'}
{/* Automat → område-tildeling */}

{no ? 'Tildel automater' : 'Assign machines'}

{machines.map(m => ( ))}
{no ? 'Automat' : 'Machine'}{no ? 'Område' : 'Area'}
{m.location}
{m.id}
{editing && ( setEditing(null)} onDone={async () => { setEditing(null); await refresh(); if (onReload) await onReload(); }} /> )}
); }; const AreaEditModal = ({ lang, area, tenantId, onClose, onDone }) => { const no = lang === 'no'; const [name, setName] = React.useState(area ? area.name : ''); const [rName, setRName] = React.useState(area ? (area.responsible_name || '') : ''); const [rMob, setRMob] = React.useState(area ? (area.responsible_mobile || '') : ''); const [rMail, setRMail] = React.useState(area ? (area.responsible_email || '') : ''); const [depotAddr, setDepotAddr] = React.useState(area ? (area.depot_address || '') : ''); const [depotLat, setDepotLat] = React.useState(area && area.depot_lat != null ? String(area.depot_lat) : ''); const [depotLon, setDepotLon] = React.useState(area && area.depot_lon != null ? String(area.depot_lon) : ''); const [busy, setBusy] = React.useState(false); const [err, setErr] = React.useState(null); const submit = async () => { if (!name.trim()) { setErr(no ? 'Navn kreves' : 'Name required'); return; } setBusy(true); setErr(null); try { const body = { name: name.trim(), responsible_name: rName || null, responsible_mobile: rMob || null, responsible_email: rMail || null, depot_address: depotAddr || null, depot_lat: depotLat ? parseFloat(depotLat.replace(',', '.')) : null, depot_lon: depotLon ? parseFloat(depotLon.replace(',', '.')) : null }; if (area) await window.api.areaUpdate(area.id, body); else await window.api.areaCreate({ ...body, tenant_id: tenantId }); onDone(); } catch (e) { setErr(e.message); setBusy(false); } }; const Field = ({ label, value, onChange, placeholder }) => (
{label}
onChange(e.target.value)} />
); return ( <>

{area ? (no ? 'Rediger område' : 'Edit area') : (no ? 'Nytt område' : 'New area')}

{no ? 'Fyllestasjon / depot (kjøreruter)' : 'Depot (routes)'}
{err &&
❌ {err}
}
); }; Object.assign(window, { AreasPage, AreaEditModal });