@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,6 +6,13 @@ 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
8
  import { IconButton } from '@open-mercato/ui/primitives/icon-button'
9
+ import {
10
+ Select,
11
+ SelectContent,
12
+ SelectItem,
13
+ SelectTrigger,
14
+ SelectValue,
15
+ } from '@open-mercato/ui/primitives/select'
9
16
  import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
10
17
  import { createCrudFormError } from '@open-mercato/ui/backend/utils/serverErrors'
11
18
  import { DictionarySelectField } from '../formConfig'
@@ -797,20 +804,23 @@ export function DealForm({
797
804
  type: 'custom',
798
805
  layout: 'half',
799
806
  component: ({ value, setValue }) => (
800
- <select
801
- className="w-full rounded border px-2 py-1.5 text-sm"
802
- value={typeof value === 'string' ? value : ''}
803
- onChange={(e) => {
804
- setValue(e.target.value)
805
- loadStagesForPipeline(e.target.value).catch(() => {})
807
+ <Select
808
+ value={typeof value === 'string' && value ? value : undefined}
809
+ onValueChange={(next) => {
810
+ setValue(next ?? '')
811
+ loadStagesForPipeline(next ?? '').catch(() => {})
806
812
  }}
807
813
  disabled={disabled}
808
814
  >
809
- <option value="">{t('customers.deals.form.pipeline.placeholder', 'Select pipeline…')}</option>
810
- {pipelines.map((p) => (
811
- <option key={p.id} value={p.id}>{p.name}</option>
812
- ))}
813
- </select>
815
+ <SelectTrigger>
816
+ <SelectValue placeholder={t('customers.deals.form.pipeline.placeholder', 'Select pipeline…')} />
817
+ </SelectTrigger>
818
+ <SelectContent>
819
+ {pipelines.map((p) => (
820
+ <SelectItem key={p.id} value={p.id}>{p.name}</SelectItem>
821
+ ))}
822
+ </SelectContent>
823
+ </Select>
814
824
  ),
815
825
  } as CrudField,
816
826
  {
@@ -819,17 +829,20 @@ export function DealForm({
819
829
  type: 'custom',
820
830
  layout: 'half',
821
831
  component: ({ value, setValue }) => (
822
- <select
823
- className="w-full rounded border px-2 py-1.5 text-sm"
824
- value={typeof value === 'string' ? value : ''}
825
- onChange={(e) => setValue(e.target.value)}
832
+ <Select
833
+ value={typeof value === 'string' && value ? value : undefined}
834
+ onValueChange={(next) => setValue(next ?? '')}
826
835
  disabled={disabled || !pipelineStages.length}
827
836
  >
828
- <option value="">{t('customers.deals.form.pipelineStage.placeholder', 'Select stage…')}</option>
829
- {pipelineStages.map((s) => (
830
- <option key={s.id} value={s.id}>{s.label}</option>
831
- ))}
832
- </select>
837
+ <SelectTrigger>
838
+ <SelectValue placeholder={t('customers.deals.form.pipelineStage.placeholder', 'Select stage…')} />
839
+ </SelectTrigger>
840
+ <SelectContent>
841
+ {pipelineStages.map((s) => (
842
+ <SelectItem key={s.id} value={s.id}>{s.label}</SelectItem>
843
+ ))}
844
+ </SelectContent>
845
+ </Select>
833
846
  ),
834
847
  } as CrudField,
835
848
  {
@@ -7,6 +7,14 @@ import { Check, Pencil, Plus, Settings } from 'lucide-react'
7
7
  import { useT } from '@open-mercato/shared/lib/i18n/context'
8
8
  import { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'
9
9
  import { Button } from '@open-mercato/ui/primitives/button'
10
+ import { Input } from '@open-mercato/ui/primitives/input'
11
+ import {
12
+ Select,
13
+ SelectContent,
14
+ SelectItem,
15
+ SelectTrigger,
16
+ SelectValue,
17
+ } from '@open-mercato/ui/primitives/select'
10
18
  import { deriveDisplayName, isDerivedDisplayName } from '../lib/displayName'
11
19
  import {
12
20
  Dialog,
@@ -255,9 +263,8 @@ const createPrimaryEmailField = (t: Translator): CrudField => ({
255
263
 
256
264
  return (
257
265
  <div className="space-y-2">
258
- <input
266
+ <Input
259
267
  type="email"
260
- className="w-full h-9 rounded border px-2 text-sm"
261
268
  value={inputValue}
262
269
  onChange={(event) => {
263
270
  const nextValue = event.target.value
@@ -561,19 +568,22 @@ export function CompanySelectField({ value, onChange, labels }: CompanySelectFie
561
568
  return (
562
569
  <div className="space-y-2">
563
570
  <div className="flex items-center gap-2">
564
- <select
565
- className="w-full h-9 rounded border px-2 text-sm"
566
- value={value ?? ''}
567
- onChange={(event) => onChange(event.target.value ? event.target.value : undefined)}
571
+ <Select
572
+ value={value || undefined}
573
+ onValueChange={(next) => onChange(next || undefined)}
568
574
  disabled={loading}
569
575
  >
570
- <option value="">{labels.placeholder}</option>
571
- {options.map((option) => (
572
- <option key={option.value} value={option.value}>
573
- {option.label}
574
- </option>
575
- ))}
576
- </select>
576
+ <SelectTrigger>
577
+ <SelectValue placeholder={labels.placeholder} />
578
+ </SelectTrigger>
579
+ <SelectContent>
580
+ {options.map((option) => (
581
+ <SelectItem key={option.value} value={option.value}>
582
+ {option.label}
583
+ </SelectItem>
584
+ ))}
585
+ </SelectContent>
586
+ </Select>
577
587
  <Dialog open={dialogOpen} onOpenChange={handleDialogChange}>
578
588
  <DialogTrigger asChild>
579
589
  <Button
@@ -595,8 +605,7 @@ export function CompanySelectField({ value, onChange, labels }: CompanySelectFie
595
605
  <div className="space-y-4">
596
606
  <div className="space-y-1">
597
607
  <label className="text-sm font-medium">{labels.inputLabel}</label>
598
- <input
599
- className="w-full rounded-md border px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
608
+ <Input
600
609
  placeholder={labels.inputPlaceholder}
601
610
  value={newCompany}
602
611
  onChange={(event) => {
@@ -760,8 +769,7 @@ export const createDisplayNameSection = (t: Translator) =>
760
769
  </div>
761
770
  {editing ? (
762
771
  <div className="mt-2 space-y-2">
763
- <input
764
- className="w-full rounded-md border px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
772
+ <Input
765
773
  value={currentValue}
766
774
  onChange={handleChange}
767
775
  placeholder={t('customers.people.form.displayName.placeholder')}
@@ -4,6 +4,7 @@ import * as React from 'react'
4
4
  import Link from 'next/link'
5
5
  import type { DashboardWidgetComponentProps } from '@open-mercato/shared/modules/dashboard/widgets'
6
6
  import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
7
+ import { Input } from '@open-mercato/ui/primitives/input'
7
8
  import { Spinner } from '@open-mercato/ui/primitives/spinner'
8
9
  import { useT } from '@open-mercato/shared/lib/i18n/context'
9
10
  import { DEFAULT_SETTINGS, hydrateCustomerTodoSettings, type CustomerTodoWidgetSettings } from './config'
@@ -132,12 +133,12 @@ const CustomerTodosWidget: React.FC<DashboardWidgetComponentProps<CustomerTodoWi
132
133
  <label htmlFor="customer-todos-page-size" className="text-xs font-semibold uppercase text-muted-foreground">
133
134
  {t('customers.widgets.todos.settings.pageSize')}
134
135
  </label>
135
- <input
136
+ <Input
136
137
  id="customer-todos-page-size"
137
138
  type="number"
138
139
  min={1}
139
140
  max={20}
140
- className="w-24 rounded-md border px-2 py-1 text-sm focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
141
+ className="w-24"
141
142
  value={hydrated.pageSize}
142
143
  onChange={(event) => {
143
144
  const next = Number(event.target.value)
@@ -4,6 +4,14 @@ import * as React from 'react'
4
4
  import Link from 'next/link'
5
5
  import type { DashboardWidgetComponentProps } from '@open-mercato/shared/modules/dashboard/widgets'
6
6
  import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
7
+ import { Input } from '@open-mercato/ui/primitives/input'
8
+ import {
9
+ Select,
10
+ SelectContent,
11
+ SelectItem,
12
+ SelectTrigger,
13
+ SelectValue,
14
+ } from '@open-mercato/ui/primitives/select'
7
15
  import { Spinner } from '@open-mercato/ui/primitives/spinner'
8
16
  import { useT } from '@open-mercato/shared/lib/i18n/context'
9
17
  import {
@@ -121,12 +129,12 @@ const CustomerNewCustomersWidget: React.FC<DashboardWidgetComponentProps<Custome
121
129
  <label htmlFor="customer-new-customers-page-size" className="text-xs font-semibold uppercase text-muted-foreground">
122
130
  {t('customers.widgets.newCustomers.settings.pageSize')}
123
131
  </label>
124
- <input
132
+ <Input
125
133
  id="customer-new-customers-page-size"
126
134
  type="number"
127
135
  min={1}
128
136
  max={20}
129
- className="w-24 rounded-md border px-2 py-1 text-sm focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
137
+ className="w-24"
130
138
  value={hydrated.pageSize}
131
139
  onChange={(event) => {
132
140
  const next = Number(event.target.value)
@@ -138,21 +146,23 @@ const CustomerNewCustomersWidget: React.FC<DashboardWidgetComponentProps<Custome
138
146
  <label htmlFor="customer-new-customers-kind" className="text-xs font-semibold uppercase text-muted-foreground">
139
147
  {t('customers.widgets.newCustomers.settings.kind')}
140
148
  </label>
141
- <select
142
- id="customer-new-customers-kind"
143
- className="w-full rounded-md border px-2 py-1 text-sm focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
149
+ <Select
144
150
  value={hydrated.kind}
145
- onChange={(event) => {
146
- const value = event.target.value
151
+ onValueChange={(value) => {
147
152
  if (value === 'person' || value === 'company' || value === 'all') {
148
153
  onSettingsChange({ ...hydrated, kind: value })
149
154
  }
150
155
  }}
151
156
  >
152
- <option value="all">{t('customers.widgets.newCustomers.filters.all')}</option>
153
- <option value="person">{t('customers.widgets.newCustomers.filters.person')}</option>
154
- <option value="company">{t('customers.widgets.newCustomers.filters.company')}</option>
155
- </select>
157
+ <SelectTrigger id="customer-new-customers-kind" size="sm">
158
+ <SelectValue />
159
+ </SelectTrigger>
160
+ <SelectContent>
161
+ <SelectItem value="all">{t('customers.widgets.newCustomers.filters.all')}</SelectItem>
162
+ <SelectItem value="person">{t('customers.widgets.newCustomers.filters.person')}</SelectItem>
163
+ <SelectItem value="company">{t('customers.widgets.newCustomers.filters.company')}</SelectItem>
164
+ </SelectContent>
165
+ </Select>
156
166
  </div>
157
167
  </div>
158
168
  )
@@ -4,6 +4,7 @@ import * as React from 'react'
4
4
  import Link from 'next/link'
5
5
  import type { DashboardWidgetComponentProps } from '@open-mercato/shared/modules/dashboard/widgets'
6
6
  import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
7
+ import { Input } from '@open-mercato/ui/primitives/input'
7
8
  import { Spinner } from '@open-mercato/ui/primitives/spinner'
8
9
  import { useT } from '@open-mercato/shared/lib/i18n/context'
9
10
  import { DEFAULT_SETTINGS, hydrateNewDealsSettings, type CustomerNewDealsSettings } from './config'
@@ -104,12 +105,12 @@ const CustomerNewDealsWidget: React.FC<DashboardWidgetComponentProps<CustomerNew
104
105
  <label htmlFor="customer-new-deals-page-size" className="text-xs font-semibold uppercase text-muted-foreground">
105
106
  {t('customers.widgets.newDeals.settings.pageSize')}
106
107
  </label>
107
- <input
108
+ <Input
108
109
  id="customer-new-deals-page-size"
109
110
  type="number"
110
111
  min={1}
111
112
  max={20}
112
- className="w-24 rounded-md border px-2 py-1 text-sm focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
113
+ className="w-24"
113
114
  value={hydrated.pageSize}
114
115
  onChange={(event) => {
115
116
  const next = Number(event.target.value)
@@ -5,6 +5,7 @@ import Link from 'next/link'
5
5
  import type { DashboardWidgetComponentProps } from '@open-mercato/shared/modules/dashboard/widgets'
6
6
  import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
7
7
  import { formatRelativeTime } from '@open-mercato/shared/lib/time'
8
+ import { Input } from '@open-mercato/ui/primitives/input'
8
9
  import { Spinner } from '@open-mercato/ui/primitives/spinner'
9
10
  import { useT } from '@open-mercato/shared/lib/i18n/context'
10
11
  import {
@@ -136,12 +137,12 @@ const CustomerNextInteractionsWidget: React.FC<DashboardWidgetComponentProps<Cus
136
137
  <label htmlFor="customer-next-interactions-page-size" className="text-xs font-semibold uppercase text-muted-foreground">
137
138
  {t('customers.widgets.nextInteractions.settings.pageSize')}
138
139
  </label>
139
- <input
140
+ <Input
140
141
  id="customer-next-interactions-page-size"
141
142
  type="number"
142
143
  min={1}
143
144
  max={20}
144
- className="w-24 rounded-md border px-2 py-1 text-sm focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
145
+ className="w-24"
145
146
  value={hydrated.pageSize}
146
147
  onChange={(event) => {
147
148
  const next = Number(event.target.value)
@@ -3,6 +3,8 @@
3
3
  import * as React from 'react'
4
4
  import { Button } from '@open-mercato/ui/primitives/button'
5
5
  import { Spinner } from '@open-mercato/ui/primitives/spinner'
6
+ import { RadioGroup } from '@open-mercato/ui/primitives/radio'
7
+ import { RadioField } from '@open-mercato/ui/primitives/radio-field'
6
8
  import { apiCallOrThrow, readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'
7
9
  import { flash } from '@open-mercato/ui/backend/FlashMessages'
8
10
  import { useT } from '@open-mercato/shared/lib/i18n/context'
@@ -279,28 +281,21 @@ export const WidgetVisibilityEditor = React.forwardRef<WidgetVisibilityEditorHan
279
281
  )}
280
282
 
281
283
  {kind === 'user' && (
282
- <div className="flex items-center gap-3 rounded-md border bg-muted/30 px-3 py-2">
283
- <label className="flex items-center gap-2 text-sm">
284
- <input
285
- type="radio"
286
- name="widgetOverride"
287
- value="inherit"
288
- checked={mode === 'inherit'}
289
- onChange={() => setMode('inherit')}
290
- />
291
- {t('dashboards.widgets.mode.inherit', 'Inherit from roles')}
292
- </label>
293
- <label className="flex items-center gap-2 text-sm">
294
- <input
295
- type="radio"
296
- name="widgetOverride"
297
- value="override"
298
- checked={mode === 'override'}
299
- onChange={() => setMode('override')}
300
- />
301
- {t('dashboards.widgets.mode.override', 'Override for this user')}
302
- </label>
303
- </div>
284
+ <RadioGroup
285
+ className="flex flex-row items-center gap-3 rounded-md border bg-muted/30 px-3 py-2"
286
+ name="widgetOverride"
287
+ value={mode}
288
+ onValueChange={(next) => setMode(next as 'inherit' | 'override')}
289
+ >
290
+ <RadioField
291
+ value="inherit"
292
+ label={t('dashboards.widgets.mode.inherit', 'Inherit from roles')}
293
+ />
294
+ <RadioField
295
+ value="override"
296
+ label={t('dashboards.widgets.mode.override', 'Override for this user')}
297
+ />
298
+ </RadioGroup>
304
299
  )}
305
300
 
306
301
  {kind === 'user' && mode === 'inherit' && (
@@ -10,6 +10,13 @@ import {
10
10
  InlineDateRangeSelect,
11
11
  type DateRangePreset,
12
12
  } from '@open-mercato/ui/backend/date-range'
13
+ import {
14
+ Select,
15
+ SelectContent,
16
+ SelectItem,
17
+ SelectTrigger,
18
+ SelectValue,
19
+ } from '@open-mercato/ui/primitives/select'
13
20
  import { DEFAULT_SETTINGS, hydrateSettings, type OrdersByStatusSettings } from './config'
14
21
  import type { WidgetDataResponse } from '../../../services/widgetDataService'
15
22
 
@@ -115,15 +122,18 @@ const OrdersByStatusWidget: React.FC<DashboardWidgetComponentProps<OrdersByStatu
115
122
  >
116
123
  {t('dashboards.analytics.settings.chartVariant', 'Chart Style')}
117
124
  </label>
118
- <select
119
- id="orders-by-status-variant"
120
- className="w-full rounded-md border bg-background px-2 py-1 text-sm text-foreground focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
125
+ <Select
121
126
  value={hydrated.variant}
122
- onChange={(e) => onSettingsChange({ ...hydrated, variant: e.target.value as 'pie' | 'donut' })}
127
+ onValueChange={(value) => onSettingsChange({ ...hydrated, variant: value as 'pie' | 'donut' })}
123
128
  >
124
- <option value="donut">{t('dashboards.analytics.chartVariant.donut', 'Donut')}</option>
125
- <option value="pie">{t('dashboards.analytics.chartVariant.pie', 'Pie')}</option>
126
- </select>
129
+ <SelectTrigger id="orders-by-status-variant" size="sm">
130
+ <SelectValue />
131
+ </SelectTrigger>
132
+ <SelectContent>
133
+ <SelectItem value="donut">{t('dashboards.analytics.chartVariant.donut', 'Donut')}</SelectItem>
134
+ <SelectItem value="pie">{t('dashboards.analytics.chartVariant.pie', 'Pie')}</SelectItem>
135
+ </SelectContent>
136
+ </Select>
127
137
  </div>
128
138
  </div>
129
139
  )
@@ -10,6 +10,13 @@ import {
10
10
  InlineDateRangeSelect,
11
11
  type DateRangePreset,
12
12
  } from '@open-mercato/ui/backend/date-range'
13
+ import {
14
+ Select,
15
+ SelectContent,
16
+ SelectItem,
17
+ SelectTrigger,
18
+ SelectValue,
19
+ } from '@open-mercato/ui/primitives/select'
13
20
  import type { DateGranularity } from '@open-mercato/shared/modules/analytics'
14
21
  import { DEFAULT_SETTINGS, hydrateSettings, type RevenueTrendSettings } from './config'
15
22
  import type { WidgetDataResponse } from '../../../services/widgetDataService'
@@ -163,18 +170,21 @@ const RevenueTrendWidget: React.FC<DashboardWidgetComponentProps<RevenueTrendSet
163
170
  >
164
171
  {t('dashboards.analytics.settings.granularity', 'Granularity')}
165
172
  </label>
166
- <select
167
- id="revenue-trend-granularity"
168
- className="w-full rounded-md border bg-background px-2 py-1 text-sm text-foreground focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
173
+ <Select
169
174
  value={hydrated.granularity}
170
- onChange={(e) => onSettingsChange({ ...hydrated, granularity: e.target.value as DateGranularity })}
175
+ onValueChange={(value) => onSettingsChange({ ...hydrated, granularity: value as DateGranularity })}
171
176
  >
172
- {GRANULARITY_OPTIONS.map((opt) => (
173
- <option key={opt.value} value={opt.value}>
174
- {t(opt.labelKey, opt.value)}
175
- </option>
176
- ))}
177
- </select>
177
+ <SelectTrigger id="revenue-trend-granularity" size="sm">
178
+ <SelectValue />
179
+ </SelectTrigger>
180
+ <SelectContent>
181
+ {GRANULARITY_OPTIONS.map((opt) => (
182
+ <SelectItem key={opt.value} value={opt.value}>
183
+ {t(opt.labelKey, opt.value)}
184
+ </SelectItem>
185
+ ))}
186
+ </SelectContent>
187
+ </Select>
178
188
  </div>
179
189
  <div className="space-y-1.5">
180
190
  <label className="flex items-center gap-2 text-sm">
@@ -6,6 +6,7 @@ import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
6
6
  import { useT } from '@open-mercato/shared/lib/i18n/context'
7
7
  import { BarChart, type BarChartDataItem } from '@open-mercato/ui/backend/charts'
8
8
  import { DateRangeSelect, type DateRangePreset } from '@open-mercato/ui/backend/date-range'
9
+ import { Input } from '@open-mercato/ui/primitives/input'
9
10
  import { DEFAULT_SETTINGS, hydrateSettings, type SalesByRegionSettings } from './config'
10
11
  import type { WidgetDataResponse } from '../../../services/widgetDataService'
11
12
  import { formatCurrencyCompact } from '../../../lib/formatters'
@@ -94,12 +95,12 @@ const SalesByRegionWidget: React.FC<DashboardWidgetComponentProps<SalesByRegionS
94
95
  >
95
96
  {t('dashboards.analytics.settings.limit', 'Number of items')}
96
97
  </label>
97
- <input
98
+ <Input
98
99
  id="sales-by-region-limit"
99
100
  type="number"
100
101
  min={1}
101
102
  max={20}
102
- className="w-24 rounded-md border px-2 py-1 text-sm focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
103
+ className="w-24"
103
104
  value={hydrated.limit}
104
105
  onChange={(e) => {
105
106
  const next = Number(e.target.value)
@@ -6,6 +6,7 @@ import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
6
6
  import { useT } from '@open-mercato/shared/lib/i18n/context'
7
7
  import { TopNTable, type TopNTableColumn } from '@open-mercato/ui/backend/charts'
8
8
  import { DateRangeSelect, type DateRangePreset } from '@open-mercato/ui/backend/date-range'
9
+ import { Input } from '@open-mercato/ui/primitives/input'
9
10
  import { DEFAULT_SETTINGS, hydrateSettings, type TopCustomersSettings } from './config'
10
11
  import type { WidgetDataResponse } from '../../../services/widgetDataService'
11
12
  import { formatCurrencySafe } from '../../../lib/formatters'
@@ -130,12 +131,12 @@ const TopCustomersWidget: React.FC<DashboardWidgetComponentProps<TopCustomersSet
130
131
  >
131
132
  {t('dashboards.analytics.settings.limit', 'Number of items')}
132
133
  </label>
133
- <input
134
+ <Input
134
135
  id="top-customers-limit"
135
136
  type="number"
136
137
  min={1}
137
138
  max={20}
138
- className="w-24 rounded-md border px-2 py-1 text-sm focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
139
+ className="w-24"
139
140
  value={hydrated.limit}
140
141
  onChange={(e) => {
141
142
  const next = Number(e.target.value)
@@ -6,6 +6,14 @@ import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
6
6
  import { useT } from '@open-mercato/shared/lib/i18n/context'
7
7
  import { BarChart, type BarChartDataItem } from '@open-mercato/ui/backend/charts'
8
8
  import { DateRangeSelect, InlineDateRangeSelect, type DateRangePreset } from '@open-mercato/ui/backend/date-range'
9
+ import { Input } from '@open-mercato/ui/primitives/input'
10
+ import {
11
+ Select,
12
+ SelectContent,
13
+ SelectItem,
14
+ SelectTrigger,
15
+ SelectValue,
16
+ } from '@open-mercato/ui/primitives/select'
9
17
  import { DEFAULT_SETTINGS, hydrateSettings, type TopProductsSettings } from './config'
10
18
  import type { WidgetDataResponse } from '../../../services/widgetDataService'
11
19
  import { formatCurrencyCompact } from '../../../lib/formatters'
@@ -117,12 +125,12 @@ const TopProductsWidget: React.FC<DashboardWidgetComponentProps<TopProductsSetti
117
125
  >
118
126
  {t('dashboards.analytics.settings.limit', 'Number of items')}
119
127
  </label>
120
- <input
128
+ <Input
121
129
  id="top-products-limit"
122
130
  type="number"
123
131
  min={1}
124
132
  max={20}
125
- className="w-24 rounded-md border px-2 py-1 text-sm focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
133
+ className="w-24"
126
134
  value={hydrated.limit}
127
135
  onChange={(e) => {
128
136
  const next = Number(e.target.value)
@@ -137,15 +145,18 @@ const TopProductsWidget: React.FC<DashboardWidgetComponentProps<TopProductsSetti
137
145
  >
138
146
  {t('dashboards.analytics.settings.chartLayout', 'Chart Layout')}
139
147
  </label>
140
- <select
141
- id="top-products-layout"
142
- className="w-full rounded-md border bg-background px-2 py-1 text-sm text-foreground focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
148
+ <Select
143
149
  value={hydrated.layout}
144
- onChange={(e) => onSettingsChange({ ...hydrated, layout: e.target.value as 'horizontal' | 'vertical' })}
150
+ onValueChange={(value) => onSettingsChange({ ...hydrated, layout: value as 'horizontal' | 'vertical' })}
145
151
  >
146
- <option value="horizontal">{t('dashboards.analytics.settings.horizontal', 'Horizontal')}</option>
147
- <option value="vertical">{t('dashboards.analytics.settings.vertical', 'Vertical')}</option>
148
- </select>
152
+ <SelectTrigger id="top-products-layout" size="sm">
153
+ <SelectValue />
154
+ </SelectTrigger>
155
+ <SelectContent>
156
+ <SelectItem value="horizontal">{t('dashboards.analytics.settings.horizontal', 'Horizontal')}</SelectItem>
157
+ <SelectItem value="vertical">{t('dashboards.analytics.settings.vertical', 'Vertical')}</SelectItem>
158
+ </SelectContent>
159
+ </Select>
149
160
  </div>
150
161
  </div>
151
162
  )