@open-mercato/core 0.5.1-develop.2949.009dcdd2d5 → 0.5.1-develop.2954.610bab2d08

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 (229) 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/api/users/route.js +63 -23
  10. package/dist/modules/auth/api/users/route.js.map +2 -2
  11. package/dist/modules/auth/backend/users/create/page.js +26 -26
  12. package/dist/modules/auth/backend/users/create/page.js.map +2 -2
  13. package/dist/modules/business_rules/components/ActionRow.js +36 -25
  14. package/dist/modules/business_rules/components/ActionRow.js.map +2 -2
  15. package/dist/modules/business_rules/components/ConditionGroup.js +14 -5
  16. package/dist/modules/business_rules/components/ConditionGroup.js.map +2 -2
  17. package/dist/modules/business_rules/components/ConditionRow.js +19 -10
  18. package/dist/modules/business_rules/components/ConditionRow.js.map +2 -2
  19. package/dist/modules/business_rules/components/RuleSetMembers.js +16 -10
  20. package/dist/modules/business_rules/components/RuleSetMembers.js.map +2 -2
  21. package/dist/modules/catalog/backend/catalog/products/[id]/page.js +30 -34
  22. package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
  23. package/dist/modules/catalog/backend/catalog/products/create/page.js +220 -223
  24. package/dist/modules/catalog/backend/catalog/products/create/page.js.map +2 -2
  25. package/dist/modules/catalog/components/PriceKindSettings.js +20 -19
  26. package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
  27. package/dist/modules/catalog/components/products/ProductUomSection.js +42 -37
  28. package/dist/modules/catalog/components/products/ProductUomSection.js.map +2 -2
  29. package/dist/modules/catalog/components/products/VariantBuilder.js +22 -18
  30. package/dist/modules/catalog/components/products/VariantBuilder.js.map +2 -2
  31. package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js +18 -26
  32. package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js.map +2 -2
  33. package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js +4 -6
  34. package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js.map +2 -2
  35. package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js +5 -4
  36. package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js.map +2 -2
  37. package/dist/modules/customers/backend/config/customers/pipeline-stages/page.js +19 -7
  38. package/dist/modules/customers/backend/config/customers/pipeline-stages/page.js.map +2 -2
  39. package/dist/modules/customers/backend/customers/deals/pipeline/page.js +24 -21
  40. package/dist/modules/customers/backend/customers/deals/pipeline/page.js.map +2 -2
  41. package/dist/modules/customers/components/AddressEditor.js +24 -7
  42. package/dist/modules/customers/components/AddressEditor.js.map +2 -2
  43. package/dist/modules/customers/components/AddressFormatSettings.js +35 -25
  44. package/dist/modules/customers/components/AddressFormatSettings.js.map +2 -2
  45. package/dist/modules/customers/components/detail/ActivityForm.js +20 -12
  46. package/dist/modules/customers/components/detail/ActivityForm.js.map +2 -2
  47. package/dist/modules/customers/components/detail/AnnualRevenueField.js +2 -2
  48. package/dist/modules/customers/components/detail/AnnualRevenueField.js.map +2 -2
  49. package/dist/modules/customers/components/detail/DealForm.js +19 -14
  50. package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
  51. package/dist/modules/customers/components/formConfig.js +16 -12
  52. package/dist/modules/customers/components/formConfig.js.map +2 -2
  53. package/dist/modules/customers/widgets/dashboard/customer-todos/widget.client.js +3 -2
  54. package/dist/modules/customers/widgets/dashboard/customer-todos/widget.client.js.map +2 -2
  55. package/dist/modules/customers/widgets/dashboard/new-customers/widget.client.js +18 -10
  56. package/dist/modules/customers/widgets/dashboard/new-customers/widget.client.js.map +2 -2
  57. package/dist/modules/customers/widgets/dashboard/new-deals/widget.client.js +3 -2
  58. package/dist/modules/customers/widgets/dashboard/new-deals/widget.client.js.map +2 -2
  59. package/dist/modules/customers/widgets/dashboard/next-interactions/widget.client.js +3 -2
  60. package/dist/modules/customers/widgets/dashboard/next-interactions/widget.client.js.map +2 -2
  61. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js +27 -28
  62. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js.map +2 -2
  63. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.js +14 -6
  64. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.js.map +2 -2
  65. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js +14 -6
  66. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js.map +2 -2
  67. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js +3 -2
  68. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js.map +2 -2
  69. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js +3 -2
  70. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js.map +2 -2
  71. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js +17 -8
  72. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js.map +2 -2
  73. package/dist/modules/data_sync/backend/data-sync/page.js +40 -23
  74. package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
  75. package/dist/modules/data_sync/components/IntegrationScheduleTab.js +15 -6
  76. package/dist/modules/data_sync/components/IntegrationScheduleTab.js.map +2 -2
  77. package/dist/modules/dictionaries/components/AppearanceSelector.js +4 -4
  78. package/dist/modules/dictionaries/components/AppearanceSelector.js.map +2 -2
  79. package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js +4 -5
  80. package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js.map +2 -2
  81. package/dist/modules/dictionaries/components/DictionaryEntrySelect.js +22 -14
  82. package/dist/modules/dictionaries/components/DictionaryEntrySelect.js.map +2 -2
  83. package/dist/modules/dictionaries/fields/dictionary.js +18 -13
  84. package/dist/modules/dictionaries/fields/dictionary.js.map +2 -2
  85. package/dist/modules/entities/components/EncryptionManager.js +23 -19
  86. package/dist/modules/entities/components/EncryptionManager.js.map +2 -2
  87. package/dist/modules/feature_toggles/components/formConfig.js +17 -9
  88. package/dist/modules/feature_toggles/components/formConfig.js.map +2 -2
  89. package/dist/modules/feature_toggles/components/overrideFormConfig.js +17 -9
  90. package/dist/modules/feature_toggles/components/overrideFormConfig.js.map +2 -2
  91. package/dist/modules/inbox_ops/backend/inbox-ops/settings/page.js +15 -8
  92. package/dist/modules/inbox_ops/backend/inbox-ops/settings/page.js.map +2 -2
  93. package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js +37 -22
  94. package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js.map +2 -2
  95. package/dist/modules/integrations/backend/integrations/[id]/page.js +22 -17
  96. package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
  97. package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js +12 -6
  98. package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js.map +2 -2
  99. package/dist/modules/planner/components/AvailabilityRulesEditor.js +19 -12
  100. package/dist/modules/planner/components/AvailabilityRulesEditor.js.map +2 -2
  101. package/dist/modules/resources/components/ResourceCrudForm.js +15 -10
  102. package/dist/modules/resources/components/ResourceCrudForm.js.map +3 -3
  103. package/dist/modules/sales/backend/sales/documents/[id]/page.js +15 -18
  104. package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
  105. package/dist/modules/sales/components/ProviderFieldInput.js +23 -20
  106. package/dist/modules/sales/components/ProviderFieldInput.js.map +2 -2
  107. package/dist/modules/sales/components/ShippingMethodsSettings.js +25 -17
  108. package/dist/modules/sales/components/ShippingMethodsSettings.js.map +3 -3
  109. package/dist/modules/sales/components/channels/ChannelOfferForm.js +35 -42
  110. package/dist/modules/sales/components/channels/ChannelOfferForm.js.map +2 -2
  111. package/dist/modules/sales/components/documents/AddressesSection.js +87 -90
  112. package/dist/modules/sales/components/documents/AddressesSection.js.map +2 -2
  113. package/dist/modules/sales/components/documents/AdjustmentDialog.js +17 -6
  114. package/dist/modules/sales/components/documents/AdjustmentDialog.js.map +3 -3
  115. package/dist/modules/sales/components/documents/LineItemDialog.js +42 -25
  116. package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
  117. package/dist/modules/sales/components/documents/SalesDocumentForm.js +96 -87
  118. package/dist/modules/sales/components/documents/SalesDocumentForm.js.map +2 -2
  119. package/dist/modules/sales/widgets/dashboard/new-orders/widget.client.js +20 -11
  120. package/dist/modules/sales/widgets/dashboard/new-orders/widget.client.js.map +2 -2
  121. package/dist/modules/sales/widgets/dashboard/new-quotes/widget.client.js +20 -11
  122. package/dist/modules/sales/widgets/dashboard/new-quotes/widget.client.js.map +2 -2
  123. package/dist/modules/shipping_carriers/lib/shipment-wizard/components/ConfigureStep.js +36 -22
  124. package/dist/modules/shipping_carriers/lib/shipment-wizard/components/ConfigureStep.js.map +2 -2
  125. package/dist/modules/staff/components/TeamMemberForm.js +14 -9
  126. package/dist/modules/staff/components/TeamMemberForm.js.map +3 -3
  127. package/dist/modules/workflows/backend/tasks/[id]/page.js +42 -21
  128. package/dist/modules/workflows/backend/tasks/[id]/page.js.map +2 -2
  129. package/dist/modules/workflows/components/ActivitiesEditor.js +14 -6
  130. package/dist/modules/workflows/components/ActivitiesEditor.js.map +3 -3
  131. package/dist/modules/workflows/components/DefinitionTriggersEditor.js +25 -17
  132. package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +3 -3
  133. package/dist/modules/workflows/components/EdgeEditDialog.js +48 -45
  134. package/dist/modules/workflows/components/EdgeEditDialog.js.map +2 -2
  135. package/dist/modules/workflows/components/NodeEditDialog.js +90 -90
  136. package/dist/modules/workflows/components/NodeEditDialog.js.map +2 -2
  137. package/dist/modules/workflows/components/StepsEditor.js +14 -6
  138. package/dist/modules/workflows/components/StepsEditor.js.map +3 -3
  139. package/dist/modules/workflows/components/TransitionsEditor.js +31 -26
  140. package/dist/modules/workflows/components/TransitionsEditor.js.map +3 -3
  141. package/dist/modules/workflows/components/fields/ActivityArrayEditor.js +19 -11
  142. package/dist/modules/workflows/components/fields/ActivityArrayEditor.js.map +3 -3
  143. package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js +12 -14
  144. package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js.map +2 -2
  145. package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js +24 -16
  146. package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js.map +3 -3
  147. package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js +12 -13
  148. package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js.map +2 -2
  149. package/dist/modules/workflows/components/mobile/MobileTaskForm.js +12 -8
  150. package/dist/modules/workflows/components/mobile/MobileTaskForm.js.map +2 -2
  151. package/dist/modules/workflows/frontend/checkout-demo/page.js +43 -46
  152. package/dist/modules/workflows/frontend/checkout-demo/page.js.map +2 -2
  153. package/package.json +3 -3
  154. package/src/helpers/integration/salesUi.ts +40 -30
  155. package/src/modules/api_docs/frontend/docs/api/Explorer.tsx +25 -19
  156. package/src/modules/attachments/components/AttachmentPartitionSettings.tsx +21 -11
  157. package/src/modules/attachments/fields/attachment.tsx +4 -6
  158. package/src/modules/auth/api/users/route.ts +75 -25
  159. package/src/modules/auth/backend/users/create/page.tsx +16 -20
  160. package/src/modules/business_rules/components/ActionRow.tsx +51 -32
  161. package/src/modules/business_rules/components/ConditionGroup.tsx +20 -9
  162. package/src/modules/business_rules/components/ConditionRow.tsx +24 -15
  163. package/src/modules/business_rules/components/RuleSetMembers.tsx +23 -13
  164. package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +47 -53
  165. package/src/modules/catalog/backend/catalog/products/create/page.tsx +84 -87
  166. package/src/modules/catalog/components/PriceKindSettings.tsx +9 -9
  167. package/src/modules/catalog/components/products/ProductUomSection.tsx +85 -83
  168. package/src/modules/catalog/components/products/VariantBuilder.tsx +49 -33
  169. package/src/modules/customer_accounts/backend/customer_accounts/users/[id]/page.tsx +12 -27
  170. package/src/modules/customer_accounts/backend/customer_accounts/users/page.tsx +4 -6
  171. package/src/modules/customer_accounts/widgets/injection/account-status/widget.client.tsx +5 -4
  172. package/src/modules/customers/backend/config/customers/pipeline-stages/page.tsx +28 -15
  173. package/src/modules/customers/backend/customers/deals/pipeline/page.tsx +37 -26
  174. package/src/modules/customers/components/AddressEditor.tsx +30 -16
  175. package/src/modules/customers/components/AddressFormatSettings.tsx +25 -19
  176. package/src/modules/customers/components/detail/ActivityForm.tsx +35 -23
  177. package/src/modules/customers/components/detail/AnnualRevenueField.tsx +2 -2
  178. package/src/modules/customers/components/detail/DealForm.tsx +33 -20
  179. package/src/modules/customers/components/formConfig.tsx +25 -17
  180. package/src/modules/customers/widgets/dashboard/customer-todos/widget.client.tsx +3 -2
  181. package/src/modules/customers/widgets/dashboard/new-customers/widget.client.tsx +21 -11
  182. package/src/modules/customers/widgets/dashboard/new-deals/widget.client.tsx +3 -2
  183. package/src/modules/customers/widgets/dashboard/next-interactions/widget.client.tsx +3 -2
  184. package/src/modules/dashboards/components/WidgetVisibilityEditor.tsx +17 -22
  185. package/src/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.tsx +17 -7
  186. package/src/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.tsx +20 -10
  187. package/src/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.tsx +3 -2
  188. package/src/modules/dashboards/widgets/dashboard/top-customers/widget.client.tsx +3 -2
  189. package/src/modules/dashboards/widgets/dashboard/top-products/widget.client.tsx +20 -9
  190. package/src/modules/data_sync/backend/data-sync/page.tsx +64 -38
  191. package/src/modules/data_sync/components/IntegrationScheduleTab.tsx +18 -7
  192. package/src/modules/dictionaries/components/AppearanceSelector.tsx +4 -4
  193. package/src/modules/dictionaries/components/DictionaryEntriesEditor.tsx +3 -4
  194. package/src/modules/dictionaries/components/DictionaryEntrySelect.tsx +27 -21
  195. package/src/modules/dictionaries/fields/dictionary.tsx +36 -23
  196. package/src/modules/entities/components/EncryptionManager.tsx +49 -33
  197. package/src/modules/feature_toggles/components/formConfig.tsx +20 -10
  198. package/src/modules/feature_toggles/components/overrideFormConfig.tsx +20 -10
  199. package/src/modules/inbox_ops/backend/inbox-ops/settings/page.tsx +19 -10
  200. package/src/modules/inbox_ops/components/proposals/EditActionDialog.tsx +49 -26
  201. package/src/modules/integrations/backend/integrations/[id]/page.tsx +20 -11
  202. package/src/modules/integrations/backend/integrations/bundle/[id]/page.tsx +19 -9
  203. package/src/modules/planner/components/AvailabilityRulesEditor.tsx +34 -21
  204. package/src/modules/resources/components/ResourceCrudForm.tsx +24 -15
  205. package/src/modules/sales/backend/sales/documents/[id]/page.tsx +12 -15
  206. package/src/modules/sales/components/ProviderFieldInput.tsx +26 -17
  207. package/src/modules/sales/components/ShippingMethodsSettings.tsx +28 -20
  208. package/src/modules/sales/components/channels/ChannelOfferForm.tsx +51 -46
  209. package/src/modules/sales/components/documents/AddressesSection.tsx +78 -76
  210. package/src/modules/sales/components/documents/AdjustmentDialog.tsx +27 -15
  211. package/src/modules/sales/components/documents/LineItemDialog.tsx +69 -51
  212. package/src/modules/sales/components/documents/SalesDocumentForm.tsx +98 -87
  213. package/src/modules/sales/widgets/dashboard/new-orders/widget.client.tsx +23 -12
  214. package/src/modules/sales/widgets/dashboard/new-quotes/widget.client.tsx +23 -12
  215. package/src/modules/shipping_carriers/lib/shipment-wizard/components/ConfigureStep.tsx +35 -19
  216. package/src/modules/staff/components/TeamMemberForm.tsx +23 -14
  217. package/src/modules/workflows/backend/tasks/[id]/page.tsx +51 -23
  218. package/src/modules/workflows/components/ActivitiesEditor.tsx +20 -10
  219. package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +28 -18
  220. package/src/modules/workflows/components/EdgeEditDialog.tsx +51 -40
  221. package/src/modules/workflows/components/NodeEditDialog.tsx +81 -77
  222. package/src/modules/workflows/components/StepsEditor.tsx +20 -10
  223. package/src/modules/workflows/components/TransitionsEditor.tsx +61 -44
  224. package/src/modules/workflows/components/fields/ActivityArrayEditor.tsx +22 -12
  225. package/src/modules/workflows/components/fields/BusinessRuleConditionsEditor.tsx +9 -13
  226. package/src/modules/workflows/components/fields/FormFieldArrayEditor.tsx +27 -17
  227. package/src/modules/workflows/components/fields/StartPreConditionsEditor.tsx +9 -12
  228. package/src/modules/workflows/components/mobile/MobileTaskForm.tsx +19 -11
  229. package/src/modules/workflows/frontend/checkout-demo/page.tsx +71 -60
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/business_rules/components/ConditionRow.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { X } from 'lucide-react'\nimport type { SimpleCondition } from './utils/conditionValidation'\nimport { getComparisonOperators, isValidFieldPath } from './utils/conditionValidation'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\n\nexport type ConditionRowProps = {\n condition: SimpleCondition\n onChange: (condition: SimpleCondition) => void\n onDelete: () => void\n entityType?: string\n error?: string\n}\n\nexport function ConditionRow({ condition, onChange, onDelete, error }: ConditionRowProps) {\n const t = useT()\n const operators = getComparisonOperators(t)\n const [useFieldComparison, setUseFieldComparison] = React.useState(!!condition.valueField)\n\n const handleFieldChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange({ ...condition, field: e.target.value })\n }\n\n const handleOperatorChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n onChange({ ...condition, operator: e.target.value as any })\n }\n\n const handleValueChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const rawValue = e.target.value\n\n // Try to parse as JSON for arrays/objects\n let parsedValue: any = rawValue\n if (rawValue.trim().startsWith('[') || rawValue.trim().startsWith('{')) {\n try {\n parsedValue = JSON.parse(rawValue)\n } catch {\n // Keep as string if not valid JSON\n parsedValue = rawValue\n }\n }\n\n onChange({ ...condition, value: parsedValue, valueField: undefined })\n }\n\n const handleValueFieldChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange({ ...condition, valueField: e.target.value, value: null })\n }\n\n const toggleFieldComparison = () => {\n if (useFieldComparison) {\n onChange({ ...condition, valueField: undefined, value: null })\n setUseFieldComparison(false)\n } else {\n onChange({ ...condition, value: null, valueField: '' })\n setUseFieldComparison(true)\n }\n }\n\n // Operators that don't need a value\n const operatorNeedsValue = !['IS_EMPTY', 'IS_NOT_EMPTY'].includes(condition.operator)\n\n const fieldError = condition.field && !isValidFieldPath(condition.field)\n\n return (\n <div className=\"flex items-start gap-2 p-3 bg-muted rounded border border-border\">\n <div className=\"flex-1 grid grid-cols-1 md:grid-cols-3 gap-2\">\n {/* Field Input */}\n <div>\n <label className=\"block text-xs font-medium text-foreground mb-1\">\n {t('business_rules.components.conditionRow.field')}\n </label>\n <input\n type=\"text\"\n value={condition.field || ''}\n onChange={handleFieldChange}\n placeholder={t('business_rules.components.conditionRow.field.placeholder')}\n className={`w-full px-2 py-1.5 text-sm border rounded bg-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring ${\n fieldError ? 'border-red-500' : 'border-border'\n }`}\n />\n {fieldError && (\n <p className=\"text-xs text-red-600 mt-0.5\">\n {t('business_rules.components.conditionRow.field.invalidPath')}\n </p>\n )}\n </div>\n\n {/* Operator Select */}\n <div>\n <label className=\"block text-xs font-medium text-foreground mb-1\">\n {t('business_rules.components.conditionRow.operator')}\n </label>\n <select\n value={condition.operator || '='}\n onChange={handleOperatorChange}\n className=\"w-full px-2 py-1.5 text-sm border border-border rounded bg-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {operators.map((op) => (\n <option key={op.value} value={op.value}>\n {op.label}\n </option>\n ))}\n </select>\n </div>\n\n {/* Value Input */}\n {operatorNeedsValue && (\n <div>\n <div className=\"flex items-center justify-between mb-1\">\n <label className=\"block text-xs font-medium text-foreground\">\n {useFieldComparison\n ? t('business_rules.components.conditionRow.compareToField')\n : t('business_rules.components.conditionRow.value')\n }\n </label>\n <button\n type=\"button\"\n onClick={toggleFieldComparison}\n className=\"text-xs text-blue-600 hover:text-blue-800 dark:text-blue-400 dark:hover:text-blue-300\"\n title={t('business_rules.components.conditionRow.toggleFieldComparison')}\n >\n {useFieldComparison\n ? t('business_rules.components.conditionRow.useValue')\n : t('business_rules.components.conditionRow.useField')\n }\n </button>\n </div>\n <input\n type=\"text\"\n value={\n useFieldComparison\n ? (condition.valueField || '')\n : (condition.value === null || condition.value === undefined)\n ? ''\n : typeof condition.value === 'string'\n ? condition.value\n : JSON.stringify(condition.value)\n }\n onChange={useFieldComparison ? handleValueFieldChange : handleValueChange}\n placeholder={useFieldComparison\n ? t('business_rules.components.conditionRow.field.comparisonPlaceholder')\n : t('business_rules.components.conditionRow.value.placeholder')\n }\n className=\"w-full px-2 py-1.5 text-sm border border-border rounded bg-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n <p className=\"text-xs text-muted-foreground mt-0.5\">\n {useFieldComparison\n ? t('business_rules.components.conditionRow.field.comparisonHelp')\n : t('business_rules.components.conditionRow.value.help')\n }\n </p>\n </div>\n )}\n </div>\n\n {/* Delete Button */}\n <button\n type=\"button\"\n onClick={onDelete}\n className=\"p-1.5 text-muted-foreground hover:text-red-600 hover:bg-red-50 dark:hover:bg-red-900/20 rounded transition-colors\"\n title={t('business_rules.components.conditionRow.deleteCondition')}\n >\n <X className=\"w-4 h-4\" />\n </button>\n\n {/* Error Display */}\n {error && (\n <div className=\"col-span-full mt-2\">\n <p className=\"text-xs text-red-600\">{error}</p>\n </div>\n )}\n </div>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Button } from '@open-mercato/ui/primitives/button'\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 { X } from 'lucide-react'\nimport type { SimpleCondition } from './utils/conditionValidation'\nimport { getComparisonOperators, isValidFieldPath } from './utils/conditionValidation'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\n\nexport type ConditionRowProps = {\n condition: SimpleCondition\n onChange: (condition: SimpleCondition) => void\n onDelete: () => void\n entityType?: string\n error?: string\n}\n\nexport function ConditionRow({ condition, onChange, onDelete, error }: ConditionRowProps) {\n const t = useT()\n const operators = getComparisonOperators(t)\n const [useFieldComparison, setUseFieldComparison] = React.useState(!!condition.valueField)\n\n const handleFieldChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange({ ...condition, field: e.target.value })\n }\n\n const handleOperatorChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n onChange({ ...condition, operator: e.target.value as any })\n }\n\n const handleValueChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const rawValue = e.target.value\n\n // Try to parse as JSON for arrays/objects\n let parsedValue: any = rawValue\n if (rawValue.trim().startsWith('[') || rawValue.trim().startsWith('{')) {\n try {\n parsedValue = JSON.parse(rawValue)\n } catch {\n // Keep as string if not valid JSON\n parsedValue = rawValue\n }\n }\n\n onChange({ ...condition, value: parsedValue, valueField: undefined })\n }\n\n const handleValueFieldChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange({ ...condition, valueField: e.target.value, value: null })\n }\n\n const toggleFieldComparison = () => {\n if (useFieldComparison) {\n onChange({ ...condition, valueField: undefined, value: null })\n setUseFieldComparison(false)\n } else {\n onChange({ ...condition, value: null, valueField: '' })\n setUseFieldComparison(true)\n }\n }\n\n // Operators that don't need a value\n const operatorNeedsValue = !['IS_EMPTY', 'IS_NOT_EMPTY'].includes(condition.operator)\n\n const fieldError = condition.field && !isValidFieldPath(condition.field)\n\n return (\n <div className=\"flex items-start gap-2 p-3 bg-muted rounded border border-border\">\n <div className=\"flex-1 grid grid-cols-1 md:grid-cols-3 gap-2\">\n {/* Field Input */}\n <div>\n <label className=\"block text-xs font-medium text-foreground mb-1\">\n {t('business_rules.components.conditionRow.field')}\n </label>\n <Input\n type=\"text\"\n value={condition.field || ''}\n onChange={handleFieldChange}\n placeholder={t('business_rules.components.conditionRow.field.placeholder')}\n aria-invalid={fieldError ? true : undefined}\n />\n {fieldError && (\n <p className=\"text-xs text-red-600 mt-0.5\">\n {t('business_rules.components.conditionRow.field.invalidPath')}\n </p>\n )}\n </div>\n\n {/* Operator Select */}\n <div>\n <label className=\"block text-xs font-medium text-foreground mb-1\">\n {t('business_rules.components.conditionRow.operator')}\n </label>\n <Select\n value={condition.operator || '='}\n onValueChange={(value) => handleOperatorChange({ target: { value } } as React.ChangeEvent<HTMLSelectElement>)}\n >\n <SelectTrigger size=\"sm\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {operators.map((op) => (\n <SelectItem key={op.value} value={op.value}>\n {op.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Value Input */}\n {operatorNeedsValue && (\n <div>\n <div className=\"flex items-center justify-between mb-1\">\n <label className=\"block text-xs font-medium text-foreground\">\n {useFieldComparison\n ? t('business_rules.components.conditionRow.compareToField')\n : t('business_rules.components.conditionRow.value')\n }\n </label>\n <button\n type=\"button\"\n onClick={toggleFieldComparison}\n className=\"text-xs text-blue-600 hover:text-blue-800 dark:text-blue-400 dark:hover:text-blue-300\"\n title={t('business_rules.components.conditionRow.toggleFieldComparison')}\n >\n {useFieldComparison\n ? t('business_rules.components.conditionRow.useValue')\n : t('business_rules.components.conditionRow.useField')\n }\n </button>\n </div>\n <Input\n type=\"text\"\n value={\n useFieldComparison\n ? (condition.valueField || '')\n : (condition.value === null || condition.value === undefined)\n ? ''\n : typeof condition.value === 'string'\n ? condition.value\n : JSON.stringify(condition.value)\n }\n onChange={useFieldComparison ? handleValueFieldChange : handleValueChange}\n placeholder={useFieldComparison\n ? t('business_rules.components.conditionRow.field.comparisonPlaceholder')\n : t('business_rules.components.conditionRow.value.placeholder')\n }\n />\n <p className=\"text-xs text-muted-foreground mt-0.5\">\n {useFieldComparison\n ? t('business_rules.components.conditionRow.field.comparisonHelp')\n : t('business_rules.components.conditionRow.value.help')\n }\n </p>\n </div>\n )}\n </div>\n\n {/* Delete Button */}\n <button\n type=\"button\"\n onClick={onDelete}\n className=\"p-1.5 text-muted-foreground hover:text-red-600 hover:bg-red-50 dark:hover:bg-red-900/20 rounded transition-colors\"\n title={t('business_rules.components.conditionRow.deleteCondition')}\n >\n <X className=\"w-4 h-4\" />\n </button>\n\n {/* Error Display */}\n {error && (\n <div className=\"col-span-full mt-2\">\n <p className=\"text-xs text-red-600\">{error}</p>\n </div>\n )}\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -2,6 +2,14 @@
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
4
  import { Button } from "@open-mercato/ui/primitives/button";
5
+ import { Input } from "@open-mercato/ui/primitives/input";
6
+ import {
7
+ Select,
8
+ SelectContent,
9
+ SelectItem,
10
+ SelectTrigger,
11
+ SelectValue
12
+ } from "@open-mercato/ui/primitives/select";
5
13
  import { Plus, ChevronUp, ChevronDown, X } from "lucide-react";
6
14
  import { useQuery } from "@tanstack/react-query";
7
15
  import { apiCall } from "@open-mercato/ui/backend/utils/apiCall";
@@ -110,19 +118,18 @@ function RuleSetMembers({ members, onAdd, onUpdate, onRemove }) {
110
118
  /* @__PURE__ */ jsxs("div", { className: "flex-1", children: [
111
119
  /* @__PURE__ */ jsx("label", { className: "block text-sm font-medium text-foreground mb-1", children: t("business_rules.sets.members.form.selectRule") }),
112
120
  /* @__PURE__ */ jsxs(
113
- "select",
121
+ Select,
114
122
  {
115
- value: selectedRuleId,
116
- onChange: (e) => setSelectedRuleId(e.target.value),
117
- className: "w-full px-3 py-2 border border-border rounded bg-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
123
+ value: selectedRuleId || void 0,
124
+ onValueChange: (value) => setSelectedRuleId(value ?? ""),
118
125
  children: [
119
- /* @__PURE__ */ jsx("option", { value: "", children: t("business_rules.sets.members.form.selectRulePlaceholder") }),
120
- rulesNotInSet.map((rule) => /* @__PURE__ */ jsxs("option", { value: rule.id, children: [
126
+ /* @__PURE__ */ jsx(SelectTrigger, { children: /* @__PURE__ */ jsx(SelectValue, { placeholder: t("business_rules.sets.members.form.selectRulePlaceholder") }) }),
127
+ /* @__PURE__ */ jsx(SelectContent, { children: rulesNotInSet.map((rule) => /* @__PURE__ */ jsxs(SelectItem, { value: rule.id, children: [
121
128
  rule.ruleName,
122
129
  " (",
123
130
  rule.ruleId,
124
131
  ")"
125
- ] }, rule.id))
132
+ ] }, rule.id)) })
126
133
  ]
127
134
  }
128
135
  )
@@ -130,13 +137,12 @@ function RuleSetMembers({ members, onAdd, onUpdate, onRemove }) {
130
137
  /* @__PURE__ */ jsxs("div", { className: "w-32", children: [
131
138
  /* @__PURE__ */ jsx("label", { className: "block text-sm font-medium text-foreground mb-1", children: t("business_rules.sets.members.form.sequence") }),
132
139
  /* @__PURE__ */ jsx(
133
- "input",
140
+ Input,
134
141
  {
135
142
  type: "number",
136
143
  value: sequence,
137
144
  onChange: (e) => setSequence(parseInt(e.target.value) || 0),
138
- min: 0,
139
- className: "w-full px-3 py-2 border border-border rounded bg-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
145
+ min: 0
140
146
  }
141
147
  )
142
148
  ] })
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/business_rules/components/RuleSetMembers.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Plus, ChevronUp, ChevronDown, X } from 'lucide-react'\nimport { useQuery } from '@tanstack/react-query'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\n\ntype Member = {\n id: string\n ruleId: string\n ruleName: string\n ruleType: string\n sequence: number\n enabled: boolean\n}\n\ntype RuleOption = {\n id: string\n ruleId: string\n ruleName: string\n ruleType: string\n}\n\ntype RuleSetMembersProps = {\n members: Member[]\n onAdd: (ruleId: string, sequence: number) => Promise<void>\n onUpdate: (memberId: string, updates: { sequence?: number; enabled?: boolean }) => Promise<void>\n onRemove: (memberId: string, ruleName: string) => Promise<void>\n}\n\nexport function RuleSetMembers({ members, onAdd, onUpdate, onRemove }: RuleSetMembersProps) {\n const t = useT()\n const [showAddForm, setShowAddForm] = React.useState(false)\n const [selectedRuleId, setSelectedRuleId] = React.useState('')\n const [sequence, setSequence] = React.useState(0)\n\n // Fetch available rules\n const { data: availableRules } = useQuery({\n queryKey: ['business-rules', 'rules-list'],\n queryFn: async () => {\n const result = await apiCall<{ items: RuleOption[] }>(\n '/api/business_rules/rules?page=1&pageSize=100&sortField=ruleName&sortDir=asc'\n )\n if (!result.ok) {\n throw new Error('Failed to fetch rules')\n }\n return result.result?.items || []\n },\n })\n\n // Filter out already added rules (memoized to avoid re-computation on every render)\n const rulesNotInSet = React.useMemo(() => {\n const memberRuleIds = new Set(members.map(m => m.ruleId))\n return availableRules?.filter(r => !memberRuleIds.has(r.id)) || []\n }, [members, availableRules])\n\n const handleAdd = async () => {\n if (!selectedRuleId) return\n await onAdd(selectedRuleId, sequence)\n setSelectedRuleId('')\n setSequence(0)\n setShowAddForm(false)\n }\n\n const handleMoveUp = async (member: Member, index: number) => {\n if (index === 0) return\n const prevMember = members[index - 1]\n // Swap sequences\n await onUpdate(member.id, { sequence: prevMember.sequence })\n await onUpdate(prevMember.id, { sequence: member.sequence })\n }\n\n const handleMoveDown = async (member: Member, index: number) => {\n if (index === members.length - 1) return\n const nextMember = members[index + 1]\n // Swap sequences\n await onUpdate(member.id, { sequence: nextMember.sequence })\n await onUpdate(nextMember.id, { sequence: member.sequence })\n }\n\n const handleToggleEnabled = async (member: Member) => {\n await onUpdate(member.id, { enabled: !member.enabled })\n }\n\n return (\n <div className=\"space-y-4\">\n {/* Members List */}\n {members.length === 0 ? (\n <div className=\"text-center py-8 text-muted-foreground\">\n <p>{t('business_rules.sets.members.empty')}</p>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {members.map((member, index) => (\n <div\n key={member.id}\n className=\"flex items-center gap-3 p-3 bg-muted rounded border border-border\"\n >\n {/* Order Controls */}\n <div className=\"flex flex-col gap-1\">\n <button\n onClick={() => handleMoveUp(member, index)}\n disabled={index === 0}\n className=\"p-1 text-muted-foreground hover:text-foreground hover:bg-muted rounded transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n title={t('common.moveUp')}\n >\n <ChevronUp className=\"w-4 h-4\" />\n </button>\n <button\n onClick={() => handleMoveDown(member, index)}\n disabled={index === members.length - 1}\n className=\"p-1 text-muted-foreground hover:text-foreground hover:bg-muted rounded transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n title={t('common.moveDown')}\n >\n <ChevronDown className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Sequence Number */}\n <div className=\"flex items-center justify-center w-8 h-8 bg-status-info-bg text-status-info-text rounded font-mono text-sm font-medium\">\n {member.sequence}\n </div>\n\n {/* Rule Info */}\n <div className=\"flex-1\">\n <div className=\"font-medium\">{member.ruleName}</div>\n <div className=\"text-xs text-muted-foreground font-mono\">{member.ruleId}</div>\n </div>\n\n {/* Rule Type Badge */}\n <div className=\"px-2 py-1 bg-muted text-muted-foreground text-xs rounded font-medium\">\n {member.ruleType}\n </div>\n\n {/* Enabled Toggle */}\n <button\n onClick={() => handleToggleEnabled(member)}\n className={`px-2 py-1 rounded text-xs font-medium cursor-pointer ${\n member.enabled\n ? 'bg-status-success-bg text-status-success-text hover:bg-status-success-bg/80'\n : 'bg-muted text-muted-foreground hover:bg-muted/50'\n }`}\n title={t('business_rules.sets.members.actions.toggleEnabled')}\n >\n {member.enabled ? t('common.enabled') : t('common.disabled')}\n </button>\n\n {/* Remove Button */}\n <button\n onClick={() => onRemove(member.id, member.ruleName)}\n className=\"p-1.5 text-muted-foreground hover:text-status-error-text hover:bg-status-error-bg rounded transition-colors\"\n title={t('common.remove')}\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* Add Rule Form */}\n {showAddForm ? (\n <div className=\"p-4 bg-status-info-bg border border-status-info-border rounded space-y-3\">\n <div className=\"flex items-end gap-3\">\n <div className=\"flex-1\">\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n {t('business_rules.sets.members.form.selectRule')}\n </label>\n <select\n value={selectedRuleId}\n onChange={(e) => setSelectedRuleId(e.target.value)}\n className=\"w-full px-3 py-2 border border-border rounded bg-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <option value=\"\">{t('business_rules.sets.members.form.selectRulePlaceholder')}</option>\n {rulesNotInSet.map((rule) => (\n <option key={rule.id} value={rule.id}>\n {rule.ruleName} ({rule.ruleId})\n </option>\n ))}\n </select>\n </div>\n\n <div className=\"w-32\">\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n {t('business_rules.sets.members.form.sequence')}\n </label>\n <input\n type=\"number\"\n value={sequence}\n onChange={(e) => setSequence(parseInt(e.target.value) || 0)}\n min={0}\n className=\"w-full px-3 py-2 border border-border rounded bg-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n </div>\n </div>\n\n <div className=\"flex gap-2\">\n <Button onClick={handleAdd} disabled={!selectedRuleId} size=\"sm\">\n {t('business_rules.sets.members.actions.add')}\n </Button>\n <Button\n onClick={() => {\n setShowAddForm(false)\n setSelectedRuleId('')\n setSequence(0)\n }}\n variant=\"outline\"\n size=\"sm\"\n >\n {t('common.cancel')}\n </Button>\n </div>\n </div>\n ) : (\n <Button onClick={() => setShowAddForm(true)} variant=\"outline\" size=\"sm\">\n <Plus className=\"w-4 h-4 mr-2\" />\n {t('business_rules.sets.members.actions.addRule')}\n </Button>\n )}\n\n {/* Help Text */}\n <div className=\"text-xs text-muted-foreground space-y-1\">\n <p>\n <strong>{t('business_rules.sets.members.help.ordering')}:</strong>{' '}\n {t('business_rules.sets.members.help.orderingDescription')}\n </p>\n <p>\n <strong>{t('business_rules.sets.members.help.enabled')}:</strong>{' '}\n {t('business_rules.sets.members.help.enabledDescription')}\n </p>\n </div>\n </div>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Button } from '@open-mercato/ui/primitives/button'\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 { Plus, ChevronUp, ChevronDown, X } from 'lucide-react'\nimport { useQuery } from '@tanstack/react-query'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\n\ntype Member = {\n id: string\n ruleId: string\n ruleName: string\n ruleType: string\n sequence: number\n enabled: boolean\n}\n\ntype RuleOption = {\n id: string\n ruleId: string\n ruleName: string\n ruleType: string\n}\n\ntype RuleSetMembersProps = {\n members: Member[]\n onAdd: (ruleId: string, sequence: number) => Promise<void>\n onUpdate: (memberId: string, updates: { sequence?: number; enabled?: boolean }) => Promise<void>\n onRemove: (memberId: string, ruleName: string) => Promise<void>\n}\n\nexport function RuleSetMembers({ members, onAdd, onUpdate, onRemove }: RuleSetMembersProps) {\n const t = useT()\n const [showAddForm, setShowAddForm] = React.useState(false)\n const [selectedRuleId, setSelectedRuleId] = React.useState('')\n const [sequence, setSequence] = React.useState(0)\n\n // Fetch available rules\n const { data: availableRules } = useQuery({\n queryKey: ['business-rules', 'rules-list'],\n queryFn: async () => {\n const result = await apiCall<{ items: RuleOption[] }>(\n '/api/business_rules/rules?page=1&pageSize=100&sortField=ruleName&sortDir=asc'\n )\n if (!result.ok) {\n throw new Error('Failed to fetch rules')\n }\n return result.result?.items || []\n },\n })\n\n // Filter out already added rules (memoized to avoid re-computation on every render)\n const rulesNotInSet = React.useMemo(() => {\n const memberRuleIds = new Set(members.map(m => m.ruleId))\n return availableRules?.filter(r => !memberRuleIds.has(r.id)) || []\n }, [members, availableRules])\n\n const handleAdd = async () => {\n if (!selectedRuleId) return\n await onAdd(selectedRuleId, sequence)\n setSelectedRuleId('')\n setSequence(0)\n setShowAddForm(false)\n }\n\n const handleMoveUp = async (member: Member, index: number) => {\n if (index === 0) return\n const prevMember = members[index - 1]\n // Swap sequences\n await onUpdate(member.id, { sequence: prevMember.sequence })\n await onUpdate(prevMember.id, { sequence: member.sequence })\n }\n\n const handleMoveDown = async (member: Member, index: number) => {\n if (index === members.length - 1) return\n const nextMember = members[index + 1]\n // Swap sequences\n await onUpdate(member.id, { sequence: nextMember.sequence })\n await onUpdate(nextMember.id, { sequence: member.sequence })\n }\n\n const handleToggleEnabled = async (member: Member) => {\n await onUpdate(member.id, { enabled: !member.enabled })\n }\n\n return (\n <div className=\"space-y-4\">\n {/* Members List */}\n {members.length === 0 ? (\n <div className=\"text-center py-8 text-muted-foreground\">\n <p>{t('business_rules.sets.members.empty')}</p>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {members.map((member, index) => (\n <div\n key={member.id}\n className=\"flex items-center gap-3 p-3 bg-muted rounded border border-border\"\n >\n {/* Order Controls */}\n <div className=\"flex flex-col gap-1\">\n <button\n onClick={() => handleMoveUp(member, index)}\n disabled={index === 0}\n className=\"p-1 text-muted-foreground hover:text-foreground hover:bg-muted rounded transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n title={t('common.moveUp')}\n >\n <ChevronUp className=\"w-4 h-4\" />\n </button>\n <button\n onClick={() => handleMoveDown(member, index)}\n disabled={index === members.length - 1}\n className=\"p-1 text-muted-foreground hover:text-foreground hover:bg-muted rounded transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n title={t('common.moveDown')}\n >\n <ChevronDown className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Sequence Number */}\n <div className=\"flex items-center justify-center w-8 h-8 bg-status-info-bg text-status-info-text rounded font-mono text-sm font-medium\">\n {member.sequence}\n </div>\n\n {/* Rule Info */}\n <div className=\"flex-1\">\n <div className=\"font-medium\">{member.ruleName}</div>\n <div className=\"text-xs text-muted-foreground font-mono\">{member.ruleId}</div>\n </div>\n\n {/* Rule Type Badge */}\n <div className=\"px-2 py-1 bg-muted text-muted-foreground text-xs rounded font-medium\">\n {member.ruleType}\n </div>\n\n {/* Enabled Toggle */}\n <button\n onClick={() => handleToggleEnabled(member)}\n className={`px-2 py-1 rounded text-xs font-medium cursor-pointer ${\n member.enabled\n ? 'bg-status-success-bg text-status-success-text hover:bg-status-success-bg/80'\n : 'bg-muted text-muted-foreground hover:bg-muted/50'\n }`}\n title={t('business_rules.sets.members.actions.toggleEnabled')}\n >\n {member.enabled ? t('common.enabled') : t('common.disabled')}\n </button>\n\n {/* Remove Button */}\n <button\n onClick={() => onRemove(member.id, member.ruleName)}\n className=\"p-1.5 text-muted-foreground hover:text-status-error-text hover:bg-status-error-bg rounded transition-colors\"\n title={t('common.remove')}\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* Add Rule Form */}\n {showAddForm ? (\n <div className=\"p-4 bg-status-info-bg border border-status-info-border rounded space-y-3\">\n <div className=\"flex items-end gap-3\">\n <div className=\"flex-1\">\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n {t('business_rules.sets.members.form.selectRule')}\n </label>\n <Select\n value={selectedRuleId || undefined}\n onValueChange={(value) => setSelectedRuleId(value ?? '')}\n >\n <SelectTrigger>\n <SelectValue placeholder={t('business_rules.sets.members.form.selectRulePlaceholder')} />\n </SelectTrigger>\n <SelectContent>\n {rulesNotInSet.map((rule) => (\n <SelectItem key={rule.id} value={rule.id}>\n {rule.ruleName} ({rule.ruleId})\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"w-32\">\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n {t('business_rules.sets.members.form.sequence')}\n </label>\n <Input\n type=\"number\"\n value={sequence}\n onChange={(e) => setSequence(parseInt(e.target.value) || 0)}\n min={0}\n />\n </div>\n </div>\n\n <div className=\"flex gap-2\">\n <Button onClick={handleAdd} disabled={!selectedRuleId} size=\"sm\">\n {t('business_rules.sets.members.actions.add')}\n </Button>\n <Button\n onClick={() => {\n setShowAddForm(false)\n setSelectedRuleId('')\n setSequence(0)\n }}\n variant=\"outline\"\n size=\"sm\"\n >\n {t('common.cancel')}\n </Button>\n </div>\n </div>\n ) : (\n <Button onClick={() => setShowAddForm(true)} variant=\"outline\" size=\"sm\">\n <Plus className=\"w-4 h-4 mr-2\" />\n {t('business_rules.sets.members.actions.addRule')}\n </Button>\n )}\n\n {/* Help Text */}\n <div className=\"text-xs text-muted-foreground space-y-1\">\n <p>\n <strong>{t('business_rules.sets.members.help.ordering')}:</strong>{' '}\n {t('business_rules.sets.members.help.orderingDescription')}\n </p>\n <p>\n <strong>{t('business_rules.sets.members.help.enabled')}:</strong>{' '}\n {t('business_rules.sets.members.help.enabledDescription')}\n </p>\n </div>\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -19,6 +19,13 @@ import { flash } from "@open-mercato/ui/backend/FlashMessages";
19
19
  import { Button } from "@open-mercato/ui/primitives/button";
20
20
  import { Input } from "@open-mercato/ui/primitives/input";
21
21
  import { Label } from "@open-mercato/ui/primitives/label";
22
+ import {
23
+ Select,
24
+ SelectContent,
25
+ SelectItem,
26
+ SelectTrigger,
27
+ SelectValue
28
+ } from "@open-mercato/ui/primitives/select";
22
29
  import { TagsInput } from "@open-mercato/ui/backend/inputs/TagsInput";
23
30
  import { Textarea } from "@open-mercato/ui/primitives/textarea";
24
31
  import { DataLoader } from "@open-mercato/ui/primitives/DataLoader";
@@ -2010,13 +2017,12 @@ function ProductMetaSection({
2010
2017
  ] }),
2011
2018
  /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
2012
2019
  /* @__PURE__ */ jsx(Label, { children: t("catalog.products.form.productType", "Product type") }),
2013
- /* @__PURE__ */ jsx(
2014
- "select",
2020
+ /* @__PURE__ */ jsxs(
2021
+ Select,
2015
2022
  {
2016
- className: "w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
2017
2023
  value: values.productType || "simple",
2018
- onChange: (event) => {
2019
- const nextType = event.target.value;
2024
+ onValueChange: (value) => {
2025
+ const nextType = value;
2020
2026
  setValue("productType", nextType);
2021
2027
  const nextIsConfigurable = isConfigurableProductType(nextType);
2022
2028
  if (nextIsConfigurable && !values.hasVariants) {
@@ -2025,24 +2031,16 @@ function ProductMetaSection({
2025
2031
  setValue("hasVariants", false);
2026
2032
  }
2027
2033
  },
2028
- children: CATALOG_PRODUCT_TYPES.map((type) => {
2029
- const isDisabled = type === "bundle" || type === "grouped";
2030
- return /* @__PURE__ */ jsxs(
2031
- "option",
2032
- {
2033
- value: type,
2034
- disabled: isDisabled,
2035
- children: [
2036
- t(
2037
- `catalog.products.types.${type}`,
2038
- type
2039
- ),
2040
- isDisabled ? ` (${t("common.comingSoon", "Coming soon")})` : ""
2041
- ]
2042
- },
2043
- type
2044
- );
2045
- })
2034
+ children: [
2035
+ /* @__PURE__ */ jsx(SelectTrigger, { children: /* @__PURE__ */ jsx(SelectValue, {}) }),
2036
+ /* @__PURE__ */ jsx(SelectContent, { children: CATALOG_PRODUCT_TYPES.map((type) => {
2037
+ const isDisabled = type === "bundle" || type === "grouped";
2038
+ return /* @__PURE__ */ jsxs(SelectItem, { value: type, disabled: isDisabled, children: [
2039
+ t(`catalog.products.types.${type}`, type),
2040
+ isDisabled ? ` (${t("common.comingSoon", "Coming soon")})` : ""
2041
+ ] }, type);
2042
+ }) })
2043
+ ]
2046
2044
  }
2047
2045
  ),
2048
2046
  errors.productType ? /* @__PURE__ */ jsx("p", { className: "text-xs text-red-600", children: errors.productType }) : null
@@ -2081,21 +2079,19 @@ function ProductMetaSection({
2081
2079
  )
2082
2080
  ] }),
2083
2081
  /* @__PURE__ */ jsxs(
2084
- "select",
2082
+ Select,
2085
2083
  {
2086
- className: "w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
2087
- value: values.taxRateId ?? "",
2088
- onChange: (event) => setValue("taxRateId", event.target.value || null),
2084
+ value: values.taxRateId || void 0,
2085
+ onValueChange: (value) => setValue("taxRateId", value || null),
2089
2086
  disabled: !taxRates.length,
2090
2087
  children: [
2091
- /* @__PURE__ */ jsx("option", { value: "", children: taxRates.length ? t(
2092
- "catalog.products.create.taxRates.noneSelected",
2093
- "No tax class selected"
2094
- ) : t(
2095
- "catalog.products.create.taxRates.emptyOption",
2096
- "No tax classes available"
2088
+ /* @__PURE__ */ jsx(SelectTrigger, { children: /* @__PURE__ */ jsx(
2089
+ SelectValue,
2090
+ {
2091
+ placeholder: taxRates.length ? t("catalog.products.create.taxRates.noneSelected", "No tax class selected") : t("catalog.products.create.taxRates.emptyOption", "No tax classes available")
2092
+ }
2097
2093
  ) }),
2098
- taxRates.map((rate) => /* @__PURE__ */ jsx("option", { value: rate.id, children: formatTaxRateLabel(rate) }, rate.id))
2094
+ /* @__PURE__ */ jsx(SelectContent, { children: taxRates.map((rate) => /* @__PURE__ */ jsx(SelectItem, { value: rate.id, children: formatTaxRateLabel(rate) }, rate.id)) })
2099
2095
  ]
2100
2096
  }
2101
2097
  ),