summaryrefslogtreecommitdiff
path: root/lib/vendor-investigation/table/investigation-table.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'lib/vendor-investigation/table/investigation-table.tsx')
-rw-r--r--lib/vendor-investigation/table/investigation-table.tsx133
1 files changed, 133 insertions, 0 deletions
diff --git a/lib/vendor-investigation/table/investigation-table.tsx b/lib/vendor-investigation/table/investigation-table.tsx
new file mode 100644
index 00000000..fa4e2ab8
--- /dev/null
+++ b/lib/vendor-investigation/table/investigation-table.tsx
@@ -0,0 +1,133 @@
+"use client"
+
+import * as React from "react"
+import { useRouter } from "next/navigation"
+import type {
+ DataTableAdvancedFilterField,
+ DataTableFilterField,
+ DataTableRowAction,
+} from "@/types/table"
+
+import { useDataTable } from "@/hooks/use-data-table"
+import { DataTable } from "@/components/data-table/data-table"
+import { DataTableAdvancedToolbar } from "@/components/data-table/data-table-advanced-toolbar"
+import { useFeatureFlags } from "./feature-flags-provider"
+import { getColumns } from "./investigation-table-columns"
+import { getVendorsInvestigation } from "../service"
+import { VendorsTableToolbarActions } from "./investigation-table-toolbar-actions"
+import {
+ VendorInvestigationsViewWithContacts,
+ ContactItem,
+ PossibleItem
+} from "@/config/vendorInvestigationsColumnsConfig"
+import { UpdateVendorInvestigationSheet } from "./update-investigation-sheet"
+
+interface VendorsTableProps {
+ promises: Promise<
+ [
+ Awaited<ReturnType<typeof getVendorsInvestigation>>,
+ ]
+ >
+}
+
+export function VendorsInvestigationTable({ promises }: VendorsTableProps) {
+ const { featureFlags } = useFeatureFlags()
+
+ // Get data from Suspense
+ const [rawResponse] = React.use(promises)
+
+ // Transform the data to match the expected types
+ const transformedData: VendorInvestigationsViewWithContacts[] = React.useMemo(() => {
+ return rawResponse.data.map(item => {
+ // Parse contacts field if it's a string
+ let contacts: ContactItem[] = []
+ if (typeof item.contacts === 'string') {
+ try {
+ contacts = JSON.parse(item.contacts) as ContactItem[]
+ } catch (e) {
+ console.error('Failed to parse contacts:', e)
+ }
+ } else if (Array.isArray(item.contacts)) {
+ contacts = item.contacts
+ }
+
+ // Parse possibleItems field if it's a string
+ let possibleItems: PossibleItem[] = []
+ if (typeof item.possibleItems === 'string') {
+ try {
+ possibleItems = JSON.parse(item.possibleItems) as PossibleItem[]
+ } catch (e) {
+ console.error('Failed to parse possibleItems:', e)
+ }
+ } else if (Array.isArray(item.possibleItems)) {
+ possibleItems = item.possibleItems
+ }
+
+ // Return a new object with the transformed fields
+ return {
+ ...item,
+ contacts,
+ possibleItems
+ } as VendorInvestigationsViewWithContacts
+ })
+ }, [rawResponse.data])
+
+ const pageCount = rawResponse.pageCount
+
+ const [rowAction, setRowAction] = React.useState<DataTableRowAction<VendorInvestigationsViewWithContacts> | null>(null)
+
+ // Get router
+ const router = useRouter()
+
+ // Call getColumns() with router injection
+ const columns = React.useMemo(
+ () => getColumns({ setRowAction }),
+ [setRowAction, router]
+ )
+
+ const filterFields: DataTableFilterField<VendorInvestigationsViewWithContacts>[] = [
+ { id: "vendorCode", label: "Vendor Code" },
+ ]
+
+ const advancedFilterFields: DataTableAdvancedFilterField<VendorInvestigationsViewWithContacts>[] = [
+ { id: "vendorName", label: "Vendor Name", type: "text" },
+ { id: "vendorCode", label: "Vendor Code", type: "text" },
+ ]
+
+ const { table } = useDataTable({
+ data: transformedData,
+ columns,
+ pageCount,
+ filterFields,
+ enablePinning: true,
+ enableAdvancedFilter: true,
+ initialState: {
+ sorting: [{ id: "investigationCreatedAt", desc: true }],
+ columnPinning: { right: ["actions"] },
+ },
+ getRowId: (originalRow) => String(originalRow.investigationId),
+ shallow: false,
+ clearOnDefault: true,
+ })
+
+ return (
+ <>
+ <DataTable
+ table={table}
+ >
+ <DataTableAdvancedToolbar
+ table={table}
+ filterFields={advancedFilterFields}
+ shallow={false}
+ >
+ <VendorsTableToolbarActions table={table} />
+ </DataTableAdvancedToolbar>
+ </DataTable>
+ <UpdateVendorInvestigationSheet
+ open={rowAction?.type === "update"}
+ onOpenChange={() => setRowAction(null)}
+ investigation={rowAction?.row.original ?? null}
+ />
+ </>
+ )
+} \ No newline at end of file