diff --git a/README.quick b/README.quick new file mode 100644 index 0000000..b65a9de --- /dev/null +++ b/README.quick @@ -0,0 +1 @@ +src/appRouter.jsx \ No newline at end of file diff --git a/src/components/manifest/index.js b/src/components/manifest/index.js index d1618cb..3d729a2 100644 --- a/src/components/manifest/index.js +++ b/src/components/manifest/index.js @@ -11,4 +11,5 @@ export { emptyLine, lineFromApi, buildManifestBody, + dateInputValue, } from './manifestConfig'; diff --git a/src/pages/lieferung/edit.jsx b/src/pages/lieferung/edit.jsx index 4cd48b3..b22bf8e 100644 --- a/src/pages/lieferung/edit.jsx +++ b/src/pages/lieferung/edit.jsx @@ -1,16 +1,4 @@ -import { PureComponent } from 'react'; -import { ManifestForm, withManifestId } from '../../components/manifest'; +import { withManifestId } from '../../components/manifest'; +import LieferungNeuPage from './neu'; -class LieferungEditPage extends PureComponent { - render() { - return ( - - ); - } -} - -export default withManifestId('deliveryId', LieferungEditPage); +export default withManifestId('deliveryId', LieferungNeuPage); diff --git a/src/pages/lieferung/neu.jsx b/src/pages/lieferung/neu.jsx index 2ef5e95..119b78b 100644 --- a/src/pages/lieferung/neu.jsx +++ b/src/pages/lieferung/neu.jsx @@ -14,12 +14,15 @@ import { ManifestLines, DELIVERY_LINE_COLUMNS, buildManifestBody, + dateInputValue, + emptyLine, + lineFromApi, manifestConfig, } from '../../components/manifest'; import ManifestPdfDialog from '../../components/manifest/ManifestPdfDialog'; import { loadParties } from '../../components/manifest/manifestConfig'; import { StorageManagerContext } from '../../api/storageManagerContext'; -import { requireDefined, requireObject } from '../../utils/apiShape'; +import { requireArray, requireDefined, requireObject } from '../../utils/apiShape'; import { backendErrorFrom } from '../../utils/backendError'; import { notifyError } from '../../utils/notify'; import { @@ -76,7 +79,22 @@ class LieferungNeuPage extends PureComponent { componentDidMount() { this._cancelled = false; - void this.loadPartiesOnly(); + if (this.props.docId != null) { + void this.loadEdit(); + } else { + void this.loadPartiesOnly(); + } + } + + componentDidUpdate(prevProps) { + if (this.props.docId !== prevProps.docId) { + if (this.props.docId != null) { + void this.loadEdit(); + } else { + this.props.resetDelivery(); + void this.loadPartiesOnly(); + } + } } componentWillUnmount() { @@ -104,8 +122,57 @@ class LieferungNeuPage extends PureComponent { } } + async loadEdit() { + const { docId } = this.props; + const cfg = this.cfg; + if (docId == null) { + this.setState({ + status: 'failed', + error: backendErrorFrom(new Error(cfg.invalidId)), + }); + return; + } + + this.setState({ status: 'loading', error: null, partiesLoading: true }); + try { + const [docRes, parties] = await Promise.all([ + this.context[cfg.api].get(docId), + loadParties('delivery', this.context), + ]); + if (this._cancelled) return; + + this.props.setDeliveryEntities(parties); + + requireObject(docRes, cfg.getPathLabel); + requireObject(docRes[cfg.docField], cfg.docField); + const doc = docRes[cfg.docField]; + const apiLines = requireArray(doc.lines, `${cfg.docField}.lines`); + const lines = + apiLines.length > 0 ? apiLines.map(lineFromApi) : [emptyLine()]; + + this.props.setDate(dateInputValue(doc.date)); + if (doc[cfg.partyField] != null) this.props.setDeliveryEntity(doc[cfg.partyField]); + if (doc.number != null) this.props.setNumber(doc.number); + if (doc.externalNumber != null) this.props.setExternalNumber(String(doc.externalNumber)); + this.props.setLineitems(lines); + + this.setState({ + status: 'ready', + partiesLoading: false, + }); + } catch (err) { + if (this._cancelled) return; + this.setState({ + status: 'failed', + error: backendErrorFrom(err), + partiesLoading: false, + }); + } + } + handleRetry() { - void this.loadPartiesOnly(); + if (this.props.docId != null) void this.loadEdit(); + else void this.loadPartiesOnly(); } handlePartyChange(partyId) { @@ -290,9 +357,11 @@ class LieferungNeuPage extends PureComponent { } async handleSave() { + const { docId } = this.props; const cfg = this.cfg; if (this.state.saving) return; + const isCreate = docId == null; let body; try { body = buildManifestBody( @@ -305,7 +374,7 @@ class LieferungNeuPage extends PureComponent { }, { partyField: cfg.partyField, - requireAtLeastOne: true, + requireAtLeastOne: isCreate, externalNumber: cfg.externalNumber, }, ); @@ -316,15 +385,36 @@ class LieferungNeuPage extends PureComponent { this.setState({ saving: true }); try { - const data = await this.context[cfg.api].create(body); - requireObject(data, cfg.postPathLabel); - requireObject(data[cfg.docField], cfg.docField); - requireDefined(data[cfg.docField].id, `${cfg.docField}.id`); - await this.context[cfg.updateCache](); - if (this._cancelled) return; - enqueueSnackbar(cfg.createdMsg, { variant: 'success' }); - this.props.resetDelivery(); - this.props.navigate(cfg.editPath(data[cfg.docField].id)); + if (isCreate) { + const data = await this.context[cfg.api].create(body); + requireObject(data, cfg.postPathLabel); + requireObject(data[cfg.docField], cfg.docField); + requireDefined(data[cfg.docField].id, `${cfg.docField}.id`); + await this.context[cfg.updateCache](); + if (this._cancelled) return; + enqueueSnackbar(cfg.createdMsg, { variant: 'success' }); + this.props.resetDelivery(); + this.props.navigate(cfg.editPath(data[cfg.docField].id)); + } else { + const data = await this.context[cfg.api].update(docId, body); + requireObject(data, cfg.patchPathLabel); + requireObject(data[cfg.docField], cfg.docField); + requireDefined(data[cfg.docField].id, `${cfg.docField}.id`); + await this.context[cfg.updateCache](); + if (this._cancelled) return; + const doc = data[cfg.docField]; + const apiLines = requireArray(doc.lines, `${cfg.docField}.lines`); + const lines = apiLines.length > 0 ? apiLines.map(lineFromApi) : [emptyLine()]; + + this.props.setDate(dateInputValue(doc.date)); + if (doc[cfg.partyField] != null) this.props.setDeliveryEntity(doc[cfg.partyField]); + if (doc.number != null) this.props.setNumber(doc.number); + if (doc.externalNumber != null) this.props.setExternalNumber(String(doc.externalNumber)); + this.props.setLineitems(lines); + + enqueueSnackbar(cfg.savedMsg, { variant: 'success' }); + this.setState({ saving: false }); + } } catch (err) { if (this._cancelled) return; notifyError(err); @@ -354,7 +444,7 @@ class LieferungNeuPage extends PureComponent { notes, } = this.props; - if (status === 'loadingParties') { + if (status === 'loadingParties' || status === 'loading') { return (