medusajs-documents-plugin 1.1.26 → 1.1.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -272,6 +272,32 @@ All hardware replacements and associated workshop labor are covered under our co
272
272
  { title: "Workshop Labor & Clean-Room Installation", description: "Certified technician installation & calibration", quantity: 1, unit_price: 45 }
273
273
  ]
274
274
  },
275
+ {
276
+ id: "trade_in",
277
+ name: "Device Trade-In Agreement",
278
+ icon: "🔄",
279
+ badge: "Trade-In & Transfer",
280
+ title: "Device Trade-In & Buyback Agreement",
281
+ subject: "Device Trade-In & Buyback Agreement - Urban Device Care",
282
+ body_text: `This agreement confirms the valuation, transfer of title, and trade-in credit for the listed customer hardware. Customer verifies legal ownership and consents to complete data sanitation and ownership transfer.`,
283
+ items: [
284
+ { title: "Trade-In Device Valuation & Credit", description: "Assessed Grade A condition allowance", quantity: 1, unit_price: 25e3 },
285
+ { title: "Data Sanitization & Ownership Transfer", description: "Certified NIST 800-88 cryptographic wipe", quantity: 1, unit_price: 0 }
286
+ ]
287
+ },
288
+ {
289
+ id: "destruction",
290
+ name: "Certificate of Destruction & Disposal",
291
+ icon: "♻️",
292
+ badge: "Eco & Compliance",
293
+ title: "Certificate of Destruction & Eco-Disposal",
294
+ subject: "Certificate of Hardware Destruction & Eco-Disposal",
295
+ body_text: `This certificate confirms that the decommissioned hardware listed below has been safely demanufactured, shredded, or recycled in full compliance with WEEE and environmental data destruction standards.`,
296
+ items: [
297
+ { title: "Hardware Demanufacturing & Shredding", description: "Certified environmental destruction", quantity: 1, unit_price: 0 },
298
+ { title: "Hazardous Materials Recycling", description: "Zero-landfill lithium battery reclamation", quantity: 1, unit_price: 0 }
299
+ ]
300
+ },
275
301
  {
276
302
  id: "blank",
277
303
  name: "Blank Custom Document",
@@ -290,10 +316,11 @@ const DocumentsPage = () => {
290
316
  const [documents, setDocuments] = react.useState([]);
291
317
  const [loading, setLoading] = react.useState(true);
292
318
  const [searchTerm, setSearchTerm] = react.useState("");
293
- const [typeFilter, setTypeFilter] = react.useState("invoice");
319
+ const [typeFilter, setTypeFilter] = react.useState("all");
294
320
  const [sourceFilter, setSourceFilter] = react.useState("all");
295
321
  const [zohoLiveDocs, setZohoLiveDocs] = react.useState([]);
296
322
  const [loadingZoho, setLoadingZoho] = react.useState(false);
323
+ const [isSyncingRepairs, setIsSyncingRepairs] = react.useState(false);
297
324
  const [groupByJob, setGroupByJob] = react.useState(true);
298
325
  const [expandedGroups, setExpandedGroups] = react.useState({});
299
326
  const toggleGroup = (groupId) => {
@@ -364,6 +391,7 @@ const DocumentsPage = () => {
364
391
  const [previewModalOpen, setPreviewModalOpen] = react.useState(false);
365
392
  const [previewStyle, setPreviewStyle] = react.useState("modern");
366
393
  const [previewType, setPreviewType] = react.useState("invoice");
394
+ const [previewPreset, setPreviewPreset] = react.useState(null);
367
395
  const [previewBlobUrl, setPreviewBlobUrl] = react.useState(null);
368
396
  const [isPreviewModalLoading, setIsPreviewModalLoading] = react.useState(false);
369
397
  const [isGeneratingManual, setIsGeneratingManual] = react.useState(false);
@@ -580,10 +608,11 @@ const DocumentsPage = () => {
580
608
  setIsGeneratingCustom(false);
581
609
  }
582
610
  };
583
- const loadPreviewBlob = async (style, type) => {
611
+ const loadPreviewBlob = async (style, type, preset) => {
584
612
  setIsPreviewModalLoading(true);
585
613
  try {
586
- const res = await fetch(`/admin/documents/templates/preview?style=${style}&type=${type}`, {
614
+ const presetParam = preset ? `&preset=${preset}` : "";
615
+ const res = await fetch(`/admin/documents/templates/preview?style=${style}&type=${type}${presetParam}`, {
587
616
  credentials: "include"
588
617
  });
589
618
  if (!res.ok) {
@@ -604,31 +633,53 @@ const DocumentsPage = () => {
604
633
  setPreviewLoading(null);
605
634
  }
606
635
  };
607
- const handlePreviewTemplate = async (style, type) => {
608
- const key = `${style}-${type}`;
636
+ const handlePreviewTemplate = async (style, type, preset) => {
637
+ const key = preset ? `${style}-${type}-${preset}` : `${style}-${type}`;
609
638
  setPreviewLoading(key);
610
639
  setPreviewStyle(style);
611
640
  setPreviewType(type);
641
+ setPreviewPreset(preset || null);
612
642
  setPreviewModalOpen(true);
613
- await loadPreviewBlob(style, type);
643
+ await loadPreviewBlob(style, type, preset);
614
644
  };
615
645
  const switchPreview = async (style, type) => {
616
646
  setPreviewStyle(style);
617
647
  setPreviewType(type);
618
- await loadPreviewBlob(style, type);
648
+ await loadPreviewBlob(style, type, previewPreset);
619
649
  };
620
650
  const handleOpenPreviewNewTab = () => {
621
- window.open(`/admin/documents/templates/preview?style=${previewStyle}&type=${previewType}`, "_blank");
651
+ const presetParam = previewPreset ? `&preset=${previewPreset}` : "";
652
+ window.open(`/admin/documents/templates/preview?style=${previewStyle}&type=${previewType}${presetParam}`, "_blank");
622
653
  };
623
654
  const handleDownloadPreview = () => {
624
655
  if (!previewBlobUrl) return;
625
656
  const a = document.createElement("a");
626
657
  a.href = previewBlobUrl;
627
- a.download = `preview-${previewStyle}-${previewType}.pdf`;
658
+ a.download = `preview-${previewStyle}-${previewPreset || previewType}.pdf`;
628
659
  document.body.appendChild(a);
629
660
  a.click();
630
661
  document.body.removeChild(a);
631
662
  };
663
+ const handleSyncRepairs = async () => {
664
+ setIsSyncingRepairs(true);
665
+ try {
666
+ const res = await fetch("/admin/documents/sync", {
667
+ method: "POST",
668
+ credentials: "include"
669
+ });
670
+ const data = await res.json().catch(() => ({}));
671
+ if (res.ok && data.success) {
672
+ alert(data.message || `Successfully synced ${data.synced_tickets || 0} repairs!`);
673
+ loadDocuments();
674
+ } else {
675
+ alert(`Sync failed: ${data.message || "Unknown error"}`);
676
+ }
677
+ } catch (e) {
678
+ alert(`Error syncing repairs: ${e.message}`);
679
+ } finally {
680
+ setIsSyncingRepairs(false);
681
+ }
682
+ };
632
683
  const handleViewDocument = (id, displayId) => {
633
684
  window.open(`/admin/documents/${id}/document`, "_blank");
634
685
  };
@@ -759,6 +810,20 @@ const DocumentsPage = () => {
759
810
  ] })
760
811
  ] }),
761
812
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
813
+ /* @__PURE__ */ jsxRuntime.jsxs(
814
+ ui.Button,
815
+ {
816
+ variant: "secondary",
817
+ size: "small",
818
+ onClick: handleSyncRepairs,
819
+ isLoading: isSyncingRepairs,
820
+ title: "Scan and synchronize all repair tickets and Zoho documents",
821
+ children: [
822
+ /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowPath, { className: `w-4 h-4 mr-1 ${isSyncingRepairs ? "animate-spin" : ""}` }),
823
+ " Sync Repairs & Zoho"
824
+ ]
825
+ }
826
+ ),
762
827
  /* @__PURE__ */ jsxRuntime.jsxs(ui.Button, { variant: "secondary", size: "small", onClick: () => setManualModalOpen(true), children: [
763
828
  /* @__PURE__ */ jsxRuntime.jsx(icons.Plus, { className: "w-4 h-4 mr-1" }),
764
829
  " Create Invoice"
@@ -847,8 +912,8 @@ const DocumentsPage = () => {
847
912
  children: [
848
913
  /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Trigger, { size: "small", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Value, { placeholder: "Document Type" }) }),
849
914
  /* @__PURE__ */ jsxRuntime.jsxs(ui.Select.Content, { children: [
850
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "invoice", children: "Invoices (Default)" }),
851
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "all", children: "All Types" }),
915
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "all", children: "All Types (Default)" }),
916
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "invoice", children: "Invoices" }),
852
917
  /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "receipt", children: "Receipts" }),
853
918
  /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "estimate", children: "Estimates / Quotes" }),
854
919
  /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "job_card", children: "Job Cards" }),
@@ -1366,221 +1431,567 @@ const DocumentsPage = () => {
1366
1431
  ] })
1367
1432
  ] })
1368
1433
  ] }),
1369
- activeTab === "templates" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-6 max-w-4xl flex flex-col gap-6", children: [
1370
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1371
- /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", className: "text-base font-semibold", children: "PDFKit Fallback Templates" }),
1372
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-xs text-ui-fg-subtle", children: "Configure different styling templates for each document type when generated locally via PDFKit." })
1434
+ activeTab === "templates" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-6 max-w-6xl flex flex-col gap-6", children: [
1435
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
1436
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", className: "text-lg font-semibold", children: "Document Templates & Live Previews" }),
1437
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-xs text-ui-fg-subtle", children: "Configure styling templates and preview official customer, workshop, and compliance documents. Zoho-backed documents match official Zoho Books layouts; workshop and custom certificates use dedicated professional formats with consistent company headers." })
1373
1438
  ] }),
1374
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [
1375
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-4 border border-ui-border-base rounded-lg bg-ui-bg-base flex flex-col justify-between", children: [
1439
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-5", children: [
1440
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-5 border border-ui-border-base rounded-lg bg-ui-bg-base flex flex-col justify-between shadow-sm hover:border-ui-border-interactive transition-colors", children: [
1376
1441
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1377
- /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "font-semibold text-sm", children: "Invoice Template" }),
1378
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-xs text-ui-fg-subtle mb-3", children: "Used for standard customer order & repair invoices." }),
1442
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between mb-2", children: [
1443
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
1444
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xl", children: "🧾" }),
1445
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "font-semibold text-sm", children: "Tax Invoice" })
1446
+ ] }),
1447
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { color: "orange", size: "small", children: "Zoho Exact" })
1448
+ ] }),
1449
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-xs text-ui-fg-subtle mb-4", children: "Official invoice matching Zoho Books layout with itemized parts & labor, balance due highlight, online payment shortlink, QR tracking, and KRA PIN." }),
1450
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
1451
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "text-xs font-medium", children: "Template Style" }),
1452
+ /* @__PURE__ */ jsxRuntime.jsxs(
1453
+ ui.Select,
1454
+ {
1455
+ value: settings.invoice_template || "zoho_exact",
1456
+ onValueChange: (v) => updateSettingField("invoice_template", v),
1457
+ children: [
1458
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Trigger, { size: "small", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Value, {}) }),
1459
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Select.Content, { children: [
1460
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "zoho_exact", children: "Zoho Books Exact Format" }),
1461
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "modern", children: "Modern Minimalist" }),
1462
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "classic", children: "Classic Corporate" }),
1463
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "minimal", children: "Clean Tech Monospace" })
1464
+ ] })
1465
+ ]
1466
+ }
1467
+ )
1468
+ ] })
1469
+ ] }),
1470
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-5 pt-3 border-t border-ui-border-base flex items-center justify-between", children: [
1471
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-[11px] text-ui-fg-muted font-mono", children: "Type: invoice" }),
1379
1472
  /* @__PURE__ */ jsxRuntime.jsxs(
1380
- ui.Select,
1473
+ ui.Button,
1381
1474
  {
1382
- value: settings.invoice_template || "zoho_exact",
1383
- onValueChange: (v) => updateSettingField("invoice_template", v),
1475
+ variant: "secondary",
1476
+ size: "small",
1477
+ onClick: () => handlePreviewTemplate(settings.invoice_template || "zoho_exact", "invoice"),
1478
+ isLoading: previewLoading === `${settings.invoice_template || "zoho_exact"}-invoice`,
1384
1479
  children: [
1385
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Trigger, { size: "small", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Value, {}) }),
1386
- /* @__PURE__ */ jsxRuntime.jsxs(ui.Select.Content, { children: [
1387
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "zoho_exact", children: "Zoho Books Exact Layout" }),
1388
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "modern", children: "Modern Minimalist" }),
1389
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "classic", children: "Classic Corporate" }),
1390
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "minimal", children: "Clean Tech Monospace" })
1391
- ] })
1480
+ /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowDownTray, { className: "w-3.5 h-3.5 mr-1" }),
1481
+ " Preview Invoice"
1392
1482
  ]
1393
1483
  }
1394
1484
  )
1485
+ ] })
1486
+ ] }),
1487
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-5 border border-ui-border-base rounded-lg bg-ui-bg-base flex flex-col justify-between shadow-sm hover:border-ui-border-interactive transition-colors", children: [
1488
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1489
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between mb-2", children: [
1490
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
1491
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xl", children: "💼" }),
1492
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "font-semibold text-sm", children: "Repair Estimate / Quote" })
1493
+ ] }),
1494
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { color: "orange", size: "small", children: "Zoho Exact" })
1495
+ ] }),
1496
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-xs text-ui-fg-subtle mb-4", children: "Itemized repair quotation matching Zoho Books with validity period, customer approval links, and workshop labor breakdown." }),
1497
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
1498
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "text-xs font-medium", children: "Template Style" }),
1499
+ /* @__PURE__ */ jsxRuntime.jsxs(
1500
+ ui.Select,
1501
+ {
1502
+ value: settings.estimate_template || "zoho_exact",
1503
+ onValueChange: (v) => updateSettingField("estimate_template", v),
1504
+ children: [
1505
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Trigger, { size: "small", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Value, {}) }),
1506
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Select.Content, { children: [
1507
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "zoho_exact", children: "Zoho Books Exact Format" }),
1508
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "modern", children: "Modern Minimalist" }),
1509
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "classic", children: "Classic Corporate" }),
1510
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "minimal", children: "Clean Tech Monospace" })
1511
+ ] })
1512
+ ]
1513
+ }
1514
+ )
1515
+ ] })
1395
1516
  ] }),
1396
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-4 pt-3 border-t border-ui-border-base flex justify-end", children: /* @__PURE__ */ jsxRuntime.jsxs(
1397
- ui.Button,
1398
- {
1399
- variant: "secondary",
1400
- size: "small",
1401
- onClick: () => handlePreviewTemplate(settings.invoice_template || "zoho_exact", "invoice"),
1402
- isLoading: previewLoading === `${settings.invoice_template || "zoho_exact"}-invoice`,
1403
- children: [
1404
- /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowDownTray, { className: "w-3.5 h-3.5 mr-1" }),
1405
- " Preview Invoice Template"
1406
- ]
1407
- }
1408
- ) })
1517
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-5 pt-3 border-t border-ui-border-base flex items-center justify-between", children: [
1518
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-[11px] text-ui-fg-muted font-mono", children: "Type: quote" }),
1519
+ /* @__PURE__ */ jsxRuntime.jsxs(
1520
+ ui.Button,
1521
+ {
1522
+ variant: "secondary",
1523
+ size: "small",
1524
+ onClick: () => handlePreviewTemplate(settings.estimate_template || "zoho_exact", "estimate"),
1525
+ isLoading: previewLoading === `${settings.estimate_template || "zoho_exact"}-estimate`,
1526
+ children: [
1527
+ /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowDownTray, { className: "w-3.5 h-3.5 mr-1" }),
1528
+ " Preview Estimate"
1529
+ ]
1530
+ }
1531
+ )
1532
+ ] })
1409
1533
  ] }),
1410
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-4 border border-ui-border-base rounded-lg bg-ui-bg-base flex flex-col justify-between", children: [
1534
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-5 border border-ui-border-base rounded-lg bg-ui-bg-base flex flex-col justify-between shadow-sm hover:border-ui-border-interactive transition-colors", children: [
1411
1535
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1412
- /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "font-semibold text-sm", children: "Packing Slip Template" }),
1413
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-xs text-ui-fg-subtle mb-3", children: "Used for warehouse fulfillment & shipping packing slips." }),
1536
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between mb-2", children: [
1537
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
1538
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xl", children: "💳" }),
1539
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "font-semibold text-sm", children: "Payment Receipt" })
1540
+ ] }),
1541
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { color: "orange", size: "small", children: "Zoho Exact" })
1542
+ ] }),
1543
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-xs text-ui-fg-subtle mb-4", children: "Official payment receipt issued upon payment capture with green PAID watermark stamp, payment reference, and receipt details." }),
1544
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
1545
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "text-xs font-medium", children: "Template Style" }),
1546
+ /* @__PURE__ */ jsxRuntime.jsxs(
1547
+ ui.Select,
1548
+ {
1549
+ value: settings.receipt_template || "zoho_exact",
1550
+ onValueChange: (v) => updateSettingField("receipt_template", v),
1551
+ children: [
1552
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Trigger, { size: "small", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Value, {}) }),
1553
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Select.Content, { children: [
1554
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "zoho_exact", children: "Zoho Books Exact Format" }),
1555
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "modern", children: "Modern Minimalist" }),
1556
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "classic", children: "Classic Corporate" }),
1557
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "minimal", children: "Clean Tech Monospace" })
1558
+ ] })
1559
+ ]
1560
+ }
1561
+ )
1562
+ ] })
1563
+ ] }),
1564
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-5 pt-3 border-t border-ui-border-base flex items-center justify-between", children: [
1565
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-[11px] text-ui-fg-muted font-mono", children: "Type: receipt" }),
1414
1566
  /* @__PURE__ */ jsxRuntime.jsxs(
1415
- ui.Select,
1567
+ ui.Button,
1416
1568
  {
1417
- value: settings.packing_slip_template || "modern",
1418
- onValueChange: (v) => updateSettingField("packing_slip_template", v),
1569
+ variant: "secondary",
1570
+ size: "small",
1571
+ onClick: () => handlePreviewTemplate(settings.receipt_template || "zoho_exact", "receipt"),
1572
+ isLoading: previewLoading === `${settings.receipt_template || "zoho_exact"}-receipt`,
1419
1573
  children: [
1420
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Trigger, { size: "small", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Value, {}) }),
1421
- /* @__PURE__ */ jsxRuntime.jsxs(ui.Select.Content, { children: [
1422
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "modern", children: "Modern Minimalist" }),
1423
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "classic", children: "Classic Corporate" }),
1424
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "minimal", children: "Clean Tech Monospace" })
1425
- ] })
1574
+ /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowDownTray, { className: "w-3.5 h-3.5 mr-1" }),
1575
+ " Preview Receipt"
1426
1576
  ]
1427
1577
  }
1428
1578
  )
1579
+ ] })
1580
+ ] }),
1581
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-5 border border-ui-border-base rounded-lg bg-ui-bg-base flex flex-col justify-between shadow-sm hover:border-ui-border-interactive transition-colors", children: [
1582
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1583
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between mb-2", children: [
1584
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
1585
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xl", children: "📋" }),
1586
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "font-semibold text-sm", children: "Repair Job Card" })
1587
+ ] }),
1588
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { color: "blue", size: "small", children: "Workshop Intake" })
1589
+ ] }),
1590
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-xs text-ui-fg-subtle mb-4", children: "Customer intake job card featuring asset specifications, serial/IMEI, intake condition, checklist tasks, and technician sign-off." }),
1591
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
1592
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "text-xs font-medium", children: "Template Style" }),
1593
+ /* @__PURE__ */ jsxRuntime.jsxs(
1594
+ ui.Select,
1595
+ {
1596
+ value: settings.job_card_template || "standard",
1597
+ onValueChange: (v) => updateSettingField("job_card_template", v),
1598
+ children: [
1599
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Trigger, { size: "small", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Value, {}) }),
1600
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Select.Content, { children: [
1601
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "standard", children: "Standard Workshop Intake" }),
1602
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "modern", children: "Modern Minimalist" }),
1603
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "classic", children: "Classic Corporate" }),
1604
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "minimal", children: "Clean Tech Monospace" })
1605
+ ] })
1606
+ ]
1607
+ }
1608
+ )
1609
+ ] })
1429
1610
  ] }),
1430
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-4 pt-3 border-t border-ui-border-base flex justify-end", children: /* @__PURE__ */ jsxRuntime.jsxs(
1431
- ui.Button,
1432
- {
1433
- variant: "secondary",
1434
- size: "small",
1435
- onClick: () => handlePreviewTemplate(settings.packing_slip_template || "modern", "packing_slip"),
1436
- isLoading: previewLoading === `${settings.packing_slip_template || "modern"}-packing_slip`,
1437
- children: [
1438
- /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowDownTray, { className: "w-3.5 h-3.5 mr-1" }),
1439
- " Preview Packing Slip Template"
1440
- ]
1441
- }
1442
- ) })
1611
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-5 pt-3 border-t border-ui-border-base flex items-center justify-between", children: [
1612
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-[11px] text-ui-fg-muted font-mono", children: "Type: job_card" }),
1613
+ /* @__PURE__ */ jsxRuntime.jsxs(
1614
+ ui.Button,
1615
+ {
1616
+ variant: "secondary",
1617
+ size: "small",
1618
+ onClick: () => handlePreviewTemplate(settings.job_card_template || "standard", "job_card"),
1619
+ isLoading: previewLoading === `${settings.job_card_template || "standard"}-job_card`,
1620
+ children: [
1621
+ /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowDownTray, { className: "w-3.5 h-3.5 mr-1" }),
1622
+ " Preview Job Card"
1623
+ ]
1624
+ }
1625
+ )
1626
+ ] })
1443
1627
  ] }),
1444
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-4 border border-ui-border-base rounded-lg bg-ui-bg-base flex flex-col justify-between", children: [
1628
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-5 border border-ui-border-base rounded-lg bg-ui-bg-base flex flex-col justify-between shadow-sm hover:border-ui-border-interactive transition-colors", children: [
1445
1629
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1446
- /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "font-semibold text-sm", children: "Payment Receipt Template" }),
1447
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-xs text-ui-fg-subtle mb-3", children: "Issued when orders or repairs are captured and paid in full." }),
1630
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between mb-2", children: [
1631
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
1632
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xl", children: "📦" }),
1633
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "font-semibold text-sm", children: "Packing Slip" })
1634
+ ] }),
1635
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { color: "purple", size: "small", children: "Order Fulfillment" })
1636
+ ] }),
1637
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-xs text-ui-fg-subtle mb-4", children: "Used for warehouse fulfillment, package tracking, and shipping dispatch verification with itemized manifest." }),
1638
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
1639
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "text-xs font-medium", children: "Template Style" }),
1640
+ /* @__PURE__ */ jsxRuntime.jsxs(
1641
+ ui.Select,
1642
+ {
1643
+ value: settings.packing_slip_template || "modern",
1644
+ onValueChange: (v) => updateSettingField("packing_slip_template", v),
1645
+ children: [
1646
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Trigger, { size: "small", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Value, {}) }),
1647
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Select.Content, { children: [
1648
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "modern", children: "Modern Minimalist" }),
1649
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "classic", children: "Classic Corporate" }),
1650
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "minimal", children: "Clean Tech Monospace" })
1651
+ ] })
1652
+ ]
1653
+ }
1654
+ )
1655
+ ] })
1656
+ ] }),
1657
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-5 pt-3 border-t border-ui-border-base flex items-center justify-between", children: [
1658
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-[11px] text-ui-fg-muted font-mono", children: "Type: packing_slip" }),
1448
1659
  /* @__PURE__ */ jsxRuntime.jsxs(
1449
- ui.Select,
1660
+ ui.Button,
1450
1661
  {
1451
- value: settings.receipt_template || "zoho_exact",
1452
- onValueChange: (v) => updateSettingField("receipt_template", v),
1662
+ variant: "secondary",
1663
+ size: "small",
1664
+ onClick: () => handlePreviewTemplate(settings.packing_slip_template || "modern", "packing_slip"),
1665
+ isLoading: previewLoading === `${settings.packing_slip_template || "modern"}-packing_slip`,
1453
1666
  children: [
1454
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Trigger, { size: "small", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Value, {}) }),
1455
- /* @__PURE__ */ jsxRuntime.jsxs(ui.Select.Content, { children: [
1456
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "zoho_exact", children: "Zoho Books Exact Layout" }),
1457
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "modern", children: "Modern Minimalist" }),
1458
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "classic", children: "Classic Corporate" }),
1459
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "minimal", children: "Clean Tech Monospace" })
1460
- ] })
1667
+ /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowDownTray, { className: "w-3.5 h-3.5 mr-1" }),
1668
+ " Preview Packing Slip"
1461
1669
  ]
1462
1670
  }
1463
1671
  )
1672
+ ] })
1673
+ ] }),
1674
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-5 border border-ui-border-base rounded-lg bg-ui-bg-base flex flex-col justify-between shadow-sm hover:border-ui-border-interactive transition-colors", children: [
1675
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1676
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between mb-2", children: [
1677
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
1678
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xl", children: "🛡️" }),
1679
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "font-semibold text-sm", children: "Warranty Certificate" })
1680
+ ] }),
1681
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { color: "green", size: "small", children: "90-Day Coverage" })
1682
+ ] }),
1683
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-xs text-ui-fg-subtle mb-4", children: "Official certificate verifying professional repair with OEM-specification components and 90-day parts and labor coverage." }),
1684
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
1685
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "text-xs font-medium", children: "Template Style" }),
1686
+ /* @__PURE__ */ jsxRuntime.jsxs(
1687
+ ui.Select,
1688
+ {
1689
+ value: settings.custom_doc_template || "modern",
1690
+ onValueChange: (v) => updateSettingField("custom_doc_template", v),
1691
+ children: [
1692
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Trigger, { size: "small", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Value, {}) }),
1693
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Select.Content, { children: [
1694
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "modern", children: "Modern Minimalist" }),
1695
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "classic", children: "Classic Corporate" }),
1696
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "minimal", children: "Clean Tech Monospace" })
1697
+ ] })
1698
+ ]
1699
+ }
1700
+ )
1701
+ ] })
1464
1702
  ] }),
1465
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-4 pt-3 border-t border-ui-border-base flex justify-end", children: /* @__PURE__ */ jsxRuntime.jsxs(
1466
- ui.Button,
1467
- {
1468
- variant: "secondary",
1469
- size: "small",
1470
- onClick: () => handlePreviewTemplate(settings.receipt_template || "zoho_exact", "receipt"),
1471
- isLoading: previewLoading === `${settings.receipt_template || "zoho_exact"}-receipt`,
1472
- children: [
1473
- /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowDownTray, { className: "w-3.5 h-3.5 mr-1" }),
1474
- " Preview Receipt Template"
1475
- ]
1476
- }
1477
- ) })
1703
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-5 pt-3 border-t border-ui-border-base flex items-center justify-between", children: [
1704
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-[11px] text-ui-fg-muted font-mono", children: "Preset: warranty" }),
1705
+ /* @__PURE__ */ jsxRuntime.jsxs(
1706
+ ui.Button,
1707
+ {
1708
+ variant: "secondary",
1709
+ size: "small",
1710
+ onClick: () => handlePreviewTemplate(settings.custom_doc_template || "modern", "custom", "warranty"),
1711
+ isLoading: previewLoading === `${settings.custom_doc_template || "modern"}-custom-warranty`,
1712
+ children: [
1713
+ /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowDownTray, { className: "w-3.5 h-3.5 mr-1" }),
1714
+ " Preview Certificate"
1715
+ ]
1716
+ }
1717
+ )
1718
+ ] })
1478
1719
  ] }),
1479
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-4 border border-ui-border-base rounded-lg bg-ui-bg-base flex flex-col justify-between", children: [
1720
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-5 border border-ui-border-base rounded-lg bg-ui-bg-base flex flex-col justify-between shadow-sm hover:border-ui-border-interactive transition-colors", children: [
1480
1721
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1481
- /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "font-semibold text-sm", children: "Estimate / Quotation Template" }),
1482
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-xs text-ui-fg-subtle mb-3", children: "Issued for customer repair quotations, diagnostics, and price estimates." }),
1722
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between mb-2", children: [
1723
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
1724
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xl", children: "🔬" }),
1725
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "font-semibold text-sm", children: "Diagnostic & Inspection" })
1726
+ ] }),
1727
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { color: "purple", size: "small", children: "Hardware Findings" })
1728
+ ] }),
1729
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-xs text-ui-fg-subtle mb-4", children: "Technical diagnostic report featuring component voltage checks, TrueTone / digitizer measurements, and technician notes." }),
1730
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
1731
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "text-xs font-medium", children: "Template Style" }),
1732
+ /* @__PURE__ */ jsxRuntime.jsxs(
1733
+ ui.Select,
1734
+ {
1735
+ value: settings.custom_doc_template || "modern",
1736
+ onValueChange: (v) => updateSettingField("custom_doc_template", v),
1737
+ children: [
1738
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Trigger, { size: "small", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Value, {}) }),
1739
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Select.Content, { children: [
1740
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "modern", children: "Modern Minimalist" }),
1741
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "classic", children: "Classic Corporate" }),
1742
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "minimal", children: "Clean Tech Monospace" })
1743
+ ] })
1744
+ ]
1745
+ }
1746
+ )
1747
+ ] })
1748
+ ] }),
1749
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-5 pt-3 border-t border-ui-border-base flex items-center justify-between", children: [
1750
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-[11px] text-ui-fg-muted font-mono", children: "Preset: diagnostic" }),
1483
1751
  /* @__PURE__ */ jsxRuntime.jsxs(
1484
- ui.Select,
1752
+ ui.Button,
1485
1753
  {
1486
- value: settings.estimate_template || "zoho_exact",
1487
- onValueChange: (v) => updateSettingField("estimate_template", v),
1754
+ variant: "secondary",
1755
+ size: "small",
1756
+ onClick: () => handlePreviewTemplate(settings.custom_doc_template || "modern", "custom", "diagnostic"),
1757
+ isLoading: previewLoading === `${settings.custom_doc_template || "modern"}-custom-diagnostic`,
1488
1758
  children: [
1489
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Trigger, { size: "small", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Value, {}) }),
1490
- /* @__PURE__ */ jsxRuntime.jsxs(ui.Select.Content, { children: [
1491
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "zoho_exact", children: "Zoho Books Exact Layout" }),
1492
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "modern", children: "Modern Minimalist" }),
1493
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "classic", children: "Classic Corporate" }),
1494
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "minimal", children: "Clean Tech Monospace" })
1495
- ] })
1759
+ /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowDownTray, { className: "w-3.5 h-3.5 mr-1" }),
1760
+ " Preview Report"
1496
1761
  ]
1497
1762
  }
1498
1763
  )
1764
+ ] })
1765
+ ] }),
1766
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-5 border border-ui-border-base rounded-lg bg-ui-bg-base flex flex-col justify-between shadow-sm hover:border-ui-border-interactive transition-colors", children: [
1767
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1768
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between mb-2", children: [
1769
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
1770
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xl", children: "📜" }),
1771
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "font-semibold text-sm", children: "Service Completion" })
1772
+ ] }),
1773
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { color: "green", size: "small", children: "QC Cleared" })
1774
+ ] }),
1775
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-xs text-ui-fg-subtle mb-4", children: "Certificate verifying that maintenance, repair overhaul, and 100% bench functional test criteria have been passed." }),
1776
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
1777
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "text-xs font-medium", children: "Template Style" }),
1778
+ /* @__PURE__ */ jsxRuntime.jsxs(
1779
+ ui.Select,
1780
+ {
1781
+ value: settings.custom_doc_template || "modern",
1782
+ onValueChange: (v) => updateSettingField("custom_doc_template", v),
1783
+ children: [
1784
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Trigger, { size: "small", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Value, {}) }),
1785
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Select.Content, { children: [
1786
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "modern", children: "Modern Minimalist" }),
1787
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "classic", children: "Classic Corporate" }),
1788
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "minimal", children: "Clean Tech Monospace" })
1789
+ ] })
1790
+ ]
1791
+ }
1792
+ )
1793
+ ] })
1499
1794
  ] }),
1500
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-4 pt-3 border-t border-ui-border-base flex justify-end", children: /* @__PURE__ */ jsxRuntime.jsxs(
1501
- ui.Button,
1502
- {
1503
- variant: "secondary",
1504
- size: "small",
1505
- onClick: () => handlePreviewTemplate(settings.estimate_template || "zoho_exact", "estimate"),
1506
- isLoading: previewLoading === `${settings.estimate_template || "zoho_exact"}-estimate`,
1507
- children: [
1508
- /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowDownTray, { className: "w-3.5 h-3.5 mr-1" }),
1509
- " Preview Estimate Template"
1510
- ]
1511
- }
1512
- ) })
1795
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-5 pt-3 border-t border-ui-border-base flex items-center justify-between", children: [
1796
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-[11px] text-ui-fg-muted font-mono", children: "Preset: service_completion" }),
1797
+ /* @__PURE__ */ jsxRuntime.jsxs(
1798
+ ui.Button,
1799
+ {
1800
+ variant: "secondary",
1801
+ size: "small",
1802
+ onClick: () => handlePreviewTemplate(settings.custom_doc_template || "modern", "custom", "service_completion"),
1803
+ isLoading: previewLoading === `${settings.custom_doc_template || "modern"}-custom-service_completion`,
1804
+ children: [
1805
+ /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowDownTray, { className: "w-3.5 h-3.5 mr-1" }),
1806
+ " Preview Certificate"
1807
+ ]
1808
+ }
1809
+ )
1810
+ ] })
1513
1811
  ] }),
1514
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-4 border border-ui-border-base rounded-lg bg-ui-bg-base flex flex-col justify-between", children: [
1812
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-5 border border-ui-border-base rounded-lg bg-ui-bg-base flex flex-col justify-between shadow-sm hover:border-ui-border-interactive transition-colors", children: [
1515
1813
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1516
- /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "font-semibold text-sm", children: "Custom Document Template" }),
1517
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-xs text-ui-fg-subtle mb-3", children: "Used for certificates, agreements, and customized memos." }),
1814
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between mb-2", children: [
1815
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
1816
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xl", children: "🤝" }),
1817
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "font-semibold text-sm", children: "Asset Handover & Custody" })
1818
+ ] }),
1819
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { color: "blue", size: "small", children: "Custody Release" })
1820
+ ] }),
1821
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-xs text-ui-fg-subtle mb-4", children: "Official physical custody and equipment return agreement acknowledging customer receipt in verified working condition." }),
1822
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
1823
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "text-xs font-medium", children: "Template Style" }),
1824
+ /* @__PURE__ */ jsxRuntime.jsxs(
1825
+ ui.Select,
1826
+ {
1827
+ value: settings.custom_doc_template || "modern",
1828
+ onValueChange: (v) => updateSettingField("custom_doc_template", v),
1829
+ children: [
1830
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Trigger, { size: "small", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Value, {}) }),
1831
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Select.Content, { children: [
1832
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "modern", children: "Modern Minimalist" }),
1833
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "classic", children: "Classic Corporate" }),
1834
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "minimal", children: "Clean Tech Monospace" })
1835
+ ] })
1836
+ ]
1837
+ }
1838
+ )
1839
+ ] })
1840
+ ] }),
1841
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-5 pt-3 border-t border-ui-border-base flex items-center justify-between", children: [
1842
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-[11px] text-ui-fg-muted font-mono", children: "Preset: handover" }),
1518
1843
  /* @__PURE__ */ jsxRuntime.jsxs(
1519
- ui.Select,
1844
+ ui.Button,
1520
1845
  {
1521
- value: settings.custom_doc_template || "modern",
1522
- onValueChange: (v) => updateSettingField("custom_doc_template", v),
1846
+ variant: "secondary",
1847
+ size: "small",
1848
+ onClick: () => handlePreviewTemplate(settings.custom_doc_template || "modern", "custom", "handover"),
1849
+ isLoading: previewLoading === `${settings.custom_doc_template || "modern"}-custom-handover`,
1523
1850
  children: [
1524
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Trigger, { size: "small", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Value, {}) }),
1525
- /* @__PURE__ */ jsxRuntime.jsxs(ui.Select.Content, { children: [
1526
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "modern", children: "Modern Minimalist" }),
1527
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "classic", children: "Classic Corporate" }),
1528
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "minimal", children: "Clean Tech Monospace" }),
1529
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "zoho_exact", children: "Zoho Books Exact Layout" })
1530
- ] })
1851
+ /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowDownTray, { className: "w-3.5 h-3.5 mr-1" }),
1852
+ " Preview Handover"
1531
1853
  ]
1532
1854
  }
1533
1855
  )
1856
+ ] })
1857
+ ] }),
1858
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-5 border border-ui-border-base rounded-lg bg-ui-bg-base flex flex-col justify-between shadow-sm hover:border-ui-border-interactive transition-colors", children: [
1859
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1860
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between mb-2", children: [
1861
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
1862
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xl", children: "💼" }),
1863
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "font-semibold text-sm", children: "Commercial Proforma Quote" })
1864
+ ] }),
1865
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { color: "orange", size: "small", children: "Cost Estimate" })
1866
+ ] }),
1867
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-xs text-ui-fg-subtle mb-4", children: "Itemized corporate repair quotation with workshop turnaround estimate, OEM part warranties, and 14-day validity period." }),
1868
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
1869
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "text-xs font-medium", children: "Template Style" }),
1870
+ /* @__PURE__ */ jsxRuntime.jsxs(
1871
+ ui.Select,
1872
+ {
1873
+ value: settings.custom_doc_template || "modern",
1874
+ onValueChange: (v) => updateSettingField("custom_doc_template", v),
1875
+ children: [
1876
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Trigger, { size: "small", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Value, {}) }),
1877
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Select.Content, { children: [
1878
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "modern", children: "Modern Minimalist" }),
1879
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "classic", children: "Classic Corporate" }),
1880
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "minimal", children: "Clean Tech Monospace" })
1881
+ ] })
1882
+ ]
1883
+ }
1884
+ )
1885
+ ] })
1534
1886
  ] }),
1535
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-4 pt-3 border-t border-ui-border-base flex justify-end", children: /* @__PURE__ */ jsxRuntime.jsxs(
1536
- ui.Button,
1537
- {
1538
- variant: "secondary",
1539
- size: "small",
1540
- onClick: () => handlePreviewTemplate(settings.custom_doc_template || "modern", "custom"),
1541
- isLoading: previewLoading === `${settings.custom_doc_template || "modern"}-custom`,
1542
- children: [
1543
- /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowDownTray, { className: "w-3.5 h-3.5 mr-1" }),
1544
- " Preview Custom Doc Template"
1545
- ]
1546
- }
1547
- ) })
1887
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-5 pt-3 border-t border-ui-border-base flex items-center justify-between", children: [
1888
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-[11px] text-ui-fg-muted font-mono", children: "Preset: proforma" }),
1889
+ /* @__PURE__ */ jsxRuntime.jsxs(
1890
+ ui.Button,
1891
+ {
1892
+ variant: "secondary",
1893
+ size: "small",
1894
+ onClick: () => handlePreviewTemplate(settings.custom_doc_template || "modern", "custom", "proforma"),
1895
+ isLoading: previewLoading === `${settings.custom_doc_template || "modern"}-custom-proforma`,
1896
+ children: [
1897
+ /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowDownTray, { className: "w-3.5 h-3.5 mr-1" }),
1898
+ " Preview Proforma"
1899
+ ]
1900
+ }
1901
+ )
1902
+ ] })
1548
1903
  ] }),
1549
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-4 border border-ui-border-base rounded-lg bg-ui-bg-base flex flex-col justify-between", children: [
1904
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-5 border border-ui-border-base rounded-lg bg-ui-bg-base flex flex-col justify-between shadow-sm hover:border-ui-border-interactive transition-colors", children: [
1550
1905
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1551
- /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "font-semibold text-sm", children: "Repair Job Card Template" }),
1552
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-xs text-ui-fg-subtle mb-3", children: "Workshop intake job card with device specs, inspection checklist & technician sign-off." }),
1906
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between mb-2", children: [
1907
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
1908
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xl", children: "🔄" }),
1909
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "font-semibold text-sm", children: "Device Trade-In Agreement" })
1910
+ ] }),
1911
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { color: "green", size: "small", children: "Trade-In & Transfer" })
1912
+ ] }),
1913
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-xs text-ui-fg-subtle mb-4", children: "Official contract confirming hardware valuation, title handover, and trade-in store credit with verified ownership transfer." }),
1914
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
1915
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "text-xs font-medium", children: "Template Style" }),
1916
+ /* @__PURE__ */ jsxRuntime.jsxs(
1917
+ ui.Select,
1918
+ {
1919
+ value: settings.custom_doc_template || "modern",
1920
+ onValueChange: (v) => updateSettingField("custom_doc_template", v),
1921
+ children: [
1922
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Trigger, { size: "small", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Value, {}) }),
1923
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Select.Content, { children: [
1924
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "modern", children: "Modern Minimalist" }),
1925
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "classic", children: "Classic Corporate" }),
1926
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "minimal", children: "Clean Tech Monospace" })
1927
+ ] })
1928
+ ]
1929
+ }
1930
+ )
1931
+ ] })
1932
+ ] }),
1933
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-5 pt-3 border-t border-ui-border-base flex items-center justify-between", children: [
1934
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-[11px] text-ui-fg-muted font-mono", children: "Preset: trade_in" }),
1553
1935
  /* @__PURE__ */ jsxRuntime.jsxs(
1554
- ui.Select,
1936
+ ui.Button,
1555
1937
  {
1556
- value: settings.job_card_template || "standard",
1557
- onValueChange: (v) => updateSettingField("job_card_template", v),
1938
+ variant: "secondary",
1939
+ size: "small",
1940
+ onClick: () => handlePreviewTemplate(settings.custom_doc_template || "modern", "custom", "trade_in"),
1941
+ isLoading: previewLoading === `${settings.custom_doc_template || "modern"}-custom-trade_in`,
1558
1942
  children: [
1559
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Trigger, { size: "small", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Value, {}) }),
1560
- /* @__PURE__ */ jsxRuntime.jsxs(ui.Select.Content, { children: [
1561
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "standard", children: "Workshop Intake Job Card (Standard)" }),
1562
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "zoho_exact", children: "Zoho Books Exact Layout" }),
1563
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "modern", children: "Modern Minimalist" }),
1564
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "classic", children: "Classic Corporate" }),
1565
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "minimal", children: "Clean Tech Monospace" })
1566
- ] })
1943
+ /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowDownTray, { className: "w-3.5 h-3.5 mr-1" }),
1944
+ " Preview Trade-In"
1567
1945
  ]
1568
1946
  }
1569
1947
  )
1948
+ ] })
1949
+ ] }),
1950
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-5 border border-ui-border-base rounded-lg bg-ui-bg-base flex flex-col justify-between shadow-sm hover:border-ui-border-interactive transition-colors", children: [
1951
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1952
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between mb-2", children: [
1953
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
1954
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xl", children: "♻️" }),
1955
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "font-semibold text-sm", children: "Destruction & Disposal" })
1956
+ ] }),
1957
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { color: "red", size: "small", children: "Eco & Compliance" })
1958
+ ] }),
1959
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-xs text-ui-fg-subtle mb-4", children: "Certificate verifying compliant electronic demanufacturing, physical shredding, and WEEE eco-friendly recycling." }),
1960
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
1961
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "text-xs font-medium", children: "Template Style" }),
1962
+ /* @__PURE__ */ jsxRuntime.jsxs(
1963
+ ui.Select,
1964
+ {
1965
+ value: settings.custom_doc_template || "modern",
1966
+ onValueChange: (v) => updateSettingField("custom_doc_template", v),
1967
+ children: [
1968
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Trigger, { size: "small", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Value, {}) }),
1969
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Select.Content, { children: [
1970
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "modern", children: "Modern Minimalist" }),
1971
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "classic", children: "Classic Corporate" }),
1972
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: "minimal", children: "Clean Tech Monospace" })
1973
+ ] })
1974
+ ]
1975
+ }
1976
+ )
1977
+ ] })
1570
1978
  ] }),
1571
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-4 pt-3 border-t border-ui-border-base flex justify-end", children: /* @__PURE__ */ jsxRuntime.jsxs(
1572
- ui.Button,
1573
- {
1574
- variant: "secondary",
1575
- size: "small",
1576
- onClick: () => handlePreviewTemplate(settings.job_card_template || "standard", "job_card"),
1577
- isLoading: previewLoading === `${settings.job_card_template || "standard"}-job_card`,
1578
- children: [
1579
- /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowDownTray, { className: "w-3.5 h-3.5 mr-1" }),
1580
- " Preview Job Card Template"
1581
- ]
1582
- }
1583
- ) })
1979
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-5 pt-3 border-t border-ui-border-base flex items-center justify-between", children: [
1980
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-[11px] text-ui-fg-muted font-mono", children: "Preset: destruction" }),
1981
+ /* @__PURE__ */ jsxRuntime.jsxs(
1982
+ ui.Button,
1983
+ {
1984
+ variant: "secondary",
1985
+ size: "small",
1986
+ onClick: () => handlePreviewTemplate(settings.custom_doc_template || "modern", "custom", "destruction"),
1987
+ isLoading: previewLoading === `${settings.custom_doc_template || "modern"}-custom-destruction`,
1988
+ children: [
1989
+ /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowDownTray, { className: "w-3.5 h-3.5 mr-1" }),
1990
+ " Preview Disposal"
1991
+ ]
1992
+ }
1993
+ )
1994
+ ] })
1584
1995
  ] })
1585
1996
  ] }),
1586
1997
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-3 mt-4", children: [