lead menu

nquiry menu
This commit is contained in:
phaichayon
2026-06-19 10:39:11 +07:00
parent 0650cf6297
commit c0cc880be2
46 changed files with 5985 additions and 420 deletions

View File

@@ -1,5 +1,6 @@
'use client';
import Link from 'next/link';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
import type { CrmDashboardSummary } from '../api/types';
@@ -10,13 +11,15 @@ function formatNumber(value: number) {
function SummaryCard({
title,
description,
items
items,
href
}: {
title: string;
description: string;
items: Array<{ label: string; value: number; suffix?: string }>;
href?: string;
}) {
return (
const content = (
<Card className='h-full'>
<CardHeader>
<CardTitle>{title}</CardTitle>
@@ -35,14 +38,23 @@ function SummaryCard({
</CardContent>
</Card>
);
return href ? <Link href={href} className='block'>{content}</Link> : content;
}
export function DashboardSummaryCards({ summary }: { summary: CrmDashboardSummary }) {
export function DashboardSummaryCards({
summary,
canViewCommercialData
}: {
summary: CrmDashboardSummary;
canViewCommercialData: boolean;
}) {
return (
<div className='grid gap-4 xl:grid-cols-2 2xl:grid-cols-4'>
<div className={`grid gap-4 ${canViewCommercialData ? 'xl:grid-cols-2 2xl:grid-cols-4' : 'xl:grid-cols-2'}`}>
<SummaryCard
title='Lead'
description='Lead-stage enquiries based on the frozen KPI rules.'
description='Marketing-owned lead-stage records based on pipeline stage.'
href='/dashboard/crm/leads'
items={[
{ label: 'Lead Count', value: summary.lead.leadCount },
{ label: 'New Leads', value: summary.lead.newLeads },
@@ -51,34 +63,39 @@ export function DashboardSummaryCards({ summary }: { summary: CrmDashboardSummar
]}
/>
<SummaryCard
title='Opportunity'
description='Assigned enquiries that remain active in the pipeline.'
title='Enquiry'
description='Sales-owned enquiry-stage records plus closed outcomes.'
href='/dashboard/crm/enquiries'
items={[
{ label: 'Opportunity Count', value: summary.opportunity.opportunityCount },
{ label: 'Open Opportunities', value: summary.opportunity.openOpportunities },
{ label: 'Hot Opportunities', value: summary.opportunity.hotOpportunities },
{ label: 'Opportunity Value', value: summary.opportunity.opportunityValue }
]}
/>
<SummaryCard
title='Quotation'
description='Live quotation status counts from production data.'
items={[
{ label: 'Draft Quotations', value: summary.quotation.draftQuotations },
{ label: 'Pending Approval', value: summary.quotation.pendingApproval },
{ label: 'Approved Quotations', value: summary.quotation.approvedQuotations },
{ label: 'Sent Quotations', value: summary.quotation.sentQuotations }
]}
/>
<SummaryCard
title='Revenue'
description='Quotation, won, and lost values using frozen dashboard rules.'
items={[
{ label: 'Quotation Value', value: summary.revenue.quotationValue },
{ label: 'Won Value', value: summary.revenue.wonValue },
{ label: 'Lost Value', value: summary.revenue.lostValue }
{ label: 'Enquiry Count', value: summary.enquiry.enquiryCount },
{ label: 'Active Enquiries', value: summary.enquiry.activeEnquiries },
{ label: 'Closed Won', value: summary.enquiry.wonCount },
{ label: 'Closed Lost', value: summary.enquiry.lostCount }
]}
/>
{canViewCommercialData ? (
<SummaryCard
title='Quotation'
description='Live quotation status counts from production data.'
items={[
{ label: 'Draft Quotations', value: summary.quotation.draftQuotations },
{ label: 'Pending Approval', value: summary.quotation.pendingApproval },
{ label: 'Approved Quotations', value: summary.quotation.approvedQuotations },
{ label: 'Sent Quotations', value: summary.quotation.sentQuotations }
]}
/>
) : null}
{canViewCommercialData ? (
<SummaryCard
title='Revenue'
description='Quotation, won, and lost values using governed revenue rules.'
items={[
{ label: 'Quotation Value', value: summary.revenue.quotationValue },
{ label: 'Won Value', value: summary.revenue.wonValue },
{ label: 'Lost Value', value: summary.revenue.lostValue }
]}
/>
) : null}
</div>
);
}