This commit is contained in:
phaichayon
2026-07-15 15:43:28 +07:00
parent df1821982d
commit 69ae3d42c4
13 changed files with 1645 additions and 1052 deletions

View File

@@ -1,20 +1,20 @@
'use client';
"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 { formatDate } from '@/lib/date-format';
import { formatNumber } from '@/lib/number-format';
import type { LeadReferenceData, LeadSummary } from '../api/types';
import { LeadCellAction } from './lead-cell-action';
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 { formatDate } from "@/lib/date-format";
import { formatNumber } from "@/lib/number-format";
import type { LeadReferenceData, LeadSummary } from "../api/types";
import { LeadCellAction } from "./lead-cell-action";
export function getLeadColumns({
referenceData,
canUpdate,
canDelete,
canAssign
canAssign,
}: {
referenceData: LeadReferenceData;
canUpdate: boolean;
@@ -23,142 +23,173 @@ export function getLeadColumns({
}): ColumnDef<LeadSummary>[] {
return [
{
id: 'code',
accessorKey: 'code',
id: "code",
accessorKey: "code",
header: ({ column }: { column: Column<LeadSummary, unknown> }) => (
<DataTableColumnHeader column={column} title='Lead Code' />
<DataTableColumnHeader column={column} title="Lead Code" />
),
cell: ({ row }) => (
<div className='flex flex-col'>
<div className="flex flex-col">
<Link
href={`/dashboard/crm/leads/${row.original.id}`}
className='font-medium hover:underline'
className="font-medium hover:underline"
>
{row.original.code}
</Link>
<span className='text-muted-foreground text-xs'>{row.original.customerName ?? '-'}</span>
<span className="text-muted-foreground text-xs">
{row.original.customerName ?? "-"}
</span>
</div>
),
meta: {
label: 'Lead Code',
placeholder: 'Search leads...',
variant: 'text' as const,
icon: Icons.search
label: "Lead Code",
placeholder: "Search leads...",
variant: "text" as const,
icon: Icons.search,
},
enableColumnFilter: true
enableColumnFilter: true,
},
{
id: 'status',
id: "status",
accessorFn: (row) => row.status,
header: ({ column }: { column: Column<LeadSummary, unknown> }) => (
<DataTableColumnHeader column={column} title='Status' />
<DataTableColumnHeader column={column} title="Document Status" />
),
cell: ({ row }) => (
<Badge variant='outline'>{row.original.statusLabel ?? row.original.status}</Badge>
<Badge variant="outline">
{row.original.statusLabel ?? row.original.status}
</Badge>
),
meta: {
label: 'Status',
variant: 'select' as const,
label: "Document Status",
variant: "select" as const,
options: referenceData.statuses.map((item) => ({
label: item.label,
value: item.id
}))
value: item.id,
})),
},
enableColumnFilter: true
enableColumnFilter: true,
},
{
id: 'branchId',
accessorFn: (row) => row.branchId ?? '',
id: "process_status",
accessorFn: (row) => row.status,
header: ({ column }: { column: Column<LeadSummary, unknown> }) => (
<DataTableColumnHeader column={column} title='Branch' />
<DataTableColumnHeader column={column} title="Process Status" />
),
cell: ({ row }) => (
<Badge variant="outline">
{row.original.statusLabel ?? row.original.status}
</Badge>
),
meta: {
label: "Process Status",
variant: "select" as const,
options: referenceData.statuses.map((item) => ({
label: item.label,
value: item.id,
})),
},
enableColumnFilter: true,
},
{
id: "branchId",
accessorFn: (row) => row.branchId ?? "",
header: ({ column }: { column: Column<LeadSummary, unknown> }) => (
<DataTableColumnHeader column={column} title="Branch" />
),
cell: ({ row }) => {
const branch = referenceData.branches.find((item) => item.id === row.original.branchId);
return <span>{branch?.name ?? '-'}</span>;
const branch = referenceData.branches.find(
(item) => item.id === row.original.branchId,
);
return <span>{branch?.name ?? "-"}</span>;
},
meta: {
label: 'Branch',
variant: 'select' as const,
label: "Branch",
variant: "select" as const,
options: referenceData.branches.map((item) => ({
label: item.name,
value: item.id
}))
value: item.id,
})),
},
enableColumnFilter: true
enableColumnFilter: true,
},
{
id: 'customerId',
accessorFn: (row) => row.customerId ?? '',
id: "customerId",
accessorFn: (row) => row.customerId ?? "",
header: ({ column }: { column: Column<LeadSummary, unknown> }) => (
<DataTableColumnHeader column={column} title='Customer' />
<DataTableColumnHeader column={column} title="Customer" />
),
cell: ({ row }) => <span>{row.original.customerName ?? '-'}</span>,
cell: ({ row }) => <span>{row.original.customerName ?? "-"}</span>,
meta: {
label: 'Customer',
variant: 'select' as const,
label: "Customer",
variant: "select" as const,
options: referenceData.customers.map((item) => ({
label: `${item.name} (${item.code})`,
value: item.id
}))
value: item.id,
})),
},
enableColumnFilter: true
enableColumnFilter: true,
},
{
id: 'projectName',
accessorKey: 'projectName',
id: "projectName",
accessorKey: "projectName",
header: ({ column }: { column: Column<LeadSummary, unknown> }) => (
<DataTableColumnHeader column={column} title='Project' />
<DataTableColumnHeader column={column} title="Project" />
),
cell: ({ row }) => <span>{row.original.projectName ?? '-'}</span>
cell: ({ row }) => <span>{row.original.projectName ?? "-"}</span>,
},
{
id: 'priority',
accessorFn: (row) => row.priority ?? '',
id: "priority",
accessorFn: (row) => row.priority ?? "",
header: ({ column }: { column: Column<LeadSummary, unknown> }) => (
<DataTableColumnHeader column={column} title='Priority' />
<DataTableColumnHeader column={column} title="Priority" />
),
cell: ({ row }) => <span>{row.original.priority ?? '-'}</span>
cell: ({ row }) => <span>{row.original.priority ?? "-"}</span>,
},
{
id: 'suggestedSalesOwner',
accessorFn: (row) => row.suggestedSalesOwnerId ?? '',
id: "suggestedSalesOwner",
accessorFn: (row) => row.suggestedSalesOwnerId ?? "",
header: ({ column }: { column: Column<LeadSummary, unknown> }) => (
<DataTableColumnHeader column={column} title='Suggested Owner' />
<DataTableColumnHeader column={column} title="Suggested Owner" />
),
cell: ({ row }) => <span>{row.original.suggestedSalesOwnerName ?? '-'}</span>
},
{
id: 'assignedSalesOwner',
accessorFn: (row) => row.assignedSalesOwnerId ?? '',
header: ({ column }: { column: Column<LeadSummary, unknown> }) => (
<DataTableColumnHeader column={column} title='Assigned Owner' />
cell: ({ row }) => (
<span>{row.original.suggestedSalesOwnerName ?? "-"}</span>
),
cell: ({ row }) => <span>{row.original.assignedSalesOwnerName ?? '-'}</span>
},
{
id: 'estimatedValue',
accessorKey: 'estimatedValue',
id: "assignedSalesOwner",
accessorFn: (row) => row.assignedSalesOwnerId ?? "",
header: ({ column }: { column: Column<LeadSummary, unknown> }) => (
<DataTableColumnHeader column={column} title='Estimated Value' />
<DataTableColumnHeader column={column} title="Assigned Owner" />
),
cell: ({ row }) => (
<span>{row.original.assignedSalesOwnerName ?? "-"}</span>
),
},
{
id: "estimatedValue",
accessorKey: "estimatedValue",
header: ({ column }: { column: Column<LeadSummary, unknown> }) => (
<DataTableColumnHeader column={column} title="Estimated Value" />
),
cell: ({ row }) => (
<span>
{row.original.estimatedValue !== null
? formatNumber(row.original.estimatedValue)
: '-'}
: "-"}
</span>
)
},
{
id: 'createdAt',
accessorKey: 'createdAt',
header: ({ column }: { column: Column<LeadSummary, unknown> }) => (
<DataTableColumnHeader column={column} title='Created' />
),
cell: ({ row }) => <span>{formatDate(row.original.createdAt)}</span>
},
{
id: 'actions',
id: "createdAt",
accessorKey: "createdAt",
header: ({ column }: { column: Column<LeadSummary, unknown> }) => (
<DataTableColumnHeader column={column} title="Created" />
),
cell: ({ row }) => <span>{formatDate(row.original.createdAt)}</span>,
},
{
id: "actions",
cell: ({ row }) => (
<LeadCellAction
data={row.original}
@@ -167,7 +198,7 @@ export function getLeadColumns({
canDelete={canDelete}
canAssign={canAssign}
/>
)
}
),
},
];
}