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.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 && (
)}
);
}
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 ;
}