@infuro/cms-core 1.0.63 → 1.0.65

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.
Files changed (50) hide show
  1. package/dist/admin.cjs +183 -65
  2. package/dist/admin.js +183 -65
  3. package/dist/api.cjs +40 -40
  4. package/dist/api.d.cts +2 -0
  5. package/dist/api.d.ts +2 -0
  6. package/dist/api.js +8 -8
  7. package/dist/{chunk-KAOHOHCA.js → chunk-6YOQ7G5O.js} +92 -51
  8. package/dist/{chunk-BWOITUNI.js → chunk-ACBN6UWZ.js} +320 -81
  9. package/dist/chunk-BXAKL2TF.cjs +84 -0
  10. package/dist/{chunk-7L556RGL.cjs → chunk-GLD263KW.cjs} +3 -3
  11. package/dist/{chunk-EWXG4E74.cjs → chunk-NIRYYJIJ.cjs} +330 -91
  12. package/dist/{chunk-MWEK7N3F.js → chunk-OPJEV44S.js} +2 -2
  13. package/dist/{chunk-DTUL3Q5L.js → chunk-RDEVZMO5.js} +36 -20
  14. package/dist/{chunk-77YWLP4X.js → chunk-SANKKGB3.js} +68 -32
  15. package/dist/chunk-THL5JDWJ.cjs +101 -0
  16. package/dist/{chunk-RXTUSF3R.js → chunk-TU23GJPJ.js} +2 -2
  17. package/dist/{chunk-JLDHK2QE.cjs → chunk-TZEMLHSP.cjs} +20 -14
  18. package/dist/{chunk-RHYVNRYG.cjs → chunk-V6EYAC7X.cjs} +38 -22
  19. package/dist/{chunk-YVP4NQII.cjs → chunk-VM6OVUUM.cjs} +93 -52
  20. package/dist/{chunk-MXABMVF7.cjs → chunk-XFDIIVZB.cjs} +4 -4
  21. package/dist/chunk-XJNNOSJR.js +98 -0
  22. package/dist/chunk-YEAXE4U2.js +77 -0
  23. package/dist/{chunk-CJEOH6QC.cjs → chunk-YHEITFHR.cjs} +112 -76
  24. package/dist/{chunk-3VZAAQUV.js → chunk-YRCKEGL2.js} +20 -14
  25. package/dist/{email-queue-VTYL2KFA.cjs → email-queue-4OY45JIU.cjs} +7 -7
  26. package/dist/{email-queue-YPRSVG56.js → email-queue-HGXB2FIS.js} +3 -3
  27. package/dist/{email-service-ATCPJFWG.cjs → email-service-5O24BSFR.cjs} +7 -7
  28. package/dist/{email-service-DPKVQOKP.js → email-service-ADDF52PJ.js} +2 -2
  29. package/dist/{emit-order-notification-trigger-WI4HGMKH.cjs → emit-order-notification-trigger-DR74TQXN.cjs} +4 -4
  30. package/dist/{emit-order-notification-trigger-XVG2B5ZF.js → emit-order-notification-trigger-UCKJHDQK.js} +2 -2
  31. package/dist/{erp-order-invoice-3UGWLICU.js → erp-order-invoice-H6HCJ7YS.js} +2 -2
  32. package/dist/{erp-order-invoice-KJYJNWMG.cjs → erp-order-invoice-YUSPZ7CE.cjs} +6 -6
  33. package/dist/index.cjs +279 -265
  34. package/dist/index.d.cts +46 -22
  35. package/dist/index.d.ts +46 -22
  36. package/dist/index.js +43 -29
  37. package/dist/migrations/1783000000000-AddOrderPendingProcessingCompletedTriggers.ts +15 -39
  38. package/dist/migrations/1783300000000-SeedOrderNotificationTriggersAndTemplates.ts +155 -0
  39. package/dist/{order-completion-otp-handlers-WGM7HWG4.js → order-completion-otp-handlers-CH22ZRAI.js} +5 -5
  40. package/dist/{order-completion-otp-handlers-IMMQGHDR.cjs → order-completion-otp-handlers-RW5RSXH3.cjs} +7 -7
  41. package/dist/{order-notification-dispatcher-JKFQJYGG.js → order-notification-dispatcher-3TXUAJ7L.js} +6 -6
  42. package/dist/{order-notification-dispatcher-5TUFCDU7.cjs → order-notification-dispatcher-Y7NZAALH.cjs} +11 -11
  43. package/dist/{pg-boss-service-L6MTF4EQ.cjs → pg-boss-service-BDGOKM2T.cjs} +3 -3
  44. package/dist/pg-boss-service-WCBJD4JB.js +2 -0
  45. package/package.json +1 -1
  46. package/dist/chunk-AYWDQFJZ.js +0 -27
  47. package/dist/chunk-GO7PPYNU.js +0 -76
  48. package/dist/chunk-UEE4PTTB.cjs +0 -30
  49. package/dist/chunk-XQ3QUHWR.cjs +0 -83
  50. package/dist/pg-boss-service-4XF2TQ2E.js +0 -2
package/dist/admin.js CHANGED
@@ -861,7 +861,7 @@ var init_admin_config_context = __esm({
861
861
  var CMS_VERSION;
862
862
  var init_cms_version = __esm({
863
863
  "src/lib/cms-version.ts"() {
864
- CMS_VERSION = "1.0.63" ;
864
+ CMS_VERSION = "1.0.65" ;
865
865
  }
866
866
  });
867
867
  function useCatalogCategories(enabled = true) {
@@ -16318,99 +16318,140 @@ var init_order_notification_bindings_shared = __esm({
16318
16318
  "refundAmount",
16319
16319
  "invoiceNumber",
16320
16320
  "invoiceAttachment",
16321
- "orderDetails"
16321
+ "orderDetails",
16322
+ "assigneeName",
16323
+ "assigneePhone",
16324
+ "timeSlot",
16325
+ "serviceDate",
16326
+ "taskDescription",
16327
+ "customerAddress"
16322
16328
  ];
16323
16329
  __name(useNotificationVariables, "useNotificationVariables");
16324
16330
  ORDER_NOTIFICATION_EVENT_TRIGGERS = [
16325
16331
  {
16326
- key: "order_pending",
16327
- label: "Order Pending",
16328
- description: "When an order is created and pending confirmation or payment"
16332
+ key: "order_placed",
16333
+ label: "Order placed",
16334
+ description: "Fires when a new order is created (storefront checkout or admin)."
16329
16335
  },
16330
16336
  {
16331
- key: "order_processing",
16332
- label: "Order Processing",
16333
- description: "When an order is assigned and starts processing"
16337
+ key: "order_pending",
16338
+ label: "Order pending",
16339
+ description: "Fires when an order is in pending status (awaiting payment or review)."
16334
16340
  },
16335
16341
  {
16336
- key: "order_completed",
16337
- label: "Order Completed",
16338
- description: "When an order is verified with OTP and completed"
16342
+ key: "order_assigned",
16343
+ label: "Order assigned (Customer)",
16344
+ description: "Fires when a teammate is assigned to the order (notifies customer with assignee details and scheduled time slot)."
16339
16345
  },
16340
16346
  {
16341
- key: "order_placed",
16342
- label: "Order Placed / Confirmed",
16343
- description: "When a new order is created or confirmed"
16347
+ key: "order_assigned_assignee",
16348
+ label: "Task assigned (Assignee)",
16349
+ description: "Fires when a task is assigned to a teammate (notifies assignee with task description and customer details)."
16344
16350
  },
16345
16351
  {
16346
16352
  key: "order_cancelled",
16347
- label: "Order Cancelled",
16348
- description: "When an order is cancelled"
16353
+ label: "Order cancelled",
16354
+ description: "Fires when an order is cancelled (includes refund amount when applicable)."
16355
+ },
16356
+ {
16357
+ key: "order_processing",
16358
+ label: "Order processing",
16359
+ description: "Fires when an order status changes to processing."
16349
16360
  },
16350
16361
  {
16351
16362
  key: "payment_success",
16352
- label: "Payment Success",
16353
- description: "When order payment status is paid"
16363
+ label: "Payment success",
16364
+ description: "Fires when order is placed and payment status is paid."
16365
+ },
16366
+ {
16367
+ key: "order_completed",
16368
+ label: "Order completed",
16369
+ description: "Fires when an order status changes to completed / fulfilled."
16354
16370
  },
16355
16371
  {
16356
16372
  key: "payment_failed",
16357
- label: "Payment Failed",
16358
- description: "When payment status is unpaid or failed"
16373
+ label: "Payment failed",
16374
+ description: "Fires when payment status is pending, unpaid, or failed, or when order is cancelled without payment."
16359
16375
  },
16360
16376
  {
16361
16377
  key: "payment_refund_initiated",
16362
- label: "Payment Refund Initiated",
16363
- description: "When refund is initiated for cancelled order"
16378
+ label: "Payment refund initiated",
16379
+ description: "Fires when order is cancelled and its payment status is paid (refund initiated)."
16364
16380
  }
16365
16381
  ];
16366
16382
  EMAIL_TRIGGER_DEFAULTS = {
16367
- order_pending: {
16368
- subject: "Your order {{orderNumber}} is pending",
16369
- subjectPlaceholder: "e.g. Your order {{orderNumber}} is pending",
16383
+ order_placed: {
16384
+ subject: "Your order {{orderNumber}} is confirmed",
16385
+ subjectPlaceholder: "e.g. Your order {{orderNumber}} is confirmed",
16370
16386
  body: `Hi {{customerName}},
16371
16387
 
16372
- Thank you for your order {{orderNumber}}! It is currently pending confirmation.
16373
-
16374
- Order Total: {{total}} {{currency}}
16388
+ Thank you for your order! Your order {{orderNumber}} for {{total}} {{currency}} has been confirmed.
16375
16389
 
16376
16390
  Order Details:
16377
- {{orderDetails}}`,
16378
- bodyPlaceholder: "Hi {{customerName}},\n\nYour order {{orderNumber}} is pending."
16379
- },
16380
- order_processing: {
16381
- subject: "Your order {{orderNumber}} is now processing",
16382
- subjectPlaceholder: "e.g. Your order {{orderNumber}} is now processing",
16383
- body: `Hi {{customerName}},
16391
+ {{orderDetails}}
16384
16392
 
16385
- Your order {{orderNumber}} is now being processed by our team.
16393
+ Your Tax Invoice PDF is attached to this email for your records.
16386
16394
 
16387
- Vendor: {{vendorName}}`,
16388
- bodyPlaceholder: "Hi {{customerName}},\n\nYour order {{orderNumber}} is processing."
16395
+ Thank you!`,
16396
+ bodyPlaceholder: "Hi {{customerName}},\n\nYour order {{orderNumber}} for {{total}} {{currency}} is confirmed.\n\nThank you!"
16389
16397
  },
16390
- order_completed: {
16391
- subject: "Your order {{orderNumber}} has been completed",
16392
- subjectPlaceholder: "e.g. Your order {{orderNumber}} has been completed",
16398
+ order_pending: {
16399
+ subject: "Your order {{orderNumber}} is Pending",
16400
+ subjectPlaceholder: "e.g. Your order {{orderNumber}} is Pending",
16393
16401
  body: `Hi {{customerName}},
16394
16402
 
16395
- Your order {{orderNumber}} has been successfully completed! Thank you for choosing us.
16403
+ Your order {{orderNumber}} for {{total}} {{currency}} is currently pending.
16396
16404
 
16397
- Invoice: {{invoiceNumber}}`,
16398
- bodyPlaceholder: "Hi {{customerName}},\n\nYour order {{orderNumber}} is completed."
16405
+ Order Details:
16406
+ {{orderDetails}}
16407
+
16408
+ We will update you as soon as your order status changes.
16409
+
16410
+ Thank you!`,
16411
+ bodyPlaceholder: "Hi {{customerName}},\n\nYour order {{orderNumber}} is pending."
16399
16412
  },
16400
- order_placed: {
16401
- subject: "Your order {{orderNumber}} is confirmed",
16402
- subjectPlaceholder: "e.g. Your order {{orderNumber}} is confirmed",
16413
+ order_assigned: {
16414
+ subject: "Your service expert has been assigned for order {{orderNumber}}",
16415
+ subjectPlaceholder: "e.g. Your service expert has been assigned for order {{orderNumber}}",
16403
16416
  body: `Hi {{customerName}},
16404
16417
 
16405
- Thank you for your order! Your order {{orderNumber}} for {{total}} {{currency}} has been confirmed.
16418
+ A service expert has been assigned to your order {{orderNumber}}.
16419
+
16420
+ Assignee Details:
16421
+ \u2022 Name: {{assigneeName}}
16422
+ \u2022 Phone: {{assigneePhone}}
16423
+
16424
+ Your expert will reach you by your scheduled time slot:
16425
+ \u2022 Date: {{serviceDate}}
16426
+ \u2022 Slot: {{timeSlot}}
16406
16427
 
16407
16428
  Order Details:
16408
16429
  {{orderDetails}}
16409
16430
 
16410
- Your Tax Invoice PDF is attached to this email for your records.
16411
-
16412
16431
  Thank you!`,
16413
- bodyPlaceholder: "Hi {{customerName}},\n\nYour order {{orderNumber}} for {{total}} {{currency}} is confirmed.\n\nThank you!"
16432
+ bodyPlaceholder: "Hi {{customerName}},\n\nAn expert has been assigned for order {{orderNumber}}."
16433
+ },
16434
+ order_assigned_assignee: {
16435
+ subject: "New task assigned: Order {{orderNumber}}",
16436
+ subjectPlaceholder: "e.g. New task assigned: Order {{orderNumber}}",
16437
+ body: `Hi {{assigneeName}},
16438
+
16439
+ A new task has been assigned to you for order {{orderNumber}}.
16440
+
16441
+ Task Details:
16442
+ {{taskDescription}}
16443
+
16444
+ Customer Details:
16445
+ \u2022 Name: {{customerName}}
16446
+ \u2022 Phone: {{customerPhone}}
16447
+ \u2022 Address: {{customerAddress}}
16448
+
16449
+ Schedule:
16450
+ \u2022 Date: {{serviceDate}}
16451
+ \u2022 Slot: {{timeSlot}}
16452
+
16453
+ Please arrive promptly within the scheduled time slot.`,
16454
+ bodyPlaceholder: "Hi {{assigneeName}},\n\nA new task {{orderNumber}} has been assigned to you."
16414
16455
  },
16415
16456
  order_cancelled: {
16416
16457
  subject: "Your order {{orderNumber}} has been cancelled",
@@ -16426,6 +16467,21 @@ If you have any questions, please contact us.
16426
16467
  Thank you!`,
16427
16468
  bodyPlaceholder: "Hi {{customerName}},\n\nYour order {{orderNumber}} has been cancelled.\n\nIf a refund is due, it will be returned to your original payment method."
16428
16469
  },
16470
+ order_processing: {
16471
+ subject: "Your order {{orderNumber}} is now Processing",
16472
+ subjectPlaceholder: "e.g. Your order {{orderNumber}} is now Processing",
16473
+ body: `Hi {{customerName}},
16474
+
16475
+ Your order {{orderNumber}} for {{total}} {{currency}} is currently being processed.
16476
+
16477
+ Order Details:
16478
+ {{orderDetails}}
16479
+
16480
+ We will notify you once it is completed.
16481
+
16482
+ Thank you!`,
16483
+ bodyPlaceholder: "Hi {{customerName}},\n\nYour order {{orderNumber}} is processing."
16484
+ },
16429
16485
  payment_success: {
16430
16486
  subject: "Payment Successful for Order {{orderNumber}}",
16431
16487
  subjectPlaceholder: "e.g. Payment Successful for Order {{orderNumber}}",
@@ -16439,6 +16495,19 @@ Order Details:
16439
16495
  Thank you!`,
16440
16496
  bodyPlaceholder: "Hi {{customerName}},\n\nPayment for order {{orderNumber}} was successful.\n\nThank you!"
16441
16497
  },
16498
+ order_completed: {
16499
+ subject: "Your order {{orderNumber}} is Completed",
16500
+ subjectPlaceholder: "e.g. Your order {{orderNumber}} is Completed",
16501
+ body: `Hi {{customerName}},
16502
+
16503
+ Your order {{orderNumber}} for {{total}} {{currency}} has been completed.
16504
+
16505
+ Order Details:
16506
+ {{orderDetails}}
16507
+
16508
+ Thank you for choosing us!`,
16509
+ bodyPlaceholder: "Hi {{customerName}},\n\nYour order {{orderNumber}} is completed."
16510
+ },
16442
16511
  payment_failed: {
16443
16512
  subject: "Payment Failed for Order {{orderNumber}}",
16444
16513
  subjectPlaceholder: "e.g. Payment Failed for Order {{orderNumber}}",
@@ -17371,7 +17440,13 @@ var init_emailTriggersBindingsPage = __esm({
17371
17440
  refundAmount: "Refund amount (refund triggers)",
17372
17441
  invoiceNumber: "Generated invoice number",
17373
17442
  invoiceAttachment: "Include this variable to attach Tax Invoice PDF to email",
17374
- orderDetails: "Formatted item details summary"
17443
+ orderDetails: "Formatted item details summary",
17444
+ assigneeName: "Name of assigned teammate / technician",
17445
+ assigneePhone: "Phone number of assigned teammate",
17446
+ timeSlot: "Scheduled service slot / arrival window",
17447
+ serviceDate: "Scheduled service / booking date",
17448
+ taskDescription: "Task summary / service details for assignee",
17449
+ customerAddress: "Full service or delivery address"
17375
17450
  };
17376
17451
  __name(EmailTriggerBindings, "EmailTriggerBindings");
17377
17452
  __name(TriggerEmailEditor, "TriggerEmailEditor");
@@ -17678,7 +17753,13 @@ var init_pushTriggersBindingsPage = __esm({
17678
17753
  refundAmount: "Refund amount (refund triggers)",
17679
17754
  invoiceNumber: "Generated invoice number",
17680
17755
  invoiceAttachment: "Include this variable to attach Tax Invoice PDF to email",
17681
- orderDetails: "Formatted item details summary"
17756
+ orderDetails: "Formatted item details summary",
17757
+ assigneeName: "Name of assigned teammate / technician",
17758
+ assigneePhone: "Phone number of assigned teammate",
17759
+ timeSlot: "Scheduled service slot / arrival window",
17760
+ serviceDate: "Scheduled service / booking date",
17761
+ taskDescription: "Task summary / service details for assignee",
17762
+ customerAddress: "Full service or delivery address"
17682
17763
  };
17683
17764
  __name(PushTriggerBindings, "PushTriggerBindings");
17684
17765
  }
@@ -20845,14 +20926,14 @@ function PluginSettingsPanel({ descriptor, onSaved }) {
20845
20926
  placeholder: "e.g. crm@example.com"
20846
20927
  }), /* @__PURE__ */ React.createElement("p", {
20847
20928
  className: "text-xs text-gray-500 dark:text-gray-400"
20848
- }, "Layout below merges with Branding and Store settings. Upload a logo here (or in Settings \u2192 Store \u2192 Company Logo) \u2014 email uses that image in the header. Prefer a publicly reachable URL in production."), /* @__PURE__ */ React.createElement("div", {
20929
+ }, "Email header/footer use ", /* @__PURE__ */ React.createElement("strong", null, "Settings \u2192 Store \u2192 Invoice Header & Store Details"), " (logo, company name, email, phone, address). Social links and disclaimer below are email-only extras."), /* @__PURE__ */ React.createElement("div", {
20849
20930
  className: "space-y-1"
20850
20931
  }, /* @__PURE__ */ React.createElement(ImageOrUrlField, {
20851
- label: "Email logo (upload or URL)",
20932
+ label: "Email logo override (optional)",
20852
20933
  value: logoUrl,
20853
20934
  onChange: setLogoUrl,
20854
20935
  previewVariant: "logo",
20855
- placeholder: "Upload image or paste https://\u2026",
20936
+ placeholder: "Leave empty to use Store company logo",
20856
20937
  inputClassName: "h-8 text-sm w-full rounded-md border border-input bg-background px-3"
20857
20938
  })), /* @__PURE__ */ React.createElement("div", {
20858
20939
  className: "space-y-1"
@@ -24582,7 +24663,8 @@ function OrderDetailPage({ orderId }) {
24582
24663
  __name(handleRepostToErp, "handleRepostToErp");
24583
24664
  async function handleStartProcessing() {
24584
24665
  if (!order || startingProcessing) return;
24585
- if (!order.assignedUserId && !order.assignedUser) {
24666
+ const currentAssigneeId = order.assignedUserId ?? order.assignedUser?.id ?? null;
24667
+ if (!currentAssigneeId) {
24586
24668
  toast.info("Please assign a teammate before starting order processing.");
24587
24669
  handleOpenAssignModal();
24588
24670
  return;
@@ -24595,7 +24677,8 @@ function OrderDetailPage({ orderId }) {
24595
24677
  "Content-Type": "application/json"
24596
24678
  },
24597
24679
  body: JSON.stringify({
24598
- status: "processing"
24680
+ status: "processing",
24681
+ assignedUserId: currentAssigneeId
24599
24682
  })
24600
24683
  });
24601
24684
  const data = await res.json().catch(() => ({}));
@@ -24634,13 +24717,9 @@ function OrderDetailPage({ orderId }) {
24634
24717
  if (!order) return;
24635
24718
  setSavingAssignee(true);
24636
24719
  try {
24637
- const isConfirmedOrPending = order.status === "confirmed" || order.status === "pending";
24638
24720
  const bodyPayload = {
24639
24721
  assignedUserId: selectedAssigneeId
24640
24722
  };
24641
- if (selectedAssigneeId && isConfirmedOrPending) {
24642
- bodyPayload.status = "processing";
24643
- }
24644
24723
  const res = await fetch(`/api/orders/${orderId}`, {
24645
24724
  method: "PUT",
24646
24725
  headers: {
@@ -24656,7 +24735,7 @@ function OrderDetailPage({ orderId }) {
24656
24735
  const updated = await fetch(`/api/orders/${orderId}`);
24657
24736
  if (updated.ok) setOrder(await updated.json());
24658
24737
  setAssignModalOpen(false);
24659
- toast.success(selectedAssigneeId && isConfirmedOrPending ? "Order assigned and moved to processing" : selectedAssigneeId ? "Order assigned successfully" : "Assignee removed");
24738
+ toast.success(selectedAssigneeId ? "Order assigned successfully" : "Assignee removed");
24660
24739
  } catch {
24661
24740
  toast.error("Failed to update assignee");
24662
24741
  } finally {
@@ -26076,6 +26155,7 @@ function OrderPlacementPage({ editOrderId }) {
26076
26155
  const [orderDate, setOrderDate] = useState(() => (/* @__PURE__ */ new Date()).toISOString().slice(0, 10));
26077
26156
  const [bookingDate, setBookingDate] = useState("");
26078
26157
  const [slot, setSlot] = useState("");
26158
+ const [slotOptions, setSlotOptions] = useState([]);
26079
26159
  const [orderMetadata, setOrderMetadata] = useState({});
26080
26160
  const [loadingOrder, setLoadingOrder] = useState(Boolean(editOrderId));
26081
26161
  const [orderLoadError, setOrderLoadError] = useState(null);
@@ -26112,6 +26192,33 @@ function OrderPlacementPage({ editOrderId }) {
26112
26192
  billingAddress,
26113
26193
  sameAsBilling
26114
26194
  ]);
26195
+ useEffect(() => {
26196
+ let cancelled = false;
26197
+ void (async () => {
26198
+ try {
26199
+ const res = await fetch("/api/admin/serviceable-areas", {
26200
+ credentials: "include"
26201
+ });
26202
+ if (!res.ok || cancelled) return;
26203
+ const json = await res.json();
26204
+ const cfg = json?.config;
26205
+ const times = Array.isArray(cfg?.slots) ? cfg.slots : [];
26206
+ const extras = cfg?.serviceSlots && typeof cfg.serviceSlots === "object" ? Object.values(cfg.serviceSlots).flat() : [];
26207
+ const combined = [
26208
+ ...times,
26209
+ ...extras
26210
+ ].map((s) => String(s ?? "").trim()).filter(Boolean);
26211
+ const unique = Array.from(new Set(combined));
26212
+ if (!cancelled && unique.length > 0) {
26213
+ setSlotOptions(unique);
26214
+ }
26215
+ } catch {
26216
+ }
26217
+ })();
26218
+ return () => {
26219
+ cancelled = true;
26220
+ };
26221
+ }, []);
26115
26222
  useEffect(() => {
26116
26223
  if (editOrderId) return;
26117
26224
  fetch("/api/settings/store").then((r) => r.ok ? r.json() : {}).then((data) => {
@@ -26962,6 +27069,9 @@ function OrderPlacementPage({ editOrderId }) {
26962
27069
  payload.accountCustomerId = selectedCustomerId;
26963
27070
  }
26964
27071
  if (coupons.length > 0) payload.discountId = coupons[0].discountId;
27072
+ if (!editOrderId && orderDate) {
27073
+ payload.createdAt = `${orderDate}T06:30:00.000Z`;
27074
+ }
26965
27075
  const url = editOrderId ? `/api/orders/${editOrderId}` : "/api/orders";
26966
27076
  const method = editOrderId ? "PUT" : "POST";
26967
27077
  const res = await fetch(url, {
@@ -27387,10 +27497,18 @@ function OrderPlacementPage({ editOrderId }) {
27387
27497
  htmlFor: "service-slot"
27388
27498
  }, "Slot"), /* @__PURE__ */ React.createElement(Input, {
27389
27499
  id: "service-slot",
27500
+ list: "admin-booking-slot-options",
27390
27501
  value: slot,
27391
27502
  onChange: /* @__PURE__ */ __name((e) => setSlot(e.target.value), "onChange"),
27392
- placeholder: "e.g. 10:00 AM - 01:00 PM"
27393
- })), /* @__PURE__ */ React.createElement("div", {
27503
+ placeholder: "Pick or type, e.g. 11:00 AM"
27504
+ }), /* @__PURE__ */ React.createElement("datalist", {
27505
+ id: "admin-booking-slot-options"
27506
+ }, slotOptions.map((t) => /* @__PURE__ */ React.createElement("option", {
27507
+ key: t,
27508
+ value: t
27509
+ }))), /* @__PURE__ */ React.createElement("p", {
27510
+ className: "text-[11px] text-gray-500"
27511
+ }, "Select a configured slot or type a custom time.")), /* @__PURE__ */ React.createElement("div", {
27394
27512
  className: "space-y-2 sm:col-span-1"
27395
27513
  }, /* @__PURE__ */ React.createElement(Label3, {
27396
27514
  htmlFor: "service-date"
package/dist/api.cjs CHANGED
@@ -1,18 +1,18 @@
1
1
  'use strict';
2
2
 
3
- var chunkCJEOH6QC_cjs = require('./chunk-CJEOH6QC.cjs');
3
+ var chunkYHEITFHR_cjs = require('./chunk-YHEITFHR.cjs');
4
4
  require('./chunk-WFMVD567.cjs');
5
- require('./chunk-XQ3QUHWR.cjs');
5
+ require('./chunk-THL5JDWJ.cjs');
6
6
  require('./chunk-HY3AXLOI.cjs');
7
- require('./chunk-EWXG4E74.cjs');
7
+ require('./chunk-NIRYYJIJ.cjs');
8
8
  require('./chunk-H3IVLIPR.cjs');
9
- require('./chunk-UEE4PTTB.cjs');
9
+ require('./chunk-BXAKL2TF.cjs');
10
10
  require('./chunk-7NMT3GBR.cjs');
11
- require('./chunk-YVP4NQII.cjs');
12
- require('./chunk-MXABMVF7.cjs');
13
- require('./chunk-7L556RGL.cjs');
11
+ require('./chunk-VM6OVUUM.cjs');
12
+ require('./chunk-XFDIIVZB.cjs');
13
+ require('./chunk-GLD263KW.cjs');
14
14
  require('./chunk-UPLVMVRX.cjs');
15
- require('./chunk-JLDHK2QE.cjs');
15
+ require('./chunk-TZEMLHSP.cjs');
16
16
  require('./chunk-3DZRIZOD.cjs');
17
17
  require('./chunk-OOTLNH63.cjs');
18
18
  require('./chunk-TJ2MIQUT.cjs');
@@ -26,131 +26,131 @@ require('./chunk-USNT2KNT.cjs');
26
26
 
27
27
  Object.defineProperty(exports, "autoExpireOrderIfPaymentTimeExceeded", {
28
28
  enumerable: true,
29
- get: function () { return chunkCJEOH6QC_cjs.autoExpireOrderIfPaymentTimeExceeded; }
29
+ get: function () { return chunkYHEITFHR_cjs.autoExpireOrderIfPaymentTimeExceeded; }
30
30
  });
31
31
  Object.defineProperty(exports, "createAnalyticsHandlers", {
32
32
  enumerable: true,
33
- get: function () { return chunkCJEOH6QC_cjs.createAnalyticsHandlers; }
33
+ get: function () { return chunkYHEITFHR_cjs.createAnalyticsHandlers; }
34
34
  });
35
35
  Object.defineProperty(exports, "createBlogBySlugHandler", {
36
36
  enumerable: true,
37
- get: function () { return chunkCJEOH6QC_cjs.createBlogBySlugHandler; }
37
+ get: function () { return chunkYHEITFHR_cjs.createBlogBySlugHandler; }
38
38
  });
39
39
  Object.defineProperty(exports, "createChangePasswordHandler", {
40
40
  enumerable: true,
41
- get: function () { return chunkCJEOH6QC_cjs.createChangePasswordHandler; }
41
+ get: function () { return chunkYHEITFHR_cjs.createChangePasswordHandler; }
42
42
  });
43
43
  Object.defineProperty(exports, "createCmsApiHandler", {
44
44
  enumerable: true,
45
- get: function () { return chunkCJEOH6QC_cjs.createCmsApiHandler; }
45
+ get: function () { return chunkYHEITFHR_cjs.createCmsApiHandler; }
46
46
  });
47
47
  Object.defineProperty(exports, "createCrudByIdHandler", {
48
48
  enumerable: true,
49
- get: function () { return chunkCJEOH6QC_cjs.createCrudByIdHandler; }
49
+ get: function () { return chunkYHEITFHR_cjs.createCrudByIdHandler; }
50
50
  });
51
51
  Object.defineProperty(exports, "createCrudHandler", {
52
52
  enumerable: true,
53
- get: function () { return chunkCJEOH6QC_cjs.createCrudHandler; }
53
+ get: function () { return chunkYHEITFHR_cjs.createCrudHandler; }
54
54
  });
55
55
  Object.defineProperty(exports, "createDashboardStatsHandler", {
56
56
  enumerable: true,
57
- get: function () { return chunkCJEOH6QC_cjs.createDashboardStatsHandler; }
57
+ get: function () { return chunkYHEITFHR_cjs.createDashboardStatsHandler; }
58
58
  });
59
59
  Object.defineProperty(exports, "createEcommerceAnalyticsHandler", {
60
60
  enumerable: true,
61
- get: function () { return chunkCJEOH6QC_cjs.createEcommerceAnalyticsHandler; }
61
+ get: function () { return chunkYHEITFHR_cjs.createEcommerceAnalyticsHandler; }
62
62
  });
63
63
  Object.defineProperty(exports, "createForgotPasswordHandler", {
64
64
  enumerable: true,
65
- get: function () { return chunkCJEOH6QC_cjs.createForgotPasswordHandler; }
65
+ get: function () { return chunkYHEITFHR_cjs.createForgotPasswordHandler; }
66
66
  });
67
67
  Object.defineProperty(exports, "createFormBySlugHandler", {
68
68
  enumerable: true,
69
- get: function () { return chunkCJEOH6QC_cjs.createFormBySlugHandler; }
69
+ get: function () { return chunkYHEITFHR_cjs.createFormBySlugHandler; }
70
70
  });
71
71
  Object.defineProperty(exports, "createInviteAcceptHandler", {
72
72
  enumerable: true,
73
- get: function () { return chunkCJEOH6QC_cjs.createInviteAcceptHandler; }
73
+ get: function () { return chunkYHEITFHR_cjs.createInviteAcceptHandler; }
74
74
  });
75
75
  Object.defineProperty(exports, "createJobScheduleHandlers", {
76
76
  enumerable: true,
77
- get: function () { return chunkCJEOH6QC_cjs.createJobScheduleHandlers; }
77
+ get: function () { return chunkYHEITFHR_cjs.createJobScheduleHandlers; }
78
78
  });
79
79
  Object.defineProperty(exports, "createLlmAgentKnowledgeHandlers", {
80
80
  enumerable: true,
81
- get: function () { return chunkCJEOH6QC_cjs.createLlmAgentKnowledgeHandlers; }
81
+ get: function () { return chunkYHEITFHR_cjs.createLlmAgentKnowledgeHandlers; }
82
82
  });
83
83
  Object.defineProperty(exports, "createMediaZipExtractHandler", {
84
84
  enumerable: true,
85
- get: function () { return chunkCJEOH6QC_cjs.createMediaZipExtractHandler; }
85
+ get: function () { return chunkYHEITFHR_cjs.createMediaZipExtractHandler; }
86
86
  });
87
87
  Object.defineProperty(exports, "createSetPasswordHandler", {
88
88
  enumerable: true,
89
- get: function () { return chunkCJEOH6QC_cjs.createSetPasswordHandler; }
89
+ get: function () { return chunkYHEITFHR_cjs.createSetPasswordHandler; }
90
90
  });
91
91
  Object.defineProperty(exports, "createSettingsApiHandlers", {
92
92
  enumerable: true,
93
- get: function () { return chunkCJEOH6QC_cjs.createSettingsApiHandlers; }
93
+ get: function () { return chunkYHEITFHR_cjs.createSettingsApiHandlers; }
94
94
  });
95
95
  Object.defineProperty(exports, "createStorefrontApiHandler", {
96
96
  enumerable: true,
97
- get: function () { return chunkCJEOH6QC_cjs.createStorefrontApiHandler; }
97
+ get: function () { return chunkYHEITFHR_cjs.createStorefrontApiHandler; }
98
98
  });
99
99
  Object.defineProperty(exports, "createUploadHandler", {
100
100
  enumerable: true,
101
- get: function () { return chunkCJEOH6QC_cjs.createUploadHandler; }
101
+ get: function () { return chunkYHEITFHR_cjs.createUploadHandler; }
102
102
  });
103
103
  Object.defineProperty(exports, "createUserAuthApiRouter", {
104
104
  enumerable: true,
105
- get: function () { return chunkCJEOH6QC_cjs.createUserAuthApiRouter; }
105
+ get: function () { return chunkYHEITFHR_cjs.createUserAuthApiRouter; }
106
106
  });
107
107
  Object.defineProperty(exports, "createUserAvatarHandler", {
108
108
  enumerable: true,
109
- get: function () { return chunkCJEOH6QC_cjs.createUserAvatarHandler; }
109
+ get: function () { return chunkYHEITFHR_cjs.createUserAvatarHandler; }
110
110
  });
111
111
  Object.defineProperty(exports, "createUserProfileHandler", {
112
112
  enumerable: true,
113
- get: function () { return chunkCJEOH6QC_cjs.createUserProfileHandler; }
113
+ get: function () { return chunkYHEITFHR_cjs.createUserProfileHandler; }
114
114
  });
115
115
  Object.defineProperty(exports, "createUsersApiHandlers", {
116
116
  enumerable: true,
117
- get: function () { return chunkCJEOH6QC_cjs.createUsersApiHandlers; }
117
+ get: function () { return chunkYHEITFHR_cjs.createUsersApiHandlers; }
118
118
  });
119
119
  Object.defineProperty(exports, "createVendorDashboardHandler", {
120
120
  enumerable: true,
121
- get: function () { return chunkCJEOH6QC_cjs.createVendorDashboardHandler; }
121
+ get: function () { return chunkYHEITFHR_cjs.createVendorDashboardHandler; }
122
122
  });
123
123
  Object.defineProperty(exports, "createVendorOnboardHandlers", {
124
124
  enumerable: true,
125
- get: function () { return chunkCJEOH6QC_cjs.createVendorOnboardHandlers; }
125
+ get: function () { return chunkYHEITFHR_cjs.createVendorOnboardHandlers; }
126
126
  });
127
127
  Object.defineProperty(exports, "getPublicSettingsGroup", {
128
128
  enumerable: true,
129
- get: function () { return chunkCJEOH6QC_cjs.getPublicSettingsGroup; }
129
+ get: function () { return chunkYHEITFHR_cjs.getPublicSettingsGroup; }
130
130
  });
131
131
  Object.defineProperty(exports, "mergeGuardrailsIntoSystemPrompt", {
132
132
  enumerable: true,
133
- get: function () { return chunkCJEOH6QC_cjs.mergeGuardrailsIntoSystemPrompt; }
133
+ get: function () { return chunkYHEITFHR_cjs.mergeGuardrailsIntoSystemPrompt; }
134
134
  });
135
135
  Object.defineProperty(exports, "parseLlmAgentValidationRules", {
136
136
  enumerable: true,
137
- get: function () { return chunkCJEOH6QC_cjs.parseLlmAgentValidationRules; }
137
+ get: function () { return chunkYHEITFHR_cjs.parseLlmAgentValidationRules; }
138
138
  });
139
139
  Object.defineProperty(exports, "simpleDecrypt", {
140
140
  enumerable: true,
141
- get: function () { return chunkCJEOH6QC_cjs.simpleDecrypt; }
141
+ get: function () { return chunkYHEITFHR_cjs.simpleDecrypt; }
142
142
  });
143
143
  Object.defineProperty(exports, "simpleEncrypt", {
144
144
  enumerable: true,
145
- get: function () { return chunkCJEOH6QC_cjs.simpleEncrypt; }
145
+ get: function () { return chunkYHEITFHR_cjs.simpleEncrypt; }
146
146
  });
147
147
  Object.defineProperty(exports, "validateUserMessageAgainstAgentRules", {
148
148
  enumerable: true,
149
- get: function () { return chunkCJEOH6QC_cjs.validateUserMessageAgainstAgentRules; }
149
+ get: function () { return chunkYHEITFHR_cjs.validateUserMessageAgainstAgentRules; }
150
150
  });
151
151
  Object.defineProperty(exports, "validateUserMessageAgainstStructuredRules", {
152
152
  enumerable: true,
153
- get: function () { return chunkCJEOH6QC_cjs.validateUserMessageAgainstStructuredRules; }
153
+ get: function () { return chunkYHEITFHR_cjs.validateUserMessageAgainstStructuredRules; }
154
154
  });
155
155
  Object.defineProperty(exports, "createCmsAuthBundle", {
156
156
  enumerable: true,
package/dist/api.d.cts CHANGED
@@ -181,6 +181,8 @@ interface CompanyDetails {
181
181
  companyName?: string;
182
182
  supportEmail?: string;
183
183
  supportPhone?: string;
184
+ /** From Store → Invoice Header & Store Details (`companyAddress`). */
185
+ companyAddress?: string;
184
186
  socialLinks?: SocialLinkItem[];
185
187
  /** Shown below footer rows; from email plugin settings */
186
188
  footerDisclaimer?: string;
package/dist/api.d.ts CHANGED
@@ -181,6 +181,8 @@ interface CompanyDetails {
181
181
  companyName?: string;
182
182
  supportEmail?: string;
183
183
  supportPhone?: string;
184
+ /** From Store → Invoice Header & Store Details (`companyAddress`). */
185
+ companyAddress?: string;
184
186
  socialLinks?: SocialLinkItem[];
185
187
  /** Shown below footer rows; from email plugin settings */
186
188
  footerDisclaimer?: string;
package/dist/api.js CHANGED
@@ -1,16 +1,16 @@
1
- export { autoExpireOrderIfPaymentTimeExceeded, createAnalyticsHandlers, createBlogBySlugHandler, createChangePasswordHandler, createCmsApiHandler, createCrudByIdHandler, createCrudHandler, createDashboardStatsHandler, createEcommerceAnalyticsHandler, createForgotPasswordHandler, createFormBySlugHandler, createInviteAcceptHandler, createJobScheduleHandlers, createLlmAgentKnowledgeHandlers, createMediaZipExtractHandler, createSetPasswordHandler, createSettingsApiHandlers, createStorefrontApiHandler, createUploadHandler, createUserAuthApiRouter, createUserAvatarHandler, createUserProfileHandler, createUsersApiHandlers, createVendorDashboardHandler, createVendorOnboardHandlers, getPublicSettingsGroup, mergeGuardrailsIntoSystemPrompt, parseLlmAgentValidationRules, simpleDecrypt, simpleEncrypt, validateUserMessageAgainstAgentRules, validateUserMessageAgainstStructuredRules } from './chunk-77YWLP4X.js';
1
+ export { autoExpireOrderIfPaymentTimeExceeded, createAnalyticsHandlers, createBlogBySlugHandler, createChangePasswordHandler, createCmsApiHandler, createCrudByIdHandler, createCrudHandler, createDashboardStatsHandler, createEcommerceAnalyticsHandler, createForgotPasswordHandler, createFormBySlugHandler, createInviteAcceptHandler, createJobScheduleHandlers, createLlmAgentKnowledgeHandlers, createMediaZipExtractHandler, createSetPasswordHandler, createSettingsApiHandlers, createStorefrontApiHandler, createUploadHandler, createUserAuthApiRouter, createUserAvatarHandler, createUserProfileHandler, createUsersApiHandlers, createVendorDashboardHandler, createVendorOnboardHandlers, getPublicSettingsGroup, mergeGuardrailsIntoSystemPrompt, parseLlmAgentValidationRules, simpleDecrypt, simpleEncrypt, validateUserMessageAgainstAgentRules, validateUserMessageAgainstStructuredRules } from './chunk-SANKKGB3.js';
2
2
  import './chunk-OVTOP42W.js';
3
- import './chunk-GO7PPYNU.js';
3
+ import './chunk-XJNNOSJR.js';
4
4
  import './chunk-3K5AIEIZ.js';
5
- import './chunk-BWOITUNI.js';
5
+ import './chunk-ACBN6UWZ.js';
6
6
  import './chunk-GWDI752Q.js';
7
- import './chunk-AYWDQFJZ.js';
7
+ import './chunk-YEAXE4U2.js';
8
8
  import './chunk-JXF23MPG.js';
9
- import './chunk-KAOHOHCA.js';
10
- import './chunk-RXTUSF3R.js';
11
- import './chunk-MWEK7N3F.js';
9
+ import './chunk-6YOQ7G5O.js';
10
+ import './chunk-TU23GJPJ.js';
11
+ import './chunk-OPJEV44S.js';
12
12
  import './chunk-JC6DLWTE.js';
13
- import './chunk-3VZAAQUV.js';
13
+ import './chunk-YRCKEGL2.js';
14
14
  import './chunk-MQBT33IV.js';
15
15
  import './chunk-CRFV5WJK.js';
16
16
  import './chunk-AYERBA7I.js';