1import{r as s,j as e}from"./react-vendor-CShGlGts.js";import{ck as E,au as Y,av as xe,aw as W,ax as q,ay as H,C as M,ae as Q,af as T,a as U,E as A,I as L,S as X,m as ee,n as te,o as re,p as R,B as h,W as ge,bt as fe,bq as se,aY as ce,bB as ie,bL as Se,bo as ue,L as Be,s as $,ao as Ee,ap as Ie,b7 as Fe,b8 as Re,b9 as ze,bb as de,aI as me,bY as ae,h as Oe,i as Ae,j as ye,k as ke,aR as $e,a7 as P,aC as Me}from"./index-BYC0bmF9.js";import{I as Ue}from"./IngredientImportDialog-BbBRDpM_.js";import{J as je}from"./JsBarcode-dS2ZyPj7.js";import{b as pe}from"./browser-CjSdxGTc.js";import{d as ve}from"./dymoConnectService-BC30sX08.js";import{Q as G}from"./qr-code-Bo8kqCVP.js";import{Z as Ne}from"./zap-Cf5Qc5X0.js";import{H as Le}from"./html5-qrcode-scanner-DhVKmVpR.js";import{K as _e}from"./keyboard-DazlFeb8.js";import{E as Ze}from"./ellipsis-vertical-DHZeDb-f.js";import{L as Pe}from"./link-2-CuKC8xq1.js";import"./query-BUBuIGkW.js";import"./shared-utils--gW9Kwo0.js";import"./supabase-C0joAID3.js";import"./barcode-DCqEiE4r.js";const Ce=({children:a})=>{const[v,w]=s.useState(!1),[j,m]=s.useState(""),[p,n]=s.useState("EAN13"),[b,N]=s.useState([]),[C,y]=s.useState(!1),o=s.useRef(null),u=s.useRef(null),S=s.useRef(!0);s.useEffect(()=>(S.current=!0,()=>{S.current=!1,u.current&&u.current.abort(),b.forEach(t=>{t.dataUrl&&t.dataUrl.startsWith("data:")&&URL.revokeObjectURL(t.dataUrl)})}),[]),s.useEffect(()=>()=>{u.current&&u.current.abort()},[b]);const z=()=>{const t=Math.floor(Math.random()*1e12).toString().padStart(12,"0");let c=0;for(let l=0;l<12;l++){const f=parseInt(t[l]);c+=l%2===0?f:f*3}const d=(10-c%10)%10;return t+d},I=()=>{const t="DISH",c=Math.floor(Math.random()*1e5).toString().padStart(5,"0");return t+c},O=s.useCallback(async()=>{if(!j.trim()){E({title:"Fehler",description:"Bitte geben Sie einen Gerichtnamen ein.",variant:"destructive"});return}if(C)return;u.current&&u.current.abort(),u.current=new AbortController;const t=u.current.signal;y(!0);try{let c,d;if(t.aborted||!S.current)return;if(p==="EAN13"?c=z():p==="CODE128"?c=I():c=`DISH:${j.trim()}:${Date.now()}`,p==="QRCODE")try{if(d=await pe.toDataURL(c,{width:200,margin:2,errorCorrectionLevel:"M",color:{dark:"#000000",light:"#FFFFFF"}}),t.aborted||!S.current)return}catch(f){throw console.error("QR Code generation error:",f),new Error("QR-Code konnte nicht erstellt werden")}else{const f=o.current;if(!f)throw new Error("Canvas konnte nicht initialisiert werden");const V=f.getContext("2d");V&&V.clearRect(0,0,f.width,f.height),je(f,c,{format:p,width:2,height:100,displayValue:!0,fontSize:14,margin:10}),d=f.toDataURL("image/png")}if(t.aborted||!S.current)return;const l={code:c,dishName:j.trim(),format:p,dataUrl:d};N(f=>[l,...f.slice(0,9)]),m(""),E({title:`${p==="QRCODE"?"QR-Code":"Barcode"} erstellt`,description:`${p==="QRCODE"?"QR-Code":"Barcode"} für "${l.dishName}" wurde erfolgreich generiert.`})}catch(c){!t.aborted&&S.current&&(console.error("Barcode generation error:",c),E({title:"Fehler",description:c instanceof Error?c.message:"Barcode konnte nicht erstellt werden.",variant:"destructive"}))}finally{S.current&&y(!1)}},[j,p,C]),x=t=>{const c=document.createElement("a");c.download=`barcode-${t.dishName.replace(/\s+/g,"-")}-${t.code}.png`,c.href=t.dataUrl,c.click()},k=t=>{navigator.clipboard.writeText(t).then(()=>{E({title:"Kopiert",description:"Barcode wurde in die Zwischenablage kopiert."})})},D=t=>{const c=` 2 <!DOCTYPE html> 3 <html> 4 <head> 5 <title>Diamond Drucker - Barcode</title> 6 <style> 7 @page { 8 size: 62mm 29mm; 9 margin: 0; 10 } 11 body { 12 margin: 0; 13 padding: 2mm; 14 font-family: 'Jost', sans-serif; 15 font-size: 8pt; 16 width: 58mm; 17 height: 25mm; 18 overflow: hidden; 19 } 20 .label-container { 21 display: flex; 22 flex-direction: column; 23 align-items: center; 24 justify-content: center; 25 height: 100%; 26 text-align: center; 27 } 28 .dish-name { 29 font-size: 7pt; 30 font-weight: bold; 31 margin-bottom: 1mm; 32 line-height: 1.1; 33 max-height: 8mm; 34 overflow: hidden; 35 } 36 .barcode-img { 37 max-width: 50mm; 38 height: auto; 39 max-height: 12mm; 40 } 41 .barcode-code { 42 font-size: 6pt; 43 margin-top: 0.5mm; 44 color: #333; 45 } 46 .item-type { 47 font-size: 5pt; 48 color: #666; 49 margin-bottom: 0.5mm; 50 } 51 </style> 52 </head> 53 <body> 54 <div class="label-container"> 55 <div class="item-type">INDIVIDUELL</div> 56 <div class="dish-name">${t.dishName}</div> 57 <img src="${t.dataUrl}" alt="Barcode" class="barcode-img" /> 58 <div class="barcode-code">${t.code}</div> 59 </div> 60 </body> 61 </html> 62 `,d=window.open("","_blank");d&&(d.document.write(c),d.document.close(),setTimeout(()=>{d.print()},500),E({title:"Druckauftrag gesendet",description:"Barcode-Etikett wurde an Diamond Drucker gesendet."}))},i=async t=>{try{await ve.printBarcode(t.code,t.dishName,t.format)||E({title:"DYMO Connect Fehler",description:"Druck fehlgeschlagen. Versuchen Sie Diamond Drucker.",variant:"destructive"})}catch(c){console.error("DYMO Connect Fehler:",c),E({title:"DYMO Connect Fehler",description:"Fehler bei DYMO Connect. Verwenden Sie Diamond Drucker als Alternative.",variant:"destructive"})}};return e.jsxs(Y,{open:v,onOpenChange:w,children:[e.jsx(xe,{asChild:!0,children:a}),e.jsxs(W,{className:"max-w-4xl max-h-[90vh] overflow-y-auto",children:[e.jsx(q,{children:e.jsxs(H,{
62className:"flex items-center gap-2",children:[e.jsx(G,{className:"h-5 w-5"}),"Barcode Generator für Gerichte"]})}),e.jsxs("div",{className:"space-y-6",children:[e.jsxs(M,{children:[e.jsx(Q,{children:e.jsx(T,{className:"text-lg",children:"Neuen Barcode erstellen"})}),e.jsxs(U,{className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(A,{htmlFor:"dishName",children:"Gericht Name"}),e.jsx(L,{id:"dishName",value:j,onChange:t=>m(t.target.value),placeholder:"z.B. Wiener Schnitzel"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(A,{htmlFor:"format",children:"Barcode Format"}),e.jsxs(X,{value:p,onValueChange:n,children:[e.jsx(ee,{children:e.jsx(te,{})}),e.jsxs(re,{children:[e.jsx(R,{value:"EAN13",children:"EAN-13 (Standard)"}),e.jsx(R,{value:"CODE128",children:"Code 128"}),e.jsx(R,{value:"QRCODE",children:"QR-Code"})]})]})]})]}),e.jsxs(h,{onClick:O,className:"w-full",disabled:C||!j.trim(),children:[e.jsx(G,{className:"h-4 w-4 mr-2"}),C?"Generiere...":"Barcode generieren"]})]})]}),b.length>0&&e.jsxs(M,{children:[e.jsx(Q,{children:e.jsx(T,{className:"text-lg",children:"Generierte Barcodes"})}),e.jsx(U,{children:e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:b.map((t,c)=>e.jsxs("div",{className:"border rounded-lg p-4 space-y-3",children:[e.jsxs("div",{className:"text-center",children:[e.jsx("h4",{className:"font-semibold",children:t.dishName}),e.jsx("p",{className:"text-sm text-muted-foreground",children:t.format})]}),e.jsx("div",{className:"flex justify-center",children:e.jsx("img",{src:t.dataUrl,alt:`Barcode für ${t.dishName}`,className:"max-w-full h-auto"})}),e.jsx("div",{className:"text-center",children:e.jsx("code",{className:"text-xs bg-muted px-2 py-1 rounded",children:t.code})}),e.jsxs("div",{className:"flex gap-2 justify-center",children:[e.jsx(h,{size:"sm",variant:"outline",onClick:()=>k(t.code),children:e.jsx(ge,{className:"h-3 w-3"})}),e.jsx(h,{size:"sm",variant:"outline",onClick:()=>x(t),children:e.jsx(fe,{className:"h-3 w-3"})}),e.jsxs(h,{size:"sm",onClick:()=>i(t),className:"bg-green-600 hover:bg-green-700",children:[e.jsx(Ne,{className:"h-3 w-3 mr-1"}),"DYMO"]}),e.jsxs(h,{size:"sm",onClick:()=>D(t),className:"bg-blue-600 hover:bg-blue-700",children:[e.jsx(se,{className:"h-3 w-3 mr-1"}),"Diamond"]})]})]},c))})})]}),e.jsx("canvas",{ref:o,style:{display:"none"}})]})]})]})},Qe=({ingredient:a,children:v})=>{const[w,j]=s.useState(!1),[m,p]=s.useState("EAN13"),[n,b]=s.useState(null),[N,C]=s.useState(!1),y=s.useRef(null),o=s.useRef(null),u=s.useRef(!0);s.useEffect(()=>(u.current=!0,()=>{u.current=!1,o.current&&o.current.abort(),n?.dataUrl&&n.dataUrl.startsWith("data:")&&URL.revokeObjectURL(n.dataUrl)}),[]),s.useEffect(()=>()=>{o.current&&o.current.abort()},[n]);const S=()=>{if(a.gtin&&a.gtin.length===13)return a.gtin;const i=Math.floor(Math.random()*1e12).toString().padStart(12,"0");let t=0;for(let d=0;d<12;d++){const l=parseInt(i[d]);t+=d%2===0?l:l*3}const c=(10-t%10)%10;return i+c},z=()=>{const i="ING",t=a.id.replace(/-/g,"").substring(0,8).toUpperCase();return i+t},I=s.useCallback(async()=>{if(N)return;o.current&&o.current.abort(),o.current=new AbortController;const i=o.current.signal;C(!0);try{let t,c;if(i.aborted||!u.current)return;if(m==="EAN13"?t=S():m==="CODE128"?t=z():t=`INGREDIENT:${a.id}:${a.name}${a.standard_einheit?":"+a.standard_einheit:""}`,m==="QRCODE")try{if(c=await pe.toDataURL(t,{width:200,margin:2,errorCorrectionLevel:"M",color:{dark:"#000000",light:"#FFFFFF"}}),i.aborted||!u.current)return}catch(l){throw console.error("QR Code generation error:",l),new Error("QR-Code konnte nicht erstellt werden")}else{const l=y.current;if(!l)throw new Error("Canvas konnte nicht initialisiert werden");const f=l.getContext("2d");f&&f.clearRect(0,0,l.width,l.height),je(l,t,{format:m,width:2,height:100,displayValue:!0,fontSize:14,margin:10}),c=l.toDataURL("image/png")}if(i.aborted||!u.current)return;const d={code:t,ingredientName:a.name,format:m,dataUrl:c};b(d),E({title:`${m==="QRCODE"?"QR-Code":"Barcode"} erstellt`,description:`${m==="QRCODE"?"QR-Code":"Barcode"} für Zutat "${a.name}" wurde erfolgreich generiert.`})}catch(t){!i.aborted&&u.current&&(console.error("Barcode generation error:",t),E({title:"Fehler",description:t instanceof Error?t.message:"Barcode konnte nicht erstellt werden.",variant:"destructive"}))}finally{u.current&&C(!1)}},[a.id,a.name,a.gtin,a.standard_einheit,m,N]),O=()=>{if(!n)return;const i=document.createElement("a");i.download=`barcode-zutat-${n.ingredientName.replace(/\s+/g,"-")}-${n.code}.png`,i.href=n.dataUrl,i.click()},x=()=>{n&&navigator.clipboard.writeText(n.code).then(()=>{E({title:"Kopiert",description:"Barcode wurde in die Zwischenablage kopiert."})})},k=()=>
62{if(!n)return;const i=` 63 <!DOCTYPE html> 64 <html> 65 <head> 66 <title>Diamond Drucker - Zutat Barcode</title> 67 <style> 68 @page { 69 size: 62mm 29mm; 70 margin: 0; 71 } 72 body { 73 margin: 0; 74 padding: 2mm; 75 font-family: Arial, sans-serif; 76 font-size: 8pt; 77 width: 58mm; 78 height: 25mm; 79 overflow: hidden; 80 } 81 .label-container { 82 display: flex; 83 flex-direction: column; 84 align-items: center; 85 justify-content: center; 86 height: 100%; 87 text-align: center; 88 } 89 .ingredient-name { 90 font-size: 7pt; 91 font-weight: bold; 92 margin-bottom: 1mm; 93 line-height: 1.1; 94 max-height: 8mm; 95 overflow: hidden; 96 } 97 .barcode-img { 98 max-width: 50mm; 99 height: auto; 100 max-height: 12mm; 101 } 102 .barcode-code { 103 font-size: 6pt; 104 margin-top: 0.5mm; 105 color: #333; 106 } 107 .ingredient-type { 108 font-size: 5pt; 109 color: #666; 110 margin-bottom: 0.5mm; 111 } 112 .unit { 113 font-size: 5pt; 114 color: #666; 115 margin-top: 0.5mm; 116 } 117 </style> 118 </head> 119 <body> 120 <div class="label-container"> 121 <div class="ingredient-type">ZUTAT</div> 122 <div class="ingredient-name">${n.ingredientName}</div> 123 <img src="${n.dataUrl}" alt="Barcode" class="barcode-img" /> 124 <div class="barcode-code">${n.code}</div> 125 ${a.standard_einheit?`<div class="unit">${a.standard_einheit}</div>`:""} 126 </div> 127 </body> 128 </html> 129 `,t=window.open("","_blank");t&&(t.document.write(i),t.document.close(),setTimeout(()=>{t.print()},500),E({title:"Druckauftrag gesendet",description:"Barcode-Etikett wurde an Diamond Drucker gesendet."}))},D=async()=>{if(n)try{await ve.printBarcode(n.code,n.ingredientName,n.format)||E({title:"DYMO Connect Fehler",description:"Druck fehlgeschlagen. Versuchen Sie Diamond Drucker.",variant:"destructive"})}catch(i){console.error("DYMO Connect Fehler:",i),E({title:"DYMO Connect Fehler",description:"Fehler bei DYMO Connect. Verwenden Sie Diamond Drucker als Alternative.",variant:"destructive"})}};return e.jsxs(Y,{open:w,onOpenChange:j,children:[e.jsx(xe,{asChild:!0,children:v}),e.jsxs(W,{className:"max-w-2xl",children:[e.jsx(q,{children:e.jsxs(H,{className:"flex items-center gap-2",children:[e.jsx(G,{className:"h-5 w-5"}),"Barcode für Zutat: ",a.name]})}),e.jsxs("div",{className:"space-y-6",children:[e.jsxs(M,{children:[e.jsx(Q,{children:e.jsx(T,{className:"text-lg",children:"Barcode erstellen"})}),e.jsxs(U,{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{htmlFor:"format",className:"text-sm font-medium",children:"Barcode Format"}),e.jsxs(X,{value:m,onValueChange:p,children:[e.jsx(ee,{children:e.jsx(te,{})}),e.jsxs(re,{children:[e.jsx(R,{value:"EAN13",children:"EAN-13 (Standard)"}),e.jsx(R,{value:"CODE128",children:"Code 128"}),e.jsx(R,{value:"QRCODE",children:"QR-Code"})]})]})]}),e.jsxs(h,{onClick:I,className:"w-full",disabled:N,children:[e.jsx(G,{className:"h-4 w-4 mr-2"}),N?"Generiere...":"Barcode generieren"]})]})]}),n&&e.jsxs(M,{children:[e.jsx(Q,{children:e.jsx(T,{className:"text-lg",children:"Generierter Barcode"})}),e.jsx(U,{children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"text-center space-y-2",children:[e.jsx("h4",{className:"font-semibold",children:n.ingredientName}),e.jsx("p",{className:"text-sm text-muted-foreground",children:n.format}),a.standard_einheit&&e.jsxs("p",{className:"text-xs text-muted-foreground",children:["Einheit: ",a.standard_einheit]})]}),e.jsx("div",{className:"flex justify-center bg-white p-4 rounded border",children:e.jsx("img",{src:n.dataUrl,alt:`Barcode für ${n.ingredientName}`,className:"max-w-full h-auto"})}),e.jsx("div",{className:"text-center",children:e.jsx("code",{className:"text-xs bg-muted px-2 py-1 rounded",children:n.code})}),e.jsxs("div",{className:"flex gap-2 justify-center",children:[e.jsxs(h,{size:"sm",variant:"outline",onClick:x,children:[e.jsx(ge,{className:"h-3 w-3 mr-1"}),"Kopieren"]}),e.jsxs(h,{size:"sm",variant:"outline",onClick:O,children:[e.jsx(fe,{className:"h-3 w-3 mr-1"}),"Download"]}),e.jsxs(h,{size:"sm",onClick:D,className:"bg-green-600 hover:bg-green-700",children:[e.jsx(Ne,{className:"h-3 w-3 mr-1"}),"DYMO Connect"]}),e.jsxs(h,{size:"sm",onClick:k,className:"bg-blue-600 hover:bg-blue-700",children:[e.jsx(se,{className:"h-3 w-3 mr-1"}),"Diamond Drucker"]})]})]})})]}),e.jsx("canvas",{ref:y,style:{display:"none"}})]})]})]})},Te=({producer:a,children:v})=>{const[w,j]=s.useState(!1),[m,p]=s.useState("EAN13"),[n,b]=s.useState(null),[N,C]=s.useState(!1),y=s.useRef(null),o=s.useRef(null),u=s.useRef(!0);s.useEffect(()=>(u.current=!0,()=>{u.current=!1,o.current&&o.current.abort(),n?.dataUrl&&n.dataUrl.startsWith("data:")&&URL.revokeObjectURL(n.dataUrl)}),[]),s.useEffect(()=>()=>{o.current&&o.current.abort()},[n]);const S=()=>{const i=Math.floor(Math.random()*1e12).toString().padStart(12,"0");let t=0;for(let d=0;d<12;d++){const l=parseInt(i[d]);t+=d%2===0?l:l*3}const c=(10-t%10)%10;return i+c},z=()=>{const i="PROD",t=a.id.replace(/-/g,"").substring(0,8).toUpperCase();return i+t},I=s.useCallback(async()=>
129{if(N)return;o.current&&o.current.abort(),o.current=new AbortController;const i=o.current.signal;C(!0);try{let t,c;if(i.aborted||!u.current)return;if(m==="EAN13"?t=S():m==="CODE128"?t=z():t=`PRODUCER:${a.id}:${a.name}${a.ort?":"+a.ort:""}`,m==="QRCODE")try{if(c=await pe.toDataURL(t,{width:200,margin:2,errorCorrectionLevel:"M",color:{dark:"#000000",light:"#FFFFFF"}}),i.aborted||!u.current)return}catch(l){throw console.error("QR Code generation error:",l),new Error("QR-Code konnte nicht erstellt werden")}else{const l=y.current;if(!l)throw new Error("Canvas konnte nicht initialisiert werden");const f=l.getContext("2d");f&&f.clearRect(0,0,l.width,l.height),je(l,t,{format:m,width:2,height:100,displayValue:!0,fontSize:14,margin:10}),c=l.toDataURL("image/png")}if(i.aborted||!u.current)return;const d={code:t,producerName:a.name,format:m,dataUrl:c};b(d),E({title:`${m==="QRCODE"?"QR-Code":"Barcode"} erstellt`,description:`${m==="QRCODE"?"QR-Code":"Barcode"} für Produzent "${a.name}" wurde erfolgreich generiert.`})}catch(t){!i.aborted&&u.current&&(console.error("Barcode generation error:",t),E({title:"Fehler",description:t instanceof Error?t.message:"Barcode konnte nicht erstellt werden.",variant:"destructive"}))}finally{u.current&&C(!1)}},[a.id,a.name,a.ort,m,N]),O=()=>{if(!n)return;const i=document.createElement("a");i.download=`barcode-produzent-${n.producerName.replace(/\s+/g,"-")}-${n.code}.png`,i.href=n.dataUrl,i.click()},x=()=>{n&&navigator.clipboard.writeText(n.code).then(()=>{E({title:"Kopiert",description:"Barcode wurde in die Zwischenablage kopiert."})})},k=()=>{if(!n)return;const i=` 130 <!DOCTYPE html> 131 <html> 132 <head> 133 <title>Diamond Drucker - Produzent Barcode</title> 134 <style> 135 @page { 136 size: 62mm 29mm; 137 margin: 0; 138 } 139 body { 140 margin: 0; 141 padding: 2mm; 142 font-family: 'Jost', sans-serif; 143 font-size: 8pt; 144 width: 58mm; 145 height: 25mm; 146 overflow: hidden; 147 } 148 .label-container { 149 display: flex; 150 flex-direction: column; 151 align-items: center; 152 justify-content: center; 153 height: 100%; 154 text-align: center; 155 } 156 .producer-name { 157 font-size: 7pt; 158 font-weight: bold; 159 margin-bottom: 1mm; 160 line-height: 1.1; 161 max-height: 8mm; 162 overflow: hidden; 163 } 164 .barcode-img { 165 max-width: 50mm; 166 height: auto; 167 max-height: 12mm; 168 } 169 .barcode-code { 170 font-size: 6pt; 171 margin-top: 0.5mm; 172 color: #333; 173 } 174 .producer-type { 175 font-size: 5pt; 176 color: #666; 177 margin-bottom: 0.5mm; 178 } 179 .location { 180 font-size: 5pt; 181 color: #666; 182 margin-top: 0.5mm; 183 } 184 </style> 185 </head> 186 <body> 187 <div class="label-container"> 188 <div class="producer-type">${a.regional?"REGIONAL":"PRODUZENT"}</div> 189 <div class="producer-name">${n.producerName}</div> 190 <img src="${n.dataUrl}" alt="Barcode" class="barcode-img" /> 191 <div class="barcode-code">${n.code}</div> 192 ${a.ort?`<div class="location">${a.ort}</div>`:""} 193 </div> 194 </body> 195 </html> 196 `,t=window.open("","_blank");t&&(t.document.write(i),t.document.close(),setTimeout(()=>{t.print()},500),E({title:"Druckauftrag gesendet",description:"Barcode-Etikett wurde an Diamond Drucker gesendet."}))},D=async()=>{if(n)try{await ve.printBarcode(n.code,n.producerName,n.format)||E({title:"DYMO Connect Fehler",description:"Druck fehlgeschlagen. Versuchen Sie Diamond Drucker.",variant:"destructive"})}catch(i){console.error("DYMO Connect Fehler:",i),E({title:"DYMO Connect Fehler",description:"Fehler bei DYMO Connect. Verwenden Sie Diamond Drucker als Alternative.",variant:"destructive"})}};return e.jsxs(Y,{open:w,onOpenChange:j,children:[e.jsx(xe,{asChild:!0,children:v}),e.jsxs(W,{className:"max-w-2xl",children:[e.jsx(q,{children:e.jsxs(H,{
196className:"flex items-center gap-2",children:[e.jsx(G,{className:"h-5 w-5"}),"Barcode für Produzent: ",a.name]})}),e.jsxs("div",{className:"space-y-6",children:[e.jsxs(M,{children:[e.jsx(Q,{children:e.jsx(T,{className:"text-lg",children:"Barcode erstellen"})}),e.jsxs(U,{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{htmlFor:"format",className:"text-sm font-medium",children:"Barcode Format"}),e.jsxs(X,{value:m,onValueChange:p,children:[e.jsx(ee,{children:e.jsx(te,{})}),e.jsxs(re,{children:[e.jsx(R,{value:"EAN13",children:"EAN-13 (Standard)"}),e.jsx(R,{value:"CODE128",children:"Code 128"}),e.jsx(R,{value:"QRCODE",children:"QR-Code"})]})]})]}),e.jsxs(h,{onClick:I,className:"w-full",disabled:N,children:[e.jsx(G,{className:"h-4 w-4 mr-2"}),N?"Generiere...":"Barcode generieren"]})]})]}),n&&e.jsxs(M,{children:[e.jsx(Q,{children:e.jsx(T,{className:"text-lg",children:"Generierter Barcode"})}),e.jsx(U,{children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"text-center space-y-2",children:[e.jsx("h4",{className:"font-semibold",children:n.producerName}),e.jsx("p",{className:"text-sm text-muted-foreground",children:n.format}),a.ort&&e.jsxs("p",{className:"text-xs text-muted-foreground",children:["Ort: ",a.ort]})]}),e.jsx("div",{className:"flex justify-center bg-white p-4 rounded border",children:e.jsx("img",{src:n.dataUrl,alt:`Barcode für ${n.producerName}`,className:"max-w-full h-auto"})}),e.jsx("div",{className:"text-center",children:e.jsx("code",{className:"text-xs bg-muted px-2 py-1 rounded",children:n.code})}),e.jsxs("div",{className:"flex gap-2 justify-center",children:[e.jsxs(h,{size:"sm",variant:"outline",onClick:x,children:[e.jsx(ge,{className:"h-3 w-3 mr-1"}),"Kopieren"]}),e.jsxs(h,{size:"sm",variant:"outline",onClick:O,children:[e.jsx(fe,{className:"h-3 w-3 mr-1"}),"Download"]}),e.jsxs(h,{size:"sm",onClick:D,className:"bg-green-600 hover:bg-green-700",children:[e.jsx(Ne,{className:"h-3 w-3 mr-1"}),"DYMO Connect"]}),e.jsxs(h,{size:"sm",onClick:k,className:"bg-blue-600 hover:bg-blue-700",children:[e.jsx(se,{className:"h-3 w-3 mr-1"}),"Diamond Drucker"]})]})]})})]}),e.jsx("canvas",{ref:y,style:{display:"none"}})]})]})]})};function Ge({open:a,onOpenChange:v,onBarcodeScanned:w}){const{toast:j}=ce(),[m,p]=s.useState(!1),[n,b]=s.useState(!1),[N,C]=s.useState(!1),[y,o]=s.useState(""),[u,S]=s.useState(""),[z,I]=s.useState(!1),[O,x]=s.useState([]),k=s.useRef(null),[D]=s.useState(()=>`qr-reader-${Date.now()}-${Math.random().toString(36).slice(2,8)}`);s.useEffect(()=>{if(!a||n||m)return;let g=!1;return(async()=>{if(await new Promise(le=>requestAnimationFrame(le)),g)return;if(!document.getElementById(D)){console.error("Scanner element not found:",D),b(!0);return}console.log("Starting camera for element:",D),await t()})().catch(_=>{console.error("Failed to start camera:",_),g||(b(!0),j({title:"Kamera-Fehler",description:"Kamera konnte nicht gestartet werden. Bitte manuell eingeben.",variant:"destructive"}))}),()=>{g=!0,i()}},[a,n,D]);const i=async()=>{if(console.log("Cleaning up scanner..."),k.current){try{await k.current.stop(),k.current.clear(),console.log("Scanner stopped and cleared successfully")}catch(g){console.log("Scanner cleanup error:",g)}k.current=null}p(!1)},t=async()=>{if(m){console.log("Scanner already running");return}if(!document.getElementById(D))throw console.error("Scanner element not found:",D),new Error("Scanner element not available");try{k.current&&await i(),console.log("Starting scanner with ID:",D),p(!0),k.current=new Le(D),await k.current.start({facingMode:"environment"},{fps:10,aspectRatio:1.777},async B=>{console.log("Barcode scanned:",B),await i(),w(B),v(!1),j({title:"Barcode gescannt",description:`Code: ${B}`})},B=>{}),console.log("Scanner started successfully")}catch(B){throw console.error("Scanner start error:",B),p(!1),B}},c=()=>{y.trim()&&(w(y.trim()),v(!1),o(""),b(!1))},d=()=>{i(),b(!1),C(!1),o(""),S(""),x([]),v(!1)},l=async g=>{if(g.trim()){I(!0);try{const{data:B,error:_}=await $.functions.invoke("import-ingredient",{body:{name:g.trim(),language:"de"}});if(_)throw _;B&&B.ingredient?x([B.ingredient]):(j({title:"Keine Ergebnisse",description:"Keine Zutaten online gefunden"}),x([]))}catch(B){console.error("Error searching ingredient:",B),j({title:"Suchfehler",description:"Fehler beim Suchen der Zutat online",variant:"destructive"}),x([])}finally{I(!1)}}},f=()=>{l(u)},V=g=>{const B=g.gtin||g.name;w(B),v(!1),j({title:"Zutat ausgewählt",description:`${g.name} ausgewählt`})};return e.jsx(Y,{open:a,onOpenChange:d,children:e.jsxs(W,{className:"max-w-md mx-auto",children:[e.jsxs(q,{children:[e.jsxs(H,{
196className:"flex items-center gap-2",children:[e.jsx(ie,{className:"h-5 w-5"}),"Barcode scannen"]}),e.jsx(Se,{children:"Richten Sie die Kamera auf den Barcode oder geben Sie ihn manuell ein."})]}),e.jsx("div",{className:"space-y-4",children:!n&&!N?e.jsxs(e.Fragment,{children:[e.jsx("div",{id:D,className:"w-full bg-muted rounded-lg overflow-hidden",style:{minHeight:"300px"}}),!m&&e.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[e.jsxs(h,{variant:"outline",onClick:()=>b(!0),className:"w-full",children:[e.jsx(_e,{className:"h-4 w-4 mr-2"}),"Manuell eingeben"]}),e.jsxs(h,{variant:"outline",onClick:()=>C(!0),className:"w-full",children:[e.jsx(ue,{className:"h-4 w-4 mr-2"}),"Online suchen"]})]})]}):n?e.jsx(e.Fragment,{children:e.jsxs("div",{className:"space-y-3",children:[e.jsx(L,{placeholder:"Barcode manuell eingeben...",value:y,onChange:g=>o(g.target.value),onKeyDown:g=>g.key==="Enter"&&c(),autoFocus:!0}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(h,{variant:"outline",onClick:()=>b(!1),className:"flex-1",children:[e.jsx(ie,{className:"h-4 w-4 mr-2"}),"Zurück zum Scanner"]}),e.jsx(h,{onClick:c,disabled:!y.trim(),className:"flex-1",children:"Bestätigen"})]})]})}):e.jsx(e.Fragment,{children:e.jsxs("div",{className:"space-y-3",children:[e.jsx(L,{placeholder:"Zutat suchen (z.B. Zimt)...",value:u,onChange:g=>S(g.target.value),onKeyDown:g=>g.key==="Enter"&&f(),autoFocus:!0}),O.length>0&&e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm text-muted-foreground",children:"Suchergebnisse:"}),O.map((g,B)=>e.jsxs("div",{className:"p-3 border rounded-lg cursor-pointer hover:bg-muted/50",onClick:()=>V(g),children:[e.jsx("div",{className:"font-medium",children:g.name}),g.description&&e.jsx("div",{className:"text-sm text-muted-foreground",children:g.description}),g.gtin&&e.jsxs("div",{className:"text-xs text-muted-foreground",children:["GTIN: ",g.gtin]})]},B))]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(h,{variant:"outline",onClick:()=>C(!1),className:"flex-1",children:[e.jsx(ie,{className:"h-4 w-4 mr-2"}),"Zurück zum Scanner"]}),e.jsxs(h,{onClick:f,disabled:!u.trim()||z,className:"flex-1",children:[z?e.jsx(Be,{className:"h-4 w-4 mr-2 animate-spin"}):e.jsx(ue,{className:"h-4 w-4 mr-2"}),"Suchen"]})]})]})})})]})})}function he({onImportComplete:a}){const{toast:v}=ce(),[w,j]=s.useState(!1),[m,p]=s.useState(!1),n=async b=>{const N=(b||"").trim();if(!N){v({title:"Ungültiger Code",description:"Der gescannte Barcode ist leer. Bitte erneut versuchen.",variant:"destructive"});return}p(!0);try{const{data:C}=await $.from("ingredients").select("*").eq("gtin",N).maybeSingle();if(C){v({title:"Zutat bereits vorhanden",description:`"${C.name}" ist bereits in der Datenbank.`});return}const{data:y,error:o}=await $.functions.invoke("import-ingredient",{body:{gtin:N,language:"de"}});if(o)throw o;y?.success?(v({title:"Zutat importiert",description:"Zutat wurde erfolgreich hinzugefügt."}),a?.()):v({title:"Zutat nicht gefunden",description:`Keine Zutat mit Code "${N}" gefunden. Bitte verwenden Sie den erweiterten Import.`,variant:"destructive"})}catch(C){console.error("Import error:",C),v({title:"Import-Fehler",description:"Die Zutat konnte nicht importiert werden.",variant:"destructive"})}finally{p(!1)}};return e.jsxs(e.Fragment,{children:[e.jsxs(h,{onClick:()=>j(!0),disabled:m,size:"lg",className:"bg-gradient-to-r from-primary to-accent text-primary-foreground shadow-lg hover:shadow-xl transition-all duration-200",children:[e.jsx(ie,{className:"h-5 w-5 mr-2"}),m?"Importiere...":"Schnell-Scanner"]}),e.jsx(Ge,{open:w,onOpenChange:j,onBarcodeScanned:n})]})}function Ve({open:a,onOpenChange:v,ingredient:w,onLinked:j}){const{toast:m}=ce(),[p,n]=s.useState(""),[b,N]=s.useState([]),[C,y]=s.useState(!1),[o,u]=s.useState(null),[S,z]=s.useState(!1),I=s.useMemo(()=>b.find(x=>x.id===o)||null,[b,o]);s.useEffect(()=>{if(!a){n(""),N([]),u(null);return}},[a]),s.useEffect(()=>{(async()=>{if(!(!a||!w)){y(!0);try{let k=$.from("inventory_items").select("id, name, unit, barcode, ingredient_id").order("name",{ascending:!0}).limit(50);const D=p.trim();D.length>=2&&(k=k.or(`name.ilike.%${D}%,barcode.ilike.%${D}%`));const{data:i,error:t}=await k;if(t)throw t;N(i||[])}catch(k){console.error("Error loading inventory items for link:",k),m({title:"Fehler",description:"Inventur-Artikel konnten nicht geladen werden.",variant:"destructive"})}finally{y(!1)}}})()},[a,w,p,m]);const O=async()=>
196{if(!(!w||!o)){z(!0);try{const{error:x}=await $.from("inventory_items").update({ingredient_id:w.id}).eq("id",o);if(x)throw x;m({title:"Verknüpft",description:`"${w.name}" ist jetzt mit dem Inventur-Artikel verbunden.`}),j(),v(!1)}catch(x){console.error("Error linking ingredient to inventory item:",x),m({title:"Fehler",description:"Verknüpfen ist fehlgeschlagen.",variant:"destructive"})}finally{z(!1)}}};return e.jsx(Y,{open:a,onOpenChange:v,children:e.jsxs(W,{className:"sm:max-w-[720px]",children:[e.jsx(q,{children:e.jsx(H,{children:"Inventur-Artikel verknüpfen"})}),w?e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(A,{children:"Zutat"}),e.jsx("div",{className:"text-sm font-medium",children:w.name})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(A,{children:"Inventur-Artikel suchen"}),e.jsx(L,{value:p,onChange:x=>n(x.target.value),placeholder:"Name oder Barcode..."}),e.jsx("div",{className:"text-xs text-muted-foreground",children:"Tipp: mindestens 2 Zeichen, sonst werden nur die ersten 50 Artikel angezeigt."})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(A,{children:"Auswahl"}),e.jsx("div",{className:"rounded-md border",children:e.jsx(Ee,{className:"h-[320px]",children:C?e.jsx("div",{className:"p-4 text-sm text-muted-foreground",children:"Lade Artikelâ¦"}):b.length===0?e.jsx("div",{className:"p-4 text-sm text-muted-foreground",children:"Keine Artikel gefunden."}):e.jsx("div",{className:"divide-y",children:b.map(x=>{const k=x.id===o,D=!!x.ingredient_id&&x.ingredient_id!==w.id;return e.jsx("button",{type:"button",onClick:()=>u(x.id),className:Ie("w-full text-left p-3 hover:bg-muted/50 transition",k&&"bg-muted"),children:e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-sm font-medium truncate",children:x.name}),e.jsxs("div",{className:"text-xs text-muted-foreground",children:[x.unit,x.barcode?` ⢠${x.barcode}`:""]})]}),D?e.jsx("div",{className:"text-xs text-destructive whitespace-nowrap",children:"bereits verknüpft"}):x.ingredient_id?e.jsx("div",{className:"text-xs text-muted-foreground whitespace-nowrap",children:"verknüpft"}):e.jsx("div",{className:"text-xs text-muted-foreground whitespace-nowrap",children:"frei"})]})},x.id)})})})}),I&&I.ingredient_id&&I.ingredient_id!==w.id&&e.jsx("div",{className:"text-xs text-destructive",children:"Achtung: Dieser Inventur-Artikel ist bereits mit einer anderen Zutat verknüpft. Wenn du speicherst, wird die Verknüpfung umgehängt."})]}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx(h,{variant:"outline",onClick:()=>v(!1),disabled:S,children:"Abbrechen"}),e.jsx(h,{onClick:O,disabled:!o||S,children:"Verknüpfen"})]})]}):e.jsx("div",{className:"text-sm text-muted-foreground",children:"Keine Zutat ausgewählt."})]})})}const Ke=()=>{const{toast:a}=ce(),[v,w]=s.useState([]),[j,m]=s.useState([]),[p,n]=s.useState(!0),[b,N]=s.useState(!1),[C,y]=s.useState(!1),[o,u]=s.useState(""),[S,z]=s.useState("all"),[I,O]=s.useState("all"),[x,k]=s.useState({}),[D,i]=s.useState(!1),[t,c]=s.useState(null),[d,l]=s.useState({name:"",ort:"",kontakt:"",website:"",regional:!0});s.useEffect(()=>{f()},[]);const f=async()=>{try{const[r,F]=await Promise.all([$.from("ingredients").select(` 197 *, 198 producer:producers(*) 199 `).order("created_at",{ascending:!1}),$.from("producers").select("*").order("name")]);if(r.error)throw r.error;if(F.error)throw F.error;w(r.data||[]),m(F.data||[]);const Z=(r.data||[]).map(J=>J.id).filter(Boolean);if(Z.length>0){const{data:J,error:be}=await $.from("inventory_items").select("id, name, unit, ingredient_id").in("ingredient_id",Z);if(be)throw be;const oe={};(J||[]).forEach(K=>{K.ingredient_id&&(oe[K.ingredient_id]||=[],oe[K.ingredient_id].push({id:K.id,name:K.name,unit:K.unit}))}),k(oe)}else k({})}catch(r){console.error("Error loading data:",r),a({title:"Fehler",description:"Daten konnten nicht geladen werden.",variant:"destructive"})}finally{n(!1)}},V=r=>{c({id:r.id,name:r.name}),i(!0)},g=async r=>{try{const{error:F}=await $.from("ingredients").delete().eq("id",r);
199if(F)throw F;w(v.filter(Z=>Z.id!==r)),a({title:"Zutat gelöscht",description:"Die Zutat wurde erfolgreich gelöscht."})}catch(F){console.error("Error deleting ingredient:",F),a({title:"Fehler",description:"Die Zutat konnte nicht gelöscht werden.",variant:"destructive"})}},B=async()=>{try{const{data:r,error:F}=await $.from("producers").insert([d]).select().single();if(F)throw F;m([...j,r]),l({name:"",ort:"",kontakt:"",website:"",regional:!0}),y(!1),a({title:"Produzent erstellt",description:`${r.name} wurde erfolgreich angelegt.`})}catch(r){console.error("Error creating producer:",r),a({title:"Fehler",description:"Der Produzent konnte nicht erstellt werden.",variant:"destructive"})}},_=v.filter(r=>{const F=r.name.toLowerCase().includes(o.toLowerCase())||r.gtin?.includes(o),Z=S==="all"||r.source===S,J=I==="all"||r.producer?.id===I||I==="none"&&!r.producer;return F&&Z&&J}),le=r=>{switch(r){case"OFF":return"Open Food Facts";case"FDC":return"USDA FoodData";case"MANUAL":return"Manuell";default:return"Unbekannt"}},ne=(r,F="g")=>r==null?"-":`${r.toFixed(1)} ${F}`;if(p)return e.jsx("div",{className:"p-6",children:"Lade Zutaten..."});const we=Object.keys(x).length,De=Math.max(0,v.length-we);return e.jsxs("div",{className:"p-3 md:p-6 space-y-4 md:space-y-6",children:[e.jsxs("div",{className:"flex flex-col md:flex-row md:items-center md:justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-xl md:text-2xl font-bold",children:"Zutaten-Verwaltung"}),e.jsx("p",{className:"text-muted-foreground text-sm md:text-base",children:"Verwalten Sie Ihre Zutaten, Produzenten und Nährwertdaten"}),e.jsxs("p",{className:"text-xs text-muted-foreground mt-1",children:["Inventur-Link: ",we," verknüpft ⢠",De," offen"]})]}),e.jsxs("div",{className:"flex flex-col md:hidden gap-2",children:[e.jsx(he,{onImportComplete:f}),e.jsxs(Fe,{children:[e.jsx(Re,{asChild:!0,children:e.jsxs(h,{variant:"outline",size:"sm",className:"w-full",children:[e.jsx(Ze,{className:"h-4 w-4 mr-2"}),"Weitere Aktionen"]})}),e.jsxs(ze,{align:"end",className:"w-56 z-50 bg-background border shadow-lg",children:[e.jsxs(de,{onClick:()=>N(!0),children:[e.jsx(me,{className:"h-4 w-4 mr-2"}),"Erweitert importieren"]}),e.jsxs(de,{onClick:()=>y(!0),children:[e.jsx(ae,{className:"h-4 w-4 mr-2"}),"Neuer Produzent"]}),e.jsx(de,{asChild:!0,children:e.jsx(Ce,{children:e.jsxs("div",{className:"flex items-center w-full",children:[e.jsx(G,{className:"h-4 w-4 mr-2"}),"Barcode erstellen"]})})})]})]})]}),e.jsxs("div",{className:"hidden md:flex gap-2",children:[e.jsx(he,{onImportComplete:f}),e.jsxs(h,{onClick:()=>N(!0),variant:"outline",children:[e.jsx(me,{className:"h-4 w-4 mr-2"}),"Erweitert importieren"]}),e.jsxs(h,{onClick:()=>y(!0),variant:"outline",children:[e.jsx(ae,{className:"h-4 w-4 mr-2"}),"Neuer Produzent"]}),e.jsx(Ce,{children:e.jsxs(h,{variant:"outline",children:[e.jsx(G,{className:"h-4 w-4 mr-2"}),"Barcode erstellen"]})})]})]}),e.jsxs(Oe,{defaultValue:"ingredients",className:"space-y-4",children:[e.jsxs(Ae,{children:[e.jsxs(ye,{value:"ingredients",children:["Zutaten (",v.length,")"]}),e.jsxs(ye,{value:"producers",children:["Produzenten (",j.length,")"]})]}),e.jsxs(ke,{value:"ingredients",className:"space-y-4",children:[e.jsx(M,{children:e.jsx(U,{className:"pt-4 md:pt-6",children:e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-4 gap-3 md:gap-4",children:[e.jsxs("div",{children:[e.jsx(A,{children:"Suche"}),e.jsxs("div",{className:"relative",children:[e.jsx(ue,{className:"absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(L,{placeholder:"Name oder GTIN...",value:o,onChange:r=>u(r.target.value),className:"pl-10"})]})]}),e.jsxs("div",{children:[e.jsx(A,{children:"Quelle"}),e.jsxs(X,{value:S,onValueChange:z,children:[e.jsx(ee,{children:e.jsx(te,{})}),e.jsxs(re,{className:"z-50 bg-background border shadow-lg",children:[e.jsx(R,{value:"all",children:"Alle Quellen"}),e.jsx(R,{value:"OFF",children:"Open Food Facts"}),e.jsx(R,{value:"FDC",children:"USDA FoodData"}),e.jsx(R,{value:"MANUAL",children:"Manuell"})]})]})]}),e.jsxs("div",{children:[e.jsx(A,{children:"Produzent"}
199),e.jsxs(X,{value:I,onValueChange:O,children:[e.jsx(ee,{children:e.jsx(te,{})}),e.jsxs(re,{className:"z-50 bg-background border shadow-lg max-h-48 overflow-y-auto",children:[e.jsx(R,{value:"all",children:"Alle Produzenten"}),e.jsx(R,{value:"none",children:"Ohne Produzent"}),j.map(r=>e.jsx(R,{value:r.id,children:r.name},r.id))]})]})]}),e.jsx("div",{className:"flex items-end",children:e.jsx(h,{variant:"outline",onClick:()=>{u(""),z("all"),O("all")},children:"Filter zurücksetzen"})})]})})}),e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",children:_.map(r=>e.jsxs(M,{className:"relative",children:[e.jsxs(Q,{className:"pb-3",children:[e.jsxs("div",{className:"flex items-start justify-between",children:[e.jsxs("div",{className:"flex-1",children:[e.jsx(T,{className:"text-base md:text-lg",children:r.name}),r.gtin&&e.jsxs("p",{className:"text-sm text-muted-foreground",children:["GTIN: ",r.gtin]})]}),e.jsxs("div",{className:"flex gap-1",children:[e.jsx(h,{variant:"ghost",size:"sm",onClick:()=>V(r),className:"h-8 w-8 p-0",title:"Inventur-Artikel verknüpfen",children:e.jsx(Pe,{className:"h-4 w-4"})}),e.jsx(Qe,{ingredient:r,children:e.jsx(h,{variant:"ghost",size:"sm",className:"h-8 w-8 p-0",children:e.jsx(se,{className:"h-4 w-4"})})}),e.jsx(h,{variant:"ghost",size:"sm",onClick:()=>g(r.id),className:"h-8 w-8 p-0 text-destructive",children:e.jsx($e,{className:"h-4 w-4"})})]})]}),e.jsxs("div",{className:"flex flex-wrap gap-1",children:[e.jsx(P,{variant:"outline",className:"text-xs",children:le(r.source)}),x[r.id]?.length?e.jsx(P,{variant:"secondary",className:"text-xs",children:"Inventur â"}):e.jsx(P,{variant:"outline",className:"text-xs",children:"Inventur â"}),r.producer?.regional&&e.jsx(P,{variant:"secondary",className:"text-xs",children:"Regional"}),r.standard_einheit&&e.jsx(P,{variant:"outline",className:"text-xs",children:r.standard_einheit})]})]}),e.jsxs(U,{className:"space-y-3",children:[r.producer&&e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(ae,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{children:r.producer.name}),r.producer.ort&&e.jsxs("span",{className:"text-muted-foreground",children:["(",r.producer.ort,")"]})]}),Array.isArray(r.allergene)&&r.allergene.length>0&&e.jsxs("div",{children:[e.jsx("p",{className:"text-xs font-medium mb-1",children:"Allergene:"}),e.jsxs("div",{className:"flex flex-wrap gap-1",children:[r.allergene.slice(0,3).map((F,Z)=>e.jsx(P,{variant:"destructive",className:"text-xs",children:F},Z)),r.allergene.length>3&&e.jsxs(P,{variant:"destructive",className:"text-xs",children:["+",r.allergene.length-3]})]})]}),Object.keys(r.naehrwerte_json||{}).length>0&&e.jsxs("div",{children:[e.jsx("p",{className:"text-xs font-medium mb-2",children:"Nährwerte (pro 100g):"}),e.jsxs("div",{className:"grid grid-cols-2 gap-1 text-xs",children:[r.naehrwerte_json.energy_kcal&&e.jsxs("div",{className:"bg-muted p-1 rounded text-center",children:[e.jsx("div",{className:"font-medium",children:"Energie"}),e.jsx("div",{children:ne(r.naehrwerte_json.energy_kcal,"kcal")})]}),r.naehrwerte_json.proteins&&e.jsxs("div",{className:"bg-muted p-1 rounded text-center",children:[e.jsx("div",{className:"font-medium",children:"EiweiÃ"}),e.jsx("div",{children:ne(r.naehrwerte_json.proteins)})]}),r.naehrwerte_json.fat&&e.jsxs("div",{className:"bg-muted p-1 rounded text-center",children:[e.jsx("div",{className:"font-medium",children:"Fett"}),e.jsx("div",{children:ne(r.naehrwerte_json.fat)})]}),r.naehrwerte_json.carbohydrates&&e.jsxs("div",{className:"bg-muted p-1 rounded text-center",children:[e.jsx("div",{className:"font-medium",children:"Kohlenhydrate"}),e.jsx("div",{children:ne(r.naehrwerte_json.carbohydrates)})]})]})]})]})]},r.id))}),_.length===0&&e.jsx(M,{children:e.jsxs(U,{className:"text-center py-8",children:[e.jsx(me,{className:"h-12 w-12 mx-auto mb-4 text-muted-foreground"}),e.jsx("h3",{className:"text-lg font-medium mb-2",children:"Keine Zutaten gefunden"}),e.jsx("p",{className:"text-muted-foreground mb-4",children:o||S!=="all"||I!=="all"?"Keine Zutaten entsprechen den aktuellen Filterkriterien.":"Noch keine Zutaten vorhanden. Importieren Sie Ihre erste Zutat."}),e.jsx(he,{onImportComplete:f})]})})]}),e.jsx(ke,{value:"producers",className:"space-y-4",children:e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",children:j.map(r=>e.jsxs(M,{children:[e.jsx(Q,{children:e.jsxs(T,{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(ae,{className:"h-5 w-5"}),r.name,r.regional&&e.jsx(P,{variant:"secondary",className:"text-xs",children:"Regional"})]}),e.jsx(Te,{producer:r,children:e.jsx(h,{variant:"ghost",size:"sm",className:"h-8 w-8 p-0",children:e.jsx(se,{className:"h-4 w-4"})})})]})}),e.jsxs(U,{className:"space-y-2",children:[r.ort&&e.jsxs("div",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:[e.jsx(Me,{className:"h-4 w-4"}),r.ort]}),r.kontakt&&e.jsxs("div",{className:"text-sm",children:[e.jsx("span",{className:"font-medium",children:"Kontakt:"})," ",r.kontakt]}),r.website&&e.jsx("div",{className:"text-sm",children:e.jsx("a",{href:r.website,target:"_blank",rel:"noopener noreferrer",className:"text-primary hover:underline",children:"Website besuchen"})})]})]},r.id))})})]}),e.jsx(Ue,{open:b,onOpenChange:N,onImportComplete:f}),e.jsx(Y,{open:C,onOpenChange:y,children:e.jsxs(W,{children:[e.jsx(q,{children:e.jsx(H,{children:"Neuer Produzent"})}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx(A,{htmlFor:"producer-name",children:"Name *"}),e.jsx(L,{id:"producer-name",value:d.name,onChange:r=>l({...d,name:r.target.value}),placeholder:"Produzent Name"})]}),e.jsxs("div",{children:[e.jsx(A,{htmlFor:"producer-ort",children:"Ort"}
199),e.jsx(L,{id:"producer-ort",value:d.ort,onChange:r=>l({...d,ort:r.target.value}),placeholder:"Stadt, Land"})]}),e.jsxs("div",{children:[e.jsx(A,{htmlFor:"producer-kontakt",children:"Kontakt"}),e.jsx(L,{id:"producer-kontakt",value:d.kontakt,onChange:r=>l({...d,kontakt:r.target.value}),placeholder:"E-Mail oder Telefon"})]}),e.jsxs("div",{children:[e.jsx(A,{htmlFor:"producer-website",children:"Website"}),e.jsx(L,{id:"producer-website",value:d.website,onChange:r=>l({...d,website:r.target.value}),placeholder:"https://..."})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx("input",{type:"checkbox",id:"producer-regional",checked:d.regional,onChange:r=>l({...d,regional:r.target.checked})}),e.jsx(A,{htmlFor:"producer-regional",children:"Regionaler Produzent"})]}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx(h,{variant:"outline",onClick:()=>y(!1),children:"Abbrechen"}),e.jsx(h,{onClick:B,disabled:!d.name.trim(),children:"Erstellen"})]})]})]})}),e.jsx(Ve,{open:D,onOpenChange:i,ingredient:t,onLinked:f})]})};function dt(){return e.jsx(Ke,{})}export{dt as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.