From 2cbe5dabb24d7457c2f93918412ad06904b415a8 Mon Sep 17 00:00:00 2001 From: seb Date: Sat, 8 Aug 2026 10:09:19 +0200 Subject: [PATCH] Disable menu/popover animations; update manifest handling --- src/api/index.js | 12 ++++-- src/components/manifest/ManifestForm.jsx | 21 +++++++++- src/components/manifest/ManifestHeader.jsx | 24 +++++++++-- src/components/manifest/ManifestList.jsx | 9 ++++ src/components/manifest/manifestConfig.js | 48 +++++++++++++++++----- src/theme/themes/default.js | 12 ++++++ 6 files changed, 109 insertions(+), 17 deletions(-) diff --git a/src/api/index.js b/src/api/index.js index 69245c1..3d7fa8f 100644 --- a/src/api/index.js +++ b/src/api/index.js @@ -557,7 +557,9 @@ export const supplier = { /** * Company-scoped goods receipts (manifest type = delivery). - * DeliverySummary = { id, number, type: 'delivery', supplierId, date } + * DeliverySummary = { id, number, externalNumber, type: 'delivery', supplierId, date } + * - number: server-allocated, read-only manifest number (from nextNumber('delivery')). + * - externalNumber: user-entered reference (nullable). * DeliveryLine = { id, articleId, sku, amount, net, transactedAmount, rebate, tax, comment } * Delivery = DeliverySummary & { lines: DeliveryLine[] } * DeliveryLineInput = { sku, amount, net, tax, rebate?, transactedAmount?, comment? } @@ -575,7 +577,9 @@ export const delivery = { /** * POST /api/delivery - * Body: { number, date, supplierId?, lines: DeliveryLineInput[] } + * Body: { externalNumber?, date, supplierId?, lines: DeliveryLineInput[] } + * number is NOT sent — the server allocates it automatically. The + * caller-supplied reference goes in externalNumber (nullable). * Line requires sku, amount, net, tax. rebate→0, transactedAmount→amount. * → 201 { delivery: Delivery } */ @@ -585,7 +589,9 @@ export const delivery = { /** * PATCH /api/delivery/:id - * Body: partial { number?, date?, supplierId?, lines? }. + * Body: partial { externalNumber?, date?, supplierId?, lines? }. + * number is read-only and cannot be edited. externalNumber is editable and + * can be cleared by sending null or an empty string. * If lines present, replaces all lines; if omitted, lines unchanged. * → 200 { delivery: Delivery } */ diff --git a/src/components/manifest/ManifestForm.jsx b/src/components/manifest/ManifestForm.jsx index ca4afe7..8d6de61 100644 --- a/src/components/manifest/ManifestForm.jsx +++ b/src/components/manifest/ManifestForm.jsx @@ -35,6 +35,7 @@ class ManifestForm extends PureComponent { date: '', partyId: null, number: '', + externalNumber: '', lines: [emptyLine()], saving: false, }; @@ -43,6 +44,8 @@ class ManifestForm extends PureComponent { this.handlePartyChange = this.handlePartyChange.bind(this); this.handleDateChange = this.handleDateChange.bind(this); this.handleNumberChange = this.handleNumberChange.bind(this); + this.handleExternalNumberChange = + this.handleExternalNumberChange.bind(this); this.handleLineChange = this.handleLineChange.bind(this); this.handleAddLine = this.handleAddLine.bind(this); this.handleRemoveLine = this.handleRemoveLine.bind(this); @@ -122,6 +125,8 @@ class ManifestForm extends PureComponent { date: dateInputValue(doc.date), partyId: doc[cfg.partyField], number: doc.number ?? '', + externalNumber: + doc.externalNumber != null ? String(doc.externalNumber) : '', lines, }); } catch (err) { @@ -157,6 +162,10 @@ class ManifestForm extends PureComponent { this.setState({ number }); } + handleExternalNumberChange(externalNumber) { + this.setState({ externalNumber }); + } + handleLineChange(key, field, value) { this.setState((prev) => ({ lines: prev.lines.map((line) => @@ -188,11 +197,16 @@ class ManifestForm extends PureComponent { body = buildManifestBody( { number: this.state.number, + externalNumber: this.state.externalNumber, date: this.state.date, partyId: this.state.partyId, lines: this.state.lines, }, - { partyField: cfg.partyField, requireAtLeastOne }, + { + partyField: cfg.partyField, + requireAtLeastOne, + externalNumber: cfg.externalNumber, + }, ); } catch (err) { notifyError(err); @@ -225,6 +239,8 @@ class ManifestForm extends PureComponent { date: dateInputValue(doc.date), partyId: doc[cfg.partyField], number: doc.number ?? '', + externalNumber: + doc.externalNumber != null ? String(doc.externalNumber) : '', lines: apiLines.length > 0 ? apiLines.map(lineFromApi) : [emptyLine()], saving: false, @@ -280,6 +296,7 @@ class ManifestForm extends PureComponent { date, partyId, number, + externalNumber, saving, } = this.state; @@ -307,10 +324,12 @@ class ManifestForm extends PureComponent { partyId={partyId} date={date} number={number} + externalNumber={externalNumber} saving={saving} onPartyChange={this.handlePartyChange} onDateChange={this.handleDateChange} onNumberChange={this.handleNumberChange} + onExternalNumberChange={this.handleExternalNumberChange} /> {status === 'ready' ? this.renderArticles() : null} diff --git a/src/components/manifest/ManifestHeader.jsx b/src/components/manifest/ManifestHeader.jsx index 39e069b..1e23d21 100644 --- a/src/components/manifest/ManifestHeader.jsx +++ b/src/components/manifest/ManifestHeader.jsx @@ -4,7 +4,7 @@ import Stack from '@mui/material/Stack'; import TextField from '@mui/material/TextField'; import SingleLineTextEdit from '../SingleLineTextEdit'; import { PanelTile } from '../panels'; -import { partyDisplayName } from './manifestConfig'; +import { manifestConfig, partyDisplayName } from './manifestConfig'; class ManifestHeader extends PureComponent { constructor(props) { @@ -27,12 +27,20 @@ class ManifestHeader extends PureComponent { partyId, date, number, + externalNumber, saving, onDateChange, onNumberChange, + onExternalNumberChange, } = this.props; - const selected = parties.find((row) => row.id === partyId) ?? null; + // Delivery: number is server-allocated/read-only; the caller reference + // lives in the editable externalNumber field. + const cfg = manifestConfig(kind); + const useExternalNumber = Boolean(cfg.externalNumber); + + const selected = + parties.find((row) => row.id === partyId) ?? null; return ( @@ -80,10 +88,20 @@ class ManifestHeader extends PureComponent { size="small" label="Nummer" value={number} - disabled={saving} + disabled={saving || useExternalNumber} onChange={onNumberChange} sx={{ minWidth: 180, flex: 1 }} /> + {useExternalNumber ? ( + + ) : null} ); diff --git a/src/components/manifest/ManifestList.jsx b/src/components/manifest/ManifestList.jsx index 056968f..bd8ad41 100644 --- a/src/components/manifest/ManifestList.jsx +++ b/src/components/manifest/ManifestList.jsx @@ -24,6 +24,7 @@ import { formatDate, loadParties, manifestConfig, + numberDisplay, partyDisplayName, sortDocs, } from './manifestConfig'; @@ -169,6 +170,9 @@ class ManifestList extends PureComponent { Nummer + {cfg.externalNumber ? ( + Referenz + ) : null} {cfg.dateLabel} {cfg.partyLabel} @@ -183,6 +187,11 @@ class ManifestList extends PureComponent { onClick={() => this.handleEdit(row)} > {row.number} + {cfg.externalNumber ? ( + + {numberDisplay(row.externalNumber)} + + ) : null} {formatDate(row.date)} {this.partyName(row[partyField])} ctx.deliveries ?? ctx.deliveryPromise, partiesByIdFromList: (parties) => Object.fromEntries(parties.map((row) => [row.id, row])), + // Delivery uses a server-allocated read-only number plus an optional + // caller-supplied external reference. + externalNumber: true, }; } if (kind === 'quote') { diff --git a/src/theme/themes/default.js b/src/theme/themes/default.js index 2874e89..20052f6 100644 --- a/src/theme/themes/default.js +++ b/src/theme/themes/default.js @@ -25,5 +25,17 @@ export function createDefaultTheme() { }, }, nav, + components: { + MuiMenu: { + defaultProps: { + transitionDuration: 0, + }, + }, + MuiPopover: { + defaultProps: { + transitionDuration: 0, + }, + }, + }, }); }