This commit is contained in:
phaichayon
2026-06-16 10:57:41 +07:00
parent dff22d75b5
commit 357414c247
33 changed files with 9281 additions and 26 deletions

View File

@@ -1,6 +1,7 @@
import { auth } from '@/auth';
import { HydrationBoundary, dehydrate } from '@tanstack/react-query';
import PageContainer from '@/components/layout/page-container';
import { quotationDocumentPreviewOptions } from '@/features/crm/quotations/document/queries';
import {
quotationAttachmentsOptions,
quotationByIdOptions,
@@ -85,6 +86,11 @@ export default async function QuotationDetailRoute({ params }: PageProps) {
session.user.activePermissions.includes(PERMISSIONS.crmApprovalReturn)));
const isOrgAdmin =
session?.user?.systemRole === 'super_admin' || session?.user?.activeMembershipRole === 'admin';
const canPreviewDocument =
session?.user?.systemRole === 'super_admin' ||
(!!session?.user?.activeOrganizationId &&
(session.user.activeMembershipRole === 'admin' ||
session.user.activePermissions.includes(PERMISSIONS.crmQuotationDocumentPreview)));
const queryClient = getQueryClient();
if (canRead) {
@@ -102,6 +108,9 @@ export default async function QuotationDetailRoute({ params }: PageProps) {
limit: 20
})
);
if (canPreviewDocument) {
void queryClient.prefetchQuery(quotationDocumentPreviewOptions(id));
}
}
const referenceData =
@@ -139,6 +148,7 @@ export default async function QuotationDetailRoute({ params }: PageProps) {
activeBusinessRole={session?.user?.activeBusinessRole ?? null}
isOrgAdmin={isOrgAdmin}
currentUserId={session?.user?.id ?? ''}
canPreviewDocument={canPreviewDocument}
/>
</HydrationBoundary>
) : null}

View File

@@ -1,19 +1,42 @@
import { auth } from '@/auth';
import { HydrationBoundary, dehydrate } from '@tanstack/react-query';
import PageContainer from '@/components/layout/page-container';
import { CrmProductionPlaceholder } from '@/features/foundation/components/crm-production-placeholder';
import { TemplateSettings } from '@/features/foundation/document-template/components/template-settings';
import { documentTemplatesQueryOptions } from '@/features/foundation/document-template/queries';
import { PERMISSIONS } from '@/lib/auth/rbac';
import { getQueryClient } from '@/lib/query-client';
export default async function TemplatesRoute() {
const session = await auth();
const canRead =
session?.user?.systemRole === 'super_admin' ||
(!!session?.user?.activeOrganizationId &&
(session.user.activeMembershipRole === 'admin' ||
session.user.activePermissions.includes(PERMISSIONS.crmDocumentTemplateRead)));
const queryClient = getQueryClient();
if (canRead) {
void queryClient.prefetchQuery(
documentTemplatesQueryOptions({ documentType: 'quotation', fileType: 'pdfme' })
);
}
export default function TemplatesRoute() {
return (
<PageContainer
pageTitle='Quotation Templates'
pageDescription='Template management is not part of the production path yet and no longer depends on legacy demo services.'
pageDescription='Template metadata, versions, and mapping counts for production quotation documents.'
access={canRead}
accessFallback={
<div className='text-muted-foreground rounded-lg border border-dashed p-8 text-center'>
You do not have access to CRM document templates.
</div>
}
>
<CrmProductionPlaceholder
title='Template management pending'
summary='The placeholder quotation template demo has been isolated away from the production CRM route tree.'
foundationItems={['Master options foundation', 'Sequence foundation', 'Audit foundation']}
nextStep='Introduce template persistence only when the production quotation/PDF flow is designed.'
demoHref='/dashboard/crm-demo/settings/templates'
/>
{canRead ? (
<HydrationBoundary state={dehydrate(queryClient)}>
<TemplateSettings />
</HydrationBoundary>
) : null}
</PageContainer>
);
}