'use client'; import Link from 'next/link'; import { useMutation, useSuspenseQuery } from '@tanstack/react-query'; import { type ColumnDef } from '@tanstack/react-table'; import { parseAsInteger, parseAsString, useQueryStates } from 'nuqs'; import { getSortingStateParser } from '@/lib/parsers'; import { useDataTable } from '@/hooks/use-data-table'; import { DataTable } from '@/components/ui/table/data-table'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; import { toast } from 'sonner'; import { crmReferenceQueryOptions, enquiriesQueryOptions } from '../api/queries'; import { convertEnquiryMutation } from '../api/mutations'; import type { Enquiry } from '../api/types'; import { ChancePill, EnquiryStatusBadge } from './shared'; const columns: ColumnDef[] = [ { accessorKey: 'code', header: 'Code' }, { accessorKey: 'title', header: 'Enquiry' }, { accessorKey: 'productType', header: 'Product' }, { accessorKey: 'status', header: 'Status', cell: ({ row }) => }, { accessorKey: 'chancePercent', header: 'Chance', cell: ({ row }) => }, { id: 'actions', header: '', cell: ({ row }) => } ]; const columnIds = ['code', 'title', 'productType', 'status', 'chancePercent', 'actions']; function RowActions({ enquiry }: { enquiry: Enquiry }) { const mutation = useMutation({ ...convertEnquiryMutation, onSuccess: () => toast.success('สร้าง quotation mock จาก enquiry แล้ว') }); return (
); } export function EnquiriesTablePage() { const [params, setParams] = useQueryStates({ page: parseAsInteger.withDefault(1), perPage: parseAsInteger.withDefault(10), name: parseAsString, status: parseAsString, productType: parseAsString, salesman: parseAsString, dateFrom: parseAsString, dateTo: parseAsString, sort: getSortingStateParser(columnIds).withDefault([]) }); const { data: reference } = useSuspenseQuery(crmReferenceQueryOptions()); const filters = { page: params.page, limit: params.perPage, ...(params.name && { search: params.name }), ...(params.status && { status: params.status }), ...(params.productType && { productType: params.productType }), ...(params.salesman && { salesman: params.salesman }), ...(params.dateFrom && { dateFrom: params.dateFrom }), ...(params.dateTo && { dateTo: params.dateTo }), ...(params.sort.length ? { sort: JSON.stringify(params.sort) } : {}) }; const { data } = useSuspenseQuery(enquiriesQueryOptions(filters)); const pageCount = Math.ceil(data.totalItems / params.perPage); const { table } = useDataTable({ data: data.items, columns, pageCount, initialState: { columnPinning: { right: ['actions'] } } }); return (
void setParams({ name: event.target.value || null, page: 1 })} /> void setParams({ dateFrom: event.target.value || null, page: 1 })} /> void setParams({ dateTo: event.target.value || null, page: 1 })} />
); }