From a416d41cdaeffe4e47293a7cba7826721ca83b33 Mon Sep 17 00:00:00 2001 From: Maurice Date: Thu, 1 Oct 2026 12:47:58 +0200 Subject: [PATCH] feat(packing): templates keep weight, quantity and bag; packed and per-person weights (#1131) --- .../Admin/PackingTemplateManager.tsx | 14 +++- .../Packing/PackingListPanelBagModal.tsx | 23 +++--- .../Packing/PackingListPanelBagSidebar.tsx | 8 +- .../Packing/PackingListPanelBags.test.tsx | 30 +++++++ .../Packing/PackingWeightSummary.tsx | 81 +++++++++++++++++++ .../Packing/packingListPanel.helpers.test.ts | 30 ++++++- .../Packing/packingListPanel.helpers.ts | 31 +++++++ server/src/db/migrations.ts | 12 +++ server/src/nest/packing/packing.service.ts | 50 +++++++----- .../tests/unit/nest/packing.service.test.ts | 41 ++++++++++ shared/src/i18n/ar/packing.ts | 3 + shared/src/i18n/az/packing.ts | 3 + shared/src/i18n/br/packing.ts | 3 + shared/src/i18n/ca/packing.ts | 3 + shared/src/i18n/cs/packing.ts | 3 + shared/src/i18n/de/packing.ts | 3 + shared/src/i18n/en/packing.ts | 3 + shared/src/i18n/es/packing.ts | 3 + shared/src/i18n/et/packing.ts | 3 + shared/src/i18n/fr/packing.ts | 3 + shared/src/i18n/gr/packing.ts | 3 + shared/src/i18n/hu/packing.ts | 3 + shared/src/i18n/id/packing.ts | 3 + shared/src/i18n/it/packing.ts | 3 + shared/src/i18n/ja/packing.ts | 3 + shared/src/i18n/ko/packing.ts | 3 + shared/src/i18n/nl/packing.ts | 3 + shared/src/i18n/pl/packing.ts | 3 + shared/src/i18n/ru/packing.ts | 3 + shared/src/i18n/sk/packing.ts | 3 + shared/src/i18n/sv/packing.ts | 3 + shared/src/i18n/th/packing.ts | 3 + shared/src/i18n/tr/packing.ts | 3 + shared/src/i18n/uk/packing.ts | 3 + shared/src/i18n/vi/packing.ts | 3 + shared/src/i18n/zh-TW/packing.ts | 3 + shared/src/i18n/zh/packing.ts | 3 + 37 files changed, 361 insertions(+), 40 deletions(-) create mode 100644 client/src/components/Packing/PackingWeightSummary.tsx diff --git a/client/src/components/Admin/PackingTemplateManager.tsx b/client/src/components/Admin/PackingTemplateManager.tsx index 5c81cdf99..df4197d77 100644 --- a/client/src/components/Admin/PackingTemplateManager.tsx +++ b/client/src/components/Admin/PackingTemplateManager.tsx @@ -5,7 +5,16 @@ import { useTranslation } from '../../i18n' import { Plus, Trash2, Edit2, Package, X, Check, ChevronDown, ChevronRight, FolderPlus } from 'lucide-react' interface TemplateCategory { id: number; template_id: number; name: string; sort_order: number } -interface TemplateItem { id: number; category_id: number; name: string; sort_order: number } +interface TemplateItem { id: number; category_id: number; name: string; sort_order: number; weight_grams?: number | null; quantity?: number | null; bag_name?: string | null } + +/** "2× · 300 g · Backpack": what a template item brings along besides its name (#1131). */ +function templateItemMeta(item: TemplateItem): string { + const parts: string[] = [] + if ((item.quantity ?? 1) > 1) parts.push(`${item.quantity}×`) + if (item.weight_grams) parts.push(item.weight_grams >= 1000 ? `${(item.weight_grams / 1000).toFixed(1)} kg` : `${item.weight_grams} g`) + if (item.bag_name) parts.push(item.bag_name) + return parts.join(' · ') +} interface Template { id: number; name: string; item_count: number; category_count: number; created_by_name: string } export default function PackingTemplateManager() { @@ -252,6 +261,9 @@ export default function PackingTemplateManager() { ) : ( <> {item.name} + {templateItemMeta(item) && ( + {templateItemMeta(item)} + )}