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 (