From 656c8219862696f1a8f6ec60dcf643bbaab53b9b Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Fri, 5 Dec 2025 13:12:24 +0100 Subject: [PATCH] Enhance SaleSection component to group and display transport data - Updated SaleSection.vue to group running transports by relevant attributes, improving data organization and readability. - Added a new computed property to calculate vehicle counts and total quantities for grouped transports. - Introduced a new column in the UI to display the count of vehicles associated with each transport group. - Updated German localization file to include translation for 'runningVehicleCount', enhancing user experience for German-speaking users. --- .../src/components/falukant/SaleSection.vue | 68 ++++++++++++++++--- frontend/src/i18n/locales/de/falukant.json | 1 + 2 files changed, 60 insertions(+), 9 deletions(-) diff --git a/frontend/src/components/falukant/SaleSection.vue b/frontend/src/components/falukant/SaleSection.vue index 624a0a5..462969e 100644 --- a/frontend/src/components/falukant/SaleSection.vue +++ b/frontend/src/components/falukant/SaleSection.vue @@ -137,31 +137,33 @@ {{ $t('falukant.branch.sale.runningTarget') }} {{ $t('falukant.branch.sale.runningEta') }} {{ $t('falukant.branch.sale.runningRemaining') }} + {{ $t('falukant.branch.sale.runningVehicleCount') }} - + - {{ t.direction === 'outgoing' + {{ group.direction === 'outgoing' ? $t('falukant.branch.sale.runningDirectionOut') : $t('falukant.branch.sale.runningDirectionIn') }} - - {{ $t(`falukant.product.${t.product.labelTr}`) }} + + {{ $t(`falukant.product.${group.product.labelTr}`) }} {{ $t('falukant.branch.sale.runningNoProduct') }} - {{ t.size }} + {{ group.totalQuantity }} - {{ t.sourceRegion?.name }} - {{ t.targetRegion?.name }} - {{ formatEta(t) }} - {{ formatRemaining(t) }} + {{ group.sourceRegion?.name }} + {{ group.targetRegion?.name }} + {{ formatEta({ eta: group.eta }) }} + {{ formatRemaining({ eta: group.eta }) }} + {{ group.vehicleCount }} @@ -202,6 +204,54 @@ loadingPrices: new Set(), }; }, + computed: { + groupedTransports() { + const groups = new Map(); + + for (const transport of this.runningTransports) { + // Erstelle einen Schlüssel für die Gruppierung + // Wichtig: Restzeit nicht in den Schlüssel einbeziehen, da sie sich ständig ändert + const productId = transport.product?.id || null; + const productLabelTr = transport.product?.labelTr || null; + const sourceId = transport.sourceRegion?.id || null; + const targetId = transport.targetRegion?.id || null; + const direction = transport.direction; + // ETA als Zeitstempel für Gruppierung (auf Sekunden genau, um kleine Unterschiede zu ignorieren) + const eta = transport.eta ? Math.floor(new Date(transport.eta).getTime() / 1000) : null; + + // Gruppierungsschlüssel: alle relevanten Eigenschaften außer Restzeit + const key = `${direction}-${productId}-${productLabelTr}-${sourceId}-${targetId}-${eta}`; + + if (!groups.has(key)) { + groups.set(key, { + direction: transport.direction, + product: transport.product, + sourceRegion: transport.sourceRegion, + targetRegion: transport.targetRegion, + eta: transport.eta, + vehicleCount: 0, + totalQuantity: 0, + transports: [], + }); + } + + const group = groups.get(key); + group.vehicleCount += 1; + if (transport.product && transport.size > 0) { + group.totalQuantity += transport.size || 0; + } + group.transports.push(transport); + } + + // Sortiere nach ETA (früheste zuerst) + return Array.from(groups.values()).sort((a, b) => { + if (!a.eta && !b.eta) return 0; + if (!a.eta) return 1; + if (!b.eta) return -1; + return new Date(a.eta).getTime() - new Date(b.eta).getTime(); + }); + }, + }, async mounted() { await this.loadInventory(); await this.loadTransports(); diff --git a/frontend/src/i18n/locales/de/falukant.json b/frontend/src/i18n/locales/de/falukant.json index 39c4a39..e1f876d 100644 --- a/frontend/src/i18n/locales/de/falukant.json +++ b/frontend/src/i18n/locales/de/falukant.json @@ -205,6 +205,7 @@ "runningTarget": "Ziel", "runningEta": "Ankunft", "runningRemaining": "Restzeit", + "runningVehicleCount": "Fahrzeuge", "runningDirectionOut": "Ausgehend", "runningDirectionIn": "Eingehend" },