@open-mercato/core 0.6.6-develop.6529.1.e1de4b3f27 → 0.6.6-develop.6530.1.6d8442bafd
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/dist/modules/sales/components/documents/AddressesSection.js +6 -2
- package/dist/modules/sales/components/documents/AddressesSection.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentForm.js +44 -0
- package/dist/modules/sales/components/documents/SalesDocumentForm.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentDialog.js +59 -38
- package/dist/modules/sales/components/documents/ShipmentDialog.js.map +2 -2
- package/package.json +7 -7
- package/src/modules/sales/components/documents/AddressesSection.tsx +6 -2
- package/src/modules/sales/components/documents/SalesDocumentForm.tsx +46 -0
- package/src/modules/sales/components/documents/ShipmentDialog.tsx +65 -40
|
@@ -296,6 +296,13 @@ export function ShipmentDialog({
|
|
|
296
296
|
const [addressOptions, setAddressOptions] = React.useState<ShipmentAddressOption[]>([])
|
|
297
297
|
const [addressLoading, setAddressLoading] = React.useState(false)
|
|
298
298
|
const [addressError, setAddressError] = React.useState<string | null>(null)
|
|
299
|
+
const addressLoadPromiseRef = React.useRef<{
|
|
300
|
+
orderId: string
|
|
301
|
+
promise: Promise<ShipmentAddressOption[]>
|
|
302
|
+
} | null>(null)
|
|
303
|
+
const currentAddressOrderIdRef = React.useRef(orderId)
|
|
304
|
+
currentAddressOrderIdRef.current = orderId
|
|
305
|
+
const initializedDialogKeyRef = React.useRef<string | null>(null)
|
|
299
306
|
const [documentStatuses, setDocumentStatuses] = React.useState<StatusOption[]>([])
|
|
300
307
|
const [lineStatuses, setLineStatuses] = React.useState<StatusOption[]>([])
|
|
301
308
|
const [shipmentStatuses, setShipmentStatuses] = React.useState<StatusOption[]>([])
|
|
@@ -479,37 +486,52 @@ export function ShipmentDialog({
|
|
|
479
486
|
[],
|
|
480
487
|
)
|
|
481
488
|
|
|
482
|
-
const loadAddressOptions = React.useCallback(
|
|
489
|
+
const loadAddressOptions = React.useCallback((): Promise<ShipmentAddressOption[]> => {
|
|
490
|
+
const activeRequest = addressLoadPromiseRef.current
|
|
491
|
+
if (activeRequest?.orderId === orderId) return activeRequest.promise
|
|
492
|
+
|
|
483
493
|
setAddressLoading(true)
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
494
|
+
const request = (async () => {
|
|
495
|
+
try {
|
|
496
|
+
const params = new URLSearchParams({
|
|
497
|
+
page: '1',
|
|
498
|
+
pageSize: '100',
|
|
499
|
+
documentId: orderId,
|
|
500
|
+
documentKind: 'order',
|
|
501
|
+
})
|
|
502
|
+
const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(
|
|
503
|
+
`/api/sales/document-addresses?${params.toString()}`,
|
|
504
|
+
undefined,
|
|
505
|
+
{ fallback: { items: [] } },
|
|
506
|
+
)
|
|
507
|
+
const items = Array.isArray(response.result?.items) ? response.result.items : []
|
|
508
|
+
const mapped = items
|
|
509
|
+
.map((item) => mapDocumentAddressOption(item))
|
|
510
|
+
.filter((entry): entry is ShipmentAddressOption => Boolean(entry))
|
|
511
|
+
const loadedOptions = dedupeAddressOptions([...baseAddressOptions, ...mapped])
|
|
512
|
+
if (currentAddressOrderIdRef.current !== orderId) return baseAddressOptions
|
|
513
|
+
mergeAddressOptions(loadedOptions)
|
|
514
|
+
setAddressError(null)
|
|
515
|
+
return loadedOptions
|
|
516
|
+
} catch (err) {
|
|
517
|
+
logger.error('sales.shipments.addresses.load', { err })
|
|
518
|
+
if (currentAddressOrderIdRef.current === orderId) {
|
|
519
|
+
setAddressError(
|
|
520
|
+
t('sales.documents.shipments.addressLoadError', 'Failed to load addresses.'),
|
|
521
|
+
)
|
|
522
|
+
}
|
|
523
|
+
return baseAddressOptions
|
|
524
|
+
}
|
|
525
|
+
})()
|
|
526
|
+
addressLoadPromiseRef.current = { orderId, promise: request }
|
|
527
|
+
void request.then(() => {
|
|
528
|
+
if (addressLoadPromiseRef.current?.promise === request) {
|
|
529
|
+
addressLoadPromiseRef.current = null
|
|
530
|
+
setAddressLoading(false)
|
|
531
|
+
}
|
|
532
|
+
})
|
|
533
|
+
return request
|
|
534
|
+
}, [baseAddressOptions, mapDocumentAddressOption, mergeAddressOptions, orderId, t])
|
|
513
535
|
|
|
514
536
|
const buildPriceSubtitle = React.useCallback(
|
|
515
537
|
(option: ShippingMethodOption): string | undefined => {
|
|
@@ -851,16 +873,20 @@ export function ShipmentDialog({
|
|
|
851
873
|
)
|
|
852
874
|
|
|
853
875
|
React.useEffect(() => {
|
|
854
|
-
if (!open)
|
|
876
|
+
if (!open) {
|
|
877
|
+
initializedDialogKeyRef.current = null
|
|
878
|
+
return
|
|
879
|
+
}
|
|
880
|
+
const dialogKey = `${orderId}:${mode}:${shipment?.id ?? 'new'}`
|
|
881
|
+
if (initializedDialogKeyRef.current === dialogKey) return
|
|
882
|
+
initializedDialogKeyRef.current = dialogKey
|
|
855
883
|
setFormResetKey((prev) => prev + 1)
|
|
856
884
|
if (!shippingMethods.length) {
|
|
857
885
|
void loadShippingMethods()
|
|
858
886
|
}
|
|
859
887
|
setAddressOptions(baseAddressOptions)
|
|
860
888
|
setAddressError(null)
|
|
861
|
-
|
|
862
|
-
void loadAddressOptions()
|
|
863
|
-
}
|
|
889
|
+
void loadAddressOptions()
|
|
864
890
|
if (!shipmentStatuses.length) {
|
|
865
891
|
void loadShipmentStatuses()
|
|
866
892
|
}
|
|
@@ -871,7 +897,6 @@ export function ShipmentDialog({
|
|
|
871
897
|
void loadLineStatuses()
|
|
872
898
|
}
|
|
873
899
|
}, [
|
|
874
|
-
addressOptions.length,
|
|
875
900
|
baseAddressOptions,
|
|
876
901
|
documentStatuses.length,
|
|
877
902
|
loadAddressOptions,
|
|
@@ -881,6 +906,8 @@ export function ShipmentDialog({
|
|
|
881
906
|
loadShippingMethods,
|
|
882
907
|
mode,
|
|
883
908
|
open,
|
|
909
|
+
orderId,
|
|
910
|
+
shipment?.id,
|
|
884
911
|
lineStatuses.length,
|
|
885
912
|
shipmentStatuses.length,
|
|
886
913
|
shippingMethods.length,
|
|
@@ -939,11 +966,9 @@ export function ShipmentDialog({
|
|
|
939
966
|
|
|
940
967
|
const fetchAddressItems = React.useCallback(
|
|
941
968
|
async (query?: string): Promise<LookupSelectItem[]> => {
|
|
942
|
-
|
|
943
|
-
await loadAddressOptions()
|
|
944
|
-
}
|
|
969
|
+
const options = addressOptions.length ? addressOptions : await loadAddressOptions()
|
|
945
970
|
const needle = query?.trim().toLowerCase() ?? ''
|
|
946
|
-
return
|
|
971
|
+
return options
|
|
947
972
|
.filter((option) => {
|
|
948
973
|
if (!needle) return true
|
|
949
974
|
return (
|
|
@@ -962,7 +987,7 @@ export function ShipmentDialog({
|
|
|
962
987
|
),
|
|
963
988
|
}))
|
|
964
989
|
},
|
|
965
|
-
[
|
|
990
|
+
[addressOptions, loadAddressOptions],
|
|
966
991
|
)
|
|
967
992
|
|
|
968
993
|
const validateItems = React.useCallback(
|