From 985f4a3da2727bc93c2a664cb8b59f7b68793444 Mon Sep 17 00:00:00 2001 From: seb Date: Wed, 21 Oct 2026 11:54:46 +0200 Subject: [PATCH] u --- src/components/article/ArticleSearch.jsx | 25 +++++++++++-------- .../article/ArticleStockAdjustDialog.jsx | 2 +- .../article/boxes/ArticleViewEANs.jsx | 2 +- .../article/boxes/ArticleViewLists.jsx | 2 ++ src/components/kunde/Kunde.jsx | 1 + .../manifest/ArticleSearchDialog.jsx | 2 +- .../manifest/BookDeliveryDialog.jsx | 11 +++++++- src/components/manifest/DeliveryList.jsx | 8 +++--- src/components/manifest/ManifestFormLine.jsx | 7 ++++-- src/components/manifest/ManifestHeader.jsx | 7 ++++++ src/components/manifest/ManifestList.jsx | 3 ++- .../manifest/OrderDocumentsTiles.jsx | 4 +-- src/components/manifest/OrderList.jsx | 8 +++--- src/components/manifest/OrderPaymentList.jsx | 4 +-- .../manifest/OrderShipmentDialog.jsx | 7 +++--- src/components/manifest/PartyFilterPanel.jsx | 1 + src/components/manifest/QuoteList.jsx | 4 +-- .../manifest/ShipmentDetailDialog.jsx | 13 +++++++--- src/components/manifest/ShipmentList.jsx | 17 +++++++------ .../settings/NumberSettingsPanel.jsx | 3 +++ src/components/tiles/ArticleTile.jsx | 8 +++++- src/index.css | 12 +++++++++ src/routes/artikel.jsx | 2 +- src/routes/kunde/_entityId.jsx | 25 +++++++++++++++---- src/routes/kunde/neu.jsx | 1 + src/theme/themes/default.js | 3 +++ src/utils/documentNumber.js | 10 ++++++++ 27 files changed, 139 insertions(+), 53 deletions(-) diff --git a/src/components/article/ArticleSearch.jsx b/src/components/article/ArticleSearch.jsx index 3fd0f41..a483158 100644 --- a/src/components/article/ArticleSearch.jsx +++ b/src/components/article/ArticleSearch.jsx @@ -228,7 +228,9 @@ class SearchResultRow extends PureComponent { {' · '} )} - {article.sku} + + {article.sku} + {article.stock != null && ( <> {' · '} @@ -781,16 +783,17 @@ export default class ArticleSearch extends PureComponent { - + {article.name || '–'} diff --git a/src/components/article/ArticleStockAdjustDialog.jsx b/src/components/article/ArticleStockAdjustDialog.jsx index 058ac4f..2674994 100644 --- a/src/components/article/ArticleStockAdjustDialog.jsx +++ b/src/components/article/ArticleStockAdjustDialog.jsx @@ -358,7 +358,7 @@ export default class ArticleStockAdjustDialog extends PureComponent { }} > - Artikel ({article?.sku}) + Artikel ({article?.sku}) {article?.name || '–'} diff --git a/src/components/article/boxes/ArticleViewEANs.jsx b/src/components/article/boxes/ArticleViewEANs.jsx index c757db9..38b2c74 100644 --- a/src/components/article/boxes/ArticleViewEANs.jsx +++ b/src/components/article/boxes/ArticleViewEANs.jsx @@ -152,7 +152,7 @@ export default class ArticleViewEANs extends PureComponent { return ( {articleData.sku}} wide={1} minHeight={SECOND_ROW_MIN_HEIGHT} color={BORDER} diff --git a/src/components/article/boxes/ArticleViewLists.jsx b/src/components/article/boxes/ArticleViewLists.jsx index d031047..df6316c 100644 --- a/src/components/article/boxes/ArticleViewLists.jsx +++ b/src/components/article/boxes/ArticleViewLists.jsx @@ -875,6 +875,7 @@ export default class ArticleViewLists extends PureComponent { to={artikelDetailPath(item.sku)} sx={{ fontSize: '0.72rem', + fontFamily: 'monospace', color: 'text.secondary', textDecoration: 'none', '&:hover': { textDecoration: 'underline' }, @@ -1085,6 +1086,7 @@ export default class ArticleViewLists extends PureComponent { to={artikelDetailPath(opt.sku)} sx={{ fontSize: '0.72rem', + fontFamily: 'monospace', color: 'text.secondary', textDecoration: 'none', '&:hover': { textDecoration: 'underline' }, diff --git a/src/components/kunde/Kunde.jsx b/src/components/kunde/Kunde.jsx index 0ad991f..147a203 100644 --- a/src/components/kunde/Kunde.jsx +++ b/src/components/kunde/Kunde.jsx @@ -165,6 +165,7 @@ class Kunde extends PureComponent { height: 24, fontSize: '0.75rem', fontWeight: 600, + fontFamily: 'monospace', fontVariantNumeric: 'tabular-nums', bgcolor: 'action.hover', color: 'text.primary', diff --git a/src/components/manifest/ArticleSearchDialog.jsx b/src/components/manifest/ArticleSearchDialog.jsx index bee3308..d3f1fea 100644 --- a/src/components/manifest/ArticleSearchDialog.jsx +++ b/src/components/manifest/ArticleSearchDialog.jsx @@ -130,7 +130,7 @@ export default class ArticleSearchDialog extends PureComponent { {line ? ( <> - {isDelivery ? 'Lieferanten-ArtNr' : 'ArtNr'}: {rawSku || '–'} + {isDelivery ? 'Lieferanten-ArtNr' : 'ArtNr'}: {rawSku || '–'} {line?.name ? ` · ${line.name}` : ''} ) : isDelivery ? ( diff --git a/src/components/manifest/BookDeliveryDialog.jsx b/src/components/manifest/BookDeliveryDialog.jsx index 0a3df24..b886fd4 100644 --- a/src/components/manifest/BookDeliveryDialog.jsx +++ b/src/components/manifest/BookDeliveryDialog.jsx @@ -780,7 +780,16 @@ export default class BookDeliveryDialog extends PureComponent { {prefillLine && ( Vorausgewählt zum Verbuchen: Position{' '} - {prefillLine.sku ? `ArtNr ${prefillLine.sku}` : prefillLine.name} ({amountsToBook[prefillLine.id] || 0} Stk.). Andere Positionen stehen auf 0. + {prefillLine.sku ? ( + <> + {'ArtNr '} + + {prefillLine.sku} + + + ) : ( + {prefillLine.name} + )} ({amountsToBook[prefillLine.id] || 0} Stk.). Andere Positionen stehen auf 0. )} {this.renderLinesTable()} diff --git a/src/components/manifest/DeliveryList.jsx b/src/components/manifest/DeliveryList.jsx index da63c59..d1452df 100644 --- a/src/components/manifest/DeliveryList.jsx +++ b/src/components/manifest/DeliveryList.jsx @@ -122,8 +122,8 @@ function renderInvisibleDummyRow(dummy) { return ( <> - {d.number} - {d.externalNumber || 'Nr. / Ref.'} + {d.number} + {d.externalNumber || 'Nr. / Ref.'} {d.date ? formatDate(d.date) : '–'} @@ -241,10 +241,10 @@ class DeliveryRow extends Component { {renderInvisibleDummyRow(dummy)} - + {delivery.number} - + {numberDisplay(delivery.externalNumber)} diff --git a/src/components/manifest/ManifestFormLine.jsx b/src/components/manifest/ManifestFormLine.jsx index fba22cc..4ec9bda 100644 --- a/src/components/manifest/ManifestFormLine.jsx +++ b/src/components/manifest/ManifestFormLine.jsx @@ -392,7 +392,7 @@ class ManifestFormLine extends PureComponent { slotProps={{ htmlInput: { inputMode: type === 'number' ? 'decimal' : 'text', - style: { textAlign: align }, + style: { textAlign: align, ...(id === 'sku' ? { fontFamily: 'monospace' } : {}) }, autoComplete: 'off', step: type === 'number' ? 'any' : undefined, }, @@ -544,6 +544,7 @@ class ManifestFormLine extends PureComponent { fontSize: '0.875rem', lineHeight: '20px', fontWeight: id === 'sku' ? 600 : 400, + fontFamily: id === 'sku' ? 'monospace' : 'inherit', color: isError ? 'error.main' : hasValue @@ -751,6 +752,7 @@ class ManifestFormLine extends PureComponent { height: 20, fontSize: '0.7rem', fontWeight: 600, + fontFamily: 'monospace', bgcolor: 'primary.50', color: 'primary.dark', border: '1px solid', @@ -1108,6 +1110,7 @@ class ManifestFormLine extends PureComponent { height: 20, fontSize: '0.7rem', fontWeight: 600, + fontFamily: 'monospace', bgcolor: 'primary.50', color: 'primary.dark', border: '1px solid', @@ -1150,7 +1153,7 @@ class ManifestFormLine extends PureComponent { {/* Supplier SKU if distinct */} {supplierArticle.sku && supplierArticle.sku !== rawSku && supplierArticle.sku !== article.sku && ( - (Lief.-ArtNr: {supplierArticle.sku}) + (Lief.-ArtNr: {supplierArticle.sku}) )} diff --git a/src/components/manifest/ManifestHeader.jsx b/src/components/manifest/ManifestHeader.jsx index d55602c..0127a23 100644 --- a/src/components/manifest/ManifestHeader.jsx +++ b/src/components/manifest/ManifestHeader.jsx @@ -479,9 +479,13 @@ class ManifestHeader extends PureComponent { sx={{ flex: { xs: '1 1 100%', sm: '1 1 120px' }, minWidth: { sm: 100 }, + '& .MuiInputBase-input': { + fontFamily: 'monospace', + }, ...(!number && previewNumber && { '& .MuiInputBase-input.Mui-disabled': { fontStyle: 'italic', + fontFamily: 'monospace', }, }), }} @@ -496,6 +500,9 @@ class ManifestHeader extends PureComponent { sx={{ flex: { xs: '1 1 100%', sm: '1 1 120px' }, minWidth: { sm: 100 }, + '& .MuiInputBase-input': { + fontFamily: 'monospace', + }, ...(dirtyFields?.externalNumber && { '& .MuiOutlinedInput-notchedOutline': { borderColor: 'warning.main', diff --git a/src/components/manifest/ManifestList.jsx b/src/components/manifest/ManifestList.jsx index ba610cb..6d85e9b 100644 --- a/src/components/manifest/ManifestList.jsx +++ b/src/components/manifest/ManifestList.jsx @@ -131,11 +131,12 @@ class ManifestList extends PureComponent { const cfg = this.cfg; const partyField = cfg.partyField; - const columns = [{ key: 'number', label: 'Nummer' }]; + const columns = [{ key: 'number', label: 'Nummer', mono: true }]; if (cfg.externalNumber) { columns.push({ key: 'externalNumber', label: 'Referenz', + mono: true, render: (row) => numberDisplay(row.externalNumber), }); } diff --git a/src/components/manifest/OrderDocumentsTiles.jsx b/src/components/manifest/OrderDocumentsTiles.jsx index be8477d..a36e75a 100644 --- a/src/components/manifest/OrderDocumentsTiles.jsx +++ b/src/components/manifest/OrderDocumentsTiles.jsx @@ -109,7 +109,7 @@ export class OrderDocumentsTiles extends PureComponent { }} > - + {sh.number} @@ -134,7 +134,7 @@ export class OrderDocumentsTiles extends PureComponent { {sh.externalNumber ? ( - Ref: {sh.externalNumber} + Ref: {sh.externalNumber} ) : null} diff --git a/src/components/manifest/OrderList.jsx b/src/components/manifest/OrderList.jsx index e73630d..58a65cd 100644 --- a/src/components/manifest/OrderList.jsx +++ b/src/components/manifest/OrderList.jsx @@ -103,8 +103,8 @@ function renderInvisibleDummyRow(dummy) { return ( <> - {d.number} - {d.externalNumber || 'Nr. / Ref.'} + {d.number} + {d.externalNumber || 'Nr. / Ref.'} {d.date ? formatDate(d.date) : '–'} @@ -200,10 +200,10 @@ class OrderRow extends PureComponent { {renderInvisibleDummyRow(dummy)} - + {order.number} - + {numberDisplay(order.externalNumber)} diff --git a/src/components/manifest/OrderPaymentList.jsx b/src/components/manifest/OrderPaymentList.jsx index bdcf321..ab41267 100644 --- a/src/components/manifest/OrderPaymentList.jsx +++ b/src/components/manifest/OrderPaymentList.jsx @@ -99,7 +99,7 @@ class PaymentTableRow extends PureComponent { onNavigateOrder?.(payment.orderId)}> {/* Payment ID from payment table */} - + {/* Amount */} @@ -126,7 +126,7 @@ class PaymentTableRow extends PureComponent { {/* Linked Manifest (Auftrag) */} - + {payment.orderNumber} diff --git a/src/components/manifest/OrderShipmentDialog.jsx b/src/components/manifest/OrderShipmentDialog.jsx index 2b1bec4..dec27e2 100644 --- a/src/components/manifest/OrderShipmentDialog.jsx +++ b/src/components/manifest/OrderShipmentDialog.jsx @@ -435,7 +435,7 @@ export default class OrderShipmentDialog extends PureComponent { {orderNumber ? ( - Zu: {orderNumber} + Zu: {orderNumber} ) : null} @@ -486,7 +486,7 @@ export default class OrderShipmentDialog extends PureComponent { readOnly: true, }, }} - sx={{ minWidth: 190 }} + sx={{ minWidth: 190, '& .MuiInputBase-input': { fontFamily: 'monospace' } }} /> this.setState({ externalNumber: e.target.value })} fullWidth + slotProps={{ input: { sx: { fontFamily: 'monospace' } } }} /> @@ -549,7 +550,7 @@ export default class OrderShipmentDialog extends PureComponent { onChange={() => this.handleToggleItem(item.itemKey, item.remaining)} /> - {item.sku || '–'} + {item.sku || '–'} {item.name || '–'} diff --git a/src/components/manifest/PartyFilterPanel.jsx b/src/components/manifest/PartyFilterPanel.jsx index aa85ba2..0c5c73b 100644 --- a/src/components/manifest/PartyFilterPanel.jsx +++ b/src/components/manifest/PartyFilterPanel.jsx @@ -279,6 +279,7 @@ export default class PartyFilterPanel extends PureComponent { sx: { color: isSelected ? 'inherit' : 'text.secondary', opacity: isSelected ? 0.8 : 1, + fontFamily: 'monospace', }, }, }} diff --git a/src/components/manifest/QuoteList.jsx b/src/components/manifest/QuoteList.jsx index 8392a2b..e25c7dd 100644 --- a/src/components/manifest/QuoteList.jsx +++ b/src/components/manifest/QuoteList.jsx @@ -117,7 +117,7 @@ function renderInvisibleDummyRow(dummy) { return ( <> - {d.number} + {d.number} {d.date ? formatDate(d.date) : '–'} @@ -209,7 +209,7 @@ class QuoteRow extends PureComponent { {renderInvisibleDummyRow(dummy)} - + {quote.number} diff --git a/src/components/manifest/ShipmentDetailDialog.jsx b/src/components/manifest/ShipmentDetailDialog.jsx index 5e78b85..73309c1 100644 --- a/src/components/manifest/ShipmentDetailDialog.jsx +++ b/src/components/manifest/ShipmentDetailDialog.jsx @@ -429,12 +429,19 @@ export default class ShipmentDetailDialog extends PureComponent { - + {shipment.number || 'Lieferschein'} {shipment.date ? `Datum: ${formatDate(shipment.date)}` : ''} - {shipment.externalNumber ? ` • Ref: ${shipment.externalNumber}` : ''} + {shipment.externalNumber ? ( + <> + {' • Ref: '} + + {shipment.externalNumber} + + + ) : ''} @@ -476,7 +483,7 @@ export default class ShipmentDetailDialog extends PureComponent { ) : ( shLines.map((line, idx) => ( - {line.sku} + {line.sku} {line.name || '–'} {line.amount} diff --git a/src/components/manifest/ShipmentList.jsx b/src/components/manifest/ShipmentList.jsx index d44222f..706e557 100644 --- a/src/components/manifest/ShipmentList.jsx +++ b/src/components/manifest/ShipmentList.jsx @@ -247,7 +247,7 @@ class NewShipmentModal extends PureComponent { size="small" value={getNextShipmentNumber(currentOrder.number, currentOrder.shipments)} disabled - slotProps={{ input: { readOnly: true } }} + slotProps={{ input: { readOnly: true, sx: { fontFamily: 'monospace' } } }} sx={{ width: 190 }} /> ) : null} @@ -256,6 +256,7 @@ class NewShipmentModal extends PureComponent { size="small" value={externalNumber} onChange={(e) => this.setState({ externalNumber: e.target.value })} + slotProps={{ input: { sx: { fontFamily: 'monospace' } } }} sx={{ flex: 1 }} /> @@ -264,7 +265,7 @@ class NewShipmentModal extends PureComponent { {currentOrder && ( - Lieferbare Positionen für Auftrag {currentOrder.number}: + Lieferbare Positionen für Auftrag {currentOrder.number}: {lines.map((line, idx) => { @@ -488,14 +489,14 @@ function renderInvisibleDummyRow(dummy) { return ( <> - {d.number} - {d.externalNumber || 'Nr. / Ref.'} + {d.number} + {d.externalNumber || 'Nr. / Ref.'} {d.date ? formatDate(d.date) : '–'} - {d.orderNumber} + {d.orderNumber} {d.customerName} @@ -594,10 +595,10 @@ class ShipmentRow extends PureComponent { {/* 1. Lieferschein-Nr & Ref */} - + {shipment.number} - + {numberDisplay(shipment.externalNumber)} @@ -612,7 +613,7 @@ class ShipmentRow extends PureComponent { {/* 3. Bezugsauftrag */} {shipment.orderNumber ? ( - + {shipment.orderNumber} ) : ( diff --git a/src/components/settings/NumberSettingsPanel.jsx b/src/components/settings/NumberSettingsPanel.jsx index 6cac791..252d21a 100644 --- a/src/components/settings/NumberSettingsPanel.jsx +++ b/src/components/settings/NumberSettingsPanel.jsx @@ -217,6 +217,7 @@ export default class NumberSettingsPanel extends Component { value={draft.prefix} disabled={draft.busy} onChange={(e) => this.handleChange(row.id, 'prefix', e.target.value)} + sx={{ input: { fontFamily: 'monospace' } }} /> @@ -227,6 +228,7 @@ export default class NumberSettingsPanel extends Component { disabled={draft.busy} slotProps={{ htmlInput: { min: 1, step: 1 } }} onChange={(e) => this.handleChange(row.id, 'padding', e.target.value)} + sx={{ input: { fontFamily: 'monospace' } }} /> @@ -237,6 +239,7 @@ export default class NumberSettingsPanel extends Component { disabled={draft.busy} slotProps={{ htmlInput: { min: 0, step: 1 } }} onChange={(e) => this.handleChange(row.id, 'next', e.target.value)} + sx={{ input: { fontFamily: 'monospace' } }} /> diff --git a/src/components/tiles/ArticleTile.jsx b/src/components/tiles/ArticleTile.jsx index 9735534..89e666e 100644 --- a/src/components/tiles/ArticleTile.jsx +++ b/src/components/tiles/ArticleTile.jsx @@ -309,7 +309,12 @@ export class ArticleTile extends Tile { /> ) : null} {sku ? ( - + {sku} ) : null} @@ -497,6 +502,7 @@ export class ArticleTile extends Tile { height: '1.2em', overflow: 'hidden', textOverflow: 'ellipsis', + fontFamily: 'monospace', }} > {sku || '\u00A0'} diff --git a/src/index.css b/src/index.css index fdc338c..9c2bb14 100644 --- a/src/index.css +++ b/src/index.css @@ -102,4 +102,16 @@ html.df-dialog-open #root { box-shadow: var(--df-shadow-drag, 0 8px 20px rgba(15, 23, 42, 0.28)); cursor: grabbing !important; user-select: none !important; +} + +/* ──────────────────────────────────────────────────────────────────────────── + * NUMBER SCHEME MONOSPACE FONT + * + * All numbers originating from a number scheme (SKUs, customer numbers, + * delivery/quote/order/shipment document numbers) must be monospaced with tabular numbers. + * ──────────────────────────────────────────────────────────────────────────── */ +.df-mono, +.df-number-scheme { + font-family: ui-monospace, 'SFMono-Regular', Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace !important; + font-variant-numeric: tabular-nums; } \ No newline at end of file diff --git a/src/routes/artikel.jsx b/src/routes/artikel.jsx index 18ab604..6c9a568 100644 --- a/src/routes/artikel.jsx +++ b/src/routes/artikel.jsx @@ -156,7 +156,7 @@ class ResultRow extends Component { {row.sku} diff --git a/src/routes/kunde/_entityId.jsx b/src/routes/kunde/_entityId.jsx index f01d2b7..e9bef8e 100644 --- a/src/routes/kunde/_entityId.jsx +++ b/src/routes/kunde/_entityId.jsx @@ -2,6 +2,7 @@ import { PureComponent } from 'react'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; import CircularProgress from '@mui/material/CircularProgress'; +import Chip from '@mui/material/Chip'; import Divider from '@mui/material/Divider'; import IconButton from '@mui/material/IconButton'; import Stack from '@mui/material/Stack'; @@ -559,11 +560,25 @@ class KundeEditPage extends PureComponent { - {groupName != null ? ( - - Gruppe: {groupName} - - ) : null} + + {entity?.number ? ( + + ) : null} + {groupName != null ? ( + + Gruppe: {groupName} + + ) : null} +