@open-mercato/core 0.5.1-develop.2953.6647bb2c43 → 0.5.1-develop.2964.d5ac4a6ebb

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 (226) hide show
  1. package/dist/helpers/integration/salesUi.js +25 -23
  2. package/dist/helpers/integration/salesUi.js.map +2 -2
  3. package/dist/modules/api_docs/frontend/docs/api/Explorer.js +24 -24
  4. package/dist/modules/api_docs/frontend/docs/api/Explorer.js.map +2 -2
  5. package/dist/modules/attachments/components/AttachmentPartitionSettings.js +15 -7
  6. package/dist/modules/attachments/components/AttachmentPartitionSettings.js.map +2 -2
  7. package/dist/modules/attachments/fields/attachment.js +4 -6
  8. package/dist/modules/attachments/fields/attachment.js.map +2 -2
  9. package/dist/modules/auth/backend/users/create/page.js +26 -26
  10. package/dist/modules/auth/backend/users/create/page.js.map +2 -2
  11. package/dist/modules/business_rules/components/ActionRow.js +36 -25
  12. package/dist/modules/business_rules/components/ActionRow.js.map +2 -2
  13. package/dist/modules/business_rules/components/ConditionGroup.js +14 -5
  14. package/dist/modules/business_rules/components/ConditionGroup.js.map +2 -2
  15. package/dist/modules/business_rules/components/ConditionRow.js +19 -10
  16. package/dist/modules/business_rules/components/ConditionRow.js.map +2 -2
  17. package/dist/modules/business_rules/components/RuleSetMembers.js +16 -10
  18. package/dist/modules/business_rules/components/RuleSetMembers.js.map +2 -2
  19. package/dist/modules/catalog/backend/catalog/products/[id]/page.js +30 -34
  20. package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
  21. package/dist/modules/catalog/backend/catalog/products/create/page.js +220 -223
  22. package/dist/modules/catalog/backend/catalog/products/create/page.js.map +2 -2
  23. package/dist/modules/catalog/components/PriceKindSettings.js +20 -19
  24. package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
  25. package/dist/modules/catalog/components/products/ProductUomSection.js +42 -37
  26. package/dist/modules/catalog/components/products/ProductUomSection.js.map +2 -2
  27. package/dist/modules/catalog/components/products/VariantBuilder.js +22 -18
  28. package/dist/modules/catalog/components/products/VariantBuilder.js.map +2 -2
  29. package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js +18 -26
  30. package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js.map +2 -2
  31. package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js +4 -6
  32. package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js.map +2 -2
  33. package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js +5 -4
  34. package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js.map +2 -2
  35. package/dist/modules/customers/backend/config/customers/pipeline-stages/page.js +19 -7
  36. package/dist/modules/customers/backend/config/customers/pipeline-stages/page.js.map +2 -2
  37. package/dist/modules/customers/backend/customers/deals/pipeline/page.js +24 -21
  38. package/dist/modules/customers/backend/customers/deals/pipeline/page.js.map +2 -2
  39. package/dist/modules/customers/components/AddressEditor.js +24 -7
  40. package/dist/modules/customers/components/AddressEditor.js.map +2 -2
  41. package/dist/modules/customers/components/AddressFormatSettings.js +35 -25
  42. package/dist/modules/customers/components/AddressFormatSettings.js.map +2 -2
  43. package/dist/modules/customers/components/detail/ActivityForm.js +20 -12
  44. package/dist/modules/customers/components/detail/ActivityForm.js.map +2 -2
  45. package/dist/modules/customers/components/detail/AnnualRevenueField.js +2 -2
  46. package/dist/modules/customers/components/detail/AnnualRevenueField.js.map +2 -2
  47. package/dist/modules/customers/components/detail/DealForm.js +19 -14
  48. package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
  49. package/dist/modules/customers/components/formConfig.js +16 -12
  50. package/dist/modules/customers/components/formConfig.js.map +2 -2
  51. package/dist/modules/customers/widgets/dashboard/customer-todos/widget.client.js +3 -2
  52. package/dist/modules/customers/widgets/dashboard/customer-todos/widget.client.js.map +2 -2
  53. package/dist/modules/customers/widgets/dashboard/new-customers/widget.client.js +18 -10
  54. package/dist/modules/customers/widgets/dashboard/new-customers/widget.client.js.map +2 -2
  55. package/dist/modules/customers/widgets/dashboard/new-deals/widget.client.js +3 -2
  56. package/dist/modules/customers/widgets/dashboard/new-deals/widget.client.js.map +2 -2
  57. package/dist/modules/customers/widgets/dashboard/next-interactions/widget.client.js +3 -2
  58. package/dist/modules/customers/widgets/dashboard/next-interactions/widget.client.js.map +2 -2
  59. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js +27 -28
  60. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js.map +2 -2
  61. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.js +14 -6
  62. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.js.map +2 -2
  63. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js +14 -6
  64. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js.map +2 -2
  65. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js +3 -2
  66. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js.map +2 -2
  67. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js +3 -2
  68. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js.map +2 -2
  69. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js +17 -8
  70. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js.map +2 -2
  71. package/dist/modules/data_sync/backend/data-sync/page.js +40 -23
  72. package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
  73. package/dist/modules/data_sync/components/IntegrationScheduleTab.js +15 -6
  74. package/dist/modules/data_sync/components/IntegrationScheduleTab.js.map +2 -2
  75. package/dist/modules/dictionaries/components/AppearanceSelector.js +4 -4
  76. package/dist/modules/dictionaries/components/AppearanceSelector.js.map +2 -2
  77. package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js +4 -5
  78. package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js.map +2 -2
  79. package/dist/modules/dictionaries/components/DictionaryEntrySelect.js +22 -14
  80. package/dist/modules/dictionaries/components/DictionaryEntrySelect.js.map +2 -2
  81. package/dist/modules/dictionaries/fields/dictionary.js +18 -13
  82. package/dist/modules/dictionaries/fields/dictionary.js.map +2 -2
  83. package/dist/modules/entities/components/EncryptionManager.js +23 -19
  84. package/dist/modules/entities/components/EncryptionManager.js.map +2 -2
  85. package/dist/modules/feature_toggles/components/formConfig.js +17 -9
  86. package/dist/modules/feature_toggles/components/formConfig.js.map +2 -2
  87. package/dist/modules/feature_toggles/components/overrideFormConfig.js +17 -9
  88. package/dist/modules/feature_toggles/components/overrideFormConfig.js.map +2 -2
  89. package/dist/modules/inbox_ops/backend/inbox-ops/settings/page.js +15 -8
  90. package/dist/modules/inbox_ops/backend/inbox-ops/settings/page.js.map +2 -2
  91. package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js +37 -22
  92. package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js.map +2 -2
  93. package/dist/modules/integrations/backend/integrations/[id]/page.js +22 -17
  94. package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
  95. package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js +12 -6
  96. package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js.map +2 -2
  97. package/dist/modules/planner/components/AvailabilityRulesEditor.js +19 -12
  98. package/dist/modules/planner/components/AvailabilityRulesEditor.js.map +2 -2
  99. package/dist/modules/resources/components/ResourceCrudForm.js +15 -10
  100. package/dist/modules/resources/components/ResourceCrudForm.js.map +3 -3
  101. package/dist/modules/sales/backend/sales/documents/[id]/page.js +15 -18
  102. package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
  103. package/dist/modules/sales/components/ProviderFieldInput.js +23 -20
  104. package/dist/modules/sales/components/ProviderFieldInput.js.map +2 -2
  105. package/dist/modules/sales/components/ShippingMethodsSettings.js +25 -17
  106. package/dist/modules/sales/components/ShippingMethodsSettings.js.map +3 -3
  107. package/dist/modules/sales/components/channels/ChannelOfferForm.js +35 -42
  108. package/dist/modules/sales/components/channels/ChannelOfferForm.js.map +2 -2
  109. package/dist/modules/sales/components/documents/AddressesSection.js +87 -90
  110. package/dist/modules/sales/components/documents/AddressesSection.js.map +2 -2
  111. package/dist/modules/sales/components/documents/AdjustmentDialog.js +17 -6
  112. package/dist/modules/sales/components/documents/AdjustmentDialog.js.map +3 -3
  113. package/dist/modules/sales/components/documents/LineItemDialog.js +42 -25
  114. package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
  115. package/dist/modules/sales/components/documents/SalesDocumentForm.js +96 -87
  116. package/dist/modules/sales/components/documents/SalesDocumentForm.js.map +2 -2
  117. package/dist/modules/sales/widgets/dashboard/new-orders/widget.client.js +20 -11
  118. package/dist/modules/sales/widgets/dashboard/new-orders/widget.client.js.map +2 -2
  119. package/dist/modules/sales/widgets/dashboard/new-quotes/widget.client.js +20 -11
  120. package/dist/modules/sales/widgets/dashboard/new-quotes/widget.client.js.map +2 -2
  121. package/dist/modules/shipping_carriers/lib/shipment-wizard/components/ConfigureStep.js +36 -22
  122. package/dist/modules/shipping_carriers/lib/shipment-wizard/components/ConfigureStep.js.map +2 -2
  123. package/dist/modules/staff/components/TeamMemberForm.js +14 -9
  124. package/dist/modules/staff/components/TeamMemberForm.js.map +3 -3
  125. package/dist/modules/workflows/backend/tasks/[id]/page.js +42 -21
  126. package/dist/modules/workflows/backend/tasks/[id]/page.js.map +2 -2
  127. package/dist/modules/workflows/components/ActivitiesEditor.js +14 -6
  128. package/dist/modules/workflows/components/ActivitiesEditor.js.map +3 -3
  129. package/dist/modules/workflows/components/DefinitionTriggersEditor.js +25 -17
  130. package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +3 -3
  131. package/dist/modules/workflows/components/EdgeEditDialog.js +48 -45
  132. package/dist/modules/workflows/components/EdgeEditDialog.js.map +2 -2
  133. package/dist/modules/workflows/components/NodeEditDialog.js +90 -90
  134. package/dist/modules/workflows/components/NodeEditDialog.js.map +2 -2
  135. package/dist/modules/workflows/components/StepsEditor.js +14 -6
  136. package/dist/modules/workflows/components/StepsEditor.js.map +3 -3
  137. package/dist/modules/workflows/components/TransitionsEditor.js +31 -26
  138. package/dist/modules/workflows/components/TransitionsEditor.js.map +3 -3
  139. package/dist/modules/workflows/components/fields/ActivityArrayEditor.js +19 -11
  140. package/dist/modules/workflows/components/fields/ActivityArrayEditor.js.map +3 -3
  141. package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js +12 -14
  142. package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js.map +2 -2
  143. package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js +24 -16
  144. package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js.map +3 -3
  145. package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js +12 -13
  146. package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js.map +2 -2
  147. package/dist/modules/workflows/components/mobile/MobileTaskForm.js +12 -8
  148. package/dist/modules/workflows/components/mobile/MobileTaskForm.js.map +2 -2
  149. package/dist/modules/workflows/frontend/checkout-demo/page.js +43 -46
  150. package/dist/modules/workflows/frontend/checkout-demo/page.js.map +2 -2
  151. package/package.json +3 -3
  152. package/src/helpers/integration/salesUi.ts +40 -30
  153. package/src/modules/api_docs/frontend/docs/api/Explorer.tsx +25 -19
  154. package/src/modules/attachments/components/AttachmentPartitionSettings.tsx +21 -11
  155. package/src/modules/attachments/fields/attachment.tsx +4 -6
  156. package/src/modules/auth/backend/users/create/page.tsx +16 -20
  157. package/src/modules/business_rules/components/ActionRow.tsx +51 -32
  158. package/src/modules/business_rules/components/ConditionGroup.tsx +20 -9
  159. package/src/modules/business_rules/components/ConditionRow.tsx +24 -15
  160. package/src/modules/business_rules/components/RuleSetMembers.tsx +23 -13
  161. package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +47 -53
  162. package/src/modules/catalog/backend/catalog/products/create/page.tsx +84 -87
  163. package/src/modules/catalog/components/PriceKindSettings.tsx +9 -9
  164. package/src/modules/catalog/components/products/ProductUomSection.tsx +85 -83
  165. package/src/modules/catalog/components/products/VariantBuilder.tsx +49 -33
  166. package/src/modules/customer_accounts/backend/customer_accounts/users/[id]/page.tsx +12 -27
  167. package/src/modules/customer_accounts/backend/customer_accounts/users/page.tsx +4 -6
  168. package/src/modules/customer_accounts/widgets/injection/account-status/widget.client.tsx +5 -4
  169. package/src/modules/customers/backend/config/customers/pipeline-stages/page.tsx +28 -15
  170. package/src/modules/customers/backend/customers/deals/pipeline/page.tsx +37 -26
  171. package/src/modules/customers/components/AddressEditor.tsx +30 -16
  172. package/src/modules/customers/components/AddressFormatSettings.tsx +25 -19
  173. package/src/modules/customers/components/detail/ActivityForm.tsx +35 -23
  174. package/src/modules/customers/components/detail/AnnualRevenueField.tsx +2 -2
  175. package/src/modules/customers/components/detail/DealForm.tsx +33 -20
  176. package/src/modules/customers/components/formConfig.tsx +25 -17
  177. package/src/modules/customers/widgets/dashboard/customer-todos/widget.client.tsx +3 -2
  178. package/src/modules/customers/widgets/dashboard/new-customers/widget.client.tsx +21 -11
  179. package/src/modules/customers/widgets/dashboard/new-deals/widget.client.tsx +3 -2
  180. package/src/modules/customers/widgets/dashboard/next-interactions/widget.client.tsx +3 -2
  181. package/src/modules/dashboards/components/WidgetVisibilityEditor.tsx +17 -22
  182. package/src/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.tsx +17 -7
  183. package/src/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.tsx +20 -10
  184. package/src/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.tsx +3 -2
  185. package/src/modules/dashboards/widgets/dashboard/top-customers/widget.client.tsx +3 -2
  186. package/src/modules/dashboards/widgets/dashboard/top-products/widget.client.tsx +20 -9
  187. package/src/modules/data_sync/backend/data-sync/page.tsx +64 -38
  188. package/src/modules/data_sync/components/IntegrationScheduleTab.tsx +18 -7
  189. package/src/modules/dictionaries/components/AppearanceSelector.tsx +4 -4
  190. package/src/modules/dictionaries/components/DictionaryEntriesEditor.tsx +3 -4
  191. package/src/modules/dictionaries/components/DictionaryEntrySelect.tsx +27 -21
  192. package/src/modules/dictionaries/fields/dictionary.tsx +36 -23
  193. package/src/modules/entities/components/EncryptionManager.tsx +49 -33
  194. package/src/modules/feature_toggles/components/formConfig.tsx +20 -10
  195. package/src/modules/feature_toggles/components/overrideFormConfig.tsx +20 -10
  196. package/src/modules/inbox_ops/backend/inbox-ops/settings/page.tsx +19 -10
  197. package/src/modules/inbox_ops/components/proposals/EditActionDialog.tsx +49 -26
  198. package/src/modules/integrations/backend/integrations/[id]/page.tsx +20 -11
  199. package/src/modules/integrations/backend/integrations/bundle/[id]/page.tsx +19 -9
  200. package/src/modules/planner/components/AvailabilityRulesEditor.tsx +34 -21
  201. package/src/modules/resources/components/ResourceCrudForm.tsx +24 -15
  202. package/src/modules/sales/backend/sales/documents/[id]/page.tsx +12 -15
  203. package/src/modules/sales/components/ProviderFieldInput.tsx +26 -17
  204. package/src/modules/sales/components/ShippingMethodsSettings.tsx +28 -20
  205. package/src/modules/sales/components/channels/ChannelOfferForm.tsx +51 -46
  206. package/src/modules/sales/components/documents/AddressesSection.tsx +78 -76
  207. package/src/modules/sales/components/documents/AdjustmentDialog.tsx +27 -15
  208. package/src/modules/sales/components/documents/LineItemDialog.tsx +69 -51
  209. package/src/modules/sales/components/documents/SalesDocumentForm.tsx +98 -87
  210. package/src/modules/sales/widgets/dashboard/new-orders/widget.client.tsx +23 -12
  211. package/src/modules/sales/widgets/dashboard/new-quotes/widget.client.tsx +23 -12
  212. package/src/modules/shipping_carriers/lib/shipment-wizard/components/ConfigureStep.tsx +35 -19
  213. package/src/modules/staff/components/TeamMemberForm.tsx +23 -14
  214. package/src/modules/workflows/backend/tasks/[id]/page.tsx +51 -23
  215. package/src/modules/workflows/components/ActivitiesEditor.tsx +20 -10
  216. package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +28 -18
  217. package/src/modules/workflows/components/EdgeEditDialog.tsx +51 -40
  218. package/src/modules/workflows/components/NodeEditDialog.tsx +81 -77
  219. package/src/modules/workflows/components/StepsEditor.tsx +20 -10
  220. package/src/modules/workflows/components/TransitionsEditor.tsx +61 -44
  221. package/src/modules/workflows/components/fields/ActivityArrayEditor.tsx +22 -12
  222. package/src/modules/workflows/components/fields/BusinessRuleConditionsEditor.tsx +9 -13
  223. package/src/modules/workflows/components/fields/FormFieldArrayEditor.tsx +27 -17
  224. package/src/modules/workflows/components/fields/StartPreConditionsEditor.tsx +9 -12
  225. package/src/modules/workflows/components/mobile/MobileTaskForm.tsx +19 -11
  226. package/src/modules/workflows/frontend/checkout-demo/page.tsx +71 -60
@@ -4,6 +4,13 @@ import * as React from "react";
4
4
  import { useT } from "@open-mercato/shared/lib/i18n/context";
5
5
  import { Label } from "@open-mercato/ui/primitives/label";
6
6
  import { Input } from "@open-mercato/ui/primitives/input";
7
+ import {
8
+ Select,
9
+ SelectContent,
10
+ SelectItem,
11
+ SelectTrigger,
12
+ SelectValue
13
+ } from "@open-mercato/ui/primitives/select";
7
14
  import { Switch } from "@open-mercato/ui/primitives/switch";
8
15
  import { ProductMediaManager } from "./ProductMediaManager.js";
9
16
  import { MetadataEditor } from "./MetadataEditor.js";
@@ -105,14 +112,13 @@ function VariantOptionValuesSection({
105
112
  /* @__PURE__ */ jsx("div", { className: "grid gap-4 md:grid-cols-2", children: optionDefinitions.map((option) => /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
106
113
  /* @__PURE__ */ jsx(Label, { className: "text-xs uppercase text-muted-foreground", children: option.label }),
107
114
  /* @__PURE__ */ jsxs(
108
- "select",
115
+ Select,
109
116
  {
110
- className: "w-full rounded border px-3 py-2 text-sm",
111
- value: values.optionValues?.[option.code] ?? "",
112
- onChange: (event) => handleOptionChange(option.code, event.target.value),
117
+ value: values.optionValues?.[option.code] || void 0,
118
+ onValueChange: (value) => handleOptionChange(option.code, value ?? ""),
113
119
  children: [
114
- /* @__PURE__ */ jsx("option", { value: "", children: t("catalog.variants.form.optionPlaceholder", "Select value") }),
115
- option.values.map((value) => /* @__PURE__ */ jsx("option", { value: value.label, children: value.label }, value.id))
120
+ /* @__PURE__ */ jsx(SelectTrigger, { children: /* @__PURE__ */ jsx(SelectValue, { placeholder: t("catalog.variants.form.optionPlaceholder", "Select value") }) }),
121
+ /* @__PURE__ */ jsx(SelectContent, { children: option.values.map((value) => /* @__PURE__ */ jsx(SelectItem, { value: value.label, children: value.label }, value.id)) })
116
122
  ]
117
123
  }
118
124
  )
@@ -239,26 +245,24 @@ function VariantPricesSection({
239
245
  /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: t("catalog.variants.form.pricesHint", "Populate list prices per price kind.") })
240
246
  ] }),
241
247
  /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ jsxs(
242
- "select",
248
+ Select,
243
249
  {
244
- className: "rounded border px-3 py-2 text-sm",
245
- value: values.taxRateId ?? "",
246
- onChange: (event) => setValue("taxRateId", event.target.value || null),
250
+ value: values.taxRateId || void 0,
251
+ onValueChange: (value) => setValue("taxRateId", value || null),
247
252
  children: [
248
- /* @__PURE__ */ jsx("option", { value: "", children: t("catalog.variants.form.pricesTaxNone", "No tax override") }),
249
- taxRates.map((rate) => /* @__PURE__ */ jsx("option", { value: rate.id, children: formatTaxRateLabel(rate) }, rate.id))
253
+ /* @__PURE__ */ jsx(SelectTrigger, { children: /* @__PURE__ */ jsx(SelectValue, { placeholder: t("catalog.variants.form.pricesTaxNone", "No tax override") }) }),
254
+ /* @__PURE__ */ jsx(SelectContent, { children: taxRates.map((rate) => /* @__PURE__ */ jsx(SelectItem, { value: rate.id, children: formatTaxRateLabel(rate) }, rate.id)) })
250
255
  ]
251
256
  }
252
257
  ) })
253
258
  ] }) : /* @__PURE__ */ jsx("div", { className: "flex justify-end", children: /* @__PURE__ */ jsxs(
254
- "select",
259
+ Select,
255
260
  {
256
- className: "rounded border px-3 py-2 text-sm",
257
- value: values.taxRateId ?? "",
258
- onChange: (event) => setValue("taxRateId", event.target.value || null),
261
+ value: values.taxRateId || void 0,
262
+ onValueChange: (value) => setValue("taxRateId", value || null),
259
263
  children: [
260
- /* @__PURE__ */ jsx("option", { value: "", children: t("catalog.variants.form.pricesTaxNone", "No tax override") }),
261
- taxRates.map((rate) => /* @__PURE__ */ jsx("option", { value: rate.id, children: formatTaxRateLabel(rate) }, rate.id))
264
+ /* @__PURE__ */ jsx(SelectTrigger, { children: /* @__PURE__ */ jsx(SelectValue, { placeholder: t("catalog.variants.form.pricesTaxNone", "No tax override") }) }),
265
+ /* @__PURE__ */ jsx(SelectContent, { children: taxRates.map((rate) => /* @__PURE__ */ jsx(SelectItem, { value: rate.id, children: formatTaxRateLabel(rate) }, rate.id)) })
262
266
  ]
263
267
  }
264
268
  ) }),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/catalog/components/products/VariantBuilder.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Switch } from '@open-mercato/ui/primitives/switch'\nimport { ProductMediaManager } from './ProductMediaManager'\nimport { MetadataEditor } from './MetadataEditor'\nimport type { PriceKindSummary, TaxRateSummary } from './productForm'\nimport { formatTaxRateLabel } from './productForm'\nimport type { OptionDefinition, VariantFormValues, VariantPriceDraft } from './variantForm'\nimport { E } from '#generated/entities.ids.generated'\n\ntype VariantBuilderProps = {\n values: VariantFormValues\n setValue: (id: string, value: unknown) => void\n errors: Record<string, string>\n optionDefinitions: OptionDefinition[]\n priceKinds: PriceKindSummary[]\n taxRates: TaxRateSummary[]\n}\n\ntype VariantSectionBaseProps = {\n values: VariantFormValues\n setValue: (id: string, value: unknown) => void\n errors: Record<string, string>\n}\n\ntype VariantOptionValuesSectionProps = {\n values: VariantFormValues\n setValue: (id: string, value: unknown) => void\n optionDefinitions: OptionDefinition[]\n showHeading?: boolean\n}\n\ntype VariantDimensionsSectionProps = {\n values: VariantFormValues\n setValue: (id: string, value: unknown) => void\n showHeading?: boolean\n}\n\ntype VariantMetadataSectionProps = {\n values: VariantFormValues\n setValue: (id: string, value: unknown) => void\n showIntro?: boolean\n embedded?: boolean\n}\n\ntype VariantPricesSectionProps = {\n values: VariantFormValues\n setValue: (id: string, value: unknown) => void\n priceKinds: PriceKindSummary[]\n taxRates: TaxRateSummary[]\n showHeader?: boolean\n embedded?: boolean\n}\n\ntype VariantMediaSectionProps = {\n values: VariantFormValues\n setValue: (id: string, value: unknown) => void\n showLabel?: boolean\n}\n\nexport function VariantBuilder({\n values,\n setValue,\n errors,\n optionDefinitions,\n priceKinds,\n taxRates,\n}: VariantBuilderProps) {\n return (\n <div className=\"space-y-6\">\n <VariantBasicsSection values={values} setValue={setValue} errors={errors} />\n <VariantOptionValuesSection values={values} setValue={setValue} optionDefinitions={optionDefinitions} />\n <VariantDimensionsSection values={values} setValue={setValue} />\n <VariantMetadataSection values={values} setValue={setValue} />\n <VariantPricesSection values={values} setValue={setValue} priceKinds={priceKinds} taxRates={taxRates} />\n <VariantMediaSection values={values} setValue={setValue} />\n </div>\n )\n}\n\nexport function VariantBasicsSection({ values, setValue, errors }: VariantSectionBaseProps) {\n const t = useT()\n return (\n <div className=\"space-y-6\">\n <div className=\"space-y-2\">\n <Label className=\"flex items-center gap-1\">\n {t('catalog.variants.form.nameLabel', 'Name')}\n <span className=\"text-red-600\">*</span>\n </Label>\n <Input\n value={values.name}\n onChange={(event) => setValue('name', event.target.value)}\n placeholder={t('catalog.variants.form.namePlaceholder', 'e.g., Blue / Small')}\n />\n {errors.name ? <p className=\"text-xs text-red-600\">{errors.name}</p> : null}\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>{t('catalog.variants.form.skuLabel', 'SKU')}</Label>\n <Input\n value={values.sku}\n onChange={(event) => setValue('sku', event.target.value)}\n placeholder={t('catalog.variants.form.skuPlaceholder', 'Unique identifier')}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>{t('catalog.variants.form.barcodeLabel', 'Barcode')}</Label>\n <Input\n value={values.barcode}\n onChange={(event) => setValue('barcode', event.target.value)}\n placeholder={t('catalog.variants.form.barcodePlaceholder', 'EAN, UPC, etc.')}\n />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <label className=\"flex items-center justify-between gap-2 rounded border px-3 py-2\">\n <div>\n <p className=\"text-sm font-medium\">{t('catalog.variants.form.isDefaultLabel', 'Default variant')}</p>\n <p className=\"text-xs text-muted-foreground\">{t('catalog.variants.form.isDefaultHint', 'Used in storefronts')}</p>\n </div>\n <Switch checked={values.isDefault} onCheckedChange={(next) => setValue('isDefault', next)} />\n </label>\n <label className=\"flex items-center justify-between gap-2 rounded border px-3 py-2\">\n <div>\n <p className=\"text-sm font-medium\">{t('catalog.variants.form.isActiveLabel', 'Active')}</p>\n <p className=\"text-xs text-muted-foreground\">{t('catalog.variants.form.isActiveHint', 'Inactive variants stay hidden')}</p>\n </div>\n <Switch checked={values.isActive !== false} onCheckedChange={(next) => setValue('isActive', next)} />\n </label>\n </div>\n </div>\n )\n}\n\nexport function VariantOptionValuesSection({\n values,\n setValue,\n optionDefinitions,\n showHeading = true,\n}: VariantOptionValuesSectionProps) {\n const t = useT()\n\n const handleOptionChange = React.useCallback(\n (code: string, next: string) => {\n setValue('optionValues', { ...(values.optionValues ?? {}), [code]: next })\n },\n [setValue, values.optionValues],\n )\n\n if (!optionDefinitions.length) return null\n\n return (\n <div className=\"space-y-3\">\n {showHeading ? <h3 className=\"text-sm font-semibold\">{t('catalog.variants.form.options', 'Option values')}</h3> : null}\n <div className=\"grid gap-4 md:grid-cols-2\">\n {optionDefinitions.map((option) => (\n <div key={option.code} className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">{option.label}</Label>\n <select\n className=\"w-full rounded border px-3 py-2 text-sm\"\n value={values.optionValues?.[option.code] ?? ''}\n onChange={(event) => handleOptionChange(option.code, event.target.value)}\n >\n <option value=\"\">{t('catalog.variants.form.optionPlaceholder', 'Select value')}</option>\n {option.values.map((value) => (\n <option key={value.id} value={value.label}>\n {value.label}\n </option>\n ))}\n </select>\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nexport function VariantDimensionsSection({ values, setValue, showHeading = true }: VariantDimensionsSectionProps) {\n const t = useT()\n const metadata = normalizeMetadata(values.metadata)\n const dimensionValues = normalizeDimensions(metadata)\n const weightValues = normalizeWeight(metadata)\n const dimensionUnitPlaceholder = t('catalog.variants.form.dimensionUnitPlaceholder', 'cm')\n const weightUnitPlaceholder = t('catalog.variants.form.weightUnitPlaceholder', 'kg')\n\n return (\n <div className=\"space-y-4\">\n {showHeading ? <h3 className=\"text-sm font-semibold\">{t('catalog.variants.form.dimensions', 'Dimensions & weight')}</h3> : null}\n <div className=\"grid gap-4 md:grid-cols-2\">\n <DimensionInput\n label={t('catalog.variants.form.width', 'Width')}\n value={dimensionValues.width ?? ''}\n onChange={(value) => setValue('metadata', applyDimension(metadata, 'width', value))}\n />\n <DimensionInput\n label={t('catalog.variants.form.height', 'Height')}\n value={dimensionValues.height ?? ''}\n onChange={(value) => setValue('metadata', applyDimension(metadata, 'height', value))}\n />\n <DimensionInput\n label={t('catalog.variants.form.depth', 'Depth')}\n value={dimensionValues.depth ?? ''}\n onChange={(value) => setValue('metadata', applyDimension(metadata, 'depth', value))}\n />\n <DimensionInput\n label={t('catalog.variants.form.dimensionUnit', 'Size unit')}\n value={dimensionValues.unit ?? ''}\n placeholder={dimensionUnitPlaceholder}\n onChange={(value) => setValue('metadata', applyDimension(metadata, 'unit', value))}\n />\n <DimensionInput\n label={t('catalog.variants.form.weight', 'Weight')}\n value={weightValues.value ?? ''}\n onChange={(value) => setValue('metadata', applyWeight(metadata, 'value', value))}\n />\n <DimensionInput\n label={t('catalog.variants.form.weightUnit', 'Weight unit')}\n value={weightValues.unit ?? ''}\n placeholder={weightUnitPlaceholder}\n onChange={(value) => setValue('metadata', applyWeight(metadata, 'unit', value))}\n />\n </div>\n </div>\n )\n}\n\nexport function VariantMetadataSection({\n values,\n setValue,\n showIntro = true,\n embedded = false,\n}: VariantMetadataSectionProps) {\n const metadata = normalizeMetadata(values.metadata)\n const systemMetadata = React.useMemo(() => extractSystemMetadata(metadata), [metadata])\n const customMetadata = React.useMemo(() => stripSystemMetadata(metadata), [metadata])\n\n const handleMetadataChange = React.useCallback(\n (next: Record<string, unknown>) => {\n const merged: Record<string, unknown> = {}\n Object.entries(systemMetadata).forEach(([key, value]) => {\n merged[key] = value\n })\n Object.entries(next).forEach(([key, value]) => {\n merged[key] = value\n })\n setValue('metadata', merged)\n },\n [setValue, systemMetadata],\n )\n\n return (\n <MetadataEditor\n value={customMetadata}\n onChange={handleMetadataChange}\n title={showIntro ? undefined : ''}\n description={showIntro ? undefined : ''}\n embedded={embedded}\n />\n )\n}\n\nexport function VariantPricesSection({\n values,\n setValue,\n priceKinds,\n taxRates,\n showHeader = true,\n embedded = false,\n}: VariantPricesSectionProps) {\n const t = useT()\n\n const updatePrice = React.useCallback(\n (priceKindId: string, patch: Partial<VariantPriceDraft>) => {\n const prev = values.prices?.[priceKindId] ?? { priceKindId, amount: '', displayMode: 'excluding-tax' }\n setValue('prices', { ...values.prices, [priceKindId]: { ...prev, ...patch, priceKindId } })\n },\n [setValue, values.prices],\n )\n\n const containerClass = embedded ? 'space-y-4' : 'space-y-4 rounded-lg border p-4'\n\n return (\n <div className={containerClass}>\n {showHeader ? (\n <div className=\"flex items-center justify-between gap-2\">\n <div>\n <h3 className=\"text-sm font-semibold\">{t('catalog.variants.form.pricesLabel', 'Prices')}</h3>\n <p className=\"text-xs text-muted-foreground\">\n {t('catalog.variants.form.pricesHint', 'Populate list prices per price kind.')}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <select\n className=\"rounded border px-3 py-2 text-sm\"\n value={values.taxRateId ?? ''}\n onChange={(event) => setValue('taxRateId', event.target.value || null)}\n >\n <option value=\"\">{t('catalog.variants.form.pricesTaxNone', 'No tax override')}</option>\n {taxRates.map((rate) => (\n <option key={rate.id} value={rate.id}>\n {formatTaxRateLabel(rate)}\n </option>\n ))}\n </select>\n </div>\n </div>\n ) : (\n <div className=\"flex justify-end\">\n <select\n className=\"rounded border px-3 py-2 text-sm\"\n value={values.taxRateId ?? ''}\n onChange={(event) => setValue('taxRateId', event.target.value || null)}\n >\n <option value=\"\">{t('catalog.variants.form.pricesTaxNone', 'No tax override')}</option>\n {taxRates.map((rate) => (\n <option key={rate.id} value={rate.id}>\n {formatTaxRateLabel(rate)}\n </option>\n ))}\n </select>\n </div>\n )}\n <div className=\"space-y-3\">\n {priceKinds.length ? (\n priceKinds.map((kind) => {\n const draft = values.prices?.[kind.id]\n return (\n <div key={kind.id} className=\"rounded bg-muted/50 p-3\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm font-semibold\">{kind.title}</p>\n <p className=\"text-xs text-muted-foreground\">\n {kind.currencyCode\n ? `${kind.currencyCode.toUpperCase()} \u2022 ${kind.displayMode === 'including-tax' ? t('catalog.priceKinds.form.displayMode.include', 'Including tax') : t('catalog.priceKinds.form.displayMode.exclude', 'Excluding tax')}`\n : t('catalog.variants.form.priceMissingCurrency', 'No currency configured')}\n </p>\n </div>\n </div>\n <Input\n className=\"mt-3\"\n value={draft?.amount ?? ''}\n onChange={(event) => updatePrice(kind.id, { amount: event.target.value })}\n placeholder=\"0.00\"\n />\n </div>\n )\n })\n ) : (\n <p className=\"text-xs text-muted-foreground\">{t('catalog.variants.form.pricesEmpty', 'No price kinds configured yet.')}</p>\n )}\n </div>\n </div>\n )\n}\n\nexport function VariantMediaSection({ values, setValue, showLabel = true }: VariantMediaSectionProps) {\n const t = useT()\n return (\n <div className=\"space-y-2\">\n {showLabel ? <Label>{t('catalog.variants.form.media', 'Media')}</Label> : null}\n <ProductMediaManager\n entityId={E.catalog.catalog_product_variant}\n draftRecordId={values.mediaDraftId}\n items={Array.isArray(values.mediaItems) ? values.mediaItems : []}\n defaultMediaId={values.defaultMediaId}\n onItemsChange={(next) => setValue('mediaItems', next)}\n onDefaultChange={(next) => setValue('defaultMediaId', next)}\n />\n </div>\n )\n}\n\nfunction DimensionInput({\n label,\n value,\n onChange,\n placeholder = '0',\n}: {\n label: string\n value: string | number | undefined\n onChange: (next: string) => void\n placeholder?: string\n}) {\n return (\n <div className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">{label}</Label>\n <Input value={value ?? ''} onChange={(event) => onChange(event.target.value)} placeholder={placeholder} />\n </div>\n )\n}\n\nfunction normalizeMetadata(input: unknown): Record<string, any> {\n return typeof input === 'object' && input ? { ...(input as Record<string, unknown>) } : {}\n}\n\nfunction normalizeDimensions(metadata: Record<string, any>) {\n const raw = metadata.dimensions\n if (!raw || typeof raw !== 'object') return {}\n return {\n width: typeof raw.width === 'number' ? raw.width : undefined,\n height: typeof raw.height === 'number' ? raw.height : undefined,\n depth: typeof raw.depth === 'number' ? raw.depth : undefined,\n unit: typeof raw.unit === 'string' ? raw.unit : undefined,\n }\n}\n\nfunction normalizeWeight(metadata: Record<string, any>) {\n const raw = metadata.weight\n if (!raw || typeof raw !== 'object') return {}\n return {\n value: typeof raw.value === 'number' ? raw.value : undefined,\n unit: typeof raw.unit === 'string' ? raw.unit : undefined,\n }\n}\n\nfunction applyDimension(metadata: Record<string, any>, field: 'width' | 'height' | 'depth' | 'unit', raw: string) {\n const dims = normalizeDimensions(metadata)\n if (field === 'unit') {\n dims.unit = raw\n } else {\n const numeric = Number(raw)\n dims[field] = Number.isNaN(numeric) ? undefined : numeric\n }\n const clean = cleanupDimensions(dims)\n if (clean) return { ...metadata, dimensions: clean }\n const copy = { ...metadata }\n delete copy.dimensions\n return copy\n}\n\nfunction applyWeight(metadata: Record<string, any>, field: 'value' | 'unit', raw: string) {\n const weight = normalizeWeight(metadata)\n if (field === 'unit') weight.unit = raw\n else {\n const numeric = Number(raw)\n weight.value = Number.isNaN(numeric) ? undefined : numeric\n }\n const clean = cleanupWeight(weight)\n if (clean) return { ...metadata, weight: clean }\n const copy = { ...metadata }\n delete copy.weight\n return copy\n}\n\nfunction cleanupDimensions(dims: { width?: number; height?: number; depth?: number; unit?: string }) {\n const clean: Record<string, unknown> = {}\n if (typeof dims.width === 'number' && Number.isFinite(dims.width)) clean.width = dims.width\n if (typeof dims.height === 'number' && Number.isFinite(dims.height)) clean.height = dims.height\n if (typeof dims.depth === 'number' && Number.isFinite(dims.depth)) clean.depth = dims.depth\n if (typeof dims.unit === 'string' && dims.unit.trim().length) clean.unit = dims.unit\n return Object.keys(clean).length ? clean : null\n}\n\nfunction cleanupWeight(weight: { value?: number; unit?: string }) {\n const clean: Record<string, unknown> = {}\n if (typeof weight.value === 'number' && Number.isFinite(weight.value)) clean.value = weight.value\n if (typeof weight.unit === 'string' && weight.unit.trim().length) clean.unit = weight.unit\n return Object.keys(clean).length ? clean : null\n}\n\nfunction stripSystemMetadata(metadata: Record<string, any>) {\n const copy: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(metadata)) {\n if (key === 'dimensions' || key === 'weight') continue\n copy[key] = value\n }\n return copy\n}\n\nfunction extractSystemMetadata(metadata: Record<string, any>) {\n const system: Record<string, unknown> = {}\n if (metadata.dimensions) system.dimensions = metadata.dimensions\n if (metadata.weight) system.weight = metadata.weight\n return system\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\nimport { Switch } from '@open-mercato/ui/primitives/switch'\nimport { ProductMediaManager } from './ProductMediaManager'\nimport { MetadataEditor } from './MetadataEditor'\nimport type { PriceKindSummary, TaxRateSummary } from './productForm'\nimport { formatTaxRateLabel } from './productForm'\nimport type { OptionDefinition, VariantFormValues, VariantPriceDraft } from './variantForm'\nimport { E } from '#generated/entities.ids.generated'\n\ntype VariantBuilderProps = {\n values: VariantFormValues\n setValue: (id: string, value: unknown) => void\n errors: Record<string, string>\n optionDefinitions: OptionDefinition[]\n priceKinds: PriceKindSummary[]\n taxRates: TaxRateSummary[]\n}\n\ntype VariantSectionBaseProps = {\n values: VariantFormValues\n setValue: (id: string, value: unknown) => void\n errors: Record<string, string>\n}\n\ntype VariantOptionValuesSectionProps = {\n values: VariantFormValues\n setValue: (id: string, value: unknown) => void\n optionDefinitions: OptionDefinition[]\n showHeading?: boolean\n}\n\ntype VariantDimensionsSectionProps = {\n values: VariantFormValues\n setValue: (id: string, value: unknown) => void\n showHeading?: boolean\n}\n\ntype VariantMetadataSectionProps = {\n values: VariantFormValues\n setValue: (id: string, value: unknown) => void\n showIntro?: boolean\n embedded?: boolean\n}\n\ntype VariantPricesSectionProps = {\n values: VariantFormValues\n setValue: (id: string, value: unknown) => void\n priceKinds: PriceKindSummary[]\n taxRates: TaxRateSummary[]\n showHeader?: boolean\n embedded?: boolean\n}\n\ntype VariantMediaSectionProps = {\n values: VariantFormValues\n setValue: (id: string, value: unknown) => void\n showLabel?: boolean\n}\n\nexport function VariantBuilder({\n values,\n setValue,\n errors,\n optionDefinitions,\n priceKinds,\n taxRates,\n}: VariantBuilderProps) {\n return (\n <div className=\"space-y-6\">\n <VariantBasicsSection values={values} setValue={setValue} errors={errors} />\n <VariantOptionValuesSection values={values} setValue={setValue} optionDefinitions={optionDefinitions} />\n <VariantDimensionsSection values={values} setValue={setValue} />\n <VariantMetadataSection values={values} setValue={setValue} />\n <VariantPricesSection values={values} setValue={setValue} priceKinds={priceKinds} taxRates={taxRates} />\n <VariantMediaSection values={values} setValue={setValue} />\n </div>\n )\n}\n\nexport function VariantBasicsSection({ values, setValue, errors }: VariantSectionBaseProps) {\n const t = useT()\n return (\n <div className=\"space-y-6\">\n <div className=\"space-y-2\">\n <Label className=\"flex items-center gap-1\">\n {t('catalog.variants.form.nameLabel', 'Name')}\n <span className=\"text-red-600\">*</span>\n </Label>\n <Input\n value={values.name}\n onChange={(event) => setValue('name', event.target.value)}\n placeholder={t('catalog.variants.form.namePlaceholder', 'e.g., Blue / Small')}\n />\n {errors.name ? <p className=\"text-xs text-red-600\">{errors.name}</p> : null}\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>{t('catalog.variants.form.skuLabel', 'SKU')}</Label>\n <Input\n value={values.sku}\n onChange={(event) => setValue('sku', event.target.value)}\n placeholder={t('catalog.variants.form.skuPlaceholder', 'Unique identifier')}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>{t('catalog.variants.form.barcodeLabel', 'Barcode')}</Label>\n <Input\n value={values.barcode}\n onChange={(event) => setValue('barcode', event.target.value)}\n placeholder={t('catalog.variants.form.barcodePlaceholder', 'EAN, UPC, etc.')}\n />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <label className=\"flex items-center justify-between gap-2 rounded border px-3 py-2\">\n <div>\n <p className=\"text-sm font-medium\">{t('catalog.variants.form.isDefaultLabel', 'Default variant')}</p>\n <p className=\"text-xs text-muted-foreground\">{t('catalog.variants.form.isDefaultHint', 'Used in storefronts')}</p>\n </div>\n <Switch checked={values.isDefault} onCheckedChange={(next) => setValue('isDefault', next)} />\n </label>\n <label className=\"flex items-center justify-between gap-2 rounded border px-3 py-2\">\n <div>\n <p className=\"text-sm font-medium\">{t('catalog.variants.form.isActiveLabel', 'Active')}</p>\n <p className=\"text-xs text-muted-foreground\">{t('catalog.variants.form.isActiveHint', 'Inactive variants stay hidden')}</p>\n </div>\n <Switch checked={values.isActive !== false} onCheckedChange={(next) => setValue('isActive', next)} />\n </label>\n </div>\n </div>\n )\n}\n\nexport function VariantOptionValuesSection({\n values,\n setValue,\n optionDefinitions,\n showHeading = true,\n}: VariantOptionValuesSectionProps) {\n const t = useT()\n\n const handleOptionChange = React.useCallback(\n (code: string, next: string) => {\n setValue('optionValues', { ...(values.optionValues ?? {}), [code]: next })\n },\n [setValue, values.optionValues],\n )\n\n if (!optionDefinitions.length) return null\n\n return (\n <div className=\"space-y-3\">\n {showHeading ? <h3 className=\"text-sm font-semibold\">{t('catalog.variants.form.options', 'Option values')}</h3> : null}\n <div className=\"grid gap-4 md:grid-cols-2\">\n {optionDefinitions.map((option) => (\n <div key={option.code} className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">{option.label}</Label>\n <Select\n value={values.optionValues?.[option.code] || undefined}\n onValueChange={(value) => handleOptionChange(option.code, value ?? '')}\n >\n <SelectTrigger>\n <SelectValue placeholder={t('catalog.variants.form.optionPlaceholder', 'Select value')} />\n </SelectTrigger>\n <SelectContent>\n {option.values.map((value) => (\n <SelectItem key={value.id} value={value.label}>\n {value.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nexport function VariantDimensionsSection({ values, setValue, showHeading = true }: VariantDimensionsSectionProps) {\n const t = useT()\n const metadata = normalizeMetadata(values.metadata)\n const dimensionValues = normalizeDimensions(metadata)\n const weightValues = normalizeWeight(metadata)\n const dimensionUnitPlaceholder = t('catalog.variants.form.dimensionUnitPlaceholder', 'cm')\n const weightUnitPlaceholder = t('catalog.variants.form.weightUnitPlaceholder', 'kg')\n\n return (\n <div className=\"space-y-4\">\n {showHeading ? <h3 className=\"text-sm font-semibold\">{t('catalog.variants.form.dimensions', 'Dimensions & weight')}</h3> : null}\n <div className=\"grid gap-4 md:grid-cols-2\">\n <DimensionInput\n label={t('catalog.variants.form.width', 'Width')}\n value={dimensionValues.width ?? ''}\n onChange={(value) => setValue('metadata', applyDimension(metadata, 'width', value))}\n />\n <DimensionInput\n label={t('catalog.variants.form.height', 'Height')}\n value={dimensionValues.height ?? ''}\n onChange={(value) => setValue('metadata', applyDimension(metadata, 'height', value))}\n />\n <DimensionInput\n label={t('catalog.variants.form.depth', 'Depth')}\n value={dimensionValues.depth ?? ''}\n onChange={(value) => setValue('metadata', applyDimension(metadata, 'depth', value))}\n />\n <DimensionInput\n label={t('catalog.variants.form.dimensionUnit', 'Size unit')}\n value={dimensionValues.unit ?? ''}\n placeholder={dimensionUnitPlaceholder}\n onChange={(value) => setValue('metadata', applyDimension(metadata, 'unit', value))}\n />\n <DimensionInput\n label={t('catalog.variants.form.weight', 'Weight')}\n value={weightValues.value ?? ''}\n onChange={(value) => setValue('metadata', applyWeight(metadata, 'value', value))}\n />\n <DimensionInput\n label={t('catalog.variants.form.weightUnit', 'Weight unit')}\n value={weightValues.unit ?? ''}\n placeholder={weightUnitPlaceholder}\n onChange={(value) => setValue('metadata', applyWeight(metadata, 'unit', value))}\n />\n </div>\n </div>\n )\n}\n\nexport function VariantMetadataSection({\n values,\n setValue,\n showIntro = true,\n embedded = false,\n}: VariantMetadataSectionProps) {\n const metadata = normalizeMetadata(values.metadata)\n const systemMetadata = React.useMemo(() => extractSystemMetadata(metadata), [metadata])\n const customMetadata = React.useMemo(() => stripSystemMetadata(metadata), [metadata])\n\n const handleMetadataChange = React.useCallback(\n (next: Record<string, unknown>) => {\n const merged: Record<string, unknown> = {}\n Object.entries(systemMetadata).forEach(([key, value]) => {\n merged[key] = value\n })\n Object.entries(next).forEach(([key, value]) => {\n merged[key] = value\n })\n setValue('metadata', merged)\n },\n [setValue, systemMetadata],\n )\n\n return (\n <MetadataEditor\n value={customMetadata}\n onChange={handleMetadataChange}\n title={showIntro ? undefined : ''}\n description={showIntro ? undefined : ''}\n embedded={embedded}\n />\n )\n}\n\nexport function VariantPricesSection({\n values,\n setValue,\n priceKinds,\n taxRates,\n showHeader = true,\n embedded = false,\n}: VariantPricesSectionProps) {\n const t = useT()\n\n const updatePrice = React.useCallback(\n (priceKindId: string, patch: Partial<VariantPriceDraft>) => {\n const prev = values.prices?.[priceKindId] ?? { priceKindId, amount: '', displayMode: 'excluding-tax' }\n setValue('prices', { ...values.prices, [priceKindId]: { ...prev, ...patch, priceKindId } })\n },\n [setValue, values.prices],\n )\n\n const containerClass = embedded ? 'space-y-4' : 'space-y-4 rounded-lg border p-4'\n\n return (\n <div className={containerClass}>\n {showHeader ? (\n <div className=\"flex items-center justify-between gap-2\">\n <div>\n <h3 className=\"text-sm font-semibold\">{t('catalog.variants.form.pricesLabel', 'Prices')}</h3>\n <p className=\"text-xs text-muted-foreground\">\n {t('catalog.variants.form.pricesHint', 'Populate list prices per price kind.')}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <Select\n value={values.taxRateId || undefined}\n onValueChange={(value) => setValue('taxRateId', value || null)}\n >\n <SelectTrigger>\n <SelectValue placeholder={t('catalog.variants.form.pricesTaxNone', 'No tax override')} />\n </SelectTrigger>\n <SelectContent>\n {taxRates.map((rate) => (\n <SelectItem key={rate.id} value={rate.id}>\n {formatTaxRateLabel(rate)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n ) : (\n <div className=\"flex justify-end\">\n <Select\n value={values.taxRateId || undefined}\n onValueChange={(value) => setValue('taxRateId', value || null)}\n >\n <SelectTrigger>\n <SelectValue placeholder={t('catalog.variants.form.pricesTaxNone', 'No tax override')} />\n </SelectTrigger>\n <SelectContent>\n {taxRates.map((rate) => (\n <SelectItem key={rate.id} value={rate.id}>\n {formatTaxRateLabel(rate)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n <div className=\"space-y-3\">\n {priceKinds.length ? (\n priceKinds.map((kind) => {\n const draft = values.prices?.[kind.id]\n return (\n <div key={kind.id} className=\"rounded bg-muted/50 p-3\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm font-semibold\">{kind.title}</p>\n <p className=\"text-xs text-muted-foreground\">\n {kind.currencyCode\n ? `${kind.currencyCode.toUpperCase()} \u2022 ${kind.displayMode === 'including-tax' ? t('catalog.priceKinds.form.displayMode.include', 'Including tax') : t('catalog.priceKinds.form.displayMode.exclude', 'Excluding tax')}`\n : t('catalog.variants.form.priceMissingCurrency', 'No currency configured')}\n </p>\n </div>\n </div>\n <Input\n className=\"mt-3\"\n value={draft?.amount ?? ''}\n onChange={(event) => updatePrice(kind.id, { amount: event.target.value })}\n placeholder=\"0.00\"\n />\n </div>\n )\n })\n ) : (\n <p className=\"text-xs text-muted-foreground\">{t('catalog.variants.form.pricesEmpty', 'No price kinds configured yet.')}</p>\n )}\n </div>\n </div>\n )\n}\n\nexport function VariantMediaSection({ values, setValue, showLabel = true }: VariantMediaSectionProps) {\n const t = useT()\n return (\n <div className=\"space-y-2\">\n {showLabel ? <Label>{t('catalog.variants.form.media', 'Media')}</Label> : null}\n <ProductMediaManager\n entityId={E.catalog.catalog_product_variant}\n draftRecordId={values.mediaDraftId}\n items={Array.isArray(values.mediaItems) ? values.mediaItems : []}\n defaultMediaId={values.defaultMediaId}\n onItemsChange={(next) => setValue('mediaItems', next)}\n onDefaultChange={(next) => setValue('defaultMediaId', next)}\n />\n </div>\n )\n}\n\nfunction DimensionInput({\n label,\n value,\n onChange,\n placeholder = '0',\n}: {\n label: string\n value: string | number | undefined\n onChange: (next: string) => void\n placeholder?: string\n}) {\n return (\n <div className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">{label}</Label>\n <Input value={value ?? ''} onChange={(event) => onChange(event.target.value)} placeholder={placeholder} />\n </div>\n )\n}\n\nfunction normalizeMetadata(input: unknown): Record<string, any> {\n return typeof input === 'object' && input ? { ...(input as Record<string, unknown>) } : {}\n}\n\nfunction normalizeDimensions(metadata: Record<string, any>) {\n const raw = metadata.dimensions\n if (!raw || typeof raw !== 'object') return {}\n return {\n width: typeof raw.width === 'number' ? raw.width : undefined,\n height: typeof raw.height === 'number' ? raw.height : undefined,\n depth: typeof raw.depth === 'number' ? raw.depth : undefined,\n unit: typeof raw.unit === 'string' ? raw.unit : undefined,\n }\n}\n\nfunction normalizeWeight(metadata: Record<string, any>) {\n const raw = metadata.weight\n if (!raw || typeof raw !== 'object') return {}\n return {\n value: typeof raw.value === 'number' ? raw.value : undefined,\n unit: typeof raw.unit === 'string' ? raw.unit : undefined,\n }\n}\n\nfunction applyDimension(metadata: Record<string, any>, field: 'width' | 'height' | 'depth' | 'unit', raw: string) {\n const dims = normalizeDimensions(metadata)\n if (field === 'unit') {\n dims.unit = raw\n } else {\n const numeric = Number(raw)\n dims[field] = Number.isNaN(numeric) ? undefined : numeric\n }\n const clean = cleanupDimensions(dims)\n if (clean) return { ...metadata, dimensions: clean }\n const copy = { ...metadata }\n delete copy.dimensions\n return copy\n}\n\nfunction applyWeight(metadata: Record<string, any>, field: 'value' | 'unit', raw: string) {\n const weight = normalizeWeight(metadata)\n if (field === 'unit') weight.unit = raw\n else {\n const numeric = Number(raw)\n weight.value = Number.isNaN(numeric) ? undefined : numeric\n }\n const clean = cleanupWeight(weight)\n if (clean) return { ...metadata, weight: clean }\n const copy = { ...metadata }\n delete copy.weight\n return copy\n}\n\nfunction cleanupDimensions(dims: { width?: number; height?: number; depth?: number; unit?: string }) {\n const clean: Record<string, unknown> = {}\n if (typeof dims.width === 'number' && Number.isFinite(dims.width)) clean.width = dims.width\n if (typeof dims.height === 'number' && Number.isFinite(dims.height)) clean.height = dims.height\n if (typeof dims.depth === 'number' && Number.isFinite(dims.depth)) clean.depth = dims.depth\n if (typeof dims.unit === 'string' && dims.unit.trim().length) clean.unit = dims.unit\n return Object.keys(clean).length ? clean : null\n}\n\nfunction cleanupWeight(weight: { value?: number; unit?: string }) {\n const clean: Record<string, unknown> = {}\n if (typeof weight.value === 'number' && Number.isFinite(weight.value)) clean.value = weight.value\n if (typeof weight.unit === 'string' && weight.unit.trim().length) clean.unit = weight.unit\n return Object.keys(clean).length ? clean : null\n}\n\nfunction stripSystemMetadata(metadata: Record<string, any>) {\n const copy: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(metadata)) {\n if (key === 'dimensions' || key === 'weight') continue\n copy[key] = value\n }\n return copy\n}\n\nfunction extractSystemMetadata(metadata: Record<string, any>) {\n const system: Record<string, unknown> = {}\n if (metadata.dimensions) system.dimensions = metadata.dimensions\n if (metadata.weight) system.weight = metadata.weight\n return system\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -6,7 +6,9 @@ import { useRouter } from "next/navigation";
6
6
  import { Page, PageBody } from "@open-mercato/ui/backend/Page";
7
7
  import { FormHeader } from "@open-mercato/ui/backend/forms";
8
8
  import { Button } from "@open-mercato/ui/primitives/button";
9
+ import { Input } from "@open-mercato/ui/primitives/input";
9
10
  import { Spinner } from "@open-mercato/ui/primitives/spinner";
11
+ import { SwitchField } from "@open-mercato/ui/primitives/switch-field";
10
12
  import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@open-mercato/ui/primitives/dialog";
11
13
  import { apiCall, readApiResultOrThrow } from "@open-mercato/ui/backend/utils/apiCall";
12
14
  import { flash } from "@open-mercato/ui/backend/FlashMessages";
@@ -78,7 +80,7 @@ function ResetPasswordDialog({
78
80
  /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
79
81
  /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", htmlFor: "reset-password", children: t("customer_accounts.admin.detail.resetPassword.fields.newPassword", "New Password") }),
80
82
  /* @__PURE__ */ jsx(
81
- "input",
83
+ Input,
82
84
  {
83
85
  id: "reset-password",
84
86
  type: "password",
@@ -86,7 +88,6 @@ function ResetPasswordDialog({
86
88
  minLength: 8,
87
89
  value: newPassword,
88
90
  onChange: (event) => setNewPassword(event.target.value),
89
- className: "flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
90
91
  placeholder: t("customer_accounts.admin.detail.resetPassword.fields.placeholder", "Min. 8 characters")
91
92
  }
92
93
  )
@@ -492,15 +493,14 @@ function CustomerUserDetailPage({ params }) {
492
493
  }, children: t("customer_accounts.admin.detail.actions.unlink", "Unlink") })
493
494
  ] }) : /* @__PURE__ */ jsx("div", { className: "space-y-1", children: /* @__PURE__ */ jsxs("div", { className: "relative", children: [
494
495
  /* @__PURE__ */ jsx(
495
- "input",
496
+ Input,
496
497
  {
497
498
  type: "text",
498
499
  value: personSearchQuery,
499
500
  onChange: (event) => {
500
501
  void handleSearchPeople(event.target.value);
501
502
  },
502
- placeholder: t("customer_accounts.admin.detail.fields.searchPerson", "Search people by name..."),
503
- className: "flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
503
+ placeholder: t("customer_accounts.admin.detail.fields.searchPerson", "Search people by name...")
504
504
  }
505
505
  ),
506
506
  personResults.length > 0 && /* @__PURE__ */ jsx("div", { className: "absolute z-10 mt-1 w-full rounded-md border bg-background shadow-lg max-h-40 overflow-y-auto", children: personResults.map((person) => /* @__PURE__ */ jsx(
@@ -530,15 +530,14 @@ function CustomerUserDetailPage({ params }) {
530
530
  }, children: t("customer_accounts.admin.detail.actions.unlink", "Unlink") })
531
531
  ] }) : /* @__PURE__ */ jsx("div", { className: "space-y-1", children: /* @__PURE__ */ jsxs("div", { className: "relative", children: [
532
532
  /* @__PURE__ */ jsx(
533
- "input",
533
+ Input,
534
534
  {
535
535
  type: "text",
536
536
  value: companySearchQuery,
537
537
  onChange: (event) => {
538
538
  void handleSearchCompanies(event.target.value);
539
539
  },
540
- placeholder: t("customer_accounts.admin.detail.fields.searchCompany", "Search companies by name..."),
541
- className: "flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
540
+ placeholder: t("customer_accounts.admin.detail.fields.searchCompany", "Search companies by name...")
542
541
  }
543
542
  ),
544
543
  companyResults.length > 0 && /* @__PURE__ */ jsx("div", { className: "absolute z-10 mt-1 w-full rounded-md border bg-background shadow-lg max-h-40 overflow-y-auto", children: companyResults.map((company) => /* @__PURE__ */ jsx(
@@ -569,31 +568,24 @@ function CustomerUserDetailPage({ params }) {
569
568
  /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
570
569
  /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", htmlFor: "user-display-name", children: t("customer_accounts.admin.detail.fields.displayName", "Display Name") }),
571
570
  /* @__PURE__ */ jsx(
572
- "input",
571
+ Input,
573
572
  {
574
573
  id: "user-display-name",
575
574
  type: "text",
576
575
  value: editDisplayName,
577
- onChange: (event) => setEditDisplayName(event.target.value),
578
- className: "flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
576
+ onChange: (event) => setEditDisplayName(event.target.value)
579
577
  }
580
578
  )
581
579
  ] }),
582
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
583
- /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", htmlFor: "user-active-toggle", children: t("customer_accounts.admin.detail.fields.isActive", "Active") }),
584
- /* @__PURE__ */ jsx(
585
- "button",
586
- {
587
- id: "user-active-toggle",
588
- type: "button",
589
- role: "switch",
590
- "aria-checked": editActive ?? data.isActive,
591
- onClick: () => setEditActive((prev) => !(prev ?? data.isActive)),
592
- className: `relative inline-flex h-6 w-11 items-center rounded-full transition-colors ${editActive ?? data.isActive ? "bg-primary" : "bg-muted"}`,
593
- children: /* @__PURE__ */ jsx("span", { className: `inline-block h-4 w-4 transform rounded-full bg-white transition-transform ${editActive ?? data.isActive ? "translate-x-6" : "translate-x-1"}` })
594
- }
595
- )
596
- ] })
580
+ /* @__PURE__ */ jsx(
581
+ SwitchField,
582
+ {
583
+ id: "user-active-toggle",
584
+ label: t("customer_accounts.admin.detail.fields.isActive", "Active"),
585
+ checked: editActive ?? data.isActive,
586
+ onCheckedChange: (next) => setEditActive(next)
587
+ }
588
+ )
597
589
  ] }),
598
590
  /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
599
591
  /* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: t("customer_accounts.admin.detail.fields.roles", "Roles") }),