import { useEffect, useState } from "react"; import { api } from "../api"; import { useConfirm } from "../confirm"; import Icon from "../components/Icon"; import DataTable from "../components/DataTable"; import { fmt } from "../units"; const KIND_LABEL = { count: "Anzahl (Stück)", weight: "Gewicht (Basis: Gramm)", volume: "Volumen (Basis: Milliliter)" }; export default function Units() { const confirm = useConfirm(); const [units, setUnits] = useState([]); const [form, setForm] = useState({ name: "", kind: "weight", factor: "" }); const [error, setError] = useState(null); const [loading, setLoading] = useState(true); async function load() { setLoading(true); try { setUnits(await api.listUnits()); } catch (err) { setError(err.message); } finally { setLoading(false); } } useEffect(() => { load(); }, []); async function add(e) { e.preventDefault(); setError(null); try { await api.createUnit({ name: form.name, kind: form.kind, factor: Number(form.factor) }); setForm({ name: "", kind: form.kind, factor: "" }); load(); } catch (err) { setError(err.message); } } async function remove(u) { const ok = await confirm({ title: `Einheit „${u.name}“ löschen?`, message: "Produkte, die diese Einheit nutzen, fallen auf ihre Basiseinheit zurück.", confirmLabel: "Löschen", danger: true, }); if (!ok) return; try { await api.deleteUnit(u.id); load(); } catch (err) { setError(err.message); } } const baseUnitOfKind = { count: "Stück", weight: "Gramm", volume: "Milliliter" }; const columns = [ { key: "name", header: "Name", grow: true, min: 160, filterText: (u) => u.name, sortValue: (u) => u.name, render: (u) => ( {u.name} {u.is_builtin && eingebaut} ) }, { key: "kind", header: "Art", width: 230, filterText: (u) => KIND_LABEL[u.kind] || u.kind, render: (u) => {KIND_LABEL[u.kind] || u.kind} }, { key: "factor", header: "Faktor", width: 150, align: "num", sortValue: (u) => u.factor, filterText: (u) => `${fmt(u.factor)} ${baseUnitOfKind[u.kind]}`, render: (u) => `${fmt(u.factor)} ${baseUnitOfKind[u.kind]}` }, { key: "actions", header: "", label: "Aktionen", fixed: true, width: 56, align: "num", render: (u) => (!u.is_builtin && ( )) }, ]; return (