This commit is contained in:
seb
2026-09-17 11:00:57 +02:00
parent 3618dd6651
commit 6e72ae84bd
2 changed files with 50 additions and 10 deletions

View File

@@ -26,6 +26,7 @@ import { requireArray, requireDefined, requireObject } from '../../utils/apiShap
import { backendErrorFrom } from '../../utils/backendError'; import { backendErrorFrom } from '../../utils/backendError';
import { notifyError } from '../../utils/notify'; import { notifyError } from '../../utils/notify';
import { import {
setId,
setDeliveryEntities, setDeliveryEntities,
setDate, setDate,
setDeliveryEntity, setDeliveryEntity,
@@ -38,6 +39,7 @@ import {
updateLineitem, updateLineitem,
removeLineitem, removeLineitem,
resetDelivery, resetDelivery,
selectDeliveryId,
selectDeliveryEntities, selectDeliveryEntities,
selectDeliveryDate, selectDeliveryDate,
selectDeliveryEntity, selectDeliveryEntity,
@@ -82,6 +84,9 @@ class LieferungNeuPage extends PureComponent {
if (this.props.docId != null) { if (this.props.docId != null) {
void this.loadEdit(); void this.loadEdit();
} else { } else {
if (this.props.deliveryId != null || this.props.number != null) {
this.props.resetDelivery();
}
void this.loadPartiesOnly(); void this.loadPartiesOnly();
} }
} }
@@ -150,6 +155,7 @@ class LieferungNeuPage extends PureComponent {
const lines = const lines =
apiLines.length > 0 ? apiLines.map(lineFromApi) : [emptyLine()]; apiLines.length > 0 ? apiLines.map(lineFromApi) : [emptyLine()];
this.props.setId(doc.id ?? docId);
this.props.setDate(dateInputValue(doc.date)); this.props.setDate(dateInputValue(doc.date));
if (doc[cfg.partyField] != null) this.props.setDeliveryEntity(doc[cfg.partyField]); if (doc[cfg.partyField] != null) this.props.setDeliveryEntity(doc[cfg.partyField]);
if (doc.number != null) this.props.setNumber(doc.number); if (doc.number != null) this.props.setNumber(doc.number);
@@ -191,10 +197,22 @@ class LieferungNeuPage extends PureComponent {
this.props.setExternalNumber(externalNumber); this.props.setExternalNumber(externalNumber);
} }
findLineIndex(key) {
if (typeof key === 'number' && !Number.isNaN(key)) return key;
const lines = this.props.lines;
if (Array.isArray(lines)) {
const idx = lines.findIndex((l) => l.key === key);
if (idx !== -1) return idx;
}
const n = Number(key);
return Number.isInteger(n) ? n : -1;
}
handleLineChange(key, field, value) { handleLineChange(key, field, value) {
const index = typeof key === 'number' ? key : Number(key); const index = this.findLineIndex(key);
this.props.updateLineitem({ this.props.updateLineitem({
index, index,
key,
[field]: value, [field]: value,
...(field === 'net' ? { netprice: value } : {}), ...(field === 'net' ? { netprice: value } : {}),
...(field === 'tax' ? { taxrate: value } : {}), ...(field === 'tax' ? { taxrate: value } : {}),
@@ -206,8 +224,8 @@ class LieferungNeuPage extends PureComponent {
} }
handleRemoveLine(key) { handleRemoveLine(key) {
const index = typeof key === 'number' ? key : Number(key); const index = this.findLineIndex(key);
this.props.removeLineitem(index); this.props.removeLineitem(index >= 0 ? index : key);
} }
async handlePdfUpload(file) { async handlePdfUpload(file) {
@@ -268,7 +286,8 @@ class LieferungNeuPage extends PureComponent {
? result.items.items ? result.items.items
: null; : null;
const newLines = Array.isArray(rawItems) const newLines = Array.isArray(rawItems)
? rawItems.map((l) => ({ ? rawItems.map((l, idx) => ({
key: l.key ?? `${Date.now()}-${idx}-${Math.random().toString(36).slice(2, 8)}`,
name: l.name ?? l.articleName ?? null, name: l.name ?? l.articleName ?? null,
sku: l.sku ?? l.liefArtNr ?? '', sku: l.sku ?? l.liefArtNr ?? '',
amount: (l.amount ?? l.count) != null ? String(l.amount ?? l.count) : '', amount: (l.amount ?? l.count) != null ? String(l.amount ?? l.count) : '',
@@ -406,6 +425,7 @@ class LieferungNeuPage extends PureComponent {
const apiLines = requireArray(doc.lines, `${cfg.docField}.lines`); const apiLines = requireArray(doc.lines, `${cfg.docField}.lines`);
const lines = apiLines.length > 0 ? apiLines.map(lineFromApi) : [emptyLine()]; const lines = apiLines.length > 0 ? apiLines.map(lineFromApi) : [emptyLine()];
this.props.setId(doc.id ?? docId);
this.props.setDate(dateInputValue(doc.date)); this.props.setDate(dateInputValue(doc.date));
if (doc[cfg.partyField] != null) this.props.setDeliveryEntity(doc[cfg.partyField]); if (doc[cfg.partyField] != null) this.props.setDeliveryEntity(doc[cfg.partyField]);
if (doc.number != null) this.props.setNumber(doc.number); if (doc.number != null) this.props.setNumber(doc.number);
@@ -532,6 +552,7 @@ class LieferungNeuPage extends PureComponent {
} }
const mapStateToProps = (state) => ({ const mapStateToProps = (state) => ({
deliveryId: selectDeliveryId(state),
deliveryEntities: selectDeliveryEntities(state), deliveryEntities: selectDeliveryEntities(state),
date: selectDeliveryDate(state), date: selectDeliveryDate(state),
partyId: selectDeliveryEntity(state), partyId: selectDeliveryEntity(state),
@@ -542,6 +563,7 @@ const mapStateToProps = (state) => ({
}); });
const mapDispatchToProps = { const mapDispatchToProps = {
setId,
setDeliveryEntities, setDeliveryEntities,
setDate, setDate,
setDeliveryEntity, setDeliveryEntity,

View File

@@ -3,6 +3,7 @@ import { createSlice } from '@reduxjs/toolkit';
export function createEmptyLineitem(line = {}) { export function createEmptyLineitem(line = {}) {
return { return {
key: line.key ?? `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
name: line.name ?? null, name: line.name ?? null,
sku: line.sku ?? null, sku: line.sku ?? null,
amount: line.amount ?? null, amount: line.amount ?? null,
@@ -14,6 +15,7 @@ export function createEmptyLineitem(line = {}) {
} }
const initialDelivery = { const initialDelivery = {
id: null,
date: null, date: null,
deliveryEntity: null, deliveryEntity: null,
external_number: null, external_number: null,
@@ -34,6 +36,9 @@ const deliveryEditorSlice = createSlice({
name: 'deliveryEditor', name: 'deliveryEditor',
initialState, initialState,
reducers: { reducers: {
setId(state, action) {
state.delivery.id = action.payload;
},
setDeliveryEntities(state, action) { setDeliveryEntities(state, action) {
state.deliveryEntities = action.payload ?? []; state.deliveryEntities = action.payload ?? [];
}, },
@@ -70,17 +75,28 @@ const deliveryEditorSlice = createSlice({
state.delivery.lineitems.push(createEmptyLineitem(action.payload)); state.delivery.lineitems.push(createEmptyLineitem(action.payload));
}, },
updateLineitem(state, action) { updateLineitem(state, action) {
const { index, ...fields } = action.payload; const { index, key, ...fields } = action.payload;
if (index >= 0 && index < state.delivery.lineitems.length) { let targetIndex = typeof index === 'number' && !Number.isNaN(index) ? index : -1;
state.delivery.lineitems[index] = { if (targetIndex === -1 && key != null) {
...state.delivery.lineitems[index], targetIndex = state.delivery.lineitems.findIndex((l) => l.key === key);
}
if (targetIndex >= 0 && targetIndex < state.delivery.lineitems.length) {
state.delivery.lineitems[targetIndex] = {
...state.delivery.lineitems[targetIndex],
...fields, ...fields,
}; };
} }
}, },
removeLineitem(state, action) { removeLineitem(state, action) {
const index = action.payload; const payload = action.payload;
if (typeof index === 'number' && index >= 0 && index < state.delivery.lineitems.length) { let index = typeof payload === 'number' && !Number.isNaN(payload) ? payload : -1;
if (index === -1 && payload != null) {
const key = typeof payload === 'string' ? payload : payload?.key;
if (key != null) {
index = state.delivery.lineitems.findIndex((l) => l.key === key);
}
}
if (index >= 0 && index < state.delivery.lineitems.length) {
state.delivery.lineitems.splice(index, 1); state.delivery.lineitems.splice(index, 1);
} }
}, },
@@ -97,6 +113,7 @@ const deliveryEditorSlice = createSlice({
}); });
export const { export const {
setId,
setDeliveryEntities, setDeliveryEntities,
setDelivery, setDelivery,
setDate, setDate,
@@ -114,6 +131,7 @@ export const {
} = deliveryEditorSlice.actions; } = deliveryEditorSlice.actions;
// Selectors // Selectors
export const selectDeliveryId = (state) => state.deliveryEditor.delivery.id;
export const selectDeliveryEntities = (state) => state.deliveryEditor.deliveryEntities; export const selectDeliveryEntities = (state) => state.deliveryEditor.deliveryEntities;
export const selectDelivery = (state) => state.deliveryEditor.delivery; export const selectDelivery = (state) => state.deliveryEditor.delivery;
export const selectDeliveryDate = (state) => state.deliveryEditor.delivery.date; export const selectDeliveryDate = (state) => state.deliveryEditor.delivery.date;