/* ================================================
Views: List, Map, Detail
================================================ */
function ListView({ parcels, onSelect, onNew, layout, setLayout, mapStyle }) {
const [q, setQ] = React.useState("");
const [sortFilter, setSortFilter] = React.useState("all");
const filtered = parcels.filter((p) => {
const matchQ = !q || p.lagebuch.toLowerCase().includes(q.toLowerCase())
|| p.lage.toLowerCase().includes(q.toLowerCase())
|| p.sorte.toLowerCase().includes(q.toLowerCase());
const matchS = sortFilter === "all" || p.sorte === sortFilter;
return matchQ && matchS;
});
const totalHa = filtered.reduce((s, p) => s + p.flaeche, 0);
const sortenCount = new Set(parcels.map((p) => p.sorte)).size;
const oldest = parcels.reduce((a, p) => p.pflanzjahr < a ? p.pflanzjahr : a, 9999);
const sortOptions = ["all", ...new Set(parcels.map((p) => p.sorte))];
return (
<>
Flächen gesamt
{parcels.length} Parzellen
Gesamtfläche
{fmtNum(parcels.reduce((s, p) => s + p.flaeche, 0))} ha
Sorten
{sortenCount} verschieden
Älteste Anlage
{oldest} · {new Date().getFullYear() - oldest} Jahre
setQ(e.target.value)} />
{sortOptions.map((s) => (
))}
{filtered.length} Fläche{filtered.length !== 1 ? "n" : ""} · {fmtNum(totalHa)} ha
{layout === "table" ? (
| Lagebuch |
Lage |
Sorte |
Pflanzjahr |
Fläche |
Erziehung |
Letzte Bearbeitung |
{filtered.map((p) => (
onSelect(p)}>
| {p.lagebuch} |
{p.lage} |
|
{p.pflanzjahr} |
{fmtNum(p.flaeche)} ha |
{p.erziehung} |
{fmtDate(p.letzteBearbeitung)} |
))}
) : (
{filtered.map((p) => (
onSelect(p)}>
{p.lagebuch}
{p.lage}
Pflanzjahr {p.pflanzjahr}
{fmtNum(p.flaeche)} ha
))}
)}
>
);
}
window.ListView = ListView;
/* ------- Map view ------- */
function MapView({ parcels, onSelect, activeId, setActiveId, mapStyle }) {
return (
Parzellen-Register
{parcels.length} Flächen · {fmtNum(parcels.reduce((s, p) => s + p.flaeche, 0))} ha
{parcels.map((p) => (
setActiveId(p.id)}
onDoubleClick={() => onSelect(p)}
>
{p.lage}
{p.lagebuch}
·
{fmtNum(p.flaeche)} ha
))}
{ setActiveId(p.id); }}
/>
Legende · Rebsorten
{Array.from(new Set(parcels.map((p) => p.sorte))).map((s) => {
const p = parcels.find((x) => x.sorte === s);
return (
{s}
);
})}
48.08°N, 7.65°E · Kaiserstuhl
);
}
window.MapView = MapView;
/* ------- Detail view ------- */
function DetailView({ parcel, onBack, onEdit, mapStyle }) {
const [sideOpen, setSideOpen] = React.useState(false);
// Sidebar schließen, wenn eine andere Parzelle geöffnet wird.
React.useEffect(() => {
setSideOpen(false);
}, [parcel.id]);
return (
Zurück zur Übersicht
{parcel.lagebuch}
{parcel.lage}
Pflanzjahr {parcel.pflanzjahr}
· {parcel.erziehung}
Flächeninhalt
{fmtNum(parcel.flaeche)} ha
Umfang
~{Math.round(Math.sqrt(parcel.flaeche * 10000) * 4)} m
Alter
{new Date().getFullYear() - parcel.pflanzjahr} J.
Notizen
{parcel.notizen}
{sideOpen && (
Historie
{parcel.historie.map((h, i) => (
{fmtDate(h.datum)}
{h.text}
))}
Stammdaten
Lagebuch-Nr.{parcel.lagebuch}
Lage{parcel.lage}
Sorte{parcel.sorte}
Pflanzjahr{parcel.pflanzjahr}
Erziehung{parcel.erziehung}
Fläche{fmtNum(parcel.flaeche)} ha
Zuletzt geändert{fmtDate(parcel.letzteBearbeitung)}
)}
);
}
window.DetailView = DetailView;