diff --git a/src/features/crm/quotations/components/quotation-detail.tsx b/src/features/crm/quotations/components/quotation-detail.tsx
index 9098ae3..681c170 100644
--- a/src/features/crm/quotations/components/quotation-detail.tsx
+++ b/src/features/crm/quotations/components/quotation-detail.tsx
@@ -1,43 +1,53 @@
-'use client';
+"use client";
-import Link from 'next/link';
-import { useMemo, useState } from 'react';
-import { useMutation, useQueryClient, useSuspenseQuery } from '@tanstack/react-query';
-import { toast } from 'sonner';
-import { AlertModal } from '@/components/modal/alert-modal';
-import { Icons } from '@/components/icons';
-import { Badge } from '@/components/ui/badge';
-import { Button } from '@/components/ui/button';
-import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
+import Link from "next/link";
+import { useMemo, useState } from "react";
+import {
+ useMutation,
+ useQueryClient,
+ useSuspenseQuery,
+} from "@tanstack/react-query";
+import { toast } from "sonner";
+import { AlertModal } from "@/components/modal/alert-modal";
+import { Icons } from "@/components/icons";
+import { Badge } from "@/components/ui/badge";
+import { Button } from "@/components/ui/button";
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardHeader,
+ CardTitle,
+} from "@/components/ui/card";
import {
Dialog,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
- DialogTitle
-} from '@/components/ui/dialog';
-import { Input } from '@/components/ui/input';
-import { Separator } from '@/components/ui/separator';
+ DialogTitle,
+} from "@/components/ui/dialog";
+import { Input } from "@/components/ui/input";
+import { Separator } from "@/components/ui/separator";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
- SelectValue
-} from '@/components/ui/select';
-import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
-import { RecentActivitiesPanel } from '@/features/crm/activities/components/recent-activities-panel';
-import { AuditLogTab } from '@/features/crm/components/audit-log-tab';
-import { formatDate, formatDateTime } from '@/lib/date-format';
-import { formatNumber } from '@/lib/number-format';
+ SelectValue,
+} from "@/components/ui/select";
+import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
+import { RecentActivitiesPanel } from "@/features/crm/activities/components/recent-activities-panel";
+import { AuditLogTab } from "@/features/crm/components/audit-log-tab";
+import { formatDate, formatDateTime } from "@/lib/date-format";
+import { formatNumber } from "@/lib/number-format";
import {
CrmCurrencyInput,
CrmDateInput,
CrmNumberInput,
CrmPercentageInput,
- CrmTextarea
-} from '@/features/crm/components/crm-form-controls';
+ CrmTextarea,
+} from "@/features/crm/components/crm-form-controls";
import {
createQuotationAttachmentMutation,
createQuotationCustomerMutation,
@@ -55,8 +65,8 @@ import {
updateQuotationCustomerMutation,
updateQuotationFollowupMutation,
updateQuotationItemMutation,
- updateQuotationTopicMutation
-} from '../api/mutations';
+ updateQuotationTopicMutation,
+} from "../api/mutations";
import {
quotationAttachmentsOptions,
quotationByIdOptions,
@@ -65,13 +75,13 @@ import {
quotationItemsOptions,
quotationKeys,
quotationRevisionsOptions,
- quotationTopicsOptions
-} from '../api/queries';
+ quotationTopicsOptions,
+} from "../api/queries";
import {
downloadApprovedQuotationPdf,
downloadQuotationCustomerPackage,
- generateApprovedQuotationPdf
-} from '../api/service';
+ generateApprovedQuotationPdf,
+} from "../api/service";
import type {
QuotationAttachmentMutationPayload,
QuotationAttachmentRecord,
@@ -84,33 +94,39 @@ import type {
QuotationItemRecord,
QuotationReferenceData,
QuotationTopicMutationPayload,
- QuotationTopicRecord
-} from '../api/types';
-import { submitQuotationApprovalMutation } from '@/features/foundation/approval/mutations';
-import { quotationDocumentKeys } from '@/features/crm/quotations/document/queries';
+ QuotationTopicRecord,
+} from "../api/types";
+import { submitQuotationApprovalMutation } from "@/features/foundation/approval/mutations";
+import { quotationDocumentKeys } from "@/features/crm/quotations/document/queries";
import {
getCustomerPackageRoleLabel,
getCustomerPackageUiStatus,
- mapCustomerPackageErrorMessage
-} from '../customer-package';
-import { QuotationDocumentPreview } from './quotation-document-preview';
-import { QuotationFormSheet } from './quotation-form-sheet';
-import { QuotationApprovalTab } from './quotation-approval-tab';
-import { QuotationStatusBadge } from './quotation-status-badge';
-import { getQueryClient } from '@/lib/query-client';
+ mapCustomerPackageErrorMessage,
+} from "../customer-package";
+import { QuotationDocumentPreview } from "./quotation-document-preview";
+import { QuotationFormSheet } from "./quotation-form-sheet";
+import { QuotationApprovalTab } from "./quotation-approval-tab";
+import { QuotationStatusBadge } from "./quotation-status-badge";
+import { getQueryClient } from "@/lib/query-client";
-function FieldItem({ label, value }: { label: string; value: string | null | undefined }) {
+function FieldItem({
+ label,
+ value,
+}: {
+ label: string;
+ value: string | null | undefined;
+}) {
return (
-
-
{label}
-
{value ?? '-'}
+
+
{label}
+
{value ?? "-"}
);
}
function EmptyState({ message }: { message: string }) {
return (
-
+
{message}
);
@@ -118,7 +134,7 @@ function EmptyState({ message }: { message: string }) {
function downloadBlobFile(blob: Blob, fileName: string) {
const url = URL.createObjectURL(blob);
- const anchor = document.createElement('a');
+ const anchor = document.createElement("a");
anchor.href = url;
anchor.download = fileName;
document.body.append(anchor);
@@ -127,18 +143,28 @@ function downloadBlobFile(blob: Blob, fileName: string) {
URL.revokeObjectURL(url);
}
-function CustomerPackageSourceItem({ item }: { item: QuotationCustomerPackageSource }) {
+function CustomerPackageSourceItem({
+ item,
+}: {
+ item: QuotationCustomerPackageSource;
+}) {
return (
-
-
-
{getCustomerPackageRoleLabel(item.role)}
-
{item.sourceType === 'generated' ? 'Generated' : 'Library'}
+
+
+
+ {getCustomerPackageRoleLabel(item.role)}
+
+
+ {item.sourceType === "generated" ? "Generated" : "Library"}
+
-
{item.fileName}
-
- {item.pageCount ? `${formatNumber(item.pageCount)} page(s)` : 'Page count unavailable'}
- {item.fileSize ? ` • ${formatNumber(item.fileSize)} bytes` : ''}
- {item.checksum ? ` • ${item.checksum.slice(0, 16)}` : ''}
+
{item.fileName}
+
+ {item.pageCount
+ ? `${formatNumber(item.pageCount)} page(s)`
+ : "Page count unavailable"}
+ {item.fileSize ? ` • ${formatNumber(item.fileSize)} bytes` : ""}
+ {item.checksum ? ` • ${item.checksum.slice(0, 16)}` : ""}
);
@@ -150,7 +176,7 @@ function ItemDialog({
onSubmit,
pending,
referenceData,
- item
+ item,
}: {
open: boolean;
onOpenChange: (open: boolean) => void;
@@ -160,31 +186,35 @@ function ItemDialog({
item?: QuotationItemRecord;
}) {
const [values, setValues] = useState({
- productType: item?.productType ?? referenceData.productTypes[0]?.id ?? '',
- description: item?.description ?? '',
+ productType: item?.productType ?? referenceData.productTypes[0]?.id ?? "",
+ description: item?.description ?? "",
quantity: String(item?.quantity ?? 1),
- unit: item?.unit ?? '',
+ unit: item?.unit ?? "",
unitPrice: String(item?.unitPrice ?? 0),
discount: String(item?.discount ?? 0),
- discountType: item?.discountType ?? '',
+ discountType: item?.discountType ?? "",
taxRate: String(item?.taxRate ?? 0),
- notes: item?.notes ?? ''
+ notes: item?.notes ?? "",
});
return (