@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/inbox_ops/backend/inbox-ops/settings/page.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { LoadingMessage, ErrorMessage } from '@open-mercato/ui/backend/detail'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport { ArrowLeft, Copy, CheckCircle } from 'lucide-react'\n\nconst LANGUAGE_KEYS = ['en', 'de', 'es', 'pl'] as const\n\nexport default function InboxSettingsPage() {\n const t = useT()\n const { runMutation } = useGuardedMutation<Record<string, unknown>>({\n contextId: 'inbox-ops-settings',\n })\n\n const languageOptions = LANGUAGE_KEYS.map((key) => ({\n value: key,\n label: t(`inbox_ops.settings.language_${key}` as never, key),\n }))\n const [settings, setSettings] = React.useState<{ inboxAddress?: string; isActive?: boolean; workingLanguage?: string } | null>(null)\n const [isLoading, setIsLoading] = React.useState(true)\n const [error, setError] = React.useState<string | null>(null)\n const [copied, setCopied] = React.useState(false)\n const [isSavingLanguage, setIsSavingLanguage] = React.useState(false)\n\n React.useEffect(() => {\n let cancelled = false\n async function load() {\n setIsLoading(true)\n setError(null)\n try {\n const result = await apiCall<{ settings: { inboxAddress?: string; isActive?: boolean; workingLanguage?: string } | null }>('/api/inbox_ops/settings')\n if (!cancelled) {\n if (result?.ok && result.result?.settings) {\n setSettings(result.result.settings)\n } else {\n setError(t('inbox_ops.settings.load_failed', 'Failed to load settings'))\n }\n }\n } catch {\n if (!cancelled) setError(t('inbox_ops.settings.load_failed', 'Failed to load settings'))\n } finally {\n if (!cancelled) setIsLoading(false)\n }\n }\n load()\n return () => { cancelled = true }\n }, [t])\n\n const handleCopy = React.useCallback(() => {\n if (settings?.inboxAddress) {\n navigator.clipboard.writeText(settings.inboxAddress)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n }, [settings])\n\n const handleLanguageChange = React.useCallback(async (event: React.ChangeEvent<HTMLSelectElement>) => {\n const workingLanguage = event.target.value\n setIsSavingLanguage(true)\n const result = await runMutation({\n operation: () => apiCall<{ ok: boolean; settings: { workingLanguage: string } }>('/api/inbox_ops/settings', {\n method: 'PATCH',\n body: JSON.stringify({ workingLanguage }),\n }),\n context: {},\n })\n if (result?.ok && result.result?.ok) {\n setSettings((prev) => prev ? { ...prev, workingLanguage: result.result!.settings.workingLanguage } : prev)\n flash(t('inbox_ops.settings.language_saved', 'Working language updated'), 'success')\n } else {\n flash(t('inbox_ops.settings.language_save_failed', 'Failed to update working language'), 'error')\n }\n setIsSavingLanguage(false)\n }, [t, runMutation])\n\n return (\n <Page>\n <div className=\"flex items-center gap-3 px-3 py-3 md:px-6 md:py-4\">\n <Link href=\"/backend/inbox-ops\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\"><ArrowLeft className=\"h-4 w-4\" /></Button>\n </Link>\n <h1 className=\"text-lg font-semibold\">{t('inbox_ops.settings.title', 'Inbox Settings')}</h1>\n </div>\n\n <PageBody>\n <div className=\"max-w-lg\">\n {isLoading ? (\n <LoadingMessage label={t('inbox_ops.settings.loading', 'Loading settings...')} />\n ) : error ? (\n <ErrorMessage label={error} />\n ) : settings ? (\n <div className=\"space-y-6\">\n <div>\n <label className=\"text-sm font-medium text-foreground\">\n {t('inbox_ops.settings.forwarding_address', 'Forwarding Address')}\n </label>\n <p className=\"text-xs text-muted-foreground mt-1\">\n {t('inbox_ops.settings.forwarding_hint', 'Forward email threads to this address to create proposals')}\n </p>\n <div className=\"mt-2 flex items-center gap-2\">\n <div className=\"flex-1 bg-muted rounded-lg px-4 py-3\">\n <code className=\"text-sm font-mono\">{settings.inboxAddress}</code>\n </div>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"h-11 md:h-9\" onClick={handleCopy}>\n {copied ? <CheckCircle className=\"h-4 w-4 text-green-600\" /> : <Copy className=\"h-4 w-4\" />}\n <span className=\"ml-1\">{copied ? t('inbox_ops.settings.copied', 'Copied') : t('inbox_ops.settings.copy', 'Copy')}</span>\n </Button>\n </div>\n </div>\n\n <div>\n <label className=\"text-sm font-medium text-foreground\">{t('inbox_ops.settings.status', 'Status')}</label>\n <div className=\"mt-1\">\n <span className={`inline-flex items-center px-2 py-0.5 rounded text-xs font-medium ${\n settings.isActive ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800'\n }`}>\n {settings.isActive ? t('inbox_ops.settings.active', 'Active') : t('inbox_ops.settings.inactive', 'Inactive')}\n </span>\n </div>\n </div>\n\n <div>\n <label htmlFor=\"working-language\" className=\"text-sm font-medium text-foreground\">\n {t('inbox_ops.settings.working_language', 'Working Language')}\n </label>\n <p className=\"text-xs text-muted-foreground mt-1\">\n {t('inbox_ops.settings.working_language_hint', 'AI summaries and action descriptions will be generated in this language')}\n </p>\n <select\n id=\"working-language\"\n className=\"mt-2 block w-full sm:w-[200px] h-11 md:h-9 rounded-md border border-input bg-background px-3 text-sm\"\n value={settings.workingLanguage || 'en'}\n onChange={handleLanguageChange}\n disabled={isSavingLanguage}\n >\n {languageOptions.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n </div>\n </div>\n ) : (\n <p className=\"text-sm text-muted-foreground\">{t('inbox_ops.settings.not_found', 'No inbox settings found. Settings are created when a new tenant is provisioned.')}</p>\n )}\n </div>\n </PageBody>\n </Page>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { LoadingMessage, ErrorMessage } from '@open-mercato/ui/backend/detail'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport { ArrowLeft, Copy, CheckCircle } from 'lucide-react'\n\nconst LANGUAGE_KEYS = ['en', 'de', 'es', 'pl'] as const\n\nexport default function InboxSettingsPage() {\n const t = useT()\n const { runMutation } = useGuardedMutation<Record<string, unknown>>({\n contextId: 'inbox-ops-settings',\n })\n\n const languageOptions = LANGUAGE_KEYS.map((key) => ({\n value: key,\n label: t(`inbox_ops.settings.language_${key}` as never, key),\n }))\n const [settings, setSettings] = React.useState<{ inboxAddress?: string; isActive?: boolean; workingLanguage?: string } | null>(null)\n const [isLoading, setIsLoading] = React.useState(true)\n const [error, setError] = React.useState<string | null>(null)\n const [copied, setCopied] = React.useState(false)\n const [isSavingLanguage, setIsSavingLanguage] = React.useState(false)\n\n React.useEffect(() => {\n let cancelled = false\n async function load() {\n setIsLoading(true)\n setError(null)\n try {\n const result = await apiCall<{ settings: { inboxAddress?: string; isActive?: boolean; workingLanguage?: string } | null }>('/api/inbox_ops/settings')\n if (!cancelled) {\n if (result?.ok && result.result?.settings) {\n setSettings(result.result.settings)\n } else {\n setError(t('inbox_ops.settings.load_failed', 'Failed to load settings'))\n }\n }\n } catch {\n if (!cancelled) setError(t('inbox_ops.settings.load_failed', 'Failed to load settings'))\n } finally {\n if (!cancelled) setIsLoading(false)\n }\n }\n load()\n return () => { cancelled = true }\n }, [t])\n\n const handleCopy = React.useCallback(() => {\n if (settings?.inboxAddress) {\n navigator.clipboard.writeText(settings.inboxAddress)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n }, [settings])\n\n const handleLanguageChange = React.useCallback(async (workingLanguage: string) => {\n setIsSavingLanguage(true)\n const result = await runMutation({\n operation: () => apiCall<{ ok: boolean; settings: { workingLanguage: string } }>('/api/inbox_ops/settings', {\n method: 'PATCH',\n body: JSON.stringify({ workingLanguage }),\n }),\n context: {},\n })\n if (result?.ok && result.result?.ok) {\n setSettings((prev) => prev ? { ...prev, workingLanguage: result.result!.settings.workingLanguage } : prev)\n flash(t('inbox_ops.settings.language_saved', 'Working language updated'), 'success')\n } else {\n flash(t('inbox_ops.settings.language_save_failed', 'Failed to update working language'), 'error')\n }\n setIsSavingLanguage(false)\n }, [t, runMutation])\n\n return (\n <Page>\n <div className=\"flex items-center gap-3 px-3 py-3 md:px-6 md:py-4\">\n <Link href=\"/backend/inbox-ops\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\"><ArrowLeft className=\"h-4 w-4\" /></Button>\n </Link>\n <h1 className=\"text-lg font-semibold\">{t('inbox_ops.settings.title', 'Inbox Settings')}</h1>\n </div>\n\n <PageBody>\n <div className=\"max-w-lg\">\n {isLoading ? (\n <LoadingMessage label={t('inbox_ops.settings.loading', 'Loading settings...')} />\n ) : error ? (\n <ErrorMessage label={error} />\n ) : settings ? (\n <div className=\"space-y-6\">\n <div>\n <label className=\"text-sm font-medium text-foreground\">\n {t('inbox_ops.settings.forwarding_address', 'Forwarding Address')}\n </label>\n <p className=\"text-xs text-muted-foreground mt-1\">\n {t('inbox_ops.settings.forwarding_hint', 'Forward email threads to this address to create proposals')}\n </p>\n <div className=\"mt-2 flex items-center gap-2\">\n <div className=\"flex-1 bg-muted rounded-lg px-4 py-3\">\n <code className=\"text-sm font-mono\">{settings.inboxAddress}</code>\n </div>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"h-11 md:h-9\" onClick={handleCopy}>\n {copied ? <CheckCircle className=\"h-4 w-4 text-green-600\" /> : <Copy className=\"h-4 w-4\" />}\n <span className=\"ml-1\">{copied ? t('inbox_ops.settings.copied', 'Copied') : t('inbox_ops.settings.copy', 'Copy')}</span>\n </Button>\n </div>\n </div>\n\n <div>\n <label className=\"text-sm font-medium text-foreground\">{t('inbox_ops.settings.status', 'Status')}</label>\n <div className=\"mt-1\">\n <span className={`inline-flex items-center px-2 py-0.5 rounded text-xs font-medium ${\n settings.isActive ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800'\n }`}>\n {settings.isActive ? t('inbox_ops.settings.active', 'Active') : t('inbox_ops.settings.inactive', 'Inactive')}\n </span>\n </div>\n </div>\n\n <div>\n <label htmlFor=\"working-language\" className=\"text-sm font-medium text-foreground\">\n {t('inbox_ops.settings.working_language', 'Working Language')}\n </label>\n <p className=\"text-xs text-muted-foreground mt-1\">\n {t('inbox_ops.settings.working_language_hint', 'AI summaries and action descriptions will be generated in this language')}\n </p>\n <Select\n value={settings.workingLanguage || 'en'}\n onValueChange={(value) => handleLanguageChange(value)}\n disabled={isSavingLanguage}\n >\n <SelectTrigger id=\"working-language\" className=\"mt-2 sm:w-[200px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {languageOptions.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>{opt.label}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n ) : (\n <p className=\"text-sm text-muted-foreground\">{t('inbox_ops.settings.not_found', 'No inbox settings found. Settings are created when a new tenant is provisioned.')}</p>\n )}\n </div>\n </PageBody>\n </Page>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -2,6 +2,13 @@
2
2
  import { Fragment, 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 {
6
+ Select,
7
+ SelectContent,
8
+ SelectItem,
9
+ SelectTrigger,
10
+ SelectValue
11
+ } from "@open-mercato/ui/primitives/select";
5
12
  import { apiCall } from "@open-mercato/ui/backend/utils/apiCall";
6
13
  import { useGuardedMutation } from "@open-mercato/ui/backend/injection/useGuardedMutation";
7
14
  import { flash } from "@open-mercato/ui/backend/FlashMessages";
@@ -117,14 +124,16 @@ function ContactPayloadEditor({
117
124
  /* @__PURE__ */ jsxs("div", { children: [
118
125
  /* @__PURE__ */ jsx(Label, { children: t("inbox_ops.edit_dialog.type", "Type") }),
119
126
  /* @__PURE__ */ jsxs(
120
- "select",
127
+ Select,
121
128
  {
122
- className: "flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm",
123
129
  value: type,
124
- onChange: (event) => updateField("type", event.target.value),
130
+ onValueChange: (value) => updateField("type", value),
125
131
  children: [
126
- /* @__PURE__ */ jsx("option", { value: "person", children: t("inbox_ops.contact_type.person", "Person") }),
127
- /* @__PURE__ */ jsx("option", { value: "company", children: t("inbox_ops.contact_type.company", "Company") })
132
+ /* @__PURE__ */ jsx(SelectTrigger, { children: /* @__PURE__ */ jsx(SelectValue, {}) }),
133
+ /* @__PURE__ */ jsxs(SelectContent, { children: [
134
+ /* @__PURE__ */ jsx(SelectItem, { value: "person", children: t("inbox_ops.contact_type.person", "Person") }),
135
+ /* @__PURE__ */ jsx(SelectItem, { value: "company", children: t("inbox_ops.contact_type.company", "Company") })
136
+ ] })
128
137
  ]
129
138
  }
130
139
  )
@@ -172,14 +181,16 @@ function LinkContactPayloadEditor({
172
181
  /* @__PURE__ */ jsxs("div", { children: [
173
182
  /* @__PURE__ */ jsx(Label, { children: t("inbox_ops.edit_dialog.contact_type", "Contact Type") }),
174
183
  /* @__PURE__ */ jsxs(
175
- "select",
184
+ Select,
176
185
  {
177
- className: "flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm",
178
186
  value: payload.contactType || "person",
179
- onChange: (event) => updateField("contactType", event.target.value),
187
+ onValueChange: (value) => updateField("contactType", value),
180
188
  children: [
181
- /* @__PURE__ */ jsx("option", { value: "person", children: t("inbox_ops.contact_type.person", "Person") }),
182
- /* @__PURE__ */ jsx("option", { value: "company", children: t("inbox_ops.contact_type.company", "Company") })
189
+ /* @__PURE__ */ jsx(SelectTrigger, { children: /* @__PURE__ */ jsx(SelectValue, {}) }),
190
+ /* @__PURE__ */ jsxs(SelectContent, { children: [
191
+ /* @__PURE__ */ jsx(SelectItem, { value: "person", children: t("inbox_ops.contact_type.person", "Person") }),
192
+ /* @__PURE__ */ jsx(SelectItem, { value: "company", children: t("inbox_ops.contact_type.company", "Company") })
193
+ ] })
183
194
  ]
184
195
  }
185
196
  )
@@ -341,14 +352,16 @@ function LogActivityPayloadEditor({
341
352
  /* @__PURE__ */ jsxs("div", { children: [
342
353
  /* @__PURE__ */ jsx(Label, { children: t("inbox_ops.edit_dialog.contact_type", "Contact Type") }),
343
354
  /* @__PURE__ */ jsxs(
344
- "select",
355
+ Select,
345
356
  {
346
- className: "flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm",
347
357
  value: payload.contactType || "person",
348
- onChange: (event) => updateField("contactType", event.target.value),
358
+ onValueChange: (value) => updateField("contactType", value),
349
359
  children: [
350
- /* @__PURE__ */ jsx("option", { value: "person", children: t("inbox_ops.contact_type.person", "Person") }),
351
- /* @__PURE__ */ jsx("option", { value: "company", children: t("inbox_ops.contact_type.company", "Company") })
360
+ /* @__PURE__ */ jsx(SelectTrigger, { children: /* @__PURE__ */ jsx(SelectValue, {}) }),
361
+ /* @__PURE__ */ jsxs(SelectContent, { children: [
362
+ /* @__PURE__ */ jsx(SelectItem, { value: "person", children: t("inbox_ops.contact_type.person", "Person") }),
363
+ /* @__PURE__ */ jsx(SelectItem, { value: "company", children: t("inbox_ops.contact_type.company", "Company") })
364
+ ] })
352
365
  ]
353
366
  }
354
367
  )
@@ -357,16 +370,18 @@ function LogActivityPayloadEditor({
357
370
  /* @__PURE__ */ jsxs("div", { children: [
358
371
  /* @__PURE__ */ jsx(Label, { children: t("inbox_ops.edit_dialog.activity_type", "Activity Type") }),
359
372
  /* @__PURE__ */ jsxs(
360
- "select",
373
+ Select,
361
374
  {
362
- className: "flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm",
363
375
  value: payload.activityType || "email",
364
- onChange: (event) => updateField("activityType", event.target.value),
376
+ onValueChange: (value) => updateField("activityType", value),
365
377
  children: [
366
- /* @__PURE__ */ jsx("option", { value: "email", children: t("inbox_ops.activity_type.email", "Email") }),
367
- /* @__PURE__ */ jsx("option", { value: "call", children: t("inbox_ops.activity_type.call", "Call") }),
368
- /* @__PURE__ */ jsx("option", { value: "meeting", children: t("inbox_ops.activity_type.meeting", "Meeting") }),
369
- /* @__PURE__ */ jsx("option", { value: "note", children: t("inbox_ops.activity_type.note", "Note") })
378
+ /* @__PURE__ */ jsx(SelectTrigger, { children: /* @__PURE__ */ jsx(SelectValue, {}) }),
379
+ /* @__PURE__ */ jsxs(SelectContent, { children: [
380
+ /* @__PURE__ */ jsx(SelectItem, { value: "email", children: t("inbox_ops.activity_type.email", "Email") }),
381
+ /* @__PURE__ */ jsx(SelectItem, { value: "call", children: t("inbox_ops.activity_type.call", "Call") }),
382
+ /* @__PURE__ */ jsx(SelectItem, { value: "meeting", children: t("inbox_ops.activity_type.meeting", "Meeting") }),
383
+ /* @__PURE__ */ jsx(SelectItem, { value: "note", children: t("inbox_ops.activity_type.note", "Note") })
384
+ ] })
370
385
  ]
371
386
  }
372
387
  )
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/inbox_ops/components/proposals/EditActionDialog.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Loader2 } from 'lucide-react'\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n DialogDescription,\n} from '@open-mercato/ui/primitives/dialog'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport type { ActionDetail } from './types'\nimport { useActionDescriptionResolver } from './ActionCard'\n\nfunction ShipmentPayloadEditor({\n payload,\n updateField,\n}: {\n payload: Record<string, unknown>\n updateField: (key: string, value: unknown) => void\n}) {\n const t = useT()\n const trackingNumbers = ((payload.trackingNumbers as string[]) || []).join(', ')\n\n return (\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <Label>{t('inbox_ops.edit_dialog.carrier', 'Carrier')}</Label>\n <Input value={(payload.carrierName as string) || ''} onChange={(event) => updateField('carrierName', event.target.value)} />\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.status', 'Status')}</Label>\n <Input value={(payload.statusLabel as string) || ''} onChange={(event) => updateField('statusLabel', event.target.value)} />\n </div>\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.tracking_numbers', 'Tracking Numbers')}</Label>\n <Input\n value={trackingNumbers}\n onChange={(event) => updateField('trackingNumbers', event.target.value.split(',').map((s) => s.trim()).filter(Boolean))}\n placeholder={t('inbox_ops.placeholder.comma_separated', 'Comma-separated')}\n />\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <Label>{t('inbox_ops.edit_dialog.shipped_at', 'Shipped At')}</Label>\n <Input value={(payload.shippedAt as string) || ''} onChange={(event) => updateField('shippedAt', event.target.value)} placeholder=\"YYYY-MM-DD\" />\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.estimated_delivery', 'Estimated Delivery')}</Label>\n <Input value={(payload.estimatedDelivery as string) || ''} onChange={(event) => updateField('estimatedDelivery', event.target.value)} placeholder=\"YYYY-MM-DD\" />\n </div>\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.notes', 'Notes')}</Label>\n <Textarea value={(payload.notes as string) || ''} onChange={(event) => updateField('notes', event.target.value)} rows={2} />\n </div>\n </div>\n )\n}\n\nfunction ContactPayloadEditor({\n payload,\n updateField,\n}: {\n payload: Record<string, unknown>\n updateField: (key: string, value: unknown) => void\n}) {\n const t = useT()\n const type = (payload.type as string) || 'person'\n const isPerson = type === 'person'\n\n const existingName = (payload.name as string) || ''\n const nameParts = existingName.trim().split(/\\s+/).filter((p) => p.length > 0)\n const [firstName, setFirstName] = React.useState(() => isPerson ? (nameParts[0] || '') : '')\n const [lastName, setLastName] = React.useState(() => isPerson ? (nameParts.slice(1).join(' ') || '') : '')\n\n const updatePersonName = React.useCallback((first: string, last: string) => {\n const combined = `${first} ${last}`.trim()\n updateField('name', combined)\n }, [updateField])\n\n const lastNameMissing = isPerson && !lastName.trim()\n\n return (\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-2 gap-3\">\n {isPerson ? (\n <>\n <div>\n <Label>{t('inbox_ops.contact.first_name', 'First Name')}</Label>\n <Input\n value={firstName}\n onChange={(event) => {\n setFirstName(event.target.value)\n updatePersonName(event.target.value, lastName)\n }}\n />\n </div>\n <div>\n <Label>{t('inbox_ops.contact.last_name', 'Last Name')}</Label>\n <Input\n value={lastName}\n onChange={(event) => {\n setLastName(event.target.value)\n updatePersonName(firstName, event.target.value)\n }}\n className={lastNameMissing ? 'border-red-500' : ''}\n />\n {lastNameMissing && (\n <p className=\"text-xs text-red-600 mt-1\">{t('inbox_ops.contact.last_name_required', 'Last name is required')}</p>\n )}\n </div>\n </>\n ) : (\n <div>\n <Label>{t('inbox_ops.edit_dialog.name', 'Name')}</Label>\n <Input value={existingName} onChange={(event) => updateField('name', event.target.value)} />\n </div>\n )}\n <div>\n <Label>{t('inbox_ops.edit_dialog.type', 'Type')}</Label>\n <select\n className=\"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm\"\n value={type}\n onChange={(event) => updateField('type', event.target.value)}\n >\n <option value=\"person\">{t('inbox_ops.contact_type.person', 'Person')}</option>\n <option value=\"company\">{t('inbox_ops.contact_type.company', 'Company')}</option>\n </select>\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <Label>{t('inbox_ops.edit_dialog.email', 'Email')}</Label>\n <Input value={(payload.email as string) || ''} onChange={(event) => updateField('email', event.target.value)} />\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.phone', 'Phone')}</Label>\n <Input value={(payload.phone as string) || ''} onChange={(event) => updateField('phone', event.target.value)} />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <Label>{t('inbox_ops.edit_dialog.company_name', 'Company Name')}</Label>\n <Input value={(payload.companyName as string) || ''} onChange={(event) => updateField('companyName', event.target.value)} />\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.role', 'Role')}</Label>\n <Input value={(payload.role as string) || ''} onChange={(event) => updateField('role', event.target.value)} />\n </div>\n </div>\n </div>\n )\n}\n\nfunction LinkContactPayloadEditor({\n payload,\n updateField,\n}: {\n payload: Record<string, unknown>\n updateField: (key: string, value: unknown) => void\n}) {\n const t = useT()\n return (\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <Label>{t('inbox_ops.edit_dialog.email', 'Email')}</Label>\n <Input value={(payload.emailAddress as string) || ''} onChange={(event) => updateField('emailAddress', event.target.value)} />\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.contact_id', 'Contact ID')}</Label>\n <Input value={(payload.contactId as string) || ''} onChange={(event) => updateField('contactId', event.target.value)} />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <Label>{t('inbox_ops.edit_dialog.contact_type', 'Contact Type')}</Label>\n <select\n className=\"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm\"\n value={(payload.contactType as string) || 'person'}\n onChange={(event) => updateField('contactType', event.target.value)}\n >\n <option value=\"person\">{t('inbox_ops.contact_type.person', 'Person')}</option>\n <option value=\"company\">{t('inbox_ops.contact_type.company', 'Company')}</option>\n </select>\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.contact_name', 'Contact Name')}</Label>\n <Input value={(payload.contactName as string) || ''} onChange={(event) => updateField('contactName', event.target.value)} />\n </div>\n </div>\n </div>\n )\n}\n\nfunction DraftReplyPayloadEditor({\n payload,\n updateField,\n}: {\n payload: Record<string, unknown>\n updateField: (key: string, value: unknown) => void\n}) {\n const t = useT()\n return (\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <Label>{t('inbox_ops.edit_dialog.to', 'To')}</Label>\n <Input value={(payload.to as string) || ''} onChange={(event) => updateField('to', event.target.value)} />\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.to_name', 'To Name')}</Label>\n <Input value={(payload.toName as string) || ''} onChange={(event) => updateField('toName', event.target.value)} />\n </div>\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.subject', 'Subject')}</Label>\n <Input value={(payload.subject as string) || ''} onChange={(event) => updateField('subject', event.target.value)} />\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.body', 'Body')}</Label>\n <Textarea value={(payload.body as string) || ''} onChange={(event) => updateField('body', event.target.value)} rows={6} />\n </div>\n </div>\n )\n}\n\nfunction UpdateOrderPayloadEditor({\n payload,\n updateField,\n}: {\n payload: Record<string, unknown>\n updateField: (key: string, value: unknown) => void\n}) {\n const t = useT()\n const quantityChanges = (payload.quantityChanges as Record<string, unknown>[]) || []\n const deliveryDateChange = (payload.deliveryDateChange as Record<string, unknown>) || {}\n const noteAdditions = Array.isArray(payload.noteAdditions) ? (payload.noteAdditions as string[]).join('\\n') : ''\n\n return (\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <Label>{t('inbox_ops.edit_dialog.order_id', 'Order ID')}</Label>\n <Input value={(payload.orderId as string) || ''} onChange={(event) => updateField('orderId', event.target.value)} />\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.order_number', 'Order Number')}</Label>\n <Input value={(payload.orderNumber as string) || ''} onChange={(event) => updateField('orderNumber', event.target.value)} />\n </div>\n </div>\n\n {quantityChanges.length > 0 && (\n <div>\n <Label className=\"mb-1 block\">{t('inbox_ops.edit_dialog.quantity_changes', 'Quantity Changes')}</Label>\n <div className=\"space-y-2\">\n {quantityChanges.map((change, index) => (\n <div key={index} className=\"border rounded p-2 space-y-2\">\n <div className=\"grid grid-cols-3 gap-2\">\n <div>\n <Label className=\"text-xs\">{t('inbox_ops.edit_dialog.line_item', 'Line Item')}</Label>\n <Input\n className=\"h-8 text-sm\"\n value={(change.lineItemName as string) || ''}\n onChange={(event) => {\n const arr = [...quantityChanges]\n arr[index] = { ...arr[index], lineItemName: event.target.value }\n updateField('quantityChanges', arr)\n }}\n />\n </div>\n <div>\n <Label className=\"text-xs\">{t('inbox_ops.edit_dialog.old_qty', 'Old Qty')}</Label>\n <Input\n className=\"h-8 text-sm\"\n value={(change.oldQuantity as string) || ''}\n onChange={(event) => {\n const arr = [...quantityChanges]\n arr[index] = { ...arr[index], oldQuantity: event.target.value }\n updateField('quantityChanges', arr)\n }}\n />\n </div>\n <div>\n <Label className=\"text-xs\">{t('inbox_ops.edit_dialog.new_qty', 'New Qty')}</Label>\n <Input\n className=\"h-8 text-sm\"\n value={(change.newQuantity as string) || ''}\n onChange={(event) => {\n const arr = [...quantityChanges]\n arr[index] = { ...arr[index], newQuantity: event.target.value }\n updateField('quantityChanges', arr)\n }}\n />\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {Boolean(deliveryDateChange.oldDate || deliveryDateChange.newDate) && (\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <Label>{t('inbox_ops.edit_dialog.old_delivery_date', 'Old Delivery Date')}</Label>\n <Input\n value={(deliveryDateChange.oldDate as string) || ''}\n onChange={(event) => updateField('deliveryDateChange', { ...deliveryDateChange, oldDate: event.target.value })}\n placeholder=\"YYYY-MM-DD\"\n />\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.new_delivery_date', 'New Delivery Date')}</Label>\n <Input\n value={(deliveryDateChange.newDate as string) || ''}\n onChange={(event) => updateField('deliveryDateChange', { ...deliveryDateChange, newDate: event.target.value })}\n placeholder=\"YYYY-MM-DD\"\n />\n </div>\n </div>\n )}\n\n <div>\n <Label>{t('inbox_ops.edit_dialog.note_additions', 'Notes')}</Label>\n <Textarea\n value={noteAdditions}\n onChange={(event) => {\n const lines = event.target.value.split('\\n').filter(Boolean)\n updateField('noteAdditions', lines.length > 0 ? lines : undefined)\n }}\n rows={2}\n placeholder={t('inbox_ops.placeholder.one_note_per_line', 'One note per line')}\n />\n </div>\n </div>\n )\n}\n\nfunction LogActivityPayloadEditor({\n payload,\n updateField,\n}: {\n payload: Record<string, unknown>\n updateField: (key: string, value: unknown) => void\n}) {\n const t = useT()\n return (\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <Label>{t('inbox_ops.edit_dialog.contact_name', 'Contact Name')}</Label>\n <Input value={(payload.contactName as string) || ''} onChange={(event) => updateField('contactName', event.target.value)} />\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.contact_type', 'Contact Type')}</Label>\n <select\n className=\"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm\"\n value={(payload.contactType as string) || 'person'}\n onChange={(event) => updateField('contactType', event.target.value)}\n >\n <option value=\"person\">{t('inbox_ops.contact_type.person', 'Person')}</option>\n <option value=\"company\">{t('inbox_ops.contact_type.company', 'Company')}</option>\n </select>\n </div>\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.activity_type', 'Activity Type')}</Label>\n <select\n className=\"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm\"\n value={(payload.activityType as string) || 'email'}\n onChange={(event) => updateField('activityType', event.target.value)}\n >\n <option value=\"email\">{t('inbox_ops.activity_type.email', 'Email')}</option>\n <option value=\"call\">{t('inbox_ops.activity_type.call', 'Call')}</option>\n <option value=\"meeting\">{t('inbox_ops.activity_type.meeting', 'Meeting')}</option>\n <option value=\"note\">{t('inbox_ops.activity_type.note', 'Note')}</option>\n </select>\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.subject', 'Subject')}</Label>\n <Input value={(payload.subject as string) || ''} onChange={(event) => updateField('subject', event.target.value)} />\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.body', 'Body')}</Label>\n <Textarea value={(payload.body as string) || ''} onChange={(event) => updateField('body', event.target.value)} rows={6} />\n </div>\n </div>\n )\n}\n\nexport function EditActionDialog({\n action,\n actionTypeLabels,\n onClose,\n onSaved,\n}: {\n action: ActionDetail\n actionTypeLabels: Record<string, string>\n onClose: () => void\n onSaved: () => void\n}) {\n const t = useT()\n const { runMutation } = useGuardedMutation<Record<string, unknown>>({\n contextId: 'inbox-ops-edit-action',\n })\n const [payload, setPayload] = React.useState<Record<string, unknown>>(\n () => structuredClone(action.payload),\n )\n const [isSaving, setIsSaving] = React.useState(false)\n const [jsonMode, setJsonMode] = React.useState(false)\n const [jsonText, setJsonText] = React.useState(() => JSON.stringify(action.payload, null, 2))\n const [jsonError, setJsonError] = React.useState<string | null>(null)\n\n const handleSave = React.useCallback(async () => {\n let finalPayload = payload\n if (jsonMode) {\n try {\n finalPayload = JSON.parse(jsonText)\n setJsonError(null)\n } catch {\n setJsonError(t('inbox_ops.edit_dialog.invalid_json', 'Invalid JSON'))\n return\n }\n }\n\n setIsSaving(true)\n const result = await runMutation({\n operation: () => apiCall<{ ok: boolean; error?: string }>(\n `/api/inbox_ops/proposals/${action.proposalId}/actions/${action.id}`,\n { method: 'PATCH', body: JSON.stringify({ payload: finalPayload }) },\n ),\n context: {},\n })\n if (result?.ok && result.result?.ok) {\n flash(t('inbox_ops.edit_dialog.saved', 'Action updated successfully'), 'success')\n onSaved()\n onClose()\n } else {\n flash(result?.result?.error || t('inbox_ops.flash.save_failed', 'Failed to save'), 'error')\n }\n setIsSaving(false)\n }, [action, payload, jsonMode, jsonText, t, onSaved, onClose, runMutation])\n\n React.useEffect(() => {\n function handleKeyDown(event: KeyboardEvent) {\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault()\n handleSave()\n }\n }\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [handleSave])\n\n const updateField = (key: string, value: unknown) => {\n setPayload((prev) => ({ ...prev, [key]: value }))\n }\n\n const resolveActionDescription = useActionDescriptionResolver()\n const label = actionTypeLabels[action.actionType] || action.actionType\n const hasTypedEditor = [\n 'create_order', 'create_quote', 'update_order', 'update_shipment', 'create_contact', 'link_contact', 'log_activity', 'draft_reply',\n ].includes(action.actionType)\n\n return (\n <Dialog open onOpenChange={(open) => { if (!open) onClose() }}>\n <DialogContent className=\"sm:max-w-2xl sm:max-h-[85vh]\">\n <DialogHeader>\n <DialogTitle>{t('inbox_ops.edit_dialog.title', 'Edit Action')}: {label}</DialogTitle>\n <DialogDescription>{resolveActionDescription(action.description, action.payload)}</DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-4 overflow-y-auto max-h-[60vh] py-2\">\n {hasTypedEditor && !jsonMode && (\n <>\n {action.actionType === 'update_order' && (\n <UpdateOrderPayloadEditor payload={payload} updateField={updateField} />\n )}\n {action.actionType === 'update_shipment' && (\n <ShipmentPayloadEditor payload={payload} updateField={updateField} />\n )}\n {action.actionType === 'create_contact' && (\n <ContactPayloadEditor payload={payload} updateField={updateField} />\n )}\n {action.actionType === 'link_contact' && (\n <LinkContactPayloadEditor payload={payload} updateField={updateField} />\n )}\n {action.actionType === 'log_activity' && (\n <LogActivityPayloadEditor payload={payload} updateField={updateField} />\n )}\n {action.actionType === 'draft_reply' && (\n <DraftReplyPayloadEditor payload={payload} updateField={updateField} />\n )}\n </>\n )}\n\n {(!hasTypedEditor || jsonMode) && (\n <div className=\"space-y-2\">\n <Label>{t('inbox_ops.edit_dialog.payload_json', 'Payload (JSON)')}</Label>\n <Textarea\n className=\"font-mono text-xs min-h-[200px]\"\n value={jsonText}\n onChange={(event) => {\n setJsonText(event.target.value)\n setJsonError(null)\n }}\n />\n {jsonError && <p className=\"text-xs text-red-600\">{t('inbox_ops.edit_dialog.invalid_json', 'Invalid JSON')}</p>}\n </div>\n )}\n\n {hasTypedEditor && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n if (!jsonMode) {\n setJsonText(JSON.stringify(payload, null, 2))\n } else {\n try {\n setPayload(JSON.parse(jsonText))\n setJsonError(null)\n } catch {\n setJsonError(t('inbox_ops.edit_dialog.invalid_json', 'Invalid JSON'))\n return\n }\n }\n setJsonMode(!jsonMode)\n }}\n >\n {jsonMode ? t('inbox_ops.edit_dialog.form_view', 'Form view') : t('inbox_ops.edit_dialog.json_view', 'JSON view')}\n </Button>\n )}\n </div>\n\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={onClose} disabled={isSaving}>\n {t('inbox_ops.edit_dialog.cancel', 'Cancel')}\n </Button>\n <Button type=\"button\" onClick={handleSave} disabled={isSaving}>\n {isSaving && <Loader2 className=\"h-4 w-4 animate-spin mr-1\" />}\n {t('inbox_ops.edit_dialog.save', 'Save Changes')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\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 {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Loader2 } from 'lucide-react'\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n DialogDescription,\n} from '@open-mercato/ui/primitives/dialog'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport type { ActionDetail } from './types'\nimport { useActionDescriptionResolver } from './ActionCard'\n\nfunction ShipmentPayloadEditor({\n payload,\n updateField,\n}: {\n payload: Record<string, unknown>\n updateField: (key: string, value: unknown) => void\n}) {\n const t = useT()\n const trackingNumbers = ((payload.trackingNumbers as string[]) || []).join(', ')\n\n return (\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <Label>{t('inbox_ops.edit_dialog.carrier', 'Carrier')}</Label>\n <Input value={(payload.carrierName as string) || ''} onChange={(event) => updateField('carrierName', event.target.value)} />\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.status', 'Status')}</Label>\n <Input value={(payload.statusLabel as string) || ''} onChange={(event) => updateField('statusLabel', event.target.value)} />\n </div>\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.tracking_numbers', 'Tracking Numbers')}</Label>\n <Input\n value={trackingNumbers}\n onChange={(event) => updateField('trackingNumbers', event.target.value.split(',').map((s) => s.trim()).filter(Boolean))}\n placeholder={t('inbox_ops.placeholder.comma_separated', 'Comma-separated')}\n />\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <Label>{t('inbox_ops.edit_dialog.shipped_at', 'Shipped At')}</Label>\n <Input value={(payload.shippedAt as string) || ''} onChange={(event) => updateField('shippedAt', event.target.value)} placeholder=\"YYYY-MM-DD\" />\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.estimated_delivery', 'Estimated Delivery')}</Label>\n <Input value={(payload.estimatedDelivery as string) || ''} onChange={(event) => updateField('estimatedDelivery', event.target.value)} placeholder=\"YYYY-MM-DD\" />\n </div>\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.notes', 'Notes')}</Label>\n <Textarea value={(payload.notes as string) || ''} onChange={(event) => updateField('notes', event.target.value)} rows={2} />\n </div>\n </div>\n )\n}\n\nfunction ContactPayloadEditor({\n payload,\n updateField,\n}: {\n payload: Record<string, unknown>\n updateField: (key: string, value: unknown) => void\n}) {\n const t = useT()\n const type = (payload.type as string) || 'person'\n const isPerson = type === 'person'\n\n const existingName = (payload.name as string) || ''\n const nameParts = existingName.trim().split(/\\s+/).filter((p) => p.length > 0)\n const [firstName, setFirstName] = React.useState(() => isPerson ? (nameParts[0] || '') : '')\n const [lastName, setLastName] = React.useState(() => isPerson ? (nameParts.slice(1).join(' ') || '') : '')\n\n const updatePersonName = React.useCallback((first: string, last: string) => {\n const combined = `${first} ${last}`.trim()\n updateField('name', combined)\n }, [updateField])\n\n const lastNameMissing = isPerson && !lastName.trim()\n\n return (\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-2 gap-3\">\n {isPerson ? (\n <>\n <div>\n <Label>{t('inbox_ops.contact.first_name', 'First Name')}</Label>\n <Input\n value={firstName}\n onChange={(event) => {\n setFirstName(event.target.value)\n updatePersonName(event.target.value, lastName)\n }}\n />\n </div>\n <div>\n <Label>{t('inbox_ops.contact.last_name', 'Last Name')}</Label>\n <Input\n value={lastName}\n onChange={(event) => {\n setLastName(event.target.value)\n updatePersonName(firstName, event.target.value)\n }}\n className={lastNameMissing ? 'border-red-500' : ''}\n />\n {lastNameMissing && (\n <p className=\"text-xs text-red-600 mt-1\">{t('inbox_ops.contact.last_name_required', 'Last name is required')}</p>\n )}\n </div>\n </>\n ) : (\n <div>\n <Label>{t('inbox_ops.edit_dialog.name', 'Name')}</Label>\n <Input value={existingName} onChange={(event) => updateField('name', event.target.value)} />\n </div>\n )}\n <div>\n <Label>{t('inbox_ops.edit_dialog.type', 'Type')}</Label>\n <Select\n value={type}\n onValueChange={(value) => updateField('type', value)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"person\">{t('inbox_ops.contact_type.person', 'Person')}</SelectItem>\n <SelectItem value=\"company\">{t('inbox_ops.contact_type.company', 'Company')}</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <Label>{t('inbox_ops.edit_dialog.email', 'Email')}</Label>\n <Input value={(payload.email as string) || ''} onChange={(event) => updateField('email', event.target.value)} />\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.phone', 'Phone')}</Label>\n <Input value={(payload.phone as string) || ''} onChange={(event) => updateField('phone', event.target.value)} />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <Label>{t('inbox_ops.edit_dialog.company_name', 'Company Name')}</Label>\n <Input value={(payload.companyName as string) || ''} onChange={(event) => updateField('companyName', event.target.value)} />\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.role', 'Role')}</Label>\n <Input value={(payload.role as string) || ''} onChange={(event) => updateField('role', event.target.value)} />\n </div>\n </div>\n </div>\n )\n}\n\nfunction LinkContactPayloadEditor({\n payload,\n updateField,\n}: {\n payload: Record<string, unknown>\n updateField: (key: string, value: unknown) => void\n}) {\n const t = useT()\n return (\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <Label>{t('inbox_ops.edit_dialog.email', 'Email')}</Label>\n <Input value={(payload.emailAddress as string) || ''} onChange={(event) => updateField('emailAddress', event.target.value)} />\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.contact_id', 'Contact ID')}</Label>\n <Input value={(payload.contactId as string) || ''} onChange={(event) => updateField('contactId', event.target.value)} />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <Label>{t('inbox_ops.edit_dialog.contact_type', 'Contact Type')}</Label>\n <Select\n value={(payload.contactType as string) || 'person'}\n onValueChange={(value) => updateField('contactType', value)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"person\">{t('inbox_ops.contact_type.person', 'Person')}</SelectItem>\n <SelectItem value=\"company\">{t('inbox_ops.contact_type.company', 'Company')}</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.contact_name', 'Contact Name')}</Label>\n <Input value={(payload.contactName as string) || ''} onChange={(event) => updateField('contactName', event.target.value)} />\n </div>\n </div>\n </div>\n )\n}\n\nfunction DraftReplyPayloadEditor({\n payload,\n updateField,\n}: {\n payload: Record<string, unknown>\n updateField: (key: string, value: unknown) => void\n}) {\n const t = useT()\n return (\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <Label>{t('inbox_ops.edit_dialog.to', 'To')}</Label>\n <Input value={(payload.to as string) || ''} onChange={(event) => updateField('to', event.target.value)} />\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.to_name', 'To Name')}</Label>\n <Input value={(payload.toName as string) || ''} onChange={(event) => updateField('toName', event.target.value)} />\n </div>\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.subject', 'Subject')}</Label>\n <Input value={(payload.subject as string) || ''} onChange={(event) => updateField('subject', event.target.value)} />\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.body', 'Body')}</Label>\n <Textarea value={(payload.body as string) || ''} onChange={(event) => updateField('body', event.target.value)} rows={6} />\n </div>\n </div>\n )\n}\n\nfunction UpdateOrderPayloadEditor({\n payload,\n updateField,\n}: {\n payload: Record<string, unknown>\n updateField: (key: string, value: unknown) => void\n}) {\n const t = useT()\n const quantityChanges = (payload.quantityChanges as Record<string, unknown>[]) || []\n const deliveryDateChange = (payload.deliveryDateChange as Record<string, unknown>) || {}\n const noteAdditions = Array.isArray(payload.noteAdditions) ? (payload.noteAdditions as string[]).join('\\n') : ''\n\n return (\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <Label>{t('inbox_ops.edit_dialog.order_id', 'Order ID')}</Label>\n <Input value={(payload.orderId as string) || ''} onChange={(event) => updateField('orderId', event.target.value)} />\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.order_number', 'Order Number')}</Label>\n <Input value={(payload.orderNumber as string) || ''} onChange={(event) => updateField('orderNumber', event.target.value)} />\n </div>\n </div>\n\n {quantityChanges.length > 0 && (\n <div>\n <Label className=\"mb-1 block\">{t('inbox_ops.edit_dialog.quantity_changes', 'Quantity Changes')}</Label>\n <div className=\"space-y-2\">\n {quantityChanges.map((change, index) => (\n <div key={index} className=\"border rounded p-2 space-y-2\">\n <div className=\"grid grid-cols-3 gap-2\">\n <div>\n <Label className=\"text-xs\">{t('inbox_ops.edit_dialog.line_item', 'Line Item')}</Label>\n <Input\n className=\"h-8 text-sm\"\n value={(change.lineItemName as string) || ''}\n onChange={(event) => {\n const arr = [...quantityChanges]\n arr[index] = { ...arr[index], lineItemName: event.target.value }\n updateField('quantityChanges', arr)\n }}\n />\n </div>\n <div>\n <Label className=\"text-xs\">{t('inbox_ops.edit_dialog.old_qty', 'Old Qty')}</Label>\n <Input\n className=\"h-8 text-sm\"\n value={(change.oldQuantity as string) || ''}\n onChange={(event) => {\n const arr = [...quantityChanges]\n arr[index] = { ...arr[index], oldQuantity: event.target.value }\n updateField('quantityChanges', arr)\n }}\n />\n </div>\n <div>\n <Label className=\"text-xs\">{t('inbox_ops.edit_dialog.new_qty', 'New Qty')}</Label>\n <Input\n className=\"h-8 text-sm\"\n value={(change.newQuantity as string) || ''}\n onChange={(event) => {\n const arr = [...quantityChanges]\n arr[index] = { ...arr[index], newQuantity: event.target.value }\n updateField('quantityChanges', arr)\n }}\n />\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {Boolean(deliveryDateChange.oldDate || deliveryDateChange.newDate) && (\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <Label>{t('inbox_ops.edit_dialog.old_delivery_date', 'Old Delivery Date')}</Label>\n <Input\n value={(deliveryDateChange.oldDate as string) || ''}\n onChange={(event) => updateField('deliveryDateChange', { ...deliveryDateChange, oldDate: event.target.value })}\n placeholder=\"YYYY-MM-DD\"\n />\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.new_delivery_date', 'New Delivery Date')}</Label>\n <Input\n value={(deliveryDateChange.newDate as string) || ''}\n onChange={(event) => updateField('deliveryDateChange', { ...deliveryDateChange, newDate: event.target.value })}\n placeholder=\"YYYY-MM-DD\"\n />\n </div>\n </div>\n )}\n\n <div>\n <Label>{t('inbox_ops.edit_dialog.note_additions', 'Notes')}</Label>\n <Textarea\n value={noteAdditions}\n onChange={(event) => {\n const lines = event.target.value.split('\\n').filter(Boolean)\n updateField('noteAdditions', lines.length > 0 ? lines : undefined)\n }}\n rows={2}\n placeholder={t('inbox_ops.placeholder.one_note_per_line', 'One note per line')}\n />\n </div>\n </div>\n )\n}\n\nfunction LogActivityPayloadEditor({\n payload,\n updateField,\n}: {\n payload: Record<string, unknown>\n updateField: (key: string, value: unknown) => void\n}) {\n const t = useT()\n return (\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <Label>{t('inbox_ops.edit_dialog.contact_name', 'Contact Name')}</Label>\n <Input value={(payload.contactName as string) || ''} onChange={(event) => updateField('contactName', event.target.value)} />\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.contact_type', 'Contact Type')}</Label>\n <Select\n value={(payload.contactType as string) || 'person'}\n onValueChange={(value) => updateField('contactType', value)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"person\">{t('inbox_ops.contact_type.person', 'Person')}</SelectItem>\n <SelectItem value=\"company\">{t('inbox_ops.contact_type.company', 'Company')}</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.activity_type', 'Activity Type')}</Label>\n <Select\n value={(payload.activityType as string) || 'email'}\n onValueChange={(value) => updateField('activityType', value)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"email\">{t('inbox_ops.activity_type.email', 'Email')}</SelectItem>\n <SelectItem value=\"call\">{t('inbox_ops.activity_type.call', 'Call')}</SelectItem>\n <SelectItem value=\"meeting\">{t('inbox_ops.activity_type.meeting', 'Meeting')}</SelectItem>\n <SelectItem value=\"note\">{t('inbox_ops.activity_type.note', 'Note')}</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.subject', 'Subject')}</Label>\n <Input value={(payload.subject as string) || ''} onChange={(event) => updateField('subject', event.target.value)} />\n </div>\n <div>\n <Label>{t('inbox_ops.edit_dialog.body', 'Body')}</Label>\n <Textarea value={(payload.body as string) || ''} onChange={(event) => updateField('body', event.target.value)} rows={6} />\n </div>\n </div>\n )\n}\n\nexport function EditActionDialog({\n action,\n actionTypeLabels,\n onClose,\n onSaved,\n}: {\n action: ActionDetail\n actionTypeLabels: Record<string, string>\n onClose: () => void\n onSaved: () => void\n}) {\n const t = useT()\n const { runMutation } = useGuardedMutation<Record<string, unknown>>({\n contextId: 'inbox-ops-edit-action',\n })\n const [payload, setPayload] = React.useState<Record<string, unknown>>(\n () => structuredClone(action.payload),\n )\n const [isSaving, setIsSaving] = React.useState(false)\n const [jsonMode, setJsonMode] = React.useState(false)\n const [jsonText, setJsonText] = React.useState(() => JSON.stringify(action.payload, null, 2))\n const [jsonError, setJsonError] = React.useState<string | null>(null)\n\n const handleSave = React.useCallback(async () => {\n let finalPayload = payload\n if (jsonMode) {\n try {\n finalPayload = JSON.parse(jsonText)\n setJsonError(null)\n } catch {\n setJsonError(t('inbox_ops.edit_dialog.invalid_json', 'Invalid JSON'))\n return\n }\n }\n\n setIsSaving(true)\n const result = await runMutation({\n operation: () => apiCall<{ ok: boolean; error?: string }>(\n `/api/inbox_ops/proposals/${action.proposalId}/actions/${action.id}`,\n { method: 'PATCH', body: JSON.stringify({ payload: finalPayload }) },\n ),\n context: {},\n })\n if (result?.ok && result.result?.ok) {\n flash(t('inbox_ops.edit_dialog.saved', 'Action updated successfully'), 'success')\n onSaved()\n onClose()\n } else {\n flash(result?.result?.error || t('inbox_ops.flash.save_failed', 'Failed to save'), 'error')\n }\n setIsSaving(false)\n }, [action, payload, jsonMode, jsonText, t, onSaved, onClose, runMutation])\n\n React.useEffect(() => {\n function handleKeyDown(event: KeyboardEvent) {\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault()\n handleSave()\n }\n }\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [handleSave])\n\n const updateField = (key: string, value: unknown) => {\n setPayload((prev) => ({ ...prev, [key]: value }))\n }\n\n const resolveActionDescription = useActionDescriptionResolver()\n const label = actionTypeLabels[action.actionType] || action.actionType\n const hasTypedEditor = [\n 'create_order', 'create_quote', 'update_order', 'update_shipment', 'create_contact', 'link_contact', 'log_activity', 'draft_reply',\n ].includes(action.actionType)\n\n return (\n <Dialog open onOpenChange={(open) => { if (!open) onClose() }}>\n <DialogContent className=\"sm:max-w-2xl sm:max-h-[85vh]\">\n <DialogHeader>\n <DialogTitle>{t('inbox_ops.edit_dialog.title', 'Edit Action')}: {label}</DialogTitle>\n <DialogDescription>{resolveActionDescription(action.description, action.payload)}</DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-4 overflow-y-auto max-h-[60vh] py-2\">\n {hasTypedEditor && !jsonMode && (\n <>\n {action.actionType === 'update_order' && (\n <UpdateOrderPayloadEditor payload={payload} updateField={updateField} />\n )}\n {action.actionType === 'update_shipment' && (\n <ShipmentPayloadEditor payload={payload} updateField={updateField} />\n )}\n {action.actionType === 'create_contact' && (\n <ContactPayloadEditor payload={payload} updateField={updateField} />\n )}\n {action.actionType === 'link_contact' && (\n <LinkContactPayloadEditor payload={payload} updateField={updateField} />\n )}\n {action.actionType === 'log_activity' && (\n <LogActivityPayloadEditor payload={payload} updateField={updateField} />\n )}\n {action.actionType === 'draft_reply' && (\n <DraftReplyPayloadEditor payload={payload} updateField={updateField} />\n )}\n </>\n )}\n\n {(!hasTypedEditor || jsonMode) && (\n <div className=\"space-y-2\">\n <Label>{t('inbox_ops.edit_dialog.payload_json', 'Payload (JSON)')}</Label>\n <Textarea\n className=\"font-mono text-xs min-h-[200px]\"\n value={jsonText}\n onChange={(event) => {\n setJsonText(event.target.value)\n setJsonError(null)\n }}\n />\n {jsonError && <p className=\"text-xs text-red-600\">{t('inbox_ops.edit_dialog.invalid_json', 'Invalid JSON')}</p>}\n </div>\n )}\n\n {hasTypedEditor && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n if (!jsonMode) {\n setJsonText(JSON.stringify(payload, null, 2))\n } else {\n try {\n setPayload(JSON.parse(jsonText))\n setJsonError(null)\n } catch {\n setJsonError(t('inbox_ops.edit_dialog.invalid_json', 'Invalid JSON'))\n return\n }\n }\n setJsonMode(!jsonMode)\n }}\n >\n {jsonMode ? t('inbox_ops.edit_dialog.form_view', 'Form view') : t('inbox_ops.edit_dialog.json_view', 'JSON view')}\n </Button>\n )}\n </div>\n\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={onClose} disabled={isSaving}>\n {t('inbox_ops.edit_dialog.cancel', 'Cancel')}\n </Button>\n <Button type=\"button\" onClick={handleSave} disabled={isSaving}>\n {isSaving && <Loader2 className=\"h-4 w-4 animate-spin mr-1\" />}\n {t('inbox_ops.edit_dialog.save', 'Save Changes')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -12,6 +12,13 @@ import { FormHeader } from "@open-mercato/ui/backend/forms";
12
12
  import { Card, CardHeader, CardTitle, CardContent } from "@open-mercato/ui/primitives/card";
13
13
  import { Badge } from "@open-mercato/ui/primitives/badge";
14
14
  import { Button } from "@open-mercato/ui/primitives/button";
15
+ import {
16
+ Select,
17
+ SelectContent,
18
+ SelectItem,
19
+ SelectTrigger,
20
+ SelectValue
21
+ } from "@open-mercato/ui/primitives/select";
15
22
  import { Switch } from "@open-mercato/ui/primitives/switch";
16
23
  import { Input } from "@open-mercato/ui/primitives/input";
17
24
  import { Spinner } from "@open-mercato/ui/primitives/spinner";
@@ -902,23 +909,21 @@ function IntegrationDetailPage({ params }) {
902
909
  ] })
903
910
  ] }) }) : null,
904
911
  showLogsTab ? /* @__PURE__ */ jsxs(TabsContent, { value: "logs", className: "mt-0 space-y-4", children: [
905
- /* @__PURE__ */ jsx("div", { className: "flex items-center gap-3", children: /* @__PURE__ */ jsxs("div", { className: "relative inline-flex", children: [
906
- /* @__PURE__ */ jsxs(
907
- "select",
908
- {
909
- className: "h-11 min-w-40 appearance-none rounded-xl border border-border bg-card pl-4 pr-11 text-sm font-medium text-foreground shadow-sm transition-colors focus-visible:border-ring focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/30",
910
- value: logLevel,
911
- onChange: (event) => setLogLevel(event.target.value),
912
- children: [
913
- /* @__PURE__ */ jsx("option", { value: "", children: t("integrations.detail.logs.level.all") }),
914
- /* @__PURE__ */ jsx("option", { value: "info", children: t("integrations.detail.logs.level.info") }),
915
- /* @__PURE__ */ jsx("option", { value: "warn", children: t("integrations.detail.logs.level.warn") }),
916
- /* @__PURE__ */ jsx("option", { value: "error", children: t("integrations.detail.logs.level.error") })
917
- ]
918
- }
919
- ),
920
- /* @__PURE__ */ jsx(ChevronDown, { className: "pointer-events-none absolute right-4 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" })
921
- ] }) }),
912
+ /* @__PURE__ */ jsx("div", { className: "flex items-center gap-3", children: /* @__PURE__ */ jsx("div", { className: "inline-flex", children: /* @__PURE__ */ jsxs(
913
+ Select,
914
+ {
915
+ value: logLevel || void 0,
916
+ onValueChange: (value) => setLogLevel(value ?? ""),
917
+ children: [
918
+ /* @__PURE__ */ jsx(SelectTrigger, { size: "lg", className: "min-w-40", children: /* @__PURE__ */ jsx(SelectValue, { placeholder: t("integrations.detail.logs.level.all") }) }),
919
+ /* @__PURE__ */ jsxs(SelectContent, { children: [
920
+ /* @__PURE__ */ jsx(SelectItem, { value: "info", children: t("integrations.detail.logs.level.info") }),
921
+ /* @__PURE__ */ jsx(SelectItem, { value: "warn", children: t("integrations.detail.logs.level.warn") }),
922
+ /* @__PURE__ */ jsx(SelectItem, { value: "error", children: t("integrations.detail.logs.level.error") })
923
+ ] })
924
+ ]
925
+ }
926
+ ) }) }),
922
927
  isLoadingLogs ? /* @__PURE__ */ jsx("div", { className: "flex justify-center py-8", children: /* @__PURE__ */ jsx(Spinner, {}) }) : logs.length === 0 ? /* @__PURE__ */ jsx("p", { className: "py-4 text-sm text-muted-foreground", children: t("integrations.detail.logs.empty") }) : /* @__PURE__ */ jsx("div", { className: "rounded-lg border", children: /* @__PURE__ */ jsxs("table", { className: "w-full text-sm", children: [
923
928
  /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { className: "border-b bg-muted/50", children: [
924
929
  /* @__PURE__ */ jsx("th", { className: "px-4 py-2 text-left font-medium", children: t("integrations.detail.logs.columns.time") }),