Dateien nach "frontend/src/tools" hochladen

This commit is contained in:
2026-05-26 01:42:56 +02:00
parent 8673a79bb1
commit ee19b13461

View File

@@ -147,8 +147,8 @@ function BestellungDetail({ id, toast, onBack }) {
{/* Bezahlt-Zeile immer eigene Card unter dem Header */} {/* Bezahlt-Zeile immer eigene Card unter dem Header */}
{order && !editMode && ( {order && !editMode && (
<div style={{marginBottom:12,padding:'10px 14px', <div style={{marginBottom:12,padding:'10px 14px',
background:order.bezahlt?'rgba(192,132,252,0.07)':'rgba(255,255,255,0.02)', background:!!order.bezahlt?'rgba(192,132,252,0.07)':'rgba(255,255,255,0.02)',
border:`1px solid ${order.bezahlt?'rgba(192,132,252,0.25)':'rgba(255,255,255,0.07)'}`, border:`1px solid ${!!order.bezahlt?'rgba(192,132,252,0.25)':'rgba(255,255,255,0.07)'}`,
borderRadius:10}}> borderRadius:10}}>
<button onClick={toggleBezahlt} style={{ <button onClick={toggleBezahlt} style={{
background:order.bezahlt?BEZAHLT.bg:'rgba(255,255,255,0.05)', background:order.bezahlt?BEZAHLT.bg:'rgba(255,255,255,0.05)',
@@ -159,7 +159,7 @@ function BestellungDetail({ id, toast, onBack }) {
}}> }}>
{order.bezahlt?'💜 Als bezahlt markiert':'○ Als bezahlt markieren'} {order.bezahlt?'💜 Als bezahlt markiert':'○ Als bezahlt markieren'}
</button> </button>
{order.bezahlt && ( {!!order.bezahlt && (
<div style={{color:'rgba(192,132,252,0.65)',fontFamily:'monospace',fontSize:11,marginTop:8}}> <div style={{color:'rgba(192,132,252,0.65)',fontFamily:'monospace',fontSize:11,marginTop:8}}>
🔒 Bezahlte Bestellungen können nicht mehr bearbeitet werden. 🔒 Bezahlte Bestellungen können nicht mehr bearbeitet werden.
</div> </div>
@@ -207,7 +207,7 @@ function BestellungDetail({ id, toast, onBack }) {
<> <>
{(order.bemerkung || order.bezahlt) && ( {(order.bemerkung || order.bezahlt) && (
<div style={{...S.card,marginBottom:10,padding:'10px 14px'}}> <div style={{...S.card,marginBottom:10,padding:'10px 14px'}}>
{order.bezahlt && ( {!!order.bezahlt && (
<div style={{color:BEZAHLT.color,fontFamily:'monospace',fontSize:11,marginBottom:order.bemerkung?6:0}}> <div style={{color:BEZAHLT.color,fontFamily:'monospace',fontSize:11,marginBottom:order.bemerkung?6:0}}>
💜 Bezahlt am {new Date(order.bezahlt_am).toLocaleDateString('de-DE',{day:'2-digit',month:'2-digit',year:'numeric'})} 💜 Bezahlt am {new Date(order.bezahlt_am).toLocaleDateString('de-DE',{day:'2-digit',month:'2-digit',year:'numeric'})}
</div> </div>
@@ -240,7 +240,7 @@ function BestellungDetail({ id, toast, onBack }) {
<div style={{display:'flex',justifyContent:'space-between',alignItems:'center',marginBottom:8}}> <div style={{display:'flex',justifyContent:'space-between',alignItems:'center',marginBottom:8}}>
<span style={{color:'#fff',fontFamily:'monospace',fontSize:13,flex:1}}>{item.calc_name}</span> <span style={{color:'#fff',fontFamily:'monospace',fontSize:13,flex:1}}>{item.calc_name}</span>
<div style={{display:'flex',gap:6,alignItems:'center'}}> <div style={{display:'flex',gap:6,alignItems:'center'}}>
<StatusBadge status={itemDisplayStatus(item)} onClick={order.bezahlt?undefined:()=>cycleItemStatus(item)} small/> <StatusBadge status={itemDisplayStatus(item)} onClick={!!order.bezahlt?undefined:()=>cycleItemStatus(item)} small/>
{!order.bezahlt && ( {!order.bezahlt && (
<button onClick={()=>removeItem(item.id)} style={{background:'transparent',border:'none',cursor:'pointer',padding:2}}> <button onClick={()=>removeItem(item.id)} style={{background:'transparent',border:'none',cursor:'pointer',padding:2}}>
<XIcon size={14} color="rgba(255,255,255,0.3)"/> <XIcon size={14} color="rgba(255,255,255,0.3)"/>
@@ -266,20 +266,20 @@ function BestellungDetail({ id, toast, onBack }) {
<input type="number" step="0.01" min="0" <input type="number" step="0.01" min="0"
defaultValue={item.custom_price??''} defaultValue={item.custom_price??''}
placeholder="" placeholder=""
readOnly={order.bezahlt} readOnly={!!order.bezahlt}
onBlur={e=>{ onBlur={e=>{
if (order.bezahlt) return; if (!!order.bezahlt) return;
const v = e.target.value==='' ? null : parseFloat(e.target.value); const v = e.target.value==='' ? null : parseFloat(e.target.value);
updateItem(item.id, {custom_price:v}); updateItem(item.id, {custom_price:v});
}} }}
style={{...S.inp,fontSize:14,padding:'8px 10px', style={{...S.inp,fontSize:14,padding:'8px 10px',
opacity:order.bezahlt?0.5:1, opacity:!!order.bezahlt?0.5:1,
cursor:order.bezahlt?'not-allowed':'text'}}/> cursor:!!order.bezahlt?'not-allowed':'text'}}/>
</div> </div>
</div> </div>
{/* Status pro Stück */} {/* Status pro Stück */}
<div style={{marginBottom:10,opacity:order.bezahlt?0.5:1,pointerEvents:order.bezahlt?'none':'auto'}}> <div style={{marginBottom:10,opacity:!!order.bezahlt?0.5:1,pointerEvents:!!order.bezahlt?'none':'auto'}}>
<div style={{...S.head,marginBottom:6}}>STATUS PRO STÜCK</div> <div style={{...S.head,marginBottom:6}}>STATUS PRO STÜCK</div>
<div style={{display:'grid',gridTemplateColumns:'1fr 1fr 1fr',gap:6}}> <div style={{display:'grid',gridTemplateColumns:'1fr 1fr 1fr',gap:6}}>
{[ {[
@@ -287,18 +287,34 @@ function BestellungDetail({ id, toast, onBack }) {
['in_arbeit', 'In Arbeit', '#4ecdc4', item.qty_in_arbeit||0], ['in_arbeit', 'In Arbeit', '#4ecdc4', item.qty_in_arbeit||0],
['fertig', 'Fertig', '#6bcb77', item.qty_fertig||0], ['fertig', 'Fertig', '#6bcb77', item.qty_fertig||0],
].map(([key, label, color, qty]) => { ].map(([key, label, color, qty]) => {
const others = item.stueckzahl - qty; const w = item.qty_warteliste||0, a = item.qty_in_arbeit||0, f = item.qty_fertig||0;
// + nimmt aus Warteliste (oder In Arbeit), - gibt zurück an Warteliste
const canInc = key==='warteliste' ? false : (key==='in_arbeit' ? w>0 : w>0||a>0);
const canDec = qty > 0;
const handleInc = () => {
if (!canInc) return;
let nw=w,na=a,nf=f;
if (key==='in_arbeit') { na++; nw=Math.max(0,nw-1); }
if (key==='fertig') { nf++; if(nw>0) nw--; else na=Math.max(0,na-1); }
updateItem(item.id,{qty_warteliste:nw,qty_in_arbeit:na,qty_fertig:nf});
};
const handleDec = () => {
if (!canDec) return;
let nw=w,na=a,nf=f;
if (key==='warteliste') { nw--; }
if (key==='in_arbeit') { na--; nw++; }
if (key==='fertig') { nf--; nw++; }
updateItem(item.id,{qty_warteliste:nw,qty_in_arbeit:na,qty_fertig:nf});
};
return ( return (
<div key={key} style={{background:`${color}10`,border:`1px solid ${color}30`,borderRadius:8,padding:'8px 6px',textAlign:'center'}}> <div key={key} style={{background:`${color}10`,border:`1px solid ${color}30`,borderRadius:8,padding:'8px 6px',textAlign:'center'}}>
<div style={{color:'rgba(255,255,255,0.35)',fontSize:9,fontFamily:'monospace',marginBottom:6}}>{label.toUpperCase()}</div> <div style={{color:'rgba(255,255,255,0.35)',fontSize:9,fontFamily:'monospace',marginBottom:6}}>{label.toUpperCase()}</div>
<div style={{display:'flex',alignItems:'center',justifyContent:'center',gap:4}}> <div style={{display:'flex',alignItems:'center',justifyContent:'center',gap:4}}>
<button <button onClick={handleDec}
onClick={()=>qty>0&&updateItem(item.id,{[`qty_${key}`]:qty-1})} style={{width:22,height:22,borderRadius:5,background:'rgba(0,0,0,0.3)',border:'none',color:canDec?color:'rgba(255,255,255,0.15)',fontSize:16,cursor:canDec?'pointer':'default',lineHeight:1}}></button>
style={{width:22,height:22,borderRadius:5,background:'rgba(0,0,0,0.3)',border:'none',color:qty>0?color:'rgba(255,255,255,0.15)',fontSize:16,cursor:qty>0?'pointer':'default',lineHeight:1}}></button>
<span style={{color,fontFamily:"'Space Mono',monospace",fontSize:16,fontWeight:700,minWidth:20,textAlign:'center'}}>{qty}</span> <span style={{color,fontFamily:"'Space Mono',monospace",fontSize:16,fontWeight:700,minWidth:20,textAlign:'center'}}>{qty}</span>
<button <button onClick={handleInc}
onClick={()=>{const sum=(item.qty_warteliste||0)+(item.qty_in_arbeit||0)+(item.qty_fertig||0);sum<item.stueckzahl&&updateItem(item.id,{[`qty_${key}`]:qty+1})}} style={{width:22,height:22,borderRadius:5,background:'rgba(0,0,0,0.3)',border:'none',color:canInc?color:'rgba(255,255,255,0.15)',fontSize:16,cursor:canInc?'pointer':'default',lineHeight:1}}>+</button>
style={{width:22,height:22,borderRadius:5,background:'rgba(0,0,0,0.3)',border:'none',color:color,fontSize:16,cursor:'pointer',lineHeight:1}}>+</button>
</div> </div>
</div> </div>
); );
@@ -531,7 +547,7 @@ export default function Bestellungen({ toast, mobile }) {
</div> </div>
</button> </button>
<div style={{display:'flex',gap:5,alignItems:'center'}}> <div style={{display:'flex',gap:5,alignItems:'center'}}>
{order.bezahlt && ( {!!order.bezahlt && (
<span style={{background:BEZAHLT.bg,border:`1px solid ${BEZAHLT.color}44`, <span style={{background:BEZAHLT.bg,border:`1px solid ${BEZAHLT.color}44`,
borderRadius:20,padding:'3px 10px',color:BEZAHLT.color,fontFamily:'monospace',fontSize:10}}> borderRadius:20,padding:'3px 10px',color:BEZAHLT.color,fontFamily:'monospace',fontSize:10}}>
💜 Bezahlt 💜 Bezahlt