import { useEffect, useState } from 'react'; import { Link as RouterLink, useNavigate, useParams } from 'react-router-dom'; import Alert from '@mui/material/Alert'; import Box from '@mui/material/Box'; import Chip from '@mui/material/Chip'; import CircularProgress from '@mui/material/CircularProgress'; import Link from '@mui/material/Link'; import Paper from '@mui/material/Paper'; import Table from '@mui/material/Table'; import TableBody from '@mui/material/TableBody'; import TableCell from '@mui/material/TableCell'; import TableHead from '@mui/material/TableHead'; import TableRow from '@mui/material/TableRow'; import Typography from '@mui/material/Typography'; import { article } from '../../api'; import { formatPrice, getBrutto } from '../../utils/price'; import { formatStock } from './searchFormat'; function DetailRow({ label, children }) { if (children == null || children === '') return null; return ( {label} {children} ); } function Section({ title, children }) { if (!children) return null; return ( {title} {children} ); } export function ArticleView({ article: a }) { const brutto = a.fVKNEtto != null ? getBrutto(a.fVKNEtto, a.kSteuerklasse) : null; return ( {a.cName} {a.cArtNr} {a.cBarcode} {a.cHersteller} {a.fVKNEtto != null ? formatPrice(a.fVKNEtto) : null} {brutto != null ? formatPrice(brutto) : null} {a.fUVP != null ? formatPrice(a.fUVP) : null} {formatStock(a.fBestand)} {a.garage != null ? formatStock(a.garage) : null} {a.keller != null ? formatStock(a.keller) : null} {a.tVersandklassecName} {a.fGewicht != null ? `${new Intl.NumberFormat('de-DE').format(a.fGewicht)} kg` : null} {a.vater?.cArtNr && ( {a.vater.cArtNr} )} {(a.cEigenschaftName || a.cEigenschaftWertName) && ( {[a.cEigenschaftName, a.cEigenschaftWertName].filter(Boolean).join(': ')} )} {a.cKurzBeschreibung && (
{a.cKurzBeschreibung}
)} {a.cBeschreibung && (
)} {a.EANs?.length > 0 && (
{a.EANs.map((row) => row.cEAN).filter(Boolean).join(', ')}
)} {a.KATs?.length > 0 && (
{a.KATs.map((row) => row.kKategorie).join(', ')}
)} {a.staffel?.length > 0 && (
Menge VK Brutto {a.staffel.map((row, i) => ( {row.menge} {row.fVKBrutto} ))}
)} {a.lief?.length > 0 && (
Firma Lief.-Artikelnr. EK Netto Lager {a.lief.map((row, i) => ( {row.cFirma} {row.nStandard ? ' ★' : ''} {row.cLiefArtNr || '—'} {row.fEKNetto != null ? formatPrice(row.fEKNetto) : '—'} {formatStock(row.fLagerbestand)} ))}
)} {a.merkmale?.length > 0 && (
{a.merkmale.map((row, i) => ( {row.cWert} ))}
)} {a.children?.length > 0 && (
Artikelnr. Name {a.children.map((row) => ( {row.cArtNr ? ( {row.cArtNr} ) : ( '—' )} {row.cName || '—'} ))}
)} {a.liste?.length > 0 && (
Artikelnr. Name Menge {a.liste.map((row, i) => ( {row.cArtNr ? ( {row.cArtNr} ) : ( '—' )} {row.cName || '—'} {formatStock(row.fAnzahl ?? row.menge)} ))}
)} {a.cAnmerkung && (
{a.cAnmerkung}
)}
); } export default function ArtikelSkuPage() { const { sku } = useParams(); const navigate = useNavigate(); const target = sku ? decodeURIComponent(sku) : ''; const [data, setData] = useState(null); const [error, setError] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { function onKeyDown(e) { if (e.key !== 'Escape') return; e.preventDefault(); navigate(-1); } document.addEventListener('keydown', onKeyDown); return () => document.removeEventListener('keydown', onKeyDown); }, [navigate]); useEffect(() => { let cancelled = false; async function load() { if (!target) { setError('Keine Artikelnr. angegeben'); setData(null); setLoading(false); return; } setLoading(true); setError(null); try { const res = await article.get({ target }); if (!cancelled) { setData(res.article ?? null); if (!res.article) setError('Artikel nicht gefunden'); } } catch (err) { if (!cancelled) { setData(null); setError(err.message || 'Artikel konnte nicht geladen werden'); } } finally { if (!cancelled) setLoading(false); } } load(); return () => { cancelled = true; }; }, [target]); if (loading) { return ( ); } if (error) { return ( {error} ); } if (!data) return null; return ; }