'use client'; import Link from 'next/link'; import type { Column, ColumnDef } from '@tanstack/react-table'; import { Icons } from '@/components/icons'; import { Badge } from '@/components/ui/badge'; import { DataTableColumnHeader } from '@/components/ui/table/data-table-column-header'; import type { EnquiryListItem, EnquiryReferenceData } from '../api/types'; import { EnquiryCellAction } from './enquiry-cell-action'; import { EnquiryStatusBadge } from './enquiry-status-badge'; type SharedColumnsConfig = { referenceData: EnquiryReferenceData; canUpdate: boolean; canDelete: boolean; canAssign: boolean; canReassign: boolean; }; function getLeadColumns({ referenceData, canUpdate, canDelete, canAssign, canReassign }: SharedColumnsConfig): ColumnDef[] { const statusMap = new Map(referenceData.statuses.map((item) => [item.id, item])); const leadChannelMap = new Map(referenceData.leadChannels.map((item) => [item.id, item.label])); return [ { id: 'code', accessorKey: 'code', header: ({ column }: { column: Column }) => ( ), cell: ({ row }) => (
{row.original.code} {row.original.title}
), meta: { label: 'Code', placeholder: 'Search leads...', variant: 'text' as const, icon: Icons.search }, enableColumnFilter: true }, { id: 'leadChannel', accessorFn: (row) => row.leadChannel ?? '', header: ({ column }: { column: Column }) => ( ), cell: ({ row }) => {leadChannelMap.get(row.original.leadChannel ?? '') ?? '-'} }, { id: 'customer', accessorFn: (row) => row.customerId, header: ({ column }: { column: Column }) => ( ), cell: ({ row }) => {row.original.customerName}, meta: { label: 'Customer', variant: 'select' as const, options: referenceData.customers.map((item) => ({ value: item.id, label: `${item.name} (${item.code})` })) }, enableColumnFilter: true }, { id: 'status', accessorKey: 'status', header: ({ column }: { column: Column }) => ( ), cell: ({ row }) => { const status = statusMap.get(row.original.status); return ; }, meta: { label: 'Status', variant: 'multiSelect' as const, options: referenceData.statuses.map((item) => ({ value: item.id, label: item.label })) }, enableColumnFilter: true }, { id: 'actions', cell: ({ row }) => ( ) } ]; } function getEnquiryWorkspaceColumns({ referenceData, canUpdate, canDelete, canAssign, canReassign }: SharedColumnsConfig): ColumnDef[] { const statusMap = new Map(referenceData.statuses.map((item) => [item.id, item])); const productTypeMap = new Map(referenceData.productTypes.map((item) => [item.id, item.label])); return [ { id: 'code', accessorKey: 'code', header: ({ column }: { column: Column }) => ( ), cell: ({ row }) => (
{row.original.code} {row.original.title}
), meta: { label: 'Opportunity', placeholder: 'Search opportunities...', variant: 'text' as const, icon: Icons.search }, enableColumnFilter: true }, { id: 'sourceLead', accessorFn: (row) => (row.leadId ? 'linked' : 'direct'), header: ({ column }: { column: Column }) => ( ), cell: ({ row }) => row.original.leadId ? ( {row.original.source ?? row.original.sourceLeadCode ?? 'Lead linked'} ) : ( Direct sales ) }, { id: 'customer', accessorFn: (row) => row.customerId, header: ({ column }: { column: Column }) => ( ), cell: ({ row }) => {row.original.customerName}, meta: { label: 'Customer', variant: 'select' as const, options: referenceData.customers.map((item) => ({ value: item.id, label: `${item.name} (${item.code})` })) }, enableColumnFilter: true }, { id: 'projectName', accessorFn: (row) => row.projectName ?? '', header: ({ column }: { column: Column }) => ( ), cell: ({ row }) => {row.original.projectName ?? '-'} }, { id: 'productType', accessorFn: (row) => row.productType, header: ({ column }: { column: Column }) => ( ), cell: ({ row }) => {productTypeMap.get(row.original.productType) ?? row.original.productType}, meta: { label: 'Product Type', variant: 'multiSelect' as const, options: referenceData.productTypes.map((item) => ({ value: item.id, label: item.label })) }, enableColumnFilter: true }, { id: 'assignedToName', accessorFn: (row) => row.assignedToName ?? '', header: ({ column }: { column: Column }) => ( ), cell: ({ row }) => {row.original.assignedToName ?? '-'} }, { id: 'status', accessorKey: 'status', header: ({ column }: { column: Column }) => ( ), cell: ({ row }) => { const status = statusMap.get(row.original.status); return ; }, meta: { label: 'Status', variant: 'multiSelect' as const, options: referenceData.statuses.map((item) => ({ value: item.id, label: item.label })) }, enableColumnFilter: true }, { id: 'estimatedValue', accessorKey: 'estimatedValue', header: ({ column }: { column: Column }) => ( ), cell: ({ row }) => ( {row.original.estimatedValue !== null ? row.original.estimatedValue.toLocaleString() : '-'} ) }, { id: 'chancePercent', accessorKey: 'chancePercent', header: ({ column }: { column: Column }) => ( ), cell: ({ row }) => {row.original.chancePercent !== null ? `${row.original.chancePercent}%` : '-'} }, { id: 'expectedCloseDate', accessorKey: 'expectedCloseDate', header: ({ column }: { column: Column }) => ( ), cell: ({ row }) => ( {row.original.expectedCloseDate ? new Date(row.original.expectedCloseDate).toLocaleDateString() : '-'} ) }, { id: 'nextFollowupDate', accessorKey: 'nextFollowupDate', header: ({ column }: { column: Column }) => ( ), cell: ({ row }) => ( {row.original.nextFollowupDate ? new Date(row.original.nextFollowupDate).toLocaleDateString() : '-'} ) }, { id: 'createdAt', accessorKey: 'createdAt', header: ({ column }: { column: Column }) => ( ), cell: ({ row }) => {new Date(row.original.createdAt).toLocaleDateString()} }, { id: 'actions', cell: ({ row }) => ( ) } ]; } export function getEnquiryColumns({ referenceData, workspace, canUpdate, canDelete, canAssign, canReassign }: SharedColumnsConfig & { workspace: 'lead' | 'enquiry' }): ColumnDef[] { const sharedConfig = { referenceData, canUpdate, canDelete, canAssign, canReassign }; return workspace === 'lead' ? getLeadColumns(sharedConfig) : getEnquiryWorkspaceColumns(sharedConfig); }