Web: Einzelstücke mit QR – anlegen, je-Stück-Felder, Etiketten, /i/<uid>

Gegenstands-Produkte haben jetzt den Umschalter "Menge je Lagerort / Einzelstücke".
Bei Einzelstücken erscheint (volle Breite) eine Liste je Stueck mit eigener UID,
QR-Code, Lagerort, Kaufdatum, Garantie, Bezugsquelle und Notiz - direkt inline
aenderbar, mit Entfernen (Grund) und druckbaren QR-Etiketten. Ein Scan oeffnet
ueber die Route /i/<uid> das passende Stueck. QR via qrcode (gebundelt, offline).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-07-26 00:36:26 +02:00
co-authored by Claude Opus 4.8
parent 5ce4411d1e
commit 6fb5c47de6
7 changed files with 665 additions and 9 deletions
+37
View File
@@ -0,0 +1,37 @@
import { useEffect, useState } from "react";
import { useParams, useNavigate } from "react-router-dom";
import { api } from "../api";
import Icon from "../components/Icon";
/**
* Ziel eines gescannten QR-Codes (/i/<uid>): löst die UID auf und öffnet den
* zugehörigen Artikel mit dem Einzelstück im Blick.
*/
export default function ItemResolve() {
const { uid } = useParams();
const navigate = useNavigate();
const [error, setError] = useState(null);
useEffect(() => {
let ok = true;
api.itemByUid(uid)
.then((item) => {
if (ok) navigate(`/products/${item.product_id}?item=${encodeURIComponent(item.uid)}`,
{ replace: true });
})
.catch((err) => { if (ok) setError(err.message); });
return () => { ok = false; };
}, [uid, navigate]);
return (
<div>
<div className="page-head">
<div>
<h1>Einzelstück {uid}</h1>
<div className="sub">{error ? error : "Wird geöffnet…"}</div>
</div>
</div>
{error && <div className="alert error"><Icon name="alert" size={16} />{error}</div>}
</div>
);
}