Vergleichs-Beschriftung folgt dem Modus (OFF vs. Open Products Facts)
Bei Gegenstaenden fragt das Backend Open Products Facts ab, bei Lebensmitteln Open Food Facts. Die sichtbaren Texte (Vergleichs-Button, Toasts, das Gegenueberstellungs-Panel) nannten aber immer "Open Food Facts". Jetzt richtet sich die Beschriftung nach der Verwaltungsart der Kategorie. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -12,7 +12,7 @@ import ProduktBild from "./ProduktBild";
|
|||||||
*/
|
*/
|
||||||
export default function OffVergleich({
|
export default function OffVergleich({
|
||||||
felder, bildEigenId, bildFremdUrl, bildUebernommen,
|
felder, bildEigenId, bildFremdUrl, bildUebernommen,
|
||||||
onUebernehmen, onAlle, onSchliessen,
|
onUebernehmen, onAlle, onSchliessen, quelle = "Open Food Facts",
|
||||||
}) {
|
}) {
|
||||||
const leer = (wert) => wert === null || wert === undefined || wert === "";
|
const leer = (wert) => wert === null || wert === undefined || wert === "";
|
||||||
const abweichend = felder.filter((f) => !leer(f.fremd) && String(f.fremd) !== String(f.eigen));
|
const abweichend = felder.filter((f) => !leer(f.fremd) && String(f.fremd) !== String(f.eigen));
|
||||||
@@ -22,7 +22,7 @@ export default function OffVergleich({
|
|||||||
<section className="off-vergleich">
|
<section className="off-vergleich">
|
||||||
<div className="off-kopf">
|
<div className="off-kopf">
|
||||||
<Icon name="search" size={16} />
|
<Icon name="search" size={16} />
|
||||||
<h3>Daten von Open Food Facts</h3>
|
<h3>Daten von {quelle}</h3>
|
||||||
<button type="button" className="btn sm" disabled={abweichend.length === 0}
|
<button type="button" className="btn sm" disabled={abweichend.length === 0}
|
||||||
onClick={onAlle}>
|
onClick={onAlle}>
|
||||||
Alle übernehmen
|
Alle übernehmen
|
||||||
@@ -38,7 +38,7 @@ export default function OffVergleich({
|
|||||||
<table className="table off-tabelle">
|
<table className="table off-tabelle">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Feld</th><th>Bisher</th><th>Open Food Facts</th><th></th>
|
<th>Feld</th><th>Bisher</th><th>{quelle}</th><th></th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@@ -48,7 +48,7 @@ export default function OffVergleich({
|
|||||||
<tr key={f.schluessel} className={gleich ? "muted" : ""}>
|
<tr key={f.schluessel} className={gleich ? "muted" : ""}>
|
||||||
<td data-label="Feld">{f.titel}</td>
|
<td data-label="Feld">{f.titel}</td>
|
||||||
<td data-label="Bisher">{f.anzeigeEigen ?? (leer(f.eigen) ? "–" : String(f.eigen))}</td>
|
<td data-label="Bisher">{f.anzeigeEigen ?? (leer(f.eigen) ? "–" : String(f.eigen))}</td>
|
||||||
<td data-label="Open Food Facts">
|
<td data-label={quelle}>
|
||||||
{f.anzeigeFremd ?? (leer(f.fremd) ? "–" : String(f.fremd))}
|
{f.anzeigeFremd ?? (leer(f.fremd) ? "–" : String(f.fremd))}
|
||||||
</td>
|
</td>
|
||||||
<td className="num">
|
<td className="num">
|
||||||
@@ -76,7 +76,7 @@ export default function OffVergleich({
|
|||||||
)
|
)
|
||||||
: <ProduktBild productId={bildEigenId} className="off-bild" />}
|
: <ProduktBild productId={bildEigenId} className="off-bild" />}
|
||||||
</td>
|
</td>
|
||||||
<td data-label="Open Food Facts">
|
<td data-label={quelle}>
|
||||||
{/* Vorschau kommt hier direkt von OFF – lokal gibt es das Bild
|
{/* Vorschau kommt hier direkt von OFF – lokal gibt es das Bild
|
||||||
ja gerade noch nicht. Übernommen und gespeichert, holt der
|
ja gerade noch nicht. Übernommen und gespeichert, holt der
|
||||||
Server es einmal und liefert es danach selbst aus. */}
|
Server es einmal und liefert es danach selbst aus. */}
|
||||||
|
|||||||
@@ -74,6 +74,9 @@ export default function ProductForm() {
|
|||||||
categories.find((c) => String(c.id) === String(form.category_id)) || null;
|
categories.find((c) => String(c.id) === String(form.category_id)) || null;
|
||||||
const mode = currentCategory ? currentCategory.tracking : "food";
|
const mode = currentCategory ? currentCategory.tracking : "food";
|
||||||
const isObject = mode === "object";
|
const isObject = mode === "object";
|
||||||
|
// Gegenstände gleicht das Backend gegen Open Products Facts ab, Lebensmittel
|
||||||
|
// gegen Open Food Facts – die Beschriftung folgt dem Modus.
|
||||||
|
const datenquelle = isObject ? "Open Products Facts" : "Open Food Facts";
|
||||||
|
|
||||||
function set(k, v) {
|
function set(k, v) {
|
||||||
setForm((f) => ({ ...f, [k]: v }));
|
setForm((f) => ({ ...f, [k]: v }));
|
||||||
@@ -200,7 +203,7 @@ export default function ProductForm() {
|
|||||||
}));
|
}));
|
||||||
if (s.package_size != null) setMinUnit("package");
|
if (s.package_size != null) setMinUnit("package");
|
||||||
toast(
|
toast(
|
||||||
"Daten von Open Food Facts übernommen." +
|
`Daten von ${datenquelle} übernommen.` +
|
||||||
(s.package_size != null ? "" : " (Füllmenge nicht hinterlegt – bitte Packungsgröße prüfen.)") +
|
(s.package_size != null ? "" : " (Füllmenge nicht hinterlegt – bitte Packungsgröße prüfen.)") +
|
||||||
(res.category_name ? ` Kategorie „${res.category_name}“ vorgeschlagen.` : "") +
|
(res.category_name ? ` Kategorie „${res.category_name}“ vorgeschlagen.` : "") +
|
||||||
(res.group_name ? ` Gruppe „${res.group_name}“ über den EAN-Code erkannt.` : "")
|
(res.group_name ? ` Gruppe „${res.group_name}“ über den EAN-Code erkannt.` : "")
|
||||||
@@ -239,7 +242,7 @@ export default function ProductForm() {
|
|||||||
setOffDaten({ ...res.suggestion, category_id: res.category_id, category_name: res.category_name });
|
setOffDaten({ ...res.suggestion, category_id: res.category_id, category_name: res.category_name });
|
||||||
} else {
|
} else {
|
||||||
setOffDaten(null);
|
setOffDaten(null);
|
||||||
toast("Open Food Facts kennt keinen der hinterlegten EAN-Codes.", "warn");
|
toast(`${datenquelle} kennt keinen der hinterlegten EAN-Codes.`, "warn");
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
setError(err.message);
|
setError(err.message);
|
||||||
@@ -496,7 +499,7 @@ export default function ProductForm() {
|
|||||||
<button type="button" className="btn" disabled={offBusy}
|
<button type="button" className="btn" disabled={offBusy}
|
||||||
onClick={holeOffDaten}>
|
onClick={holeOffDaten}>
|
||||||
<Icon name="download" size={16} />
|
<Icon name="download" size={16} />
|
||||||
{offBusy ? "Frage an…" : "Mit Open Food Facts vergleichen"}
|
{offBusy ? "Frage an…" : `Mit ${datenquelle} vergleichen`}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
@@ -533,6 +536,7 @@ export default function ProductForm() {
|
|||||||
|
|
||||||
{offDaten && (
|
{offDaten && (
|
||||||
<OffVergleich
|
<OffVergleich
|
||||||
|
quelle={datenquelle}
|
||||||
felder={offFelder()}
|
felder={offFelder()}
|
||||||
bildEigenId={id}
|
bildEigenId={id}
|
||||||
bildFremdUrl={offDaten.image_url || ""}
|
bildFremdUrl={offDaten.image_url || ""}
|
||||||
|
|||||||
Reference in New Issue
Block a user