@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
@@ -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'
@@ -110,14 +112,13 @@ function ResetPasswordDialog({
110
112
  <label className="text-sm font-medium" htmlFor="reset-password">
111
113
  {t('customer_accounts.admin.detail.resetPassword.fields.newPassword', 'New Password')}
112
114
  </label>
113
- <input
115
+ <Input
114
116
  id="reset-password"
115
117
  type="password"
116
118
  required
117
119
  minLength={8}
118
120
  value={newPassword}
119
121
  onChange={(event) => setNewPassword(event.target.value)}
120
- 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"
121
122
  placeholder={t('customer_accounts.admin.detail.resetPassword.fields.placeholder', 'Min. 8 characters')}
122
123
  />
123
124
  </div>
@@ -571,12 +572,11 @@ export default function CustomerUserDetailPage({ params }: { params?: { id?: str
571
572
  ) : (
572
573
  <div className="space-y-1">
573
574
  <div className="relative">
574
- <input
575
+ <Input
575
576
  type="text"
576
577
  value={personSearchQuery}
577
578
  onChange={(event) => { void handleSearchPeople(event.target.value) }}
578
579
  placeholder={t('customer_accounts.admin.detail.fields.searchPerson', 'Search people by name...')}
579
- 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"
580
580
  />
581
581
  {personResults.length > 0 && (
582
582
  <div className="absolute z-10 mt-1 w-full rounded-md border bg-background shadow-lg max-h-40 overflow-y-auto">
@@ -615,12 +615,11 @@ export default function CustomerUserDetailPage({ params }: { params?: { id?: str
615
615
  ) : (
616
616
  <div className="space-y-1">
617
617
  <div className="relative">
618
- <input
618
+ <Input
619
619
  type="text"
620
620
  value={companySearchQuery}
621
621
  onChange={(event) => { void handleSearchCompanies(event.target.value) }}
622
622
  placeholder={t('customer_accounts.admin.detail.fields.searchCompany', 'Search companies by name...')}
623
- 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"
624
623
  />
625
624
  {companyResults.length > 0 && (
626
625
  <div className="absolute z-10 mt-1 w-full rounded-md border bg-background shadow-lg max-h-40 overflow-y-auto">
@@ -660,34 +659,20 @@ export default function CustomerUserDetailPage({ params }: { params?: { id?: str
660
659
  <label className="text-sm font-medium" htmlFor="user-display-name">
661
660
  {t('customer_accounts.admin.detail.fields.displayName', 'Display Name')}
662
661
  </label>
663
- <input
662
+ <Input
664
663
  id="user-display-name"
665
664
  type="text"
666
665
  value={editDisplayName}
667
666
  onChange={(event) => setEditDisplayName(event.target.value)}
668
- 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"
669
667
  />
670
668
  </div>
671
669
 
672
- <div className="flex items-center gap-3">
673
- <label className="text-sm font-medium" htmlFor="user-active-toggle">
674
- {t('customer_accounts.admin.detail.fields.isActive', 'Active')}
675
- </label>
676
- <button
677
- id="user-active-toggle"
678
- type="button"
679
- role="switch"
680
- aria-checked={editActive ?? data.isActive}
681
- onClick={() => setEditActive((prev) => !(prev ?? data.isActive))}
682
- className={`relative inline-flex h-6 w-11 items-center rounded-full transition-colors ${
683
- (editActive ?? data.isActive) ? 'bg-primary' : 'bg-muted'
684
- }`}
685
- >
686
- <span className={`inline-block h-4 w-4 transform rounded-full bg-white transition-transform ${
687
- (editActive ?? data.isActive) ? 'translate-x-6' : 'translate-x-1'
688
- }`} />
689
- </button>
690
- </div>
670
+ <SwitchField
671
+ id="user-active-toggle"
672
+ label={t('customer_accounts.admin.detail.fields.isActive', 'Active')}
673
+ checked={editActive ?? data.isActive}
674
+ onCheckedChange={(next) => setEditActive(next)}
675
+ />
691
676
  </div>
692
677
 
693
678
  <div className="space-y-2">
@@ -9,6 +9,7 @@ import { DataTable } from '@open-mercato/ui/backend/DataTable'
9
9
  import type { ColumnDef } from '@tanstack/react-table'
10
10
  import { RowActions } from '@open-mercato/ui/backend/RowActions'
11
11
  import { Button } from '@open-mercato/ui/primitives/button'
12
+ import { Input } from '@open-mercato/ui/primitives/input'
12
13
  import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'
13
14
  import { apiCall, readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'
14
15
  import { flash } from '@open-mercato/ui/backend/FlashMessages'
@@ -143,13 +144,12 @@ function CreateUserDialog({
143
144
  <label className="text-sm font-medium" htmlFor="create-email">
144
145
  {t('customer_accounts.admin.createUser.fields.email', 'Email')}
145
146
  </label>
146
- <input
147
+ <Input
147
148
  id="create-email"
148
149
  type="email"
149
150
  required
150
151
  value={email}
151
152
  onChange={(event) => setEmail(event.target.value)}
152
- 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"
153
153
  placeholder={t('customer_accounts.admin.createUser.fields.emailPlaceholder', 'user@example.com')}
154
154
  />
155
155
  </div>
@@ -157,13 +157,12 @@ function CreateUserDialog({
157
157
  <label className="text-sm font-medium" htmlFor="create-name">
158
158
  {t('customer_accounts.admin.createUser.fields.displayName', 'Display Name')}
159
159
  </label>
160
- <input
160
+ <Input
161
161
  id="create-name"
162
162
  type="text"
163
163
  required
164
164
  value={displayName}
165
165
  onChange={(event) => setDisplayName(event.target.value)}
166
- 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"
167
166
  placeholder={t('customer_accounts.admin.createUser.fields.displayNamePlaceholder', 'John Doe')}
168
167
  />
169
168
  </div>
@@ -171,14 +170,13 @@ function CreateUserDialog({
171
170
  <label className="text-sm font-medium" htmlFor="create-password">
172
171
  {t('customer_accounts.admin.createUser.fields.password', 'Password')}
173
172
  </label>
174
- <input
173
+ <Input
175
174
  id="create-password"
176
175
  type="password"
177
176
  required
178
177
  minLength={8}
179
178
  value={password}
180
179
  onChange={(event) => setPassword(event.target.value)}
181
- 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"
182
180
  placeholder={t('customer_accounts.admin.createUser.fields.passwordPlaceholder', 'Min. 8 characters')}
183
181
  />
184
182
  </div>
@@ -5,6 +5,7 @@ import { useQuery, useQueryClient } from '@tanstack/react-query'
5
5
  import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
6
6
  import { useT } from '@open-mercato/shared/lib/i18n/context'
7
7
  import { Button } from '@open-mercato/ui/primitives/button'
8
+ import { Input } from '@open-mercato/ui/primitives/input'
8
9
  import { flash } from '@open-mercato/ui/backend/FlashMessages'
9
10
 
10
11
  interface AccountStatusData {
@@ -167,12 +168,12 @@ function InviteForm({ personEntityId, onSuccess }: { personEntityId: string; onS
167
168
  <label htmlFor="invite-email" className="block text-xs font-medium text-muted-foreground mb-1">
168
169
  {t('common.email', 'Email')}
169
170
  </label>
170
- <input
171
+ <Input
171
172
  id="invite-email"
172
173
  type="email"
174
+ size="sm"
173
175
  value={email}
174
176
  onChange={(event) => setEmail(event.target.value)}
175
- className="w-full rounded-md border border-input bg-background px-2.5 py-1.5 text-sm shadow-sm focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
176
177
  required
177
178
  disabled={isSubmitting}
178
179
  />
@@ -182,12 +183,12 @@ function InviteForm({ personEntityId, onSuccess }: { personEntityId: string; onS
182
183
  <label htmlFor="invite-display-name" className="block text-xs font-medium text-muted-foreground mb-1">
183
184
  {t('customer_accounts.widgets.invite.displayName', 'Display Name')}
184
185
  </label>
185
- <input
186
+ <Input
186
187
  id="invite-display-name"
187
188
  type="text"
189
+ size="sm"
188
190
  value={displayName}
189
191
  onChange={(event) => setDisplayName(event.target.value)}
190
- className="w-full rounded-md border border-input bg-background px-2.5 py-1.5 text-sm shadow-sm focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
191
192
  disabled={isSubmitting}
192
193
  />
193
194
  </div>
@@ -8,6 +8,13 @@ import { flash } from '@open-mercato/ui/backend/FlashMessages'
8
8
  import { Button } from '@open-mercato/ui/primitives/button'
9
9
  import { Input } from '@open-mercato/ui/primitives/input'
10
10
  import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from '@open-mercato/ui/primitives/dialog'
11
+ import {
12
+ Select,
13
+ SelectContent,
14
+ SelectItem,
15
+ SelectTrigger,
16
+ SelectValue,
17
+ } from '@open-mercato/ui/primitives/select'
11
18
  import { Spinner } from '@open-mercato/ui/primitives/spinner'
12
19
  import { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'
13
20
  import { AppearanceSelector, type AppearanceSelectorLabels } from '@open-mercato/core/modules/dictionaries/components/AppearanceSelector'
@@ -316,22 +323,28 @@ export default function PipelineStagesPage() {
316
323
  ) : (
317
324
  <>
318
325
  <div className="flex items-center gap-3">
319
- <select
320
- className="flex h-9 w-full max-w-xs rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
321
- value={selectedPipelineId ?? ''}
322
- onChange={(e) => setSelectedPipelineId(e.target.value || null)}
326
+ <Select
327
+ value={selectedPipelineId || undefined}
328
+ onValueChange={(value) => setSelectedPipelineId(value || null)}
329
+ disabled={pipelines.length === 0}
323
330
  >
324
- {pipelines.length === 0 && (
325
- <option value="">
326
- {t('customers.config.pipelineStages.noPipelines', 'No pipelines yet')}
327
- </option>
328
- )}
329
- {pipelines.map((p) => (
330
- <option key={p.id} value={p.id}>
331
- {p.name}{p.isDefault ? ` (${t('customers.config.pipelineStages.default', 'default')})` : ''}
332
- </option>
333
- ))}
334
- </select>
331
+ <SelectTrigger className="w-full max-w-xs">
332
+ <SelectValue
333
+ placeholder={
334
+ pipelines.length === 0
335
+ ? t('customers.config.pipelineStages.noPipelines', 'No pipelines yet')
336
+ : undefined
337
+ }
338
+ />
339
+ </SelectTrigger>
340
+ <SelectContent>
341
+ {pipelines.map((p) => (
342
+ <SelectItem key={p.id} value={p.id}>
343
+ {p.name}{p.isDefault ? ` (${t('customers.config.pipelineStages.default', 'default')})` : ''}
344
+ </SelectItem>
345
+ ))}
346
+ </SelectContent>
347
+ </Select>
335
348
  {selectedPipeline && (
336
349
  <>
337
350
  <Button variant="outline" size="sm" onClick={() => openEditPipeline(selectedPipeline)}>
@@ -4,6 +4,13 @@ import * as React from 'react'
4
4
  import Link from 'next/link'
5
5
  import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
6
6
  import { Page, PageBody } from '@open-mercato/ui/backend/Page'
7
+ import {
8
+ Select,
9
+ SelectContent,
10
+ SelectItem,
11
+ SelectTrigger,
12
+ SelectValue,
13
+ } from '@open-mercato/ui/primitives/select'
7
14
  import { Spinner } from '@open-mercato/ui/primitives/spinner'
8
15
  import { ErrorNotice } from '@open-mercato/ui/primitives/ErrorNotice'
9
16
  import { apiCallOrThrow, readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'
@@ -399,9 +406,8 @@ export default function SalesPipelinePage(): React.ReactElement {
399
406
  event.stopPropagation()
400
407
  }, [])
401
408
 
402
- const handleSortChange = React.useCallback((event: React.ChangeEvent<HTMLSelectElement>) => {
403
- const value = event.target.value as SortOption
404
- if (sortOptions.includes(value)) setSortBy(value)
409
+ const handleSortChange = React.useCallback((value: string) => {
410
+ if (sortOptions.includes(value as SortOption)) setSortBy(value as SortOption)
405
411
  }, [])
406
412
 
407
413
  const handleDragStart = React.useCallback((dealId: string) => {
@@ -478,15 +484,19 @@ export default function SalesPipelinePage(): React.ReactElement {
478
484
  {pipelinesQuery.data && pipelinesQuery.data.length > 0 ? (
479
485
  <label className="flex items-center gap-2 text-sm font-medium text-muted-foreground">
480
486
  <span>{translate('customers.deals.pipeline.switch.label', 'Pipeline')}</span>
481
- <select
482
- className="h-9 rounded-md border border-border bg-background px-3 text-sm text-foreground shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40"
483
- value={selectedPipelineId ?? ''}
484
- onChange={(e) => setSelectedPipelineId(e.target.value || null)}
487
+ <Select
488
+ value={selectedPipelineId || undefined}
489
+ onValueChange={(value) => setSelectedPipelineId(value || null)}
485
490
  >
486
- {pipelinesQuery.data.map((p) => (
487
- <option key={p.id} value={p.id}>{p.name}</option>
488
- ))}
489
- </select>
491
+ <SelectTrigger className="w-auto min-w-[12rem]">
492
+ <SelectValue />
493
+ </SelectTrigger>
494
+ <SelectContent>
495
+ {pipelinesQuery.data.map((p) => (
496
+ <SelectItem key={p.id} value={p.id}>{p.name}</SelectItem>
497
+ ))}
498
+ </SelectContent>
499
+ </Select>
490
500
  </label>
491
501
  ) : null}
492
502
  <Link
@@ -497,21 +507,22 @@ export default function SalesPipelinePage(): React.ReactElement {
497
507
  </Link>
498
508
  <label className="flex items-center gap-2 text-sm font-medium text-muted-foreground">
499
509
  <span>{translate('customers.deals.pipeline.sort.label', 'Sort by')}</span>
500
- <select
501
- className="h-9 rounded-md border border-border bg-background px-3 text-sm text-foreground shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40"
502
- value={sortBy}
503
- onChange={handleSortChange}
504
- >
505
- <option value="probability">
506
- {translate('customers.deals.pipeline.sort.probability', 'Probability (high to low)')}
507
- </option>
508
- <option value="createdAt">
509
- {translate('customers.deals.pipeline.sort.createdAt', 'Created (newest first)')}
510
- </option>
511
- <option value="expectedCloseAt">
512
- {translate('customers.deals.pipeline.sort.expectedCloseAt', 'Expected close (soonest first)')}
513
- </option>
514
- </select>
510
+ <Select value={sortBy} onValueChange={handleSortChange}>
511
+ <SelectTrigger className="w-auto min-w-[14rem]">
512
+ <SelectValue />
513
+ </SelectTrigger>
514
+ <SelectContent>
515
+ <SelectItem value="probability">
516
+ {translate('customers.deals.pipeline.sort.probability', 'Probability (high to low)')}
517
+ </SelectItem>
518
+ <SelectItem value="createdAt">
519
+ {translate('customers.deals.pipeline.sort.createdAt', 'Created (newest first)')}
520
+ </SelectItem>
521
+ <SelectItem value="expectedCloseAt">
522
+ {translate('customers.deals.pipeline.sort.expectedCloseAt', 'Expected close (soonest first)')}
523
+ </SelectItem>
524
+ </SelectContent>
525
+ </Select>
515
526
  </label>
516
527
  </div>
517
528
  </div>
@@ -6,6 +6,13 @@ import { usePathname, useSearchParams } from 'next/navigation'
6
6
  import { Plus, Settings } from 'lucide-react'
7
7
  import { Button } from '@open-mercato/ui/primitives/button'
8
8
  import { Input } from '@open-mercato/ui/primitives/input'
9
+ import {
10
+ Select,
11
+ SelectContent,
12
+ SelectItem,
13
+ SelectTrigger,
14
+ SelectValue,
15
+ } from '@open-mercato/ui/primitives/select'
9
16
  import {
10
17
  Dialog,
11
18
  DialogContent,
@@ -168,24 +175,31 @@ export function AddressEditor({
168
175
  aria-invalid={errors.name ? 'true' : undefined}
169
176
  />
170
177
  <div className="flex gap-2">
171
- <select
172
- className={inputClass('purpose')}
173
- value={current.purpose}
174
- onChange={(evt) => update('purpose', evt.target.value)}
178
+ <Select
179
+ value={current.purpose || undefined}
180
+ onValueChange={(next) => update('purpose', next ?? '')}
175
181
  disabled={disabled}
176
- aria-invalid={errors.purpose ? 'true' : undefined}
177
182
  >
178
- <option value="">
179
- {addressTypesLoading
180
- ? t('customers.people.detail.addresses.types.loading', 'Loading…')
181
- : t('customers.people.detail.addresses.types.placeholder', 'Address type')}
182
- </option>
183
- {addressTypes.map((entry) => (
184
- <option key={entry.value} value={entry.value}>
185
- {entry.label}
186
- </option>
187
- ))}
188
- </select>
183
+ <SelectTrigger
184
+ className={errors.purpose ? 'border-destructive' : undefined}
185
+ aria-invalid={errors.purpose ? 'true' : undefined}
186
+ >
187
+ <SelectValue
188
+ placeholder={
189
+ addressTypesLoading
190
+ ? t('customers.people.detail.addresses.types.loading', 'Loading…')
191
+ : t('customers.people.detail.addresses.types.placeholder', 'Address type')
192
+ }
193
+ />
194
+ </SelectTrigger>
195
+ <SelectContent>
196
+ {addressTypes.map((entry) => (
197
+ <SelectItem key={entry.value} value={entry.value}>
198
+ {entry.label}
199
+ </SelectItem>
200
+ ))}
201
+ </SelectContent>
202
+ </Select>
189
203
  <Dialog open={typeDialogOpen} onOpenChange={setTypeDialogOpen}>
190
204
  <DialogTrigger asChild>
191
205
  <Button type="button" variant="outline" size="icon" className="shrink-0" disabled={disabled}>
@@ -2,6 +2,7 @@
2
2
 
3
3
  import * as React from 'react'
4
4
  import { Spinner } from '@open-mercato/ui/primitives/spinner'
5
+ import { RadioGroup, Radio } from '@open-mercato/ui/primitives/radio'
5
6
  import { flash } from '@open-mercato/ui/backend/FlashMessages'
6
7
  import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
7
8
  import { useT } from '@open-mercato/shared/lib/i18n/context'
@@ -139,24 +140,29 @@ export function AddressFormatSettings() {
139
140
  {t('customers.config.addressFormat.loading', 'Loading current preference…')}
140
141
  </div>
141
142
  ) : (
142
- <div className="space-y-3">
143
- {options.map((option) => (
144
- <label key={option.id} className="flex cursor-pointer items-start gap-3 rounded border p-3">
145
- <input
146
- type="radio"
147
- name="address-format"
148
- className="mt-1"
149
- value={option.id}
150
- checked={format === option.id}
151
- disabled={pending !== null && pending !== option.id}
152
- onChange={() => handleChange(option.id)}
153
- />
154
- <span className="space-y-1">
155
- <span className="block text-sm font-medium">{option.title}</span>
156
- <span className="block text-xs text-muted-foreground">{option.description}</span>
157
- </span>
158
- </label>
159
- ))}
143
+ <RadioGroup
144
+ className="space-y-3"
145
+ value={format}
146
+ onValueChange={(next) => handleChange(next as AddressFormatStrategy)}
147
+ name="address-format"
148
+ >
149
+ {options.map((option) => {
150
+ const inputId = `address-format-${option.id}`
151
+ return (
152
+ <label key={option.id} htmlFor={inputId} className="flex cursor-pointer items-start gap-3 rounded border p-3">
153
+ <Radio
154
+ id={inputId}
155
+ className="mt-1"
156
+ value={option.id}
157
+ disabled={pending !== null && pending !== option.id}
158
+ />
159
+ <span className="space-y-1">
160
+ <span className="block text-sm font-medium">{option.title}</span>
161
+ <span className="block text-xs text-muted-foreground">{option.description}</span>
162
+ </span>
163
+ </label>
164
+ )
165
+ })}
160
166
  {error ? <p className="text-sm text-status-error-text">{error}</p> : null}
161
167
  {pending ? (
162
168
  <div className="inline-flex items-center gap-2 rounded border border-dashed px-3 py-1 text-xs text-muted-foreground">
@@ -164,7 +170,7 @@ export function AddressFormatSettings() {
164
170
  {t('customers.config.addressFormat.updating', 'Saving preference…')}
165
171
  </div>
166
172
  ) : null}
167
- </div>
173
+ </RadioGroup>
168
174
  )}
169
175
  </section>
170
176
  )
@@ -5,6 +5,13 @@ import { z } from 'zod'
5
5
  import { useT } from '@open-mercato/shared/lib/i18n/context'
6
6
  import { CrudForm, type CrudField, type CrudFormGroup } from '@open-mercato/ui/backend/CrudForm'
7
7
  import { Button } from '@open-mercato/ui/primitives/button'
8
+ import {
9
+ Select,
10
+ SelectContent,
11
+ SelectItem,
12
+ SelectTrigger,
13
+ SelectValue,
14
+ } from '@open-mercato/ui/primitives/select'
8
15
  import { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'
9
16
  import { createCrudFormError } from '@open-mercato/ui/backend/utils/serverErrors'
10
17
  import { DictionaryEntrySelect, type DictionarySelectLabels } from '@open-mercato/core/modules/dictionaries/components/DictionaryEntrySelect'
@@ -150,17 +157,21 @@ export function ActivityForm({
150
157
  const currentValue =
151
158
  typeof value === 'string' && value.length ? value : normalizedEntityOptions[0]?.id ?? ''
152
159
  return (
153
- <select
154
- className="h-9 w-full rounded border border-muted-foreground/40 bg-background px-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
155
- value={currentValue}
156
- onChange={(event) => setValue(event.target.value)}
160
+ <Select
161
+ value={currentValue || undefined}
162
+ onValueChange={(next) => setValue(next ?? '')}
157
163
  >
158
- {normalizedEntityOptions.map((option) => (
159
- <option key={option.id} value={option.id}>
160
- {option.label}
161
- </option>
162
- ))}
163
- </select>
164
+ <SelectTrigger>
165
+ <SelectValue />
166
+ </SelectTrigger>
167
+ <SelectContent>
168
+ {normalizedEntityOptions.map((option) => (
169
+ <SelectItem key={option.id} value={option.id}>
170
+ {option.label}
171
+ </SelectItem>
172
+ ))}
173
+ </SelectContent>
174
+ </Select>
164
175
  )
165
176
  },
166
177
  } as CrudField)
@@ -175,20 +186,21 @@ export function ActivityForm({
175
186
  component: ({ value, setValue }) => {
176
187
  const currentValue = typeof value === 'string' ? value : ''
177
188
  return (
178
- <select
179
- className="h-9 w-full rounded border border-muted-foreground/40 bg-background px-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
180
- value={currentValue}
181
- onChange={(event) => setValue(event.target.value)}
189
+ <Select
190
+ value={currentValue || undefined}
191
+ onValueChange={(next) => setValue(next ?? '')}
182
192
  >
183
- <option value="">
184
- {t('customers.people.detail.activities.fields.dealPlaceholder', 'No linked deal')}
185
- </option>
186
- {normalizedDealOptions.map((option) => (
187
- <option key={option.id} value={option.id}>
188
- {option.label}
189
- </option>
190
- ))}
191
- </select>
193
+ <SelectTrigger>
194
+ <SelectValue placeholder={t('customers.people.detail.activities.fields.dealPlaceholder', 'No linked deal')} />
195
+ </SelectTrigger>
196
+ <SelectContent>
197
+ {normalizedDealOptions.map((option) => (
198
+ <SelectItem key={option.id} value={option.id}>
199
+ {option.label}
200
+ </SelectItem>
201
+ ))}
202
+ </SelectContent>
203
+ </Select>
192
204
  )
193
205
  },
194
206
  } as CrudField)
@@ -3,6 +3,7 @@
3
3
  import * as React from 'react'
4
4
  import { Loader2, Pencil, X } from 'lucide-react'
5
5
  import { Button } from '@open-mercato/ui/primitives/button'
6
+ import { Input } from '@open-mercato/ui/primitives/input'
6
7
  import { DictionaryEntrySelect } from '@open-mercato/core/modules/dictionaries/components/DictionaryEntrySelect'
7
8
  import { useT } from '@open-mercato/shared/lib/i18n/context'
8
9
  import { cn } from '@open-mercato/shared/lib/utils'
@@ -223,8 +224,7 @@ export function AnnualRevenueField({
223
224
  <label className="text-xs font-medium uppercase tracking-wide text-muted-foreground">
224
225
  {t('customers.companies.detail.fields.annualRevenuePlaceholder', 'Enter amount')}
225
226
  </label>
226
- <input
227
- className="w-full rounded-md border px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
227
+ <Input
228
228
  value={draftAmount}
229
229
  onChange={(event) => {
230
230
  setDraftAmount(event.target.value)