From ec59a875274b672b435e24dcb0212d3278cea8ec Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Fri, 31 Jul 2026 01:34:16 +0700 Subject: [PATCH] feat: enhance grouping of purchase items by sorting variants and assigning item numbers --- .../purchases/table/PurchaseGroupedTable.vue | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/resources/js/pages/admin/manage/purchases/table/PurchaseGroupedTable.vue b/resources/js/pages/admin/manage/purchases/table/PurchaseGroupedTable.vue index 3a6c961..0451a4f 100644 --- a/resources/js/pages/admin/manage/purchases/table/PurchaseGroupedTable.vue +++ b/resources/js/pages/admin/manage/purchases/table/PurchaseGroupedTable.vue @@ -78,27 +78,33 @@ interface GroupedPurchaseItems { function getGroupedItems(items: PurchaseItemDetail[]): GroupedPurchaseItems[] { const groups: Record = {}; - let itemCounter = 0; items.forEach((item) => { const rawMaterialId = item.raw_material_id ?? 0; - const rawMaterialName = item.raw_material_name || 'Bahan Baku Tidak Diketahui'; - const unitLabel = item.raw_material_unit_label; if (!groups[rawMaterialId]) { groups[rawMaterialId] = { rawMaterialId, - rawMaterialName, - unitLabel, + rawMaterialName: item.raw_material_name || 'Bahan Baku Tidak Diketahui', + unitLabel: item.raw_material_unit_label, items: [], }; } - itemCounter++; - groups[rawMaterialId].items.push({ ...item, item_number: itemCounter }); + groups[rawMaterialId].items.push({ ...item }); }); - return Object.values(groups); + let itemCounter = 0; + return Object.values(groups).map((group) => { + group.items.sort((a, b) => (a.variant ?? '').localeCompare(b.variant ?? '')); + return { + ...group, + items: group.items.map((item) => { + itemCounter++; + return { ...item, item_number: itemCounter }; + }), + }; + }); } const verificationModalOpen = ref(false);