From 3dee5c1828e070108dc5d77a9102912ad27e730c Mon Sep 17 00:00:00 2001 From: rstubryan Date: Sat, 7 Feb 2026 09:29:05 +0700 Subject: [PATCH] refactor(FE): Add reference number column to ExpensesTable --- .../pages/expense/ExpensesTable.tsx | 7 +++ .../pages/purchase/PurchaseTable.tsx | 62 ++++++++++++++++++- src/types/api/purchase/purchase.d.ts | 2 +- 3 files changed, 69 insertions(+), 2 deletions(-) diff --git a/src/components/pages/expense/ExpensesTable.tsx b/src/components/pages/expense/ExpensesTable.tsx index 6d992e30..e141ad67 100644 --- a/src/components/pages/expense/ExpensesTable.tsx +++ b/src/components/pages/expense/ExpensesTable.tsx @@ -276,6 +276,13 @@ const ExpensesTable = () => { ); }, }, + { + accessorKey: 'reference_number', + header: 'Nomor Referensi', + cell: (props) => { + return props.row.original.reference_number ?? '-'; + }, + }, { accessorKey: 'transaction_date', header: 'Tanggal Pengajuan', diff --git a/src/components/pages/purchase/PurchaseTable.tsx b/src/components/pages/purchase/PurchaseTable.tsx index b9ff2a56..733165f8 100644 --- a/src/components/pages/purchase/PurchaseTable.tsx +++ b/src/components/pages/purchase/PurchaseTable.tsx @@ -1,7 +1,8 @@ 'use client'; -import { ChangeEventHandler, useCallback, useState } from 'react'; +import { ChangeEventHandler, useCallback, useMemo, useState } from 'react'; import useSWR from 'swr'; +import useSWRInfinite from 'swr/infinite'; import { CellContext, ColumnDef, SortingState } from '@tanstack/react-table'; import toast from 'react-hot-toast'; @@ -20,12 +21,16 @@ import StatusBadge from '@/components/helper/StatusBadge'; import { cn, formatDate } from '@/lib/helper'; import { isResponseSuccess } from '@/lib/api-helper'; +import { BaseApiResponse } from '@/types/api/api-general'; import { useTableFilter } from '@/services/hooks/useTableFilter'; import { ROWS_OPTIONS } from '@/config/constant'; import { Purchase } from '@/types/api/purchase/purchase'; import { PurchaseApi } from '@/services/api/purchase'; +import { ExpenseApi } from '@/services/api/expense'; +import { Expense } from '@/types/api/expense'; import { Color } from '@/types/theme'; +import Link from 'next/link'; // ===== STATUS BADGE UTILITIES ===== const statusTextMap: Record = { @@ -158,6 +163,33 @@ const PurchaseTable = () => { PurchaseApi.getAllFetcher ); + const getKey = ( + pageIndex: number, + previousPageData: BaseApiResponse[] | null + ) => { + if (pageIndex > 0 && !previousPageData) return null; + return `${ExpenseApi.basePath}?page=${pageIndex + 1}&limit=100`; + }; + + const { data: expensesPages } = useSWRInfinite( + getKey, + ExpenseApi.getAllFetcher + ); + + const expenseMap = useMemo(() => { + const map = new Map(); + if (!expensesPages) return map; + + expensesPages.forEach((page) => { + if (isResponseSuccess(page)) { + page.data.forEach((expense: Expense) => { + map.set(expense.reference_number, expense.id); + }); + } + }); + return map; + }, [expensesPages]); + // ===== TABLE COLUMNS DEFINITION ===== const purchaseColumns: ColumnDef[] = [ { @@ -167,6 +199,34 @@ const PurchaseTable = () => { return po_number ? po_number : pr_number; }, }, + { + accessorKey: 'po_expedition', + header: 'Ekspedisi PO', + cell: (props) => { + const poExpedition = props.row.original.po_expedition; + if (!poExpedition || poExpedition.length === 0) return '-'; + return ( +
    + {poExpedition.map((exp, index) => { + const expenseId = expenseMap.get(exp.refrence); + if (expenseId) { + return ( +
  • + + {exp.refrence} + +
  • + ); + } + return
  • {exp.refrence}
  • ; + })} +
+ ); + }, + }, { accessorKey: 'supplier', header: 'Vendor', diff --git a/src/types/api/purchase/purchase.d.ts b/src/types/api/purchase/purchase.d.ts index 60004ae0..f64d4275 100644 --- a/src/types/api/purchase/purchase.d.ts +++ b/src/types/api/purchase/purchase.d.ts @@ -76,7 +76,7 @@ export type BasePurchase = { items?: PurchaseItem[]; latest_approval?: BaseApproval; requester_name?: string; - po_expedition?: string[]; + po_expedition?: { id: number; refrence: string }[]; created_user?: CreatedUser; products?: PurchaseItemProduct[]; };