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:
Scarriffle
2026-07-25 21:50:59 +02:00
parent 044f63446f
commit a664410ac0
2 changed files with 12 additions and 8 deletions

View File

@@ -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. */}

View File

@@ -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 || ""}