@open-mercato/core 0.5.1-develop.2860.07af3a6a9d → 0.5.1-develop.2874.77704bccbd

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 (349) hide show
  1. package/dist/modules/api_docs/frontend/docs/api/Explorer.js +18 -18
  2. package/dist/modules/api_docs/frontend/docs/api/Explorer.js.map +2 -2
  3. package/dist/modules/api_keys/backend/api-keys/create/page.js +1 -1
  4. package/dist/modules/api_keys/backend/api-keys/create/page.js.map +1 -1
  5. package/dist/modules/attachments/components/AttachmentLibrary.js +2 -2
  6. package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
  7. package/dist/modules/attachments/components/AttachmentPartitionSettings.js +1 -1
  8. package/dist/modules/attachments/components/AttachmentPartitionSettings.js.map +1 -1
  9. package/dist/modules/attachments/fields/attachment.js +1 -1
  10. package/dist/modules/attachments/fields/attachment.js.map +1 -1
  11. package/dist/modules/audit_logs/components/ActionLogDetailsDialog.js +1 -1
  12. package/dist/modules/audit_logs/components/ActionLogDetailsDialog.js.map +2 -2
  13. package/dist/modules/audit_logs/lib/display-helpers.js +1 -1
  14. package/dist/modules/audit_logs/lib/display-helpers.js.map +1 -1
  15. package/dist/modules/auth/backend/users/create/page.js +1 -1
  16. package/dist/modules/auth/backend/users/create/page.js.map +1 -1
  17. package/dist/modules/business_rules/backend/rules/page.js +6 -6
  18. package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
  19. package/dist/modules/business_rules/backend/sets/page.js +2 -2
  20. package/dist/modules/business_rules/backend/sets/page.js.map +2 -2
  21. package/dist/modules/business_rules/components/ActionBuilder.js +5 -5
  22. package/dist/modules/business_rules/components/ActionBuilder.js.map +2 -2
  23. package/dist/modules/business_rules/components/ActionRow.js +8 -8
  24. package/dist/modules/business_rules/components/ActionRow.js.map +1 -1
  25. package/dist/modules/business_rules/components/ConditionBuilder.js +5 -5
  26. package/dist/modules/business_rules/components/ConditionBuilder.js.map +2 -2
  27. package/dist/modules/business_rules/components/ConditionGroup.js +2 -2
  28. package/dist/modules/business_rules/components/ConditionGroup.js.map +1 -1
  29. package/dist/modules/business_rules/components/ConditionRow.js +3 -3
  30. package/dist/modules/business_rules/components/ConditionRow.js.map +2 -2
  31. package/dist/modules/business_rules/components/RuleSetMembers.js +8 -8
  32. package/dist/modules/business_rules/components/RuleSetMembers.js.map +2 -2
  33. package/dist/modules/catalog/backend/catalog/products/[id]/page.js +2 -2
  34. package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +1 -1
  35. package/dist/modules/catalog/backend/catalog/products/create/page.js +5 -5
  36. package/dist/modules/catalog/backend/catalog/products/create/page.js.map +1 -1
  37. package/dist/modules/catalog/components/products/MetadataEditor.js +1 -1
  38. package/dist/modules/catalog/components/products/MetadataEditor.js.map +1 -1
  39. package/dist/modules/catalog/components/products/ProductImageCell.js +1 -1
  40. package/dist/modules/catalog/components/products/ProductImageCell.js.map +1 -1
  41. package/dist/modules/catalog/components/products/VariantBuilder.js +1 -1
  42. package/dist/modules/catalog/components/products/VariantBuilder.js.map +1 -1
  43. package/dist/modules/catalog/widgets/injection/product-seo/widget.client.js +1 -1
  44. package/dist/modules/catalog/widgets/injection/product-seo/widget.client.js.map +2 -2
  45. package/dist/modules/currencies/components/CurrencyFetchingConfig.js +1 -1
  46. package/dist/modules/currencies/components/CurrencyFetchingConfig.js.map +1 -1
  47. package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js +2 -2
  48. package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js.map +2 -2
  49. package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js +9 -9
  50. package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js.map +2 -2
  51. package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js +7 -7
  52. package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js.map +2 -2
  53. package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js +2 -2
  54. package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js.map +1 -1
  55. package/dist/modules/customers/backend/config/customers/pipeline-stages/page.js +3 -3
  56. package/dist/modules/customers/backend/config/customers/pipeline-stages/page.js.map +1 -1
  57. package/dist/modules/customers/backend/customers/deals/pipeline/page.js +2 -2
  58. package/dist/modules/customers/backend/customers/deals/pipeline/page.js.map +1 -1
  59. package/dist/modules/customers/components/AddressTiles.js +1 -1
  60. package/dist/modules/customers/components/AddressTiles.js.map +1 -1
  61. package/dist/modules/customers/components/detail/ActivityForm.js +3 -3
  62. package/dist/modules/customers/components/detail/ActivityForm.js.map +1 -1
  63. package/dist/modules/customers/components/detail/AnnualRevenueField.js +2 -2
  64. package/dist/modules/customers/components/detail/AnnualRevenueField.js.map +1 -1
  65. package/dist/modules/customers/components/detail/CustomFieldValuesList.js +1 -1
  66. package/dist/modules/customers/components/detail/CustomFieldValuesList.js.map +1 -1
  67. package/dist/modules/customers/components/detail/DealForm.js +1 -1
  68. package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
  69. package/dist/modules/customers/components/detail/DealsSection.js +1 -1
  70. package/dist/modules/customers/components/detail/DealsSection.js.map +1 -1
  71. package/dist/modules/customers/components/detail/DetailFieldsSection.js +1 -1
  72. package/dist/modules/customers/components/detail/DetailFieldsSection.js.map +1 -1
  73. package/dist/modules/customers/components/detail/InlineEditors.js +5 -5
  74. package/dist/modules/customers/components/detail/InlineEditors.js.map +2 -2
  75. package/dist/modules/customers/components/detail/TasksSection.js +1 -1
  76. package/dist/modules/customers/components/detail/TasksSection.js.map +1 -1
  77. package/dist/modules/customers/components/detail/TimelineItemHeader.js +1 -1
  78. package/dist/modules/customers/components/detail/TimelineItemHeader.js.map +1 -1
  79. package/dist/modules/customers/components/formConfig.js +2 -2
  80. package/dist/modules/customers/components/formConfig.js.map +1 -1
  81. package/dist/modules/customers/widgets/dashboard/customer-todos/widget.client.js +1 -1
  82. package/dist/modules/customers/widgets/dashboard/customer-todos/widget.client.js.map +1 -1
  83. package/dist/modules/customers/widgets/dashboard/new-customers/widget.client.js +2 -2
  84. package/dist/modules/customers/widgets/dashboard/new-customers/widget.client.js.map +1 -1
  85. package/dist/modules/customers/widgets/dashboard/new-deals/widget.client.js +1 -1
  86. package/dist/modules/customers/widgets/dashboard/new-deals/widget.client.js.map +1 -1
  87. package/dist/modules/customers/widgets/dashboard/next-interactions/widget.client.js +1 -1
  88. package/dist/modules/customers/widgets/dashboard/next-interactions/widget.client.js.map +1 -1
  89. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js +1 -1
  90. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js.map +1 -1
  91. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.client.js +1 -1
  92. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.client.js.map +1 -1
  93. package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.client.js +1 -1
  94. package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.client.js.map +1 -1
  95. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.js +1 -1
  96. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.js.map +1 -1
  97. package/dist/modules/dashboards/widgets/dashboard/orders-kpi/widget.client.js +1 -1
  98. package/dist/modules/dashboards/widgets/dashboard/orders-kpi/widget.client.js.map +1 -1
  99. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.client.js +1 -1
  100. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.client.js.map +1 -1
  101. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js +2 -2
  102. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js.map +1 -1
  103. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js +1 -1
  104. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js.map +1 -1
  105. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js +1 -1
  106. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js.map +1 -1
  107. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js +2 -2
  108. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js.map +1 -1
  109. package/dist/modules/data_sync/backend/data-sync/page.js +4 -4
  110. package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
  111. package/dist/modules/data_sync/backend/data-sync/runs/[id]/page.js +2 -2
  112. package/dist/modules/data_sync/backend/data-sync/runs/[id]/page.js.map +1 -1
  113. package/dist/modules/dictionaries/components/AppearanceSelector.js +3 -3
  114. package/dist/modules/dictionaries/components/AppearanceSelector.js.map +2 -2
  115. package/dist/modules/dictionaries/components/DictionariesManager.js +4 -4
  116. package/dist/modules/dictionaries/components/DictionariesManager.js.map +2 -2
  117. package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js +2 -2
  118. package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js.map +2 -2
  119. package/dist/modules/dictionaries/components/DictionaryEntrySelect.js +3 -3
  120. package/dist/modules/dictionaries/components/DictionaryEntrySelect.js.map +1 -1
  121. package/dist/modules/dictionaries/fields/dictionary.js +4 -4
  122. package/dist/modules/dictionaries/fields/dictionary.js.map +1 -1
  123. package/dist/modules/entities/components/EncryptionManager.js +3 -3
  124. package/dist/modules/entities/components/EncryptionManager.js.map +2 -2
  125. package/dist/modules/entities/components/UserEntitiesTable.js +1 -1
  126. package/dist/modules/entities/components/UserEntitiesTable.js.map +2 -2
  127. package/dist/modules/feature_toggles/components/formConfig.js +1 -1
  128. package/dist/modules/feature_toggles/components/formConfig.js.map +1 -1
  129. package/dist/modules/feature_toggles/components/overrideFormConfig.js +2 -2
  130. package/dist/modules/feature_toggles/components/overrideFormConfig.js.map +1 -1
  131. package/dist/modules/inbox_ops/backend/inbox-ops/proposals/[id]/page.js +12 -12
  132. package/dist/modules/inbox_ops/backend/inbox-ops/proposals/[id]/page.js.map +2 -2
  133. package/dist/modules/inbox_ops/components/messages/InboxEmailPreview.js +1 -1
  134. package/dist/modules/inbox_ops/components/messages/InboxEmailPreview.js.map +1 -1
  135. package/dist/modules/inbox_ops/components/proposals/ActionCard.js +12 -12
  136. package/dist/modules/inbox_ops/components/proposals/ActionCard.js.map +2 -2
  137. package/dist/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.js +3 -3
  138. package/dist/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.js.map +2 -2
  139. package/dist/modules/integrations/backend/integrations/[id]/page.js +6 -6
  140. package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
  141. package/dist/modules/messages/components/MessagesInboxPageClient.js +1 -1
  142. package/dist/modules/messages/components/MessagesInboxPageClient.js.map +1 -1
  143. package/dist/modules/messages/components/defaults/DefaultMessageListItem.js +1 -1
  144. package/dist/modules/messages/components/defaults/DefaultMessageListItem.js.map +1 -1
  145. package/dist/modules/messages/components/defaults/MessageRecordObjectDetail.js +1 -1
  146. package/dist/modules/messages/components/defaults/MessageRecordObjectDetail.js.map +1 -1
  147. package/dist/modules/messages/components/defaults/MessageRecordObjectPreview.js +1 -1
  148. package/dist/modules/messages/components/defaults/MessageRecordObjectPreview.js.map +1 -1
  149. package/dist/modules/messages/components/message-detail/panels/MessageListComponent.js +1 -1
  150. package/dist/modules/messages/components/message-detail/panels/MessageListComponent.js.map +1 -1
  151. package/dist/modules/messages/components/message-detail/panels/attachments-panel.js +1 -1
  152. package/dist/modules/messages/components/message-detail/panels/attachments-panel.js.map +1 -1
  153. package/dist/modules/payment_gateways/backend/payment-gateways/page.js +11 -11
  154. package/dist/modules/payment_gateways/backend/payment-gateways/page.js.map +2 -2
  155. package/dist/modules/planner/components/AvailabilityRulesEditor.js +2 -2
  156. package/dist/modules/planner/components/AvailabilityRulesEditor.js.map +2 -2
  157. package/dist/modules/portal/frontend/[orgSlug]/portal/dashboard/page.js +2 -2
  158. package/dist/modules/portal/frontend/[orgSlug]/portal/dashboard/page.js.map +2 -2
  159. package/dist/modules/portal/frontend/[orgSlug]/portal/login/page.js +3 -3
  160. package/dist/modules/portal/frontend/[orgSlug]/portal/login/page.js.map +2 -2
  161. package/dist/modules/portal/frontend/[orgSlug]/portal/page.js +3 -3
  162. package/dist/modules/portal/frontend/[orgSlug]/portal/page.js.map +2 -2
  163. package/dist/modules/portal/frontend/[orgSlug]/portal/profile/page.js +4 -4
  164. package/dist/modules/portal/frontend/[orgSlug]/portal/profile/page.js.map +2 -2
  165. package/dist/modules/portal/frontend/[orgSlug]/portal/signup/page.js +4 -4
  166. package/dist/modules/portal/frontend/[orgSlug]/portal/signup/page.js.map +2 -2
  167. package/dist/modules/resources/backend/resources/resources/[id]/page.js +1 -1
  168. package/dist/modules/resources/backend/resources/resources/[id]/page.js.map +1 -1
  169. package/dist/modules/sales/backend/sales/documents/[id]/page.js +4 -4
  170. package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +1 -1
  171. package/dist/modules/sales/components/DocumentNumberSettings.js +1 -1
  172. package/dist/modules/sales/components/DocumentNumberSettings.js.map +1 -1
  173. package/dist/modules/sales/components/channels/ChannelOfferForm.js +1 -1
  174. package/dist/modules/sales/components/channels/ChannelOfferForm.js.map +1 -1
  175. package/dist/modules/sales/components/documents/AdjustmentDialog.js +1 -1
  176. package/dist/modules/sales/components/documents/AdjustmentDialog.js.map +1 -1
  177. package/dist/modules/sales/components/documents/DocumentTotals.js +3 -3
  178. package/dist/modules/sales/components/documents/DocumentTotals.js.map +1 -1
  179. package/dist/modules/sales/components/documents/PaymentDialog.js +1 -1
  180. package/dist/modules/sales/components/documents/PaymentDialog.js.map +1 -1
  181. package/dist/modules/sales/components/documents/SalesDocumentForm.js +2 -2
  182. package/dist/modules/sales/components/documents/SalesDocumentForm.js.map +2 -2
  183. package/dist/modules/sales/widgets/dashboard/new-orders/widget.client.js +4 -4
  184. package/dist/modules/sales/widgets/dashboard/new-orders/widget.client.js.map +1 -1
  185. package/dist/modules/sales/widgets/dashboard/new-quotes/widget.client.js +4 -4
  186. package/dist/modules/sales/widgets/dashboard/new-quotes/widget.client.js.map +1 -1
  187. package/dist/modules/sales/widgets/injection/document-history/widget.client.js +2 -2
  188. package/dist/modules/sales/widgets/injection/document-history/widget.client.js.map +1 -1
  189. package/dist/modules/sales/widgets/messages/SalesDocumentMessageDetail.js +1 -1
  190. package/dist/modules/sales/widgets/messages/SalesDocumentMessageDetail.js.map +1 -1
  191. package/dist/modules/sales/widgets/messages/SalesDocumentMessagePreview.js +1 -1
  192. package/dist/modules/sales/widgets/messages/SalesDocumentMessagePreview.js.map +1 -1
  193. package/dist/modules/shipping_carriers/lib/shipment-wizard/components/PackageEditor.js +1 -1
  194. package/dist/modules/shipping_carriers/lib/shipment-wizard/components/PackageEditor.js.map +1 -1
  195. package/dist/modules/staff/backend/staff/team-members/[id]/page.js +1 -1
  196. package/dist/modules/staff/backend/staff/team-members/[id]/page.js.map +1 -1
  197. package/dist/modules/translations/components/TranslationDrawerAction.js +2 -2
  198. package/dist/modules/translations/components/TranslationDrawerAction.js.map +1 -1
  199. package/dist/modules/translations/components/TranslationManager.js +3 -3
  200. package/dist/modules/translations/components/TranslationManager.js.map +1 -1
  201. package/dist/modules/translations/widgets/injection/translation-manager/widget.client.js +2 -2
  202. package/dist/modules/translations/widgets/injection/translation-manager/widget.client.js.map +1 -1
  203. package/dist/modules/workflows/backend/definitions/[id]/page.js +5 -5
  204. package/dist/modules/workflows/backend/definitions/[id]/page.js.map +2 -2
  205. package/dist/modules/workflows/backend/definitions/visual-editor/page.js +2 -2
  206. package/dist/modules/workflows/backend/definitions/visual-editor/page.js.map +2 -2
  207. package/dist/modules/workflows/backend/events/[id]/page.js +4 -4
  208. package/dist/modules/workflows/backend/events/[id]/page.js.map +1 -1
  209. package/dist/modules/workflows/backend/instances/[id]/page.js +2 -2
  210. package/dist/modules/workflows/backend/instances/[id]/page.js.map +1 -1
  211. package/dist/modules/workflows/backend/tasks/[id]/page.js +20 -20
  212. package/dist/modules/workflows/backend/tasks/[id]/page.js.map +2 -2
  213. package/dist/modules/workflows/components/DefinitionTriggersEditor.js +1 -1
  214. package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +1 -1
  215. package/dist/modules/workflows/components/EdgeEditDialog.js +12 -12
  216. package/dist/modules/workflows/components/EdgeEditDialog.js.map +1 -1
  217. package/dist/modules/workflows/components/NodeEditDialog.js +26 -26
  218. package/dist/modules/workflows/components/NodeEditDialog.js.map +1 -1
  219. package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js +1 -1
  220. package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js.map +1 -1
  221. package/dist/modules/workflows/components/mobile/MobileDefinitionDetail.js +2 -2
  222. package/dist/modules/workflows/components/mobile/MobileDefinitionDetail.js.map +2 -2
  223. package/dist/modules/workflows/components/mobile/MobileInstanceOverview.js +7 -7
  224. package/dist/modules/workflows/components/mobile/MobileInstanceOverview.js.map +2 -2
  225. package/dist/modules/workflows/components/mobile/MobileTaskForm.js +11 -11
  226. package/dist/modules/workflows/components/mobile/MobileTaskForm.js.map +2 -2
  227. package/dist/modules/workflows/components/mobile/MobileVisualEditor.js +1 -1
  228. package/dist/modules/workflows/components/mobile/MobileVisualEditor.js.map +1 -1
  229. package/dist/modules/workflows/components/mobile/MobileWorkflowTimeline.js +23 -23
  230. package/dist/modules/workflows/components/mobile/MobileWorkflowTimeline.js.map +2 -2
  231. package/dist/modules/workflows/frontend/checkout-demo/page.js +6 -6
  232. package/dist/modules/workflows/frontend/checkout-demo/page.js.map +1 -1
  233. package/package.json +3 -3
  234. package/src/modules/api_docs/frontend/docs/api/Explorer.tsx +18 -18
  235. package/src/modules/api_keys/backend/api-keys/create/page.tsx +1 -1
  236. package/src/modules/attachments/components/AttachmentLibrary.tsx +3 -3
  237. package/src/modules/attachments/components/AttachmentPartitionSettings.tsx +1 -1
  238. package/src/modules/attachments/fields/attachment.tsx +1 -1
  239. package/src/modules/audit_logs/components/ActionLogDetailsDialog.tsx +1 -1
  240. package/src/modules/audit_logs/lib/display-helpers.tsx +1 -1
  241. package/src/modules/auth/backend/users/create/page.tsx +1 -1
  242. package/src/modules/business_rules/backend/rules/page.tsx +7 -7
  243. package/src/modules/business_rules/backend/sets/page.tsx +3 -3
  244. package/src/modules/business_rules/components/ActionBuilder.tsx +6 -6
  245. package/src/modules/business_rules/components/ActionRow.tsx +8 -8
  246. package/src/modules/business_rules/components/ConditionBuilder.tsx +6 -6
  247. package/src/modules/business_rules/components/ConditionGroup.tsx +2 -2
  248. package/src/modules/business_rules/components/ConditionRow.tsx +3 -3
  249. package/src/modules/business_rules/components/RuleSetMembers.tsx +9 -9
  250. package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +2 -2
  251. package/src/modules/catalog/backend/catalog/products/create/page.tsx +5 -5
  252. package/src/modules/catalog/components/products/MetadataEditor.tsx +1 -1
  253. package/src/modules/catalog/components/products/ProductImageCell.tsx +1 -1
  254. package/src/modules/catalog/components/products/VariantBuilder.tsx +1 -1
  255. package/src/modules/catalog/widgets/injection/product-seo/widget.client.tsx +1 -1
  256. package/src/modules/currencies/components/CurrencyFetchingConfig.tsx +1 -1
  257. package/src/modules/customer_accounts/backend/customer_accounts/roles/page.tsx +2 -2
  258. package/src/modules/customer_accounts/backend/customer_accounts/users/[id]/page.tsx +10 -10
  259. package/src/modules/customer_accounts/backend/customer_accounts/users/page.tsx +9 -9
  260. package/src/modules/customer_accounts/widgets/injection/account-status/widget.client.tsx +2 -2
  261. package/src/modules/customers/backend/config/customers/pipeline-stages/page.tsx +3 -3
  262. package/src/modules/customers/backend/customers/deals/pipeline/page.tsx +2 -2
  263. package/src/modules/customers/components/AddressTiles.tsx +1 -1
  264. package/src/modules/customers/components/detail/ActivityForm.tsx +3 -3
  265. package/src/modules/customers/components/detail/AnnualRevenueField.tsx +2 -2
  266. package/src/modules/customers/components/detail/CustomFieldValuesList.tsx +1 -1
  267. package/src/modules/customers/components/detail/DealForm.tsx +1 -1
  268. package/src/modules/customers/components/detail/DealsSection.tsx +1 -1
  269. package/src/modules/customers/components/detail/DetailFieldsSection.tsx +1 -1
  270. package/src/modules/customers/components/detail/InlineEditors.tsx +5 -5
  271. package/src/modules/customers/components/detail/TasksSection.tsx +1 -1
  272. package/src/modules/customers/components/detail/TimelineItemHeader.tsx +1 -1
  273. package/src/modules/customers/components/formConfig.tsx +2 -2
  274. package/src/modules/customers/widgets/dashboard/customer-todos/widget.client.tsx +1 -1
  275. package/src/modules/customers/widgets/dashboard/new-customers/widget.client.tsx +2 -2
  276. package/src/modules/customers/widgets/dashboard/new-deals/widget.client.tsx +1 -1
  277. package/src/modules/customers/widgets/dashboard/next-interactions/widget.client.tsx +1 -1
  278. package/src/modules/dashboards/components/WidgetVisibilityEditor.tsx +1 -1
  279. package/src/modules/dashboards/widgets/dashboard/aov-kpi/widget.client.tsx +1 -1
  280. package/src/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.client.tsx +1 -1
  281. package/src/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.tsx +1 -1
  282. package/src/modules/dashboards/widgets/dashboard/orders-kpi/widget.client.tsx +1 -1
  283. package/src/modules/dashboards/widgets/dashboard/revenue-kpi/widget.client.tsx +1 -1
  284. package/src/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.tsx +2 -2
  285. package/src/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.tsx +1 -1
  286. package/src/modules/dashboards/widgets/dashboard/top-customers/widget.client.tsx +1 -1
  287. package/src/modules/dashboards/widgets/dashboard/top-products/widget.client.tsx +2 -2
  288. package/src/modules/data_sync/backend/data-sync/page.tsx +4 -4
  289. package/src/modules/data_sync/backend/data-sync/runs/[id]/page.tsx +2 -2
  290. package/src/modules/dictionaries/components/AppearanceSelector.tsx +3 -3
  291. package/src/modules/dictionaries/components/DictionariesManager.tsx +4 -4
  292. package/src/modules/dictionaries/components/DictionaryEntriesEditor.tsx +2 -2
  293. package/src/modules/dictionaries/components/DictionaryEntrySelect.tsx +3 -3
  294. package/src/modules/dictionaries/fields/dictionary.tsx +4 -4
  295. package/src/modules/entities/components/EncryptionManager.tsx +3 -3
  296. package/src/modules/entities/components/UserEntitiesTable.tsx +1 -1
  297. package/src/modules/feature_toggles/components/formConfig.tsx +1 -1
  298. package/src/modules/feature_toggles/components/overrideFormConfig.tsx +2 -2
  299. package/src/modules/inbox_ops/backend/inbox-ops/proposals/[id]/page.tsx +12 -12
  300. package/src/modules/inbox_ops/components/messages/InboxEmailPreview.tsx +1 -1
  301. package/src/modules/inbox_ops/components/proposals/ActionCard.tsx +12 -12
  302. package/src/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.tsx +4 -4
  303. package/src/modules/integrations/backend/integrations/[id]/page.tsx +6 -6
  304. package/src/modules/messages/components/MessagesInboxPageClient.tsx +1 -1
  305. package/src/modules/messages/components/defaults/DefaultMessageListItem.tsx +1 -1
  306. package/src/modules/messages/components/defaults/MessageRecordObjectDetail.tsx +1 -1
  307. package/src/modules/messages/components/defaults/MessageRecordObjectPreview.tsx +1 -1
  308. package/src/modules/messages/components/message-detail/panels/MessageListComponent.tsx +1 -1
  309. package/src/modules/messages/components/message-detail/panels/attachments-panel.tsx +1 -1
  310. package/src/modules/payment_gateways/backend/payment-gateways/page.tsx +11 -11
  311. package/src/modules/planner/components/AvailabilityRulesEditor.tsx +2 -2
  312. package/src/modules/portal/frontend/[orgSlug]/portal/dashboard/page.tsx +2 -2
  313. package/src/modules/portal/frontend/[orgSlug]/portal/login/page.tsx +3 -3
  314. package/src/modules/portal/frontend/[orgSlug]/portal/page.tsx +3 -3
  315. package/src/modules/portal/frontend/[orgSlug]/portal/profile/page.tsx +4 -4
  316. package/src/modules/portal/frontend/[orgSlug]/portal/signup/page.tsx +4 -4
  317. package/src/modules/resources/backend/resources/resources/[id]/page.tsx +1 -1
  318. package/src/modules/sales/backend/sales/documents/[id]/page.tsx +4 -4
  319. package/src/modules/sales/components/DocumentNumberSettings.tsx +1 -1
  320. package/src/modules/sales/components/channels/ChannelOfferForm.tsx +1 -1
  321. package/src/modules/sales/components/documents/AdjustmentDialog.tsx +1 -1
  322. package/src/modules/sales/components/documents/DocumentTotals.tsx +3 -3
  323. package/src/modules/sales/components/documents/PaymentDialog.tsx +1 -1
  324. package/src/modules/sales/components/documents/SalesDocumentForm.tsx +2 -2
  325. package/src/modules/sales/widgets/dashboard/new-orders/widget.client.tsx +4 -4
  326. package/src/modules/sales/widgets/dashboard/new-quotes/widget.client.tsx +4 -4
  327. package/src/modules/sales/widgets/injection/document-history/widget.client.tsx +2 -2
  328. package/src/modules/sales/widgets/messages/SalesDocumentMessageDetail.tsx +1 -1
  329. package/src/modules/sales/widgets/messages/SalesDocumentMessagePreview.tsx +1 -1
  330. package/src/modules/shipping_carriers/lib/shipment-wizard/components/PackageEditor.tsx +1 -1
  331. package/src/modules/staff/backend/staff/team-members/[id]/page.tsx +1 -1
  332. package/src/modules/translations/components/TranslationDrawerAction.tsx +2 -2
  333. package/src/modules/translations/components/TranslationManager.tsx +3 -3
  334. package/src/modules/translations/widgets/injection/translation-manager/widget.client.tsx +2 -2
  335. package/src/modules/workflows/backend/definitions/[id]/page.tsx +5 -5
  336. package/src/modules/workflows/backend/definitions/visual-editor/page.tsx +2 -2
  337. package/src/modules/workflows/backend/events/[id]/page.tsx +4 -4
  338. package/src/modules/workflows/backend/instances/[id]/page.tsx +2 -2
  339. package/src/modules/workflows/backend/tasks/[id]/page.tsx +23 -23
  340. package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +1 -1
  341. package/src/modules/workflows/components/EdgeEditDialog.tsx +12 -12
  342. package/src/modules/workflows/components/NodeEditDialog.tsx +26 -26
  343. package/src/modules/workflows/components/fields/FormFieldArrayEditor.tsx +1 -1
  344. package/src/modules/workflows/components/mobile/MobileDefinitionDetail.tsx +2 -2
  345. package/src/modules/workflows/components/mobile/MobileInstanceOverview.tsx +7 -7
  346. package/src/modules/workflows/components/mobile/MobileTaskForm.tsx +14 -14
  347. package/src/modules/workflows/components/mobile/MobileVisualEditor.tsx +1 -1
  348. package/src/modules/workflows/components/mobile/MobileWorkflowTimeline.tsx +23 -23
  349. package/src/modules/workflows/frontend/checkout-demo/page.tsx +6 -6
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/inbox_ops/backend/inbox-ops/proposals/%5Bid%5D/page.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { useRouter } from 'next/navigation'\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, useLocale } from '@open-mercato/shared/lib/i18n/context'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport {\n ArrowLeft,\n CheckCircle,\n XCircle,\n AlertTriangle,\n CheckCheck,\n Loader2,\n ExternalLink,\n RefreshCw,\n Users,\n Languages,\n Pencil,\n} from 'lucide-react'\nimport type { ProposalTranslationEntry } from '../../../../data/entities'\nimport type { ProposalDetail, ActionDetail, DiscrepancyDetail, EmailDetail } from '../../../../components/proposals/types'\nimport { ActionCard, ConfidenceBadge, useActionTypeLabels, useDiscrepancyDescriptions } from '../../../../components/proposals/ActionCard'\nimport { CategoryBadge, CATEGORY_CONFIG, ALL_CATEGORIES, useCategoryLabels } from '../../../../components/proposals/CategoryBadge'\nimport { hasContactNameIssue } from '../../../../lib/contactValidation'\nimport { EditActionDialog } from '../../../../components/proposals/EditActionDialog'\n\nfunction EmailThreadViewer({ email }: { email: EmailDetail | null }) {\n const t = useT()\n if (!email) return null\n\n const messages = email.threadMessages || []\n\n return (\n <div className=\"space-y-3\">\n <h3 className=\"font-semibold text-sm\">{t('inbox_ops.email_thread', 'Email Thread')}</h3>\n {messages.length > 0 ? (\n messages.map((msg, index) => (\n <div key={index} className=\"border rounded-lg p-3 md:p-4 bg-card\">\n <div className=\"flex items-center gap-2 mb-2\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-medium truncate\">\n {msg.from?.name || msg.from?.email || t('inbox_ops.sender_unknown', 'Unknown')}\n </div>\n <div className=\"text-xs text-muted-foreground truncate\">{msg.from?.email}</div>\n </div>\n <span className=\"text-xs text-muted-foreground whitespace-nowrap\">\n {msg.date ? new Date(msg.date).toLocaleString([], { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }) : ''}\n </span>\n </div>\n <div className=\"text-sm whitespace-pre-wrap text-foreground/80\">{msg.body}</div>\n </div>\n ))\n ) : email.cleanedText ? (\n <div className=\"border rounded-lg p-3 md:p-4 bg-card\">\n <div className=\"text-sm whitespace-pre-wrap text-foreground/80\">{email.cleanedText}</div>\n </div>\n ) : (\n <p className=\"text-sm text-muted-foreground\">{t('inbox_ops.no_email_content', 'No email content available')}</p>\n )}\n </div>\n )\n}\n\nfunction CategoryEditDropdown({\n currentCategory,\n onSelect,\n disabled,\n}: {\n currentCategory: string | null | undefined\n onSelect: (category: string) => void\n disabled: boolean\n}) {\n const t = useT()\n const labels = useCategoryLabels()\n const [isOpen, setIsOpen] = React.useState(false)\n const dropdownRef = React.useRef<HTMLDivElement>(null)\n\n React.useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n }\n }\n function handleEscape(event: KeyboardEvent) {\n if (event.key === 'Escape') setIsOpen(false)\n }\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n document.addEventListener('keydown', handleEscape)\n }\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n document.removeEventListener('keydown', handleEscape)\n }\n }, [isOpen])\n\n return (\n <div className=\"relative inline-block\" ref={dropdownRef}>\n <div className=\"flex items-center gap-1\">\n <CategoryBadge category={currentCategory} />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 w-6 p-0\"\n onClick={() => setIsOpen(!isOpen)}\n disabled={disabled}\n title={t('inbox_ops.recategorize', 'Change Category')}\n >\n <Pencil className=\"h-3 w-3\" />\n </Button>\n </div>\n {isOpen && (\n <div className=\"absolute top-full left-0 mt-1 z-50 w-48 rounded-md border bg-popover shadow-md\">\n <div className=\"p-1\">\n {ALL_CATEGORIES.map((cat) => {\n const config = CATEGORY_CONFIG[cat]\n const { Icon } = config\n return (\n <Button\n key={cat}\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className={`flex items-center gap-2 w-full justify-start rounded-sm px-2 py-1.5 text-sm hover:bg-accent hover:text-accent-foreground ${currentCategory === cat ? 'bg-accent' : ''}`}\n onClick={() => { onSelect(cat); setIsOpen(false) }}\n >\n <Icon className=\"h-3.5 w-3.5\" />\n {labels[cat] || cat}\n </Button>\n )\n })}\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport default function ProposalDetailPage({ params }: { params?: { id?: string } }) {\n const t = useT()\n const locale = useLocale()\n const router = useRouter()\n const proposalId = params?.id\n\n const [proposal, setProposal] = React.useState<ProposalDetail | null>(null)\n const [actions, setActions] = React.useState<ActionDetail[]>([])\n const [discrepancies, setDiscrepancies] = React.useState<DiscrepancyDetail[]>([])\n const [email, setEmail] = React.useState<EmailDetail | null>(null)\n const [isLoading, setIsLoading] = React.useState(true)\n const [error, setError] = React.useState<string | null>(null)\n const [isProcessing, setIsProcessing] = React.useState(false)\n\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const { runMutation } = useGuardedMutation<Record<string, unknown>>({\n contextId: 'inbox-ops-proposal-detail',\n })\n const actionTypeLabels = useActionTypeLabels()\n const resolveDiscrepancyDescription = useDiscrepancyDescriptions()\n const [editingAction, setEditingAction] = React.useState<ActionDetail | null>(null)\n const [sendingReplyId, setSendingReplyId] = React.useState<string | null>(null)\n\n const [translation, setTranslation] = React.useState<ProposalTranslationEntry | null>(null)\n const [isTranslating, setIsTranslating] = React.useState(false)\n const [showTranslation, setShowTranslation] = React.useState(false)\n\n const handleEditAction = React.useCallback((action: ActionDetail) => {\n if (action.actionType === 'create_order' || action.actionType === 'create_quote') {\n const kind = action.actionType === 'create_order' ? 'order' : 'quote'\n try {\n sessionStorage.setItem(\n 'inbox_ops.orderDraft',\n JSON.stringify({\n actionId: action.id,\n proposalId: action.proposalId,\n payload: action.payload,\n }),\n )\n } catch { /* sessionStorage unavailable */ }\n router.push(`/backend/sales/documents/create?kind=${kind}&fromInboxAction=${encodeURIComponent(action.id)}`)\n return\n }\n if (action.actionType === 'create_product') {\n try {\n sessionStorage.setItem(\n 'inbox_ops.productDraft',\n JSON.stringify({\n actionId: action.id,\n proposalId: action.proposalId,\n payload: action.payload,\n }),\n )\n } catch { /* sessionStorage unavailable */ }\n router.push(`/backend/catalog/products/create?fromInboxAction=${encodeURIComponent(action.id)}`)\n return\n }\n setEditingAction(action)\n }, [router])\n\n const handleTranslate = React.useCallback(async () => {\n if (!proposalId) return\n setIsTranslating(true)\n const result = await runMutation({\n operation: () => apiCall<{ translation: ProposalTranslationEntry; cached: boolean }>(\n `/api/inbox_ops/proposals/${proposalId}/translate`,\n { method: 'POST', body: JSON.stringify({ targetLocale: locale }) },\n ),\n context: {},\n })\n if (result?.ok && result.result?.translation) {\n setTranslation(result.result.translation)\n setShowTranslation(true)\n } else {\n const detail = (result?.result as Record<string, unknown> | null)?.error\n flash(detail ? `${t('inbox_ops.translate.failed', 'Translation failed')}: ${detail}` : t('inbox_ops.translate.failed', 'Translation failed'), 'error')\n }\n setIsTranslating(false)\n }, [proposalId, locale, t, runMutation])\n\n const handleCategorize = React.useCallback(async (category: string) => {\n if (!proposalId) return\n const result = await runMutation({\n operation: () => apiCall<{ ok: boolean; category: string; previousCategory: string | null }>(\n `/api/inbox_ops/proposals/${proposalId}/categorize`,\n { method: 'POST', body: JSON.stringify({ category }) },\n ),\n context: {},\n })\n if (result?.ok && result.result?.ok) {\n setProposal((prev) => prev ? { ...prev, category: result.result!.category } : prev)\n } else {\n flash(t('inbox_ops.flash.save_failed', 'Failed to save'), 'error')\n }\n }, [proposalId, t, runMutation])\n\n const loadData = React.useCallback(async () => {\n if (!proposalId) return\n setIsLoading(true)\n setError(null)\n try {\n const result = await apiCall<{\n proposal: ProposalDetail\n actions: ActionDetail[]\n discrepancies: DiscrepancyDetail[]\n email: EmailDetail\n }>(`/api/inbox_ops/proposals/${proposalId}`)\n if (result?.ok && result.result) {\n setProposal(result.result.proposal)\n setActions(result.result.actions || [])\n setDiscrepancies(result.result.discrepancies || [])\n setEmail(result.result.email)\n } else {\n setError(t('inbox_ops.flash.load_failed', 'Failed to load proposal'))\n }\n } catch {\n setError(t('inbox_ops.flash.load_failed', 'Failed to load proposal'))\n }\n setIsLoading(false)\n }, [proposalId, t])\n\n React.useEffect(() => { loadData() }, [loadData])\n\n const handleAcceptAction = React.useCallback(async (actionId: string) => {\n setIsProcessing(true)\n const result = await runMutation({\n operation: () => apiCall<{ ok: boolean; error?: string }>(\n `/api/inbox_ops/proposals/${proposalId}/actions/${actionId}/accept`,\n { method: 'POST' },\n ),\n context: {},\n })\n if (result?.ok && result.result?.ok) {\n flash(t('inbox_ops.flash.action_executed', 'Action executed'), 'success')\n await loadData()\n } else {\n flash(result?.result?.error || t('inbox_ops.flash.action_execute_failed', 'Failed to execute action'), 'error')\n }\n setIsProcessing(false)\n }, [proposalId, loadData, t, runMutation])\n\n const handleRejectAction = React.useCallback(async (actionId: string) => {\n setIsProcessing(true)\n const result = await runMutation({\n operation: () => apiCall<{ ok: boolean }>(\n `/api/inbox_ops/proposals/${proposalId}/actions/${actionId}/reject`,\n { method: 'POST' },\n ),\n context: {},\n })\n if (result?.ok && result.result?.ok) {\n flash(t('inbox_ops.flash.action_rejected', 'Action rejected'), 'success')\n await loadData()\n } else {\n flash(t('inbox_ops.flash.action_reject_failed', 'Failed to reject action'), 'error')\n }\n setIsProcessing(false)\n }, [proposalId, loadData, runMutation])\n\n const handleAcceptAll = React.useCallback(async () => {\n const pendingActions = actions.filter((a) => a.status === 'pending')\n const pendingCount = pendingActions.length\n const nameIssueCount = pendingActions.filter((a) => hasContactNameIssue(a)).length\n\n const confirmText = nameIssueCount > 0\n ? t('inbox_ops.action.accept_all_confirm_with_skip', 'Execute {count} pending actions? {skipCount} contact actions will be skipped due to missing names.')\n .replace('{count}', String(pendingCount))\n .replace('{skipCount}', String(nameIssueCount))\n : t('inbox_ops.action.accept_all_confirm', 'Execute {count} pending actions?').replace('{count}', String(pendingCount))\n\n const confirmed = await confirm({\n title: t('inbox_ops.action.accept_all', 'Accept All'),\n text: confirmText,\n })\n if (!confirmed) return\n\n setIsProcessing(true)\n const result = await runMutation({\n operation: () => apiCall<{ ok: boolean; succeeded: number; failed: number }>(\n `/api/inbox_ops/proposals/${proposalId}/accept-all`,\n { method: 'POST' },\n ),\n context: {},\n })\n if (result?.ok && result.result?.ok) {\n const msg = result.result.failed > 0\n ? t('inbox_ops.flash.accept_all_partial', '{succeeded} actions executed, {failed} failed')\n .replace('{succeeded}', String(result.result.succeeded))\n .replace('{failed}', String(result.result.failed))\n : t('inbox_ops.flash.accept_all_success', '{succeeded} actions executed')\n .replace('{succeeded}', String(result.result.succeeded))\n flash(msg, 'success')\n await loadData()\n } else {\n flash(t('inbox_ops.flash.accept_all_failed', 'Failed to accept all actions'), 'error')\n }\n setIsProcessing(false)\n }, [proposalId, actions, confirm, t, loadData, runMutation])\n\n const handleRejectAll = React.useCallback(async () => {\n const confirmed = await confirm({\n title: t('inbox_ops.action.reject_all', 'Reject Proposal'),\n text: t('inbox_ops.action.reject_all_confirm', 'Reject all pending actions in this proposal?'),\n })\n if (!confirmed) return\n\n setIsProcessing(true)\n const result = await runMutation({\n operation: () => apiCall<{ ok: boolean }>(\n `/api/inbox_ops/proposals/${proposalId}/reject`,\n { method: 'POST' },\n ),\n context: {},\n })\n if (result?.ok && result.result?.ok) {\n flash(t('inbox_ops.action.proposal_rejected', 'Proposal rejected'), 'success')\n await loadData()\n }\n setIsProcessing(false)\n }, [proposalId, confirm, t, loadData, runMutation])\n\n const handleRetryExtraction = React.useCallback(async () => {\n if (!email) return\n setIsProcessing(true)\n const result = await runMutation({\n operation: () => apiCall<{ ok: boolean }>(\n `/api/inbox_ops/emails/${email.id}/reprocess`,\n { method: 'POST' },\n ),\n context: {},\n })\n if (result?.ok && result.result?.ok) {\n flash(t('inbox_ops.flash.reprocessing_started', 'Reprocessing started'), 'success')\n await loadData()\n }\n setIsProcessing(false)\n }, [email, loadData, runMutation])\n\n const handleSendReply = React.useCallback(async (actionId: string) => {\n setSendingReplyId(actionId)\n const result = await runMutation({\n operation: () => apiCall<{ ok: boolean; error?: string }>(\n `/api/inbox_ops/proposals/${proposalId}/replies/${actionId}/send`,\n { method: 'POST' },\n ),\n context: {},\n })\n if (result?.ok && result.result?.ok) {\n flash(t('inbox_ops.reply.sent_success', 'Reply sent successfully'), 'success')\n await loadData()\n } else {\n flash(result?.result?.error || t('inbox_ops.flash.send_reply_failed', 'Failed to send reply'), 'error')\n }\n setSendingReplyId(null)\n }, [proposalId, t, loadData, runMutation])\n\n if (isLoading) return <LoadingMessage label={t('inbox_ops.loading_proposal', 'Loading proposal...')} />\n if (error) return <ErrorMessage label={error} />\n\n const pendingActions = actions.filter((a) => a.status === 'pending')\n const emailIsProcessing = email?.status === 'processing'\n const emailFailed = email?.status === 'failed'\n\n return (\n <Page>\n {ConfirmDialogElement}\n {editingAction && (\n <EditActionDialog\n action={editingAction}\n actionTypeLabels={actionTypeLabels}\n onClose={() => setEditingAction(null)}\n onSaved={loadData}\n />\n )}\n\n <div className=\"flex items-center justify-between px-4 py-3 md:px-6 md:py-4 border-b bg-background\">\n <div className=\"flex items-center gap-2 md:gap-3 min-w-0\">\n <Link href=\"/backend/inbox-ops\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\">\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n </Link>\n <div className=\"min-w-0 flex-1\">\n <h1 className=\"text-base md:text-lg font-semibold truncate\">{email?.subject || t('inbox_ops.proposal', 'Proposal')}</h1>\n <p className=\"text-xs text-muted-foreground truncate\">\n {email?.forwardedByName || email?.forwardedByAddress} \u00B7 {email?.receivedAt && new Date(email.receivedAt).toLocaleString()}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n {pendingActions.length > 0 && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-11 md:h-9 text-destructive border-destructive/30 hover:bg-destructive/10\"\n onClick={handleRejectAll}\n disabled={isProcessing}\n >\n <XCircle className=\"h-4 w-4 mr-1\" />\n <span className=\"hidden md:inline\">{t('inbox_ops.action.reject_all', 'Reject Proposal')}</span>\n </Button>\n )}\n {pendingActions.length > 1 && (\n <Button type=\"button\" size=\"sm\" className=\"h-11 md:h-9\" onClick={handleAcceptAll} disabled={isProcessing}>\n {isProcessing ? <Loader2 className=\"h-4 w-4 animate-spin mr-1\" /> : <CheckCheck className=\"h-4 w-4 mr-1\" />}\n <span className=\"hidden md:inline\">{t('inbox_ops.action.accept_all', 'Accept All')}</span>\n </Button>\n )}\n </div>\n </div>\n\n <PageBody>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4 md:gap-6\">\n {/* Left panel: Email Thread */}\n <div>\n <EmailThreadViewer email={email} />\n </div>\n\n {/* Right panel: Summary + Actions */}\n <div className=\"space-y-4\">\n {emailIsProcessing ? (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary mb-3\" />\n <p className=\"text-sm text-muted-foreground\">{t('inbox_ops.extraction_loading', 'AI is analyzing this thread...')}</p>\n </div>\n ) : emailFailed ? (\n <div className=\"border rounded-lg p-4 bg-red-50 dark:bg-red-950/20\">\n <div className=\"flex items-center gap-2 mb-2\">\n <AlertTriangle className=\"h-5 w-5 text-red-600\" />\n <span className=\"text-sm font-medium text-red-700\">{t('inbox_ops.extraction_failed', 'Extraction failed')}</span>\n </div>\n {email?.processingError && (\n <p className=\"text-xs text-red-600 mb-3\">{email.processingError}</p>\n )}\n <Button type=\"button\" size=\"sm\" variant=\"outline\" onClick={handleRetryExtraction} disabled={isProcessing}>\n <RefreshCw className=\"h-4 w-4 mr-1\" />\n {t('inbox_ops.action.retry', 'Retry')}\n </Button>\n </div>\n ) : proposal ? (\n <>\n {/* Summary */}\n <div className=\"border rounded-lg p-3 md:p-4\">\n <div className=\"flex items-center justify-between mb-2\">\n <h3 className=\"font-semibold text-sm\">{t('inbox_ops.summary', 'Summary')}</h3>\n {(proposal.workingLanguage || 'en') !== locale && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 text-xs\"\n onClick={showTranslation ? () => setShowTranslation(false) : handleTranslate}\n disabled={isTranslating}\n >\n {isTranslating ? (\n <Loader2 className=\"h-3 w-3 animate-spin mr-1\" />\n ) : (\n <Languages className=\"h-3 w-3 mr-1\" />\n )}\n {showTranslation\n ? t('inbox_ops.translate.show_original', 'Show original')\n : t('inbox_ops.translate.translate', 'Translate')}\n </Button>\n )}\n </div>\n <p className=\"text-sm text-foreground/80 mb-3\">\n {showTranslation && translation ? translation.summary : proposal.summary}\n </p>\n\n <div className=\"flex items-center gap-4 mb-3 flex-wrap\">\n <div>\n <span className=\"text-xs text-muted-foreground\">{t('inbox_ops.confidence', 'Confidence')}</span>\n <ConfidenceBadge value={proposal.confidence} />\n </div>\n <div>\n <span className=\"text-xs text-muted-foreground block\">{t('inbox_ops.category', 'Category')}</span>\n <CategoryEditDropdown\n currentCategory={proposal.category}\n onSelect={handleCategorize}\n disabled={isProcessing}\n />\n </div>\n </div>\n\n {proposal.possiblyIncomplete && (\n <div className=\"flex items-center gap-2 text-xs text-yellow-600 bg-yellow-50 dark:bg-yellow-950/20 rounded px-2 py-1 mb-3\">\n <AlertTriangle className=\"h-3 w-3\" />\n {t('inbox_ops.possibly_incomplete', 'This thread appears to be a partial forward')}\n </div>\n )}\n\n {/* Participants */}\n {proposal.participants.length > 0 && (\n <div>\n <h4 className=\"text-xs font-medium text-muted-foreground mb-1\">{t('inbox_ops.participants', 'Participants')}</h4>\n <div className=\"space-y-1\">\n {proposal.participants.map((p, idx) => (\n <div key={idx} className=\"flex items-center gap-2 text-sm\">\n <Users className=\"h-3 w-3 text-muted-foreground\" />\n <span>{p.name}</span>\n <span className=\"text-xs text-muted-foreground\">({p.role})</span>\n {p.matchedContactId && <CheckCircle className=\"h-3 w-3 text-green-500\" />}\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Discrepancies not tied to a specific action */}\n {(() => {\n const actionIds = new Set(actions.map((a) => a.id))\n const general = discrepancies.filter((d) => !d.resolved && (!d.actionId || !actionIds.has(d.actionId)))\n if (general.length === 0) return null\n return (\n <div className=\"border rounded-lg p-3 md:p-4 bg-yellow-50 dark:bg-yellow-950/20\">\n <div className=\"flex items-center gap-2 mb-2\">\n <AlertTriangle className=\"h-4 w-4 text-yellow-600\" />\n <h3 className=\"font-semibold text-sm text-yellow-800 dark:text-yellow-300\">{t('inbox_ops.discrepancies', 'Issues Detected')}</h3>\n </div>\n <div className=\"space-y-1.5\">\n {general.map((d) => (\n <div key={d.id} className={`flex items-start gap-2 text-xs rounded px-2 py-1.5 ${\n d.severity === 'error' ? 'bg-red-100 text-red-700 dark:bg-red-950/30' : 'bg-yellow-100 text-yellow-700 dark:bg-yellow-950/30'\n }`}>\n <AlertTriangle className=\"h-3 w-3 mt-0.5 flex-shrink-0\" />\n <div>\n <span>{resolveDiscrepancyDescription(d.description, d.foundValue)}</span>\n {(d.expectedValue || d.foundValue) && (\n <div className=\"mt-0.5 text-[11px] opacity-80\">\n {d.expectedValue && <span>{t('inbox_ops.discrepancy.expected', 'Expected')}: {d.expectedValue}</span>}\n {d.expectedValue && d.foundValue && <span> \u00B7 </span>}\n {d.foundValue && <span>{t('inbox_ops.discrepancy.found', 'Found')}: {d.foundValue}</span>}\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n )\n })()}\n\n {/* Actions */}\n <div>\n <h3 className=\"font-semibold text-sm mb-2\">{t('inbox_ops.actions', 'Proposed Actions')}</h3>\n {actions.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">{t('inbox_ops.no_actions', 'No actionable items detected in this thread')}</p>\n ) : (\n <div className=\"space-y-3\">\n {actions.map((action) => (\n <div key={action.id}>\n <ActionCard\n action={action}\n discrepancies={discrepancies}\n actionTypeLabels={actionTypeLabels}\n onAccept={handleAcceptAction}\n onReject={handleRejectAction}\n onRetry={handleAcceptAction}\n onEdit={handleEditAction}\n translatedDescription={showTranslation ? translation?.actions[action.id] : undefined}\n resolveDiscrepancyDescription={resolveDiscrepancyDescription}\n />\n {action.actionType === 'draft_reply' && (action.status === 'executed' || action.status === 'accepted') && (\n <div className=\"mt-2 pl-7\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"h-11 md:h-9\"\n disabled={sendingReplyId === action.id}\n onClick={() => handleSendReply(action.id)}\n >\n {sendingReplyId === action.id ? (\n <Loader2 className=\"h-4 w-4 animate-spin mr-1\" />\n ) : (\n <ExternalLink className=\"h-4 w-4 mr-1\" />\n )}\n {sendingReplyId === action.id\n ? t('inbox_ops.reply.sending', 'Sending...')\n : t('inbox_ops.reply.send', 'Send Reply')}\n </Button>\n </div>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n </>\n ) : null}\n </div>\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 { useRouter } from 'next/navigation'\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, useLocale } from '@open-mercato/shared/lib/i18n/context'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport {\n ArrowLeft,\n CheckCircle,\n XCircle,\n AlertTriangle,\n CheckCheck,\n Loader2,\n ExternalLink,\n RefreshCw,\n Users,\n Languages,\n Pencil,\n} from 'lucide-react'\nimport type { ProposalTranslationEntry } from '../../../../data/entities'\nimport type { ProposalDetail, ActionDetail, DiscrepancyDetail, EmailDetail } from '../../../../components/proposals/types'\nimport { ActionCard, ConfidenceBadge, useActionTypeLabels, useDiscrepancyDescriptions } from '../../../../components/proposals/ActionCard'\nimport { CategoryBadge, CATEGORY_CONFIG, ALL_CATEGORIES, useCategoryLabels } from '../../../../components/proposals/CategoryBadge'\nimport { hasContactNameIssue } from '../../../../lib/contactValidation'\nimport { EditActionDialog } from '../../../../components/proposals/EditActionDialog'\n\nfunction EmailThreadViewer({ email }: { email: EmailDetail | null }) {\n const t = useT()\n if (!email) return null\n\n const messages = email.threadMessages || []\n\n return (\n <div className=\"space-y-3\">\n <h3 className=\"font-semibold text-sm\">{t('inbox_ops.email_thread', 'Email Thread')}</h3>\n {messages.length > 0 ? (\n messages.map((msg, index) => (\n <div key={index} className=\"border rounded-lg p-3 md:p-4 bg-card\">\n <div className=\"flex items-center gap-2 mb-2\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-medium truncate\">\n {msg.from?.name || msg.from?.email || t('inbox_ops.sender_unknown', 'Unknown')}\n </div>\n <div className=\"text-xs text-muted-foreground truncate\">{msg.from?.email}</div>\n </div>\n <span className=\"text-xs text-muted-foreground whitespace-nowrap\">\n {msg.date ? new Date(msg.date).toLocaleString([], { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }) : ''}\n </span>\n </div>\n <div className=\"text-sm whitespace-pre-wrap text-foreground/80\">{msg.body}</div>\n </div>\n ))\n ) : email.cleanedText ? (\n <div className=\"border rounded-lg p-3 md:p-4 bg-card\">\n <div className=\"text-sm whitespace-pre-wrap text-foreground/80\">{email.cleanedText}</div>\n </div>\n ) : (\n <p className=\"text-sm text-muted-foreground\">{t('inbox_ops.no_email_content', 'No email content available')}</p>\n )}\n </div>\n )\n}\n\nfunction CategoryEditDropdown({\n currentCategory,\n onSelect,\n disabled,\n}: {\n currentCategory: string | null | undefined\n onSelect: (category: string) => void\n disabled: boolean\n}) {\n const t = useT()\n const labels = useCategoryLabels()\n const [isOpen, setIsOpen] = React.useState(false)\n const dropdownRef = React.useRef<HTMLDivElement>(null)\n\n React.useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n }\n }\n function handleEscape(event: KeyboardEvent) {\n if (event.key === 'Escape') setIsOpen(false)\n }\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n document.addEventListener('keydown', handleEscape)\n }\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n document.removeEventListener('keydown', handleEscape)\n }\n }, [isOpen])\n\n return (\n <div className=\"relative inline-block\" ref={dropdownRef}>\n <div className=\"flex items-center gap-1\">\n <CategoryBadge category={currentCategory} />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 w-6 p-0\"\n onClick={() => setIsOpen(!isOpen)}\n disabled={disabled}\n title={t('inbox_ops.recategorize', 'Change Category')}\n >\n <Pencil className=\"h-3 w-3\" />\n </Button>\n </div>\n {isOpen && (\n <div className=\"absolute top-full left-0 mt-1 z-dropdown w-48 rounded-md border bg-popover shadow-md\">\n <div className=\"p-1\">\n {ALL_CATEGORIES.map((cat) => {\n const config = CATEGORY_CONFIG[cat]\n const { Icon } = config\n return (\n <Button\n key={cat}\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className={`flex items-center gap-2 w-full justify-start rounded-sm px-2 py-1.5 text-sm hover:bg-accent hover:text-accent-foreground ${currentCategory === cat ? 'bg-accent' : ''}`}\n onClick={() => { onSelect(cat); setIsOpen(false) }}\n >\n <Icon className=\"h-3.5 w-3.5\" />\n {labels[cat] || cat}\n </Button>\n )\n })}\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport default function ProposalDetailPage({ params }: { params?: { id?: string } }) {\n const t = useT()\n const locale = useLocale()\n const router = useRouter()\n const proposalId = params?.id\n\n const [proposal, setProposal] = React.useState<ProposalDetail | null>(null)\n const [actions, setActions] = React.useState<ActionDetail[]>([])\n const [discrepancies, setDiscrepancies] = React.useState<DiscrepancyDetail[]>([])\n const [email, setEmail] = React.useState<EmailDetail | null>(null)\n const [isLoading, setIsLoading] = React.useState(true)\n const [error, setError] = React.useState<string | null>(null)\n const [isProcessing, setIsProcessing] = React.useState(false)\n\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const { runMutation } = useGuardedMutation<Record<string, unknown>>({\n contextId: 'inbox-ops-proposal-detail',\n })\n const actionTypeLabels = useActionTypeLabels()\n const resolveDiscrepancyDescription = useDiscrepancyDescriptions()\n const [editingAction, setEditingAction] = React.useState<ActionDetail | null>(null)\n const [sendingReplyId, setSendingReplyId] = React.useState<string | null>(null)\n\n const [translation, setTranslation] = React.useState<ProposalTranslationEntry | null>(null)\n const [isTranslating, setIsTranslating] = React.useState(false)\n const [showTranslation, setShowTranslation] = React.useState(false)\n\n const handleEditAction = React.useCallback((action: ActionDetail) => {\n if (action.actionType === 'create_order' || action.actionType === 'create_quote') {\n const kind = action.actionType === 'create_order' ? 'order' : 'quote'\n try {\n sessionStorage.setItem(\n 'inbox_ops.orderDraft',\n JSON.stringify({\n actionId: action.id,\n proposalId: action.proposalId,\n payload: action.payload,\n }),\n )\n } catch { /* sessionStorage unavailable */ }\n router.push(`/backend/sales/documents/create?kind=${kind}&fromInboxAction=${encodeURIComponent(action.id)}`)\n return\n }\n if (action.actionType === 'create_product') {\n try {\n sessionStorage.setItem(\n 'inbox_ops.productDraft',\n JSON.stringify({\n actionId: action.id,\n proposalId: action.proposalId,\n payload: action.payload,\n }),\n )\n } catch { /* sessionStorage unavailable */ }\n router.push(`/backend/catalog/products/create?fromInboxAction=${encodeURIComponent(action.id)}`)\n return\n }\n setEditingAction(action)\n }, [router])\n\n const handleTranslate = React.useCallback(async () => {\n if (!proposalId) return\n setIsTranslating(true)\n const result = await runMutation({\n operation: () => apiCall<{ translation: ProposalTranslationEntry; cached: boolean }>(\n `/api/inbox_ops/proposals/${proposalId}/translate`,\n { method: 'POST', body: JSON.stringify({ targetLocale: locale }) },\n ),\n context: {},\n })\n if (result?.ok && result.result?.translation) {\n setTranslation(result.result.translation)\n setShowTranslation(true)\n } else {\n const detail = (result?.result as Record<string, unknown> | null)?.error\n flash(detail ? `${t('inbox_ops.translate.failed', 'Translation failed')}: ${detail}` : t('inbox_ops.translate.failed', 'Translation failed'), 'error')\n }\n setIsTranslating(false)\n }, [proposalId, locale, t, runMutation])\n\n const handleCategorize = React.useCallback(async (category: string) => {\n if (!proposalId) return\n const result = await runMutation({\n operation: () => apiCall<{ ok: boolean; category: string; previousCategory: string | null }>(\n `/api/inbox_ops/proposals/${proposalId}/categorize`,\n { method: 'POST', body: JSON.stringify({ category }) },\n ),\n context: {},\n })\n if (result?.ok && result.result?.ok) {\n setProposal((prev) => prev ? { ...prev, category: result.result!.category } : prev)\n } else {\n flash(t('inbox_ops.flash.save_failed', 'Failed to save'), 'error')\n }\n }, [proposalId, t, runMutation])\n\n const loadData = React.useCallback(async () => {\n if (!proposalId) return\n setIsLoading(true)\n setError(null)\n try {\n const result = await apiCall<{\n proposal: ProposalDetail\n actions: ActionDetail[]\n discrepancies: DiscrepancyDetail[]\n email: EmailDetail\n }>(`/api/inbox_ops/proposals/${proposalId}`)\n if (result?.ok && result.result) {\n setProposal(result.result.proposal)\n setActions(result.result.actions || [])\n setDiscrepancies(result.result.discrepancies || [])\n setEmail(result.result.email)\n } else {\n setError(t('inbox_ops.flash.load_failed', 'Failed to load proposal'))\n }\n } catch {\n setError(t('inbox_ops.flash.load_failed', 'Failed to load proposal'))\n }\n setIsLoading(false)\n }, [proposalId, t])\n\n React.useEffect(() => { loadData() }, [loadData])\n\n const handleAcceptAction = React.useCallback(async (actionId: string) => {\n setIsProcessing(true)\n const result = await runMutation({\n operation: () => apiCall<{ ok: boolean; error?: string }>(\n `/api/inbox_ops/proposals/${proposalId}/actions/${actionId}/accept`,\n { method: 'POST' },\n ),\n context: {},\n })\n if (result?.ok && result.result?.ok) {\n flash(t('inbox_ops.flash.action_executed', 'Action executed'), 'success')\n await loadData()\n } else {\n flash(result?.result?.error || t('inbox_ops.flash.action_execute_failed', 'Failed to execute action'), 'error')\n }\n setIsProcessing(false)\n }, [proposalId, loadData, t, runMutation])\n\n const handleRejectAction = React.useCallback(async (actionId: string) => {\n setIsProcessing(true)\n const result = await runMutation({\n operation: () => apiCall<{ ok: boolean }>(\n `/api/inbox_ops/proposals/${proposalId}/actions/${actionId}/reject`,\n { method: 'POST' },\n ),\n context: {},\n })\n if (result?.ok && result.result?.ok) {\n flash(t('inbox_ops.flash.action_rejected', 'Action rejected'), 'success')\n await loadData()\n } else {\n flash(t('inbox_ops.flash.action_reject_failed', 'Failed to reject action'), 'error')\n }\n setIsProcessing(false)\n }, [proposalId, loadData, runMutation])\n\n const handleAcceptAll = React.useCallback(async () => {\n const pendingActions = actions.filter((a) => a.status === 'pending')\n const pendingCount = pendingActions.length\n const nameIssueCount = pendingActions.filter((a) => hasContactNameIssue(a)).length\n\n const confirmText = nameIssueCount > 0\n ? t('inbox_ops.action.accept_all_confirm_with_skip', 'Execute {count} pending actions? {skipCount} contact actions will be skipped due to missing names.')\n .replace('{count}', String(pendingCount))\n .replace('{skipCount}', String(nameIssueCount))\n : t('inbox_ops.action.accept_all_confirm', 'Execute {count} pending actions?').replace('{count}', String(pendingCount))\n\n const confirmed = await confirm({\n title: t('inbox_ops.action.accept_all', 'Accept All'),\n text: confirmText,\n })\n if (!confirmed) return\n\n setIsProcessing(true)\n const result = await runMutation({\n operation: () => apiCall<{ ok: boolean; succeeded: number; failed: number }>(\n `/api/inbox_ops/proposals/${proposalId}/accept-all`,\n { method: 'POST' },\n ),\n context: {},\n })\n if (result?.ok && result.result?.ok) {\n const msg = result.result.failed > 0\n ? t('inbox_ops.flash.accept_all_partial', '{succeeded} actions executed, {failed} failed')\n .replace('{succeeded}', String(result.result.succeeded))\n .replace('{failed}', String(result.result.failed))\n : t('inbox_ops.flash.accept_all_success', '{succeeded} actions executed')\n .replace('{succeeded}', String(result.result.succeeded))\n flash(msg, 'success')\n await loadData()\n } else {\n flash(t('inbox_ops.flash.accept_all_failed', 'Failed to accept all actions'), 'error')\n }\n setIsProcessing(false)\n }, [proposalId, actions, confirm, t, loadData, runMutation])\n\n const handleRejectAll = React.useCallback(async () => {\n const confirmed = await confirm({\n title: t('inbox_ops.action.reject_all', 'Reject Proposal'),\n text: t('inbox_ops.action.reject_all_confirm', 'Reject all pending actions in this proposal?'),\n })\n if (!confirmed) return\n\n setIsProcessing(true)\n const result = await runMutation({\n operation: () => apiCall<{ ok: boolean }>(\n `/api/inbox_ops/proposals/${proposalId}/reject`,\n { method: 'POST' },\n ),\n context: {},\n })\n if (result?.ok && result.result?.ok) {\n flash(t('inbox_ops.action.proposal_rejected', 'Proposal rejected'), 'success')\n await loadData()\n }\n setIsProcessing(false)\n }, [proposalId, confirm, t, loadData, runMutation])\n\n const handleRetryExtraction = React.useCallback(async () => {\n if (!email) return\n setIsProcessing(true)\n const result = await runMutation({\n operation: () => apiCall<{ ok: boolean }>(\n `/api/inbox_ops/emails/${email.id}/reprocess`,\n { method: 'POST' },\n ),\n context: {},\n })\n if (result?.ok && result.result?.ok) {\n flash(t('inbox_ops.flash.reprocessing_started', 'Reprocessing started'), 'success')\n await loadData()\n }\n setIsProcessing(false)\n }, [email, loadData, runMutation])\n\n const handleSendReply = React.useCallback(async (actionId: string) => {\n setSendingReplyId(actionId)\n const result = await runMutation({\n operation: () => apiCall<{ ok: boolean; error?: string }>(\n `/api/inbox_ops/proposals/${proposalId}/replies/${actionId}/send`,\n { method: 'POST' },\n ),\n context: {},\n })\n if (result?.ok && result.result?.ok) {\n flash(t('inbox_ops.reply.sent_success', 'Reply sent successfully'), 'success')\n await loadData()\n } else {\n flash(result?.result?.error || t('inbox_ops.flash.send_reply_failed', 'Failed to send reply'), 'error')\n }\n setSendingReplyId(null)\n }, [proposalId, t, loadData, runMutation])\n\n if (isLoading) return <LoadingMessage label={t('inbox_ops.loading_proposal', 'Loading proposal...')} />\n if (error) return <ErrorMessage label={error} />\n\n const pendingActions = actions.filter((a) => a.status === 'pending')\n const emailIsProcessing = email?.status === 'processing'\n const emailFailed = email?.status === 'failed'\n\n return (\n <Page>\n {ConfirmDialogElement}\n {editingAction && (\n <EditActionDialog\n action={editingAction}\n actionTypeLabels={actionTypeLabels}\n onClose={() => setEditingAction(null)}\n onSaved={loadData}\n />\n )}\n\n <div className=\"flex items-center justify-between px-4 py-3 md:px-6 md:py-4 border-b bg-background\">\n <div className=\"flex items-center gap-2 md:gap-3 min-w-0\">\n <Link href=\"/backend/inbox-ops\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\">\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n </Link>\n <div className=\"min-w-0 flex-1\">\n <h1 className=\"text-base md:text-lg font-semibold truncate\">{email?.subject || t('inbox_ops.proposal', 'Proposal')}</h1>\n <p className=\"text-xs text-muted-foreground truncate\">\n {email?.forwardedByName || email?.forwardedByAddress} \u00B7 {email?.receivedAt && new Date(email.receivedAt).toLocaleString()}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n {pendingActions.length > 0 && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-11 md:h-9 text-destructive border-destructive/30 hover:bg-destructive/10\"\n onClick={handleRejectAll}\n disabled={isProcessing}\n >\n <XCircle className=\"h-4 w-4 mr-1\" />\n <span className=\"hidden md:inline\">{t('inbox_ops.action.reject_all', 'Reject Proposal')}</span>\n </Button>\n )}\n {pendingActions.length > 1 && (\n <Button type=\"button\" size=\"sm\" className=\"h-11 md:h-9\" onClick={handleAcceptAll} disabled={isProcessing}>\n {isProcessing ? <Loader2 className=\"h-4 w-4 animate-spin mr-1\" /> : <CheckCheck className=\"h-4 w-4 mr-1\" />}\n <span className=\"hidden md:inline\">{t('inbox_ops.action.accept_all', 'Accept All')}</span>\n </Button>\n )}\n </div>\n </div>\n\n <PageBody>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4 md:gap-6\">\n {/* Left panel: Email Thread */}\n <div>\n <EmailThreadViewer email={email} />\n </div>\n\n {/* Right panel: Summary + Actions */}\n <div className=\"space-y-4\">\n {emailIsProcessing ? (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary mb-3\" />\n <p className=\"text-sm text-muted-foreground\">{t('inbox_ops.extraction_loading', 'AI is analyzing this thread...')}</p>\n </div>\n ) : emailFailed ? (\n <div className=\"border rounded-lg p-4 bg-status-error-bg border-status-error-border\">\n <div className=\"flex items-center gap-2 mb-2\">\n <AlertTriangle className=\"h-5 w-5 text-status-error-icon\" />\n <span className=\"text-sm font-medium text-status-error-text\">{t('inbox_ops.extraction_failed', 'Extraction failed')}</span>\n </div>\n {email?.processingError && (\n <p className=\"text-xs text-status-error-text mb-3\">{email.processingError}</p>\n )}\n <Button type=\"button\" size=\"sm\" variant=\"outline\" onClick={handleRetryExtraction} disabled={isProcessing}>\n <RefreshCw className=\"h-4 w-4 mr-1\" />\n {t('inbox_ops.action.retry', 'Retry')}\n </Button>\n </div>\n ) : proposal ? (\n <>\n {/* Summary */}\n <div className=\"border rounded-lg p-3 md:p-4\">\n <div className=\"flex items-center justify-between mb-2\">\n <h3 className=\"font-semibold text-sm\">{t('inbox_ops.summary', 'Summary')}</h3>\n {(proposal.workingLanguage || 'en') !== locale && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 text-xs\"\n onClick={showTranslation ? () => setShowTranslation(false) : handleTranslate}\n disabled={isTranslating}\n >\n {isTranslating ? (\n <Loader2 className=\"h-3 w-3 animate-spin mr-1\" />\n ) : (\n <Languages className=\"h-3 w-3 mr-1\" />\n )}\n {showTranslation\n ? t('inbox_ops.translate.show_original', 'Show original')\n : t('inbox_ops.translate.translate', 'Translate')}\n </Button>\n )}\n </div>\n <p className=\"text-sm text-foreground/80 mb-3\">\n {showTranslation && translation ? translation.summary : proposal.summary}\n </p>\n\n <div className=\"flex items-center gap-4 mb-3 flex-wrap\">\n <div>\n <span className=\"text-xs text-muted-foreground\">{t('inbox_ops.confidence', 'Confidence')}</span>\n <ConfidenceBadge value={proposal.confidence} />\n </div>\n <div>\n <span className=\"text-xs text-muted-foreground block\">{t('inbox_ops.category', 'Category')}</span>\n <CategoryEditDropdown\n currentCategory={proposal.category}\n onSelect={handleCategorize}\n disabled={isProcessing}\n />\n </div>\n </div>\n\n {proposal.possiblyIncomplete && (\n <div className=\"flex items-center gap-2 text-xs text-status-warning-text bg-status-warning-bg rounded px-2 py-1 mb-3\">\n <AlertTriangle className=\"h-3 w-3\" />\n {t('inbox_ops.possibly_incomplete', 'This thread appears to be a partial forward')}\n </div>\n )}\n\n {/* Participants */}\n {proposal.participants.length > 0 && (\n <div>\n <h4 className=\"text-xs font-medium text-muted-foreground mb-1\">{t('inbox_ops.participants', 'Participants')}</h4>\n <div className=\"space-y-1\">\n {proposal.participants.map((p, idx) => (\n <div key={idx} className=\"flex items-center gap-2 text-sm\">\n <Users className=\"h-3 w-3 text-muted-foreground\" />\n <span>{p.name}</span>\n <span className=\"text-xs text-muted-foreground\">({p.role})</span>\n {p.matchedContactId && <CheckCircle className=\"h-3 w-3 text-status-success-icon\" />}\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Discrepancies not tied to a specific action */}\n {(() => {\n const actionIds = new Set(actions.map((a) => a.id))\n const general = discrepancies.filter((d) => !d.resolved && (!d.actionId || !actionIds.has(d.actionId)))\n if (general.length === 0) return null\n return (\n <div className=\"border rounded-lg p-3 md:p-4 bg-status-warning-bg border-status-warning-border\">\n <div className=\"flex items-center gap-2 mb-2\">\n <AlertTriangle className=\"h-4 w-4 text-status-warning-icon\" />\n <h3 className=\"font-semibold text-sm text-status-warning-text\">{t('inbox_ops.discrepancies', 'Issues Detected')}</h3>\n </div>\n <div className=\"space-y-1.5\">\n {general.map((d) => (\n <div key={d.id} className={`flex items-start gap-2 text-xs rounded px-2 py-1.5 ${\n d.severity === 'error' ? 'bg-status-error-bg text-status-error-text' : 'bg-status-warning-bg text-status-warning-text'\n }`}>\n <AlertTriangle className=\"h-3 w-3 mt-0.5 flex-shrink-0\" />\n <div>\n <span>{resolveDiscrepancyDescription(d.description, d.foundValue)}</span>\n {(d.expectedValue || d.foundValue) && (\n <div className=\"mt-0.5 text-overline opacity-80\">\n {d.expectedValue && <span>{t('inbox_ops.discrepancy.expected', 'Expected')}: {d.expectedValue}</span>}\n {d.expectedValue && d.foundValue && <span> \u00B7 </span>}\n {d.foundValue && <span>{t('inbox_ops.discrepancy.found', 'Found')}: {d.foundValue}</span>}\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n )\n })()}\n\n {/* Actions */}\n <div>\n <h3 className=\"font-semibold text-sm mb-2\">{t('inbox_ops.actions', 'Proposed Actions')}</h3>\n {actions.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">{t('inbox_ops.no_actions', 'No actionable items detected in this thread')}</p>\n ) : (\n <div className=\"space-y-3\">\n {actions.map((action) => (\n <div key={action.id}>\n <ActionCard\n action={action}\n discrepancies={discrepancies}\n actionTypeLabels={actionTypeLabels}\n onAccept={handleAcceptAction}\n onReject={handleRejectAction}\n onRetry={handleAcceptAction}\n onEdit={handleEditAction}\n translatedDescription={showTranslation ? translation?.actions[action.id] : undefined}\n resolveDiscrepancyDescription={resolveDiscrepancyDescription}\n />\n {action.actionType === 'draft_reply' && (action.status === 'executed' || action.status === 'accepted') && (\n <div className=\"mt-2 pl-7\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"h-11 md:h-9\"\n disabled={sendingReplyId === action.id}\n onClick={() => handleSendReply(action.id)}\n >\n {sendingReplyId === action.id ? (\n <Loader2 className=\"h-4 w-4 animate-spin mr-1\" />\n ) : (\n <ExternalLink className=\"h-4 w-4 mr-1\" />\n )}\n {sendingReplyId === action.id\n ? t('inbox_ops.reply.sending', 'Sending...')\n : t('inbox_ops.reply.send', 'Send Reply')}\n </Button>\n </div>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n </>\n ) : null}\n </div>\n </div>\n </PageBody>\n </Page>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["pendingActions"]
7
7
  }
@@ -9,7 +9,7 @@ function InboxEmailPreview({
9
9
  actionLabel
10
10
  }) {
11
11
  const t = useT();
12
- return /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3 rounded-md border bg-muted/20 p-3", children: [
12
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3 rounded-md border bg-muted/30 p-3", children: [
13
13
  /* @__PURE__ */ jsx(Mail, { className: "mt-0.5 h-4 w-4 text-muted-foreground" }),
14
14
  /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1 space-y-1", children: [
15
15
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/inbox_ops/components/messages/InboxEmailPreview.tsx"],
4
- "sourcesContent": ["'use client'\n\nimport { Mail } from 'lucide-react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { ObjectPreviewProps } from '@open-mercato/shared/modules/messages/types'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\n\nexport function InboxEmailPreview({\n previewData,\n actionRequired,\n actionLabel,\n}: ObjectPreviewProps) {\n const t = useT()\n\n return (\n <div className=\"flex items-start gap-3 rounded-md border bg-muted/20 p-3\">\n <Mail className=\"mt-0.5 h-4 w-4 text-muted-foreground\" />\n <div className=\"min-w-0 flex-1 space-y-1\">\n <div className=\"flex items-center gap-2\">\n <p className=\"truncate text-sm font-medium\">\n {previewData?.title || t('inbox_ops.title', 'AI Inbox Actions')}\n </p>\n {actionRequired ? (\n <Badge variant=\"secondary\" className=\"text-xs\">\n {actionLabel || t('messages.composer.objectActionRequired', 'Action required')}\n </Badge>\n ) : null}\n </div>\n {previewData?.subtitle ? (\n <p className=\"truncate text-xs text-muted-foreground\">{previewData.subtitle}</p>\n ) : null}\n {previewData?.status ? (\n <Badge variant=\"outline\" className=\"text-xs\">{previewData.status}</Badge>\n ) : null}\n </div>\n </div>\n )\n}\n\nexport default InboxEmailPreview\n"],
4
+ "sourcesContent": ["'use client'\n\nimport { Mail } from 'lucide-react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { ObjectPreviewProps } from '@open-mercato/shared/modules/messages/types'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\n\nexport function InboxEmailPreview({\n previewData,\n actionRequired,\n actionLabel,\n}: ObjectPreviewProps) {\n const t = useT()\n\n return (\n <div className=\"flex items-start gap-3 rounded-md border bg-muted/30 p-3\">\n <Mail className=\"mt-0.5 h-4 w-4 text-muted-foreground\" />\n <div className=\"min-w-0 flex-1 space-y-1\">\n <div className=\"flex items-center gap-2\">\n <p className=\"truncate text-sm font-medium\">\n {previewData?.title || t('inbox_ops.title', 'AI Inbox Actions')}\n </p>\n {actionRequired ? (\n <Badge variant=\"secondary\" className=\"text-xs\">\n {actionLabel || t('messages.composer.objectActionRequired', 'Action required')}\n </Badge>\n ) : null}\n </div>\n {previewData?.subtitle ? (\n <p className=\"truncate text-xs text-muted-foreground\">{previewData.subtitle}</p>\n ) : null}\n {previewData?.status ? (\n <Badge variant=\"outline\" className=\"text-xs\">{previewData.status}</Badge>\n ) : null}\n </div>\n </div>\n )\n}\n\nexport default InboxEmailPreview\n"],
5
5
  "mappings": ";AAgBM,cAEE,YAFF;AAdN,SAAS,YAAY;AACrB,SAAS,YAAY;AAErB,SAAS,aAAa;AAEf,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AACF,GAAuB;AACrB,QAAM,IAAI,KAAK;AAEf,SACE,qBAAC,SAAI,WAAU,4DACb;AAAA,wBAAC,QAAK,WAAU,wCAAuC;AAAA,IACvD,qBAAC,SAAI,WAAU,4BACb;AAAA,2BAAC,SAAI,WAAU,2BACb;AAAA,4BAAC,OAAE,WAAU,gCACV,uBAAa,SAAS,EAAE,mBAAmB,kBAAkB,GAChE;AAAA,QACC,iBACC,oBAAC,SAAM,SAAQ,aAAY,WAAU,WAClC,yBAAe,EAAE,0CAA0C,iBAAiB,GAC/E,IACE;AAAA,SACN;AAAA,MACC,aAAa,WACZ,oBAAC,OAAE,WAAU,0CAA0C,sBAAY,UAAS,IAC1E;AAAA,MACH,aAAa,SACZ,oBAAC,SAAM,SAAQ,WAAU,WAAU,WAAW,sBAAY,QAAO,IAC/D;AAAA,OACN;AAAA,KACF;AAEJ;AAEA,IAAO,4BAAQ;",
6
6
  "names": []
7
7
  }
@@ -83,8 +83,8 @@ function useActionTypeLabels() {
83
83
  function ConfidenceBadge({ value }) {
84
84
  const num = parseFloat(value);
85
85
  const pct = Math.round(num * 100);
86
- const color = num >= 0.8 ? "text-green-600" : num >= 0.6 ? "text-yellow-600" : "text-red-600";
87
- const bgColor = num >= 0.8 ? "bg-green-200" : num >= 0.6 ? "bg-yellow-200" : "bg-red-200";
86
+ const color = num >= 0.8 ? "text-status-success-text" : num >= 0.6 ? "text-status-warning-text" : "text-status-error-text";
87
+ const bgColor = num >= 0.8 ? "bg-status-success-icon" : num >= 0.6 ? "bg-status-warning-icon" : "bg-status-error-icon";
88
88
  const width = Math.round(num * 100);
89
89
  return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
90
90
  /* @__PURE__ */ jsxs("span", { className: `text-sm font-medium ${color}`, children: [
@@ -206,13 +206,13 @@ function ActionCard({
206
206
  const hasBlockingDiscrepancies = actionDiscrepancies.some((d) => d.severity === "error");
207
207
  const displayDescription = translatedDescription || resolveActionDescription(action.description, action.payload);
208
208
  if (action.status === "executed") {
209
- return /* @__PURE__ */ jsxs("div", { className: "border rounded-lg p-3 md:p-4 bg-green-50 dark:bg-green-950/20", children: [
209
+ return /* @__PURE__ */ jsxs("div", { className: "border rounded-lg p-3 md:p-4 bg-status-success-bg border-status-success-border", children: [
210
210
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mb-2", children: [
211
- /* @__PURE__ */ jsx(CheckCircle, { className: "h-5 w-5 text-green-600 flex-shrink-0" }),
211
+ /* @__PURE__ */ jsx(CheckCircle, { className: "h-5 w-5 text-status-success-icon flex-shrink-0" }),
212
212
  /* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: label })
213
213
  ] }),
214
214
  /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: displayDescription }),
215
- action.createdEntityId && /* @__PURE__ */ jsx("div", { className: "mt-2", children: /* @__PURE__ */ jsxs("span", { className: "text-xs text-green-600", children: [
215
+ action.createdEntityId && /* @__PURE__ */ jsx("div", { className: "mt-2", children: /* @__PURE__ */ jsxs("span", { className: "text-xs text-status-success-text", children: [
216
216
  t("inbox_ops.action.created_entity", "Created {type}").replace("{type}", action.createdEntityType || ""),
217
217
  " \xB7 ",
218
218
  action.executedAt && new Date(action.executedAt).toLocaleString()
@@ -230,14 +230,14 @@ function ActionCard({
230
230
  ] });
231
231
  }
232
232
  if (action.status === "failed") {
233
- return /* @__PURE__ */ jsxs("div", { className: "border rounded-lg p-3 md:p-4 bg-red-50 dark:bg-red-950/20", children: [
233
+ return /* @__PURE__ */ jsxs("div", { className: "border rounded-lg p-3 md:p-4 bg-status-error-bg border-status-error-border", children: [
234
234
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mb-2", children: [
235
- /* @__PURE__ */ jsx(AlertTriangle, { className: "h-5 w-5 text-red-600 flex-shrink-0" }),
235
+ /* @__PURE__ */ jsx(AlertTriangle, { className: "h-5 w-5 text-status-error-icon flex-shrink-0" }),
236
236
  /* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: label }),
237
- /* @__PURE__ */ jsx("span", { className: "text-xs text-red-600", children: t("inbox_ops.extraction_failed", "Failed") })
237
+ /* @__PURE__ */ jsx("span", { className: "text-xs text-status-error-text", children: t("inbox_ops.extraction_failed", "Failed") })
238
238
  ] }),
239
239
  /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: displayDescription }),
240
- action.executionError && /* @__PURE__ */ jsx("p", { className: "text-xs text-red-600 mt-1", children: action.executionError }),
240
+ action.executionError && /* @__PURE__ */ jsx("p", { className: "text-xs text-status-error-text mt-1", children: action.executionError }),
241
241
  /* @__PURE__ */ jsxs("div", { className: "mt-3 flex items-center gap-2", children: [
242
242
  /* @__PURE__ */ jsxs(
243
243
  Button,
@@ -293,11 +293,11 @@ function ActionCard({
293
293
  /* @__PURE__ */ jsx("p", { className: "text-sm text-foreground/80 mb-2", children: displayDescription }),
294
294
  (action.actionType === "create_order" || action.actionType === "create_quote") && /* @__PURE__ */ jsx(OrderPreview, { payload: action.payload }),
295
295
  action.actionType === "create_product" && /* @__PURE__ */ jsx(ProductPreview, { payload: action.payload }),
296
- actionDiscrepancies.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-3 space-y-1", children: actionDiscrepancies.map((d) => /* @__PURE__ */ jsxs("div", { className: `flex items-start gap-2 text-xs rounded px-2 py-1.5 ${d.severity === "error" ? "bg-red-50 text-red-700 dark:bg-red-950/20" : "bg-yellow-50 text-yellow-700 dark:bg-yellow-950/20"}`, children: [
296
+ actionDiscrepancies.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-3 space-y-1", children: actionDiscrepancies.map((d) => /* @__PURE__ */ jsxs("div", { className: `flex items-start gap-2 text-xs rounded px-2 py-1.5 ${d.severity === "error" ? "bg-status-error-bg text-status-error-text" : "bg-status-warning-bg text-status-warning-text"}`, children: [
297
297
  /* @__PURE__ */ jsx(AlertTriangle, { className: "h-3 w-3 mt-0.5 flex-shrink-0" }),
298
298
  /* @__PURE__ */ jsxs("div", { children: [
299
299
  /* @__PURE__ */ jsx("span", { children: resolveDiscrepancyDescription ? resolveDiscrepancyDescription(d.description, d.foundValue) : d.description }),
300
- (d.expectedValue || d.foundValue) && /* @__PURE__ */ jsxs("div", { className: "mt-0.5 text-[11px] opacity-80", children: [
300
+ (d.expectedValue || d.foundValue) && /* @__PURE__ */ jsxs("div", { className: "mt-0.5 text-overline opacity-80", children: [
301
301
  d.expectedValue && /* @__PURE__ */ jsxs("span", { children: [
302
302
  t("inbox_ops.discrepancy.expected", "Expected"),
303
303
  ": ",
@@ -312,7 +312,7 @@ function ActionCard({
312
312
  ] })
313
313
  ] })
314
314
  ] }, d.id)) }),
315
- hasNameIssue && /* @__PURE__ */ jsxs("div", { className: "mb-3 flex items-start gap-2 text-xs rounded px-2 py-1.5 bg-amber-50 text-amber-700 dark:bg-amber-950/20 dark:text-amber-300", children: [
315
+ hasNameIssue && /* @__PURE__ */ jsxs("div", { className: "mb-3 flex items-start gap-2 text-xs rounded px-2 py-1.5 bg-status-warning-bg text-status-warning-text", children: [
316
316
  /* @__PURE__ */ jsx(AlertTriangle, { className: "h-3 w-3 mt-0.5 flex-shrink-0" }),
317
317
  /* @__PURE__ */ jsx("span", { children: action.actionType === "link_contact" ? t("inbox_ops.contact.link_name_missing_warning", "Contact name is missing. Please edit and provide a name before accepting.") : t("inbox_ops.contact.name_missing_warning", "First and last name could not be extracted. Please edit before accepting.") })
318
318
  ] }),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/inbox_ops/components/proposals/ActionCard.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport {\n CheckCircle,\n XCircle,\n Pencil,\n AlertTriangle,\n RefreshCw,\n Package,\n FileText,\n MessageSquare,\n Truck,\n UserPlus,\n Link2,\n Activity,\n ShoppingBag,\n} from 'lucide-react'\nimport type { ActionDetail, DiscrepancyDetail } from './types'\nimport { hasContactNameIssue } from '../../lib/contactValidation'\n\nexport { hasContactNameIssue }\n\n/**\n * Resolves discrepancy description i18n keys stored in the database.\n * Falls back to the raw description string for legacy data or LLM-generated descriptions.\n */\nexport function useDiscrepancyDescriptions(): (description: string, foundValue?: string | null) => string {\n const t = useT()\n const translations: Record<string, string> = {\n 'inbox_ops.discrepancy.desc.no_channel': t('inbox_ops.discrepancy.desc.no_channel', 'No sales channel available. Create a channel in Sales settings before accepting this order.'),\n 'inbox_ops.discrepancy.desc.no_currency': t('inbox_ops.discrepancy.desc.no_currency', 'No currency could be resolved for this order. Set a currency code or configure a sales channel with a default currency.'),\n 'inbox_ops.discrepancy.desc.product_not_matched': t('inbox_ops.discrepancy.desc.product_not_matched', 'Product could not be matched to any catalog product'),\n 'inbox_ops.discrepancy.desc.no_matching_contact': t('inbox_ops.discrepancy.desc.no_matching_contact', 'No matching contact found'),\n 'inbox_ops.discrepancy.desc.draft_reply_no_contact': t('inbox_ops.discrepancy.desc.draft_reply_no_contact', 'Draft reply target has no matching contact. Create the contact first.'),\n 'inbox_ops.discrepancy.desc.duplicate_order_reference': t('inbox_ops.discrepancy.desc.duplicate_order_reference', 'An order with this customer reference already exists'),\n }\n return (description: string, foundValue?: string | null) => {\n const translated = translations[description]\n if (!translated) return description\n if (foundValue && (description === 'inbox_ops.discrepancy.desc.product_not_matched' || description === 'inbox_ops.discrepancy.desc.no_matching_contact')) {\n return `${translated}: ${foundValue}`\n }\n return translated\n }\n}\n\n/**\n * Resolves action description i18n keys stored in the database.\n * Auto-generated actions store keys like `inbox_ops.action.desc.create_contact`;\n * LLM-generated actions store plain text which is returned as-is.\n */\nexport function useActionDescriptionResolver(): (description: string, payload: Record<string, unknown>) => string {\n const t = useT()\n return (description: string, payload: Record<string, unknown>) => {\n if (!description.startsWith('inbox_ops.action.desc.')) return description\n const name = (payload.name as string) || (payload.contactName as string) || ''\n const email = (payload.email as string) || (payload.emailAddress as string) || ''\n const title = (payload.title as string) || ''\n const toName = (payload.toName as string) || (payload.to as string) || ''\n const subject = (payload.subject as string) || ''\n const translations: Record<string, string> = {\n 'inbox_ops.action.desc.create_contact': t('inbox_ops.action.desc.create_contact', 'Create contact for {name} ({email})')\n .replace('{name}', name).replace('{email}', email),\n 'inbox_ops.action.desc.link_contact': t('inbox_ops.action.desc.link_contact', 'Link {name} ({email}) to existing contact')\n .replace('{name}', name).replace('{email}', email),\n 'inbox_ops.action.desc.create_product': t('inbox_ops.action.desc.create_product', 'Create catalog product \"{title}\"')\n .replace('{title}', title),\n 'inbox_ops.action.desc.draft_reply': t('inbox_ops.action.desc.draft_reply', 'Draft reply to {toName}: {subject}')\n .replace('{toName}', toName).replace('{subject}', subject),\n }\n return translations[description] || description\n }\n}\n\nconst ACTION_TYPE_ICONS: Record<string, React.ElementType> = {\n create_order: Package,\n create_quote: FileText,\n update_order: Package,\n update_shipment: Truck,\n create_contact: UserPlus,\n create_product: ShoppingBag,\n link_contact: Link2,\n log_activity: Activity,\n draft_reply: MessageSquare,\n}\n\nexport function useActionTypeLabels(): Record<string, string> {\n const t = useT()\n return {\n create_order: t('inbox_ops.action_type.create_order', 'Create Sales Order'),\n create_quote: t('inbox_ops.action_type.create_quote', 'Create Quote'),\n update_order: t('inbox_ops.action_type.update_order', 'Update Order'),\n update_shipment: t('inbox_ops.action_type.update_shipment', 'Update Shipment'),\n create_contact: t('inbox_ops.action_type.create_contact', 'Create Contact'),\n create_product: t('inbox_ops.action_type.create_product', 'Create Product'),\n link_contact: t('inbox_ops.action_type.link_contact', 'Link Contact'),\n log_activity: t('inbox_ops.action_type.log_activity', 'Log Activity'),\n draft_reply: t('inbox_ops.action_type.draft_reply', 'Draft Reply'),\n }\n}\n\nexport function ConfidenceBadge({ value }: { value: string }) {\n const num = parseFloat(value)\n const pct = Math.round(num * 100)\n const color = num >= 0.8 ? 'text-green-600' : num >= 0.6 ? 'text-yellow-600' : 'text-red-600'\n const bgColor = num >= 0.8 ? 'bg-green-200' : num >= 0.6 ? 'bg-yellow-200' : 'bg-red-200'\n const width = Math.round(num * 100)\n return (\n <div className=\"flex items-center gap-2\">\n <span className={`text-sm font-medium ${color}`}>{pct}%</span>\n <div className=\"w-24 h-2 bg-muted rounded-full overflow-hidden\">\n <div className={`h-full ${bgColor} rounded-full`} style={{ width: `${width}%` }} />\n </div>\n </div>\n )\n}\n\nfunction OrderPreview({ payload }: { payload: Record<string, unknown> }) {\n const t = useT()\n const lineItems = (payload.lineItems as Record<string, unknown>[]) || []\n const customerName = (payload.customerName as string) || ''\n const currencyCode = (payload.currencyCode as string) || ''\n const notes = (payload.notes as string) || ''\n const deliveryDate = (payload.requestedDeliveryDate as string) || ''\n\n return (\n <div className=\"mt-2 space-y-2 text-xs\">\n {customerName && (\n <div className=\"flex gap-1\">\n <span className=\"text-muted-foreground\">{t('inbox_ops.preview.customer', 'Customer')}:</span>\n <span>{customerName}</span>\n {typeof payload.customerEmail === 'string' && <span className=\"text-muted-foreground\">({payload.customerEmail})</span>}\n </div>\n )}\n {lineItems.length > 0 && (\n <div className=\"border rounded overflow-hidden\">\n <table className=\"w-full text-xs\">\n <thead>\n <tr className=\"bg-muted/50\">\n <th className=\"text-left px-2 py-1 font-medium\">{t('inbox_ops.preview.product', 'Product')}</th>\n <th className=\"text-right px-2 py-1 font-medium\">{t('inbox_ops.preview.qty', 'Qty')}</th>\n <th className=\"text-right px-2 py-1 font-medium\">{t('inbox_ops.preview.price', 'Price')}</th>\n </tr>\n </thead>\n <tbody>\n {lineItems.map((item, index) => (\n <tr key={index} className=\"border-t\">\n <td className=\"px-2 py-1\">{(item.productName as string) || '\u2014'}</td>\n <td className=\"px-2 py-1 text-right\">{String(item.quantity ?? '')}</td>\n <td className=\"px-2 py-1 text-right\">{item.unitPrice ? `${item.unitPrice} ${currencyCode}` : '\u2014'}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n {(deliveryDate || notes) && (\n <div className=\"flex flex-wrap gap-3\">\n {deliveryDate && (\n <div className=\"flex gap-1\">\n <span className=\"text-muted-foreground\">{t('inbox_ops.preview.delivery', 'Delivery')}:</span>\n <span>{deliveryDate}</span>\n </div>\n )}\n {notes && (\n <div className=\"flex gap-1\">\n <span className=\"text-muted-foreground\">{t('inbox_ops.preview.notes', 'Notes')}:</span>\n <span className=\"truncate max-w-[200px]\">{notes}</span>\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n\nfunction ProductPreview({ payload }: { payload: Record<string, unknown> }) {\n const t = useT()\n const title = (payload.title as string) || ''\n const sku = (payload.sku as string) || ''\n const unitPrice = (payload.unitPrice as string) || ''\n const currencyCode = (payload.currencyCode as string) || ''\n const kind = (payload.kind as string) || 'product'\n\n return (\n <div className=\"mt-2 space-y-1 text-xs\">\n {title && (\n <div className=\"flex gap-1\">\n <span className=\"text-muted-foreground\">{t('inbox_ops.preview.product_title', 'Title')}:</span>\n <span className=\"font-medium\">{title}</span>\n </div>\n )}\n <div className=\"flex flex-wrap gap-3\">\n {sku && (\n <div className=\"flex gap-1\">\n <span className=\"text-muted-foreground\">{t('inbox_ops.preview.sku', 'SKU')}:</span>\n <span>{sku}</span>\n </div>\n )}\n {unitPrice && (\n <div className=\"flex gap-1\">\n <span className=\"text-muted-foreground\">{t('inbox_ops.preview.price', 'Price')}:</span>\n <span>{unitPrice}{currencyCode ? ` ${currencyCode}` : ''}</span>\n </div>\n )}\n <div className=\"flex gap-1\">\n <span className=\"text-muted-foreground\">{t('inbox_ops.edit_dialog.kind', 'Kind')}:</span>\n <span>{kind}</span>\n </div>\n </div>\n </div>\n )\n}\n\nexport function ActionCard({\n action,\n discrepancies,\n actionTypeLabels,\n onAccept,\n onReject,\n onRetry,\n onEdit,\n translatedDescription,\n resolveDiscrepancyDescription,\n}: {\n action: ActionDetail\n discrepancies: DiscrepancyDetail[]\n actionTypeLabels: Record<string, string>\n onAccept: (id: string) => void\n onReject: (id: string) => void\n onRetry: (id: string) => void\n onEdit: (action: ActionDetail) => void\n translatedDescription?: string\n resolveDiscrepancyDescription?: (description: string, foundValue?: string | null) => string\n}) {\n const t = useT()\n const Icon = ACTION_TYPE_ICONS[action.actionType] || Package\n const label = actionTypeLabels[action.actionType] || action.actionType\n const resolveActionDescription = useActionDescriptionResolver()\n\n const actionDiscrepancies = discrepancies.filter((d) => d.actionId === action.id && !d.resolved)\n const hasBlockingDiscrepancies = actionDiscrepancies.some((d) => d.severity === 'error')\n const displayDescription = translatedDescription || resolveActionDescription(action.description, action.payload)\n\n if (action.status === 'executed') {\n return (\n <div className=\"border rounded-lg p-3 md:p-4 bg-green-50 dark:bg-green-950/20\">\n <div className=\"flex items-center gap-2 mb-2\">\n <CheckCircle className=\"h-5 w-5 text-green-600 flex-shrink-0\" />\n <span className=\"text-sm font-medium\">{label}</span>\n </div>\n <p className=\"text-sm text-muted-foreground\">{displayDescription}</p>\n {action.createdEntityId && (\n <div className=\"mt-2\">\n <span className=\"text-xs text-green-600\">\n {t('inbox_ops.action.created_entity', 'Created {type}').replace('{type}', action.createdEntityType || '')} \u00B7 {action.executedAt && new Date(action.executedAt).toLocaleString()}\n </span>\n </div>\n )}\n </div>\n )\n }\n\n if (action.status === 'rejected') {\n return (\n <div className=\"border rounded-lg p-3 md:p-4 bg-muted/50 opacity-60\">\n <div className=\"flex items-center gap-2 mb-2\">\n <XCircle className=\"h-5 w-5 text-muted-foreground flex-shrink-0\" />\n <span className=\"text-sm font-medium line-through\">{label}</span>\n <span className=\"text-xs text-muted-foreground\">{t('inbox_ops.status.rejected', 'Rejected')}</span>\n </div>\n <p className=\"text-sm text-muted-foreground\">{displayDescription}</p>\n </div>\n )\n }\n\n if (action.status === 'failed') {\n return (\n <div className=\"border rounded-lg p-3 md:p-4 bg-red-50 dark:bg-red-950/20\">\n <div className=\"flex items-center gap-2 mb-2\">\n <AlertTriangle className=\"h-5 w-5 text-red-600 flex-shrink-0\" />\n <span className=\"text-sm font-medium\">{label}</span>\n <span className=\"text-xs text-red-600\">{t('inbox_ops.extraction_failed', 'Failed')}</span>\n </div>\n <p className=\"text-sm text-muted-foreground\">{displayDescription}</p>\n {action.executionError && (\n <p className=\"text-xs text-red-600 mt-1\">{action.executionError}</p>\n )}\n <div className=\"mt-3 flex items-center gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n className=\"h-11 md:h-9\"\n onClick={() => onRetry(action.id)}\n >\n <RefreshCw className=\"h-4 w-4 mr-1\" />\n {t('inbox_ops.action.retry', 'Retry')}\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-11 md:h-9\"\n onClick={() => onEdit(action)}\n >\n <Pencil className=\"h-4 w-4 mr-1\" />\n {t('inbox_ops.action.edit', 'Edit')}\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-11 md:h-9\"\n onClick={() => onReject(action.id)}\n >\n <XCircle className=\"h-4 w-4 mr-1\" />\n {t('inbox_ops.action.reject', 'Reject')}\n </Button>\n </div>\n </div>\n )\n }\n\n const hasNameIssue = hasContactNameIssue(action)\n\n return (\n <div className=\"border rounded-lg p-3 md:p-4\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Icon className=\"h-5 w-5 text-primary flex-shrink-0\" />\n <span className=\"text-sm font-medium\">{label}</span>\n <ConfidenceBadge value={action.confidence} />\n </div>\n <p className=\"text-sm text-foreground/80 mb-2\">{displayDescription}</p>\n\n {(action.actionType === 'create_order' || action.actionType === 'create_quote') && (\n <OrderPreview payload={action.payload} />\n )}\n\n {action.actionType === 'create_product' && (\n <ProductPreview payload={action.payload} />\n )}\n\n {actionDiscrepancies.length > 0 && (\n <div className=\"mb-3 space-y-1\">\n {actionDiscrepancies.map((d) => (\n <div key={d.id} className={`flex items-start gap-2 text-xs rounded px-2 py-1.5 ${\n d.severity === 'error' ? 'bg-red-50 text-red-700 dark:bg-red-950/20' : 'bg-yellow-50 text-yellow-700 dark:bg-yellow-950/20'\n }`}>\n <AlertTriangle className=\"h-3 w-3 mt-0.5 flex-shrink-0\" />\n <div>\n <span>{resolveDiscrepancyDescription ? resolveDiscrepancyDescription(d.description, d.foundValue) : d.description}</span>\n {(d.expectedValue || d.foundValue) && (\n <div className=\"mt-0.5 text-[11px] opacity-80\">\n {d.expectedValue && <span>{t('inbox_ops.discrepancy.expected', 'Expected')}: {d.expectedValue}</span>}\n {d.expectedValue && d.foundValue && <span> \u00B7 </span>}\n {d.foundValue && <span>{t('inbox_ops.discrepancy.found', 'Found')}: {d.foundValue}</span>}\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {hasNameIssue && (\n <div className=\"mb-3 flex items-start gap-2 text-xs rounded px-2 py-1.5 bg-amber-50 text-amber-700 dark:bg-amber-950/20 dark:text-amber-300\">\n <AlertTriangle className=\"h-3 w-3 mt-0.5 flex-shrink-0\" />\n <span>{action.actionType === 'link_contact'\n ? t('inbox_ops.contact.link_name_missing_warning', 'Contact name is missing. Please edit and provide a name before accepting.')\n : t('inbox_ops.contact.name_missing_warning', 'First and last name could not be extracted. Please edit before accepting.')\n }</span>\n </div>\n )}\n\n <div className=\"flex items-center gap-2\">\n <div title={\n hasNameIssue\n ? action.actionType === 'link_contact'\n ? t('inbox_ops.contact.link_name_missing_warning', 'Contact name is missing. Please edit and provide a name before accepting.')\n : t('inbox_ops.contact.name_missing_warning', 'First and last name could not be extracted. Please edit before accepting.')\n : hasBlockingDiscrepancies\n ? t('inbox_ops.action.accept_blocked', 'Resolve errors before accepting')\n : undefined\n }>\n <Button\n type=\"button\"\n size=\"sm\"\n className=\"h-11 md:h-9\"\n onClick={() => onAccept(action.id)}\n disabled={hasBlockingDiscrepancies || hasNameIssue}\n >\n <CheckCircle className=\"h-4 w-4 mr-1\" />\n {t('inbox_ops.action.accept', 'Accept')}\n </Button>\n </div>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-11 md:h-9\"\n onClick={() => onEdit(action)}\n >\n <Pencil className=\"h-4 w-4 mr-1\" />\n {t('inbox_ops.action.edit', 'Edit')}\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-11 md:h-9\"\n onClick={() => onReject(action.id)}\n >\n <XCircle className=\"h-4 w-4 mr-1\" />\n {t('inbox_ops.action.reject', 'Reject')}\n </Button>\n </div>\n </div>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport {\n CheckCircle,\n XCircle,\n Pencil,\n AlertTriangle,\n RefreshCw,\n Package,\n FileText,\n MessageSquare,\n Truck,\n UserPlus,\n Link2,\n Activity,\n ShoppingBag,\n} from 'lucide-react'\nimport type { ActionDetail, DiscrepancyDetail } from './types'\nimport { hasContactNameIssue } from '../../lib/contactValidation'\n\nexport { hasContactNameIssue }\n\n/**\n * Resolves discrepancy description i18n keys stored in the database.\n * Falls back to the raw description string for legacy data or LLM-generated descriptions.\n */\nexport function useDiscrepancyDescriptions(): (description: string, foundValue?: string | null) => string {\n const t = useT()\n const translations: Record<string, string> = {\n 'inbox_ops.discrepancy.desc.no_channel': t('inbox_ops.discrepancy.desc.no_channel', 'No sales channel available. Create a channel in Sales settings before accepting this order.'),\n 'inbox_ops.discrepancy.desc.no_currency': t('inbox_ops.discrepancy.desc.no_currency', 'No currency could be resolved for this order. Set a currency code or configure a sales channel with a default currency.'),\n 'inbox_ops.discrepancy.desc.product_not_matched': t('inbox_ops.discrepancy.desc.product_not_matched', 'Product could not be matched to any catalog product'),\n 'inbox_ops.discrepancy.desc.no_matching_contact': t('inbox_ops.discrepancy.desc.no_matching_contact', 'No matching contact found'),\n 'inbox_ops.discrepancy.desc.draft_reply_no_contact': t('inbox_ops.discrepancy.desc.draft_reply_no_contact', 'Draft reply target has no matching contact. Create the contact first.'),\n 'inbox_ops.discrepancy.desc.duplicate_order_reference': t('inbox_ops.discrepancy.desc.duplicate_order_reference', 'An order with this customer reference already exists'),\n }\n return (description: string, foundValue?: string | null) => {\n const translated = translations[description]\n if (!translated) return description\n if (foundValue && (description === 'inbox_ops.discrepancy.desc.product_not_matched' || description === 'inbox_ops.discrepancy.desc.no_matching_contact')) {\n return `${translated}: ${foundValue}`\n }\n return translated\n }\n}\n\n/**\n * Resolves action description i18n keys stored in the database.\n * Auto-generated actions store keys like `inbox_ops.action.desc.create_contact`;\n * LLM-generated actions store plain text which is returned as-is.\n */\nexport function useActionDescriptionResolver(): (description: string, payload: Record<string, unknown>) => string {\n const t = useT()\n return (description: string, payload: Record<string, unknown>) => {\n if (!description.startsWith('inbox_ops.action.desc.')) return description\n const name = (payload.name as string) || (payload.contactName as string) || ''\n const email = (payload.email as string) || (payload.emailAddress as string) || ''\n const title = (payload.title as string) || ''\n const toName = (payload.toName as string) || (payload.to as string) || ''\n const subject = (payload.subject as string) || ''\n const translations: Record<string, string> = {\n 'inbox_ops.action.desc.create_contact': t('inbox_ops.action.desc.create_contact', 'Create contact for {name} ({email})')\n .replace('{name}', name).replace('{email}', email),\n 'inbox_ops.action.desc.link_contact': t('inbox_ops.action.desc.link_contact', 'Link {name} ({email}) to existing contact')\n .replace('{name}', name).replace('{email}', email),\n 'inbox_ops.action.desc.create_product': t('inbox_ops.action.desc.create_product', 'Create catalog product \"{title}\"')\n .replace('{title}', title),\n 'inbox_ops.action.desc.draft_reply': t('inbox_ops.action.desc.draft_reply', 'Draft reply to {toName}: {subject}')\n .replace('{toName}', toName).replace('{subject}', subject),\n }\n return translations[description] || description\n }\n}\n\nconst ACTION_TYPE_ICONS: Record<string, React.ElementType> = {\n create_order: Package,\n create_quote: FileText,\n update_order: Package,\n update_shipment: Truck,\n create_contact: UserPlus,\n create_product: ShoppingBag,\n link_contact: Link2,\n log_activity: Activity,\n draft_reply: MessageSquare,\n}\n\nexport function useActionTypeLabels(): Record<string, string> {\n const t = useT()\n return {\n create_order: t('inbox_ops.action_type.create_order', 'Create Sales Order'),\n create_quote: t('inbox_ops.action_type.create_quote', 'Create Quote'),\n update_order: t('inbox_ops.action_type.update_order', 'Update Order'),\n update_shipment: t('inbox_ops.action_type.update_shipment', 'Update Shipment'),\n create_contact: t('inbox_ops.action_type.create_contact', 'Create Contact'),\n create_product: t('inbox_ops.action_type.create_product', 'Create Product'),\n link_contact: t('inbox_ops.action_type.link_contact', 'Link Contact'),\n log_activity: t('inbox_ops.action_type.log_activity', 'Log Activity'),\n draft_reply: t('inbox_ops.action_type.draft_reply', 'Draft Reply'),\n }\n}\n\nexport function ConfidenceBadge({ value }: { value: string }) {\n const num = parseFloat(value)\n const pct = Math.round(num * 100)\n const color = num >= 0.8 ? 'text-status-success-text' : num >= 0.6 ? 'text-status-warning-text' : 'text-status-error-text'\n const bgColor = num >= 0.8 ? 'bg-status-success-icon' : num >= 0.6 ? 'bg-status-warning-icon' : 'bg-status-error-icon'\n const width = Math.round(num * 100)\n return (\n <div className=\"flex items-center gap-2\">\n <span className={`text-sm font-medium ${color}`}>{pct}%</span>\n <div className=\"w-24 h-2 bg-muted rounded-full overflow-hidden\">\n <div className={`h-full ${bgColor} rounded-full`} style={{ width: `${width}%` }} />\n </div>\n </div>\n )\n}\n\nfunction OrderPreview({ payload }: { payload: Record<string, unknown> }) {\n const t = useT()\n const lineItems = (payload.lineItems as Record<string, unknown>[]) || []\n const customerName = (payload.customerName as string) || ''\n const currencyCode = (payload.currencyCode as string) || ''\n const notes = (payload.notes as string) || ''\n const deliveryDate = (payload.requestedDeliveryDate as string) || ''\n\n return (\n <div className=\"mt-2 space-y-2 text-xs\">\n {customerName && (\n <div className=\"flex gap-1\">\n <span className=\"text-muted-foreground\">{t('inbox_ops.preview.customer', 'Customer')}:</span>\n <span>{customerName}</span>\n {typeof payload.customerEmail === 'string' && <span className=\"text-muted-foreground\">({payload.customerEmail})</span>}\n </div>\n )}\n {lineItems.length > 0 && (\n <div className=\"border rounded overflow-hidden\">\n <table className=\"w-full text-xs\">\n <thead>\n <tr className=\"bg-muted/50\">\n <th className=\"text-left px-2 py-1 font-medium\">{t('inbox_ops.preview.product', 'Product')}</th>\n <th className=\"text-right px-2 py-1 font-medium\">{t('inbox_ops.preview.qty', 'Qty')}</th>\n <th className=\"text-right px-2 py-1 font-medium\">{t('inbox_ops.preview.price', 'Price')}</th>\n </tr>\n </thead>\n <tbody>\n {lineItems.map((item, index) => (\n <tr key={index} className=\"border-t\">\n <td className=\"px-2 py-1\">{(item.productName as string) || '\u2014'}</td>\n <td className=\"px-2 py-1 text-right\">{String(item.quantity ?? '')}</td>\n <td className=\"px-2 py-1 text-right\">{item.unitPrice ? `${item.unitPrice} ${currencyCode}` : '\u2014'}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n {(deliveryDate || notes) && (\n <div className=\"flex flex-wrap gap-3\">\n {deliveryDate && (\n <div className=\"flex gap-1\">\n <span className=\"text-muted-foreground\">{t('inbox_ops.preview.delivery', 'Delivery')}:</span>\n <span>{deliveryDate}</span>\n </div>\n )}\n {notes && (\n <div className=\"flex gap-1\">\n <span className=\"text-muted-foreground\">{t('inbox_ops.preview.notes', 'Notes')}:</span>\n <span className=\"truncate max-w-[200px]\">{notes}</span>\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n\nfunction ProductPreview({ payload }: { payload: Record<string, unknown> }) {\n const t = useT()\n const title = (payload.title as string) || ''\n const sku = (payload.sku as string) || ''\n const unitPrice = (payload.unitPrice as string) || ''\n const currencyCode = (payload.currencyCode as string) || ''\n const kind = (payload.kind as string) || 'product'\n\n return (\n <div className=\"mt-2 space-y-1 text-xs\">\n {title && (\n <div className=\"flex gap-1\">\n <span className=\"text-muted-foreground\">{t('inbox_ops.preview.product_title', 'Title')}:</span>\n <span className=\"font-medium\">{title}</span>\n </div>\n )}\n <div className=\"flex flex-wrap gap-3\">\n {sku && (\n <div className=\"flex gap-1\">\n <span className=\"text-muted-foreground\">{t('inbox_ops.preview.sku', 'SKU')}:</span>\n <span>{sku}</span>\n </div>\n )}\n {unitPrice && (\n <div className=\"flex gap-1\">\n <span className=\"text-muted-foreground\">{t('inbox_ops.preview.price', 'Price')}:</span>\n <span>{unitPrice}{currencyCode ? ` ${currencyCode}` : ''}</span>\n </div>\n )}\n <div className=\"flex gap-1\">\n <span className=\"text-muted-foreground\">{t('inbox_ops.edit_dialog.kind', 'Kind')}:</span>\n <span>{kind}</span>\n </div>\n </div>\n </div>\n )\n}\n\nexport function ActionCard({\n action,\n discrepancies,\n actionTypeLabels,\n onAccept,\n onReject,\n onRetry,\n onEdit,\n translatedDescription,\n resolveDiscrepancyDescription,\n}: {\n action: ActionDetail\n discrepancies: DiscrepancyDetail[]\n actionTypeLabels: Record<string, string>\n onAccept: (id: string) => void\n onReject: (id: string) => void\n onRetry: (id: string) => void\n onEdit: (action: ActionDetail) => void\n translatedDescription?: string\n resolveDiscrepancyDescription?: (description: string, foundValue?: string | null) => string\n}) {\n const t = useT()\n const Icon = ACTION_TYPE_ICONS[action.actionType] || Package\n const label = actionTypeLabels[action.actionType] || action.actionType\n const resolveActionDescription = useActionDescriptionResolver()\n\n const actionDiscrepancies = discrepancies.filter((d) => d.actionId === action.id && !d.resolved)\n const hasBlockingDiscrepancies = actionDiscrepancies.some((d) => d.severity === 'error')\n const displayDescription = translatedDescription || resolveActionDescription(action.description, action.payload)\n\n if (action.status === 'executed') {\n return (\n <div className=\"border rounded-lg p-3 md:p-4 bg-status-success-bg border-status-success-border\">\n <div className=\"flex items-center gap-2 mb-2\">\n <CheckCircle className=\"h-5 w-5 text-status-success-icon flex-shrink-0\" />\n <span className=\"text-sm font-medium\">{label}</span>\n </div>\n <p className=\"text-sm text-muted-foreground\">{displayDescription}</p>\n {action.createdEntityId && (\n <div className=\"mt-2\">\n <span className=\"text-xs text-status-success-text\">\n {t('inbox_ops.action.created_entity', 'Created {type}').replace('{type}', action.createdEntityType || '')} \u00B7 {action.executedAt && new Date(action.executedAt).toLocaleString()}\n </span>\n </div>\n )}\n </div>\n )\n }\n\n if (action.status === 'rejected') {\n return (\n <div className=\"border rounded-lg p-3 md:p-4 bg-muted/50 opacity-60\">\n <div className=\"flex items-center gap-2 mb-2\">\n <XCircle className=\"h-5 w-5 text-muted-foreground flex-shrink-0\" />\n <span className=\"text-sm font-medium line-through\">{label}</span>\n <span className=\"text-xs text-muted-foreground\">{t('inbox_ops.status.rejected', 'Rejected')}</span>\n </div>\n <p className=\"text-sm text-muted-foreground\">{displayDescription}</p>\n </div>\n )\n }\n\n if (action.status === 'failed') {\n return (\n <div className=\"border rounded-lg p-3 md:p-4 bg-status-error-bg border-status-error-border\">\n <div className=\"flex items-center gap-2 mb-2\">\n <AlertTriangle className=\"h-5 w-5 text-status-error-icon flex-shrink-0\" />\n <span className=\"text-sm font-medium\">{label}</span>\n <span className=\"text-xs text-status-error-text\">{t('inbox_ops.extraction_failed', 'Failed')}</span>\n </div>\n <p className=\"text-sm text-muted-foreground\">{displayDescription}</p>\n {action.executionError && (\n <p className=\"text-xs text-status-error-text mt-1\">{action.executionError}</p>\n )}\n <div className=\"mt-3 flex items-center gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n className=\"h-11 md:h-9\"\n onClick={() => onRetry(action.id)}\n >\n <RefreshCw className=\"h-4 w-4 mr-1\" />\n {t('inbox_ops.action.retry', 'Retry')}\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-11 md:h-9\"\n onClick={() => onEdit(action)}\n >\n <Pencil className=\"h-4 w-4 mr-1\" />\n {t('inbox_ops.action.edit', 'Edit')}\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-11 md:h-9\"\n onClick={() => onReject(action.id)}\n >\n <XCircle className=\"h-4 w-4 mr-1\" />\n {t('inbox_ops.action.reject', 'Reject')}\n </Button>\n </div>\n </div>\n )\n }\n\n const hasNameIssue = hasContactNameIssue(action)\n\n return (\n <div className=\"border rounded-lg p-3 md:p-4\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Icon className=\"h-5 w-5 text-primary flex-shrink-0\" />\n <span className=\"text-sm font-medium\">{label}</span>\n <ConfidenceBadge value={action.confidence} />\n </div>\n <p className=\"text-sm text-foreground/80 mb-2\">{displayDescription}</p>\n\n {(action.actionType === 'create_order' || action.actionType === 'create_quote') && (\n <OrderPreview payload={action.payload} />\n )}\n\n {action.actionType === 'create_product' && (\n <ProductPreview payload={action.payload} />\n )}\n\n {actionDiscrepancies.length > 0 && (\n <div className=\"mb-3 space-y-1\">\n {actionDiscrepancies.map((d) => (\n <div key={d.id} className={`flex items-start gap-2 text-xs rounded px-2 py-1.5 ${\n d.severity === 'error' ? 'bg-status-error-bg text-status-error-text' : 'bg-status-warning-bg text-status-warning-text'\n }`}>\n <AlertTriangle className=\"h-3 w-3 mt-0.5 flex-shrink-0\" />\n <div>\n <span>{resolveDiscrepancyDescription ? resolveDiscrepancyDescription(d.description, d.foundValue) : d.description}</span>\n {(d.expectedValue || d.foundValue) && (\n <div className=\"mt-0.5 text-overline opacity-80\">\n {d.expectedValue && <span>{t('inbox_ops.discrepancy.expected', 'Expected')}: {d.expectedValue}</span>}\n {d.expectedValue && d.foundValue && <span> \u00B7 </span>}\n {d.foundValue && <span>{t('inbox_ops.discrepancy.found', 'Found')}: {d.foundValue}</span>}\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {hasNameIssue && (\n <div className=\"mb-3 flex items-start gap-2 text-xs rounded px-2 py-1.5 bg-status-warning-bg text-status-warning-text\">\n <AlertTriangle className=\"h-3 w-3 mt-0.5 flex-shrink-0\" />\n <span>{action.actionType === 'link_contact'\n ? t('inbox_ops.contact.link_name_missing_warning', 'Contact name is missing. Please edit and provide a name before accepting.')\n : t('inbox_ops.contact.name_missing_warning', 'First and last name could not be extracted. Please edit before accepting.')\n }</span>\n </div>\n )}\n\n <div className=\"flex items-center gap-2\">\n <div title={\n hasNameIssue\n ? action.actionType === 'link_contact'\n ? t('inbox_ops.contact.link_name_missing_warning', 'Contact name is missing. Please edit and provide a name before accepting.')\n : t('inbox_ops.contact.name_missing_warning', 'First and last name could not be extracted. Please edit before accepting.')\n : hasBlockingDiscrepancies\n ? t('inbox_ops.action.accept_blocked', 'Resolve errors before accepting')\n : undefined\n }>\n <Button\n type=\"button\"\n size=\"sm\"\n className=\"h-11 md:h-9\"\n onClick={() => onAccept(action.id)}\n disabled={hasBlockingDiscrepancies || hasNameIssue}\n >\n <CheckCircle className=\"h-4 w-4 mr-1\" />\n {t('inbox_ops.action.accept', 'Accept')}\n </Button>\n </div>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-11 md:h-9\"\n onClick={() => onEdit(action)}\n >\n <Pencil className=\"h-4 w-4 mr-1\" />\n {t('inbox_ops.action.edit', 'Edit')}\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-11 md:h-9\"\n onClick={() => onReject(action.id)}\n >\n <XCircle className=\"h-4 w-4 mr-1\" />\n {t('inbox_ops.action.reject', 'Reject')}\n </Button>\n </div>\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -35,8 +35,8 @@ function ProposalCreatedRenderer({
35
35
  "div",
36
36
  {
37
37
  className: cn(
38
- "group relative px-4 py-3 hover:bg-muted/50 cursor-pointer transition-colors border-l-4 border-l-amber-500",
39
- isUnread && "bg-amber-50/50 dark:bg-amber-950/20"
38
+ "group relative px-4 py-3 hover:bg-muted/50 cursor-pointer transition-colors border-l-4 border-l-status-warning-border",
39
+ isUnread && "bg-status-warning-bg"
40
40
  ),
41
41
  onClick: handleReview,
42
42
  onKeyDown: (e) => {
@@ -50,7 +50,7 @@ function ProposalCreatedRenderer({
50
50
  children: [
51
51
  isUnread && /* @__PURE__ */ jsx("div", { className: "absolute left-1.5 top-1/2 -translate-y-1/2 h-2 w-2 rounded-full bg-primary" }),
52
52
  /* @__PURE__ */ jsxs("div", { className: "flex gap-3", children: [
53
- /* @__PURE__ */ jsx("div", { className: "flex-shrink-0 mt-0.5", children: /* @__PURE__ */ jsx("div", { className: "h-10 w-10 rounded-lg bg-amber-100 dark:bg-amber-900/40 flex items-center justify-center", children: /* @__PURE__ */ jsx(Inbox, { className: "h-5 w-5 text-amber-600 dark:text-amber-400" }) }) }),
53
+ /* @__PURE__ */ jsx("div", { className: "flex-shrink-0 mt-0.5", children: /* @__PURE__ */ jsx("div", { className: "h-10 w-10 rounded-lg bg-status-warning-bg flex items-center justify-center", children: /* @__PURE__ */ jsx(Inbox, { className: "h-5 w-5 text-status-warning-icon" }) }) }),
54
54
  /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
55
55
  /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-2", children: [
56
56
  /* @__PURE__ */ jsx("h4", { className: cn("text-sm font-medium", isUnread && "font-semibold"), children: notification.title }),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.tsx"],
4
- "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { Inbox, ExternalLink, Calendar } from 'lucide-react'\nimport { useRouter } from 'next/navigation'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport { formatRelativeTime } from '@open-mercato/shared/lib/time'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { NotificationRendererProps } from '@open-mercato/shared/modules/notifications/types'\n\nexport function ProposalCreatedRenderer({\n notification,\n onAction,\n onDismiss,\n actions = [],\n}: NotificationRendererProps) {\n const t = useT()\n const router = useRouter()\n const [executing, setExecuting] = React.useState(false)\n const isUnread = notification.status === 'unread'\n const actionCount = notification.bodyVariables?.actionCount\n\n const reviewAction = actions.find((action) => action.id === 'review') ?? actions[0] ?? null\n\n const handleReview = async () => {\n if (!reviewAction) {\n if (notification.linkHref) router.push(notification.linkHref)\n return\n }\n setExecuting(true)\n try {\n await onAction(reviewAction.id)\n } finally {\n setExecuting(false)\n }\n }\n\n return (\n <div\n className={cn(\n 'group relative px-4 py-3 hover:bg-muted/50 cursor-pointer transition-colors border-l-4 border-l-amber-500',\n isUnread && 'bg-amber-50/50 dark:bg-amber-950/20',\n )}\n onClick={handleReview}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleReview()\n }\n }}\n role=\"button\"\n tabIndex={0}\n >\n {isUnread && (\n <div className=\"absolute left-1.5 top-1/2 -translate-y-1/2 h-2 w-2 rounded-full bg-primary\" />\n )}\n\n <div className=\"flex gap-3\">\n <div className=\"flex-shrink-0 mt-0.5\">\n <div className=\"h-10 w-10 rounded-lg bg-amber-100 dark:bg-amber-900/40 flex items-center justify-center\">\n <Inbox className=\"h-5 w-5 text-amber-600 dark:text-amber-400\" />\n </div>\n </div>\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-start justify-between gap-2\">\n <h4 className={cn('text-sm font-medium', isUnread && 'font-semibold')}>\n {notification.title}\n </h4>\n <span className=\"flex-shrink-0 text-xs text-muted-foreground flex items-center gap-1\">\n <Calendar className=\"h-3 w-3\" />\n {formatRelativeTime(notification.createdAt, { translate: t }) ?? ''}\n </span>\n </div>\n\n {actionCount && (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {t('inbox_ops.notifications.renderer.actionCount', '{count} proposed actions', { count: actionCount })}\n </p>\n )}\n\n <div className=\"mt-3 flex gap-2\">\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={(event) => {\n event.stopPropagation()\n handleReview()\n }}\n disabled={executing || (!reviewAction && !notification.linkHref)}\n className=\"gap-1\"\n >\n <ExternalLink className=\"h-3 w-3\" />\n {t('inbox_ops.action.review', 'Review')}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={(event) => {\n event.stopPropagation()\n onDismiss()\n }}\n >\n {t('notifications.actions.dismiss', 'Dismiss')}\n </Button>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nexport default ProposalCreatedRenderer\n"],
5
- "mappings": ";AAuDQ,cAeI,YAfJ;AArDR,YAAY,WAAW;AACvB,SAAS,OAAO,cAAc,gBAAgB;AAC9C,SAAS,iBAAiB;AAC1B,SAAS,cAAc;AACvB,SAAS,UAAU;AACnB,SAAS,0BAA0B;AACnC,SAAS,YAAY;AAGd,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU,CAAC;AACb,GAA8B;AAC5B,QAAM,IAAI,KAAK;AACf,QAAM,SAAS,UAAU;AACzB,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAS,KAAK;AACtD,QAAM,WAAW,aAAa,WAAW;AACzC,QAAM,cAAc,aAAa,eAAe;AAEhD,QAAM,eAAe,QAAQ,KAAK,CAAC,WAAW,OAAO,OAAO,QAAQ,KAAK,QAAQ,CAAC,KAAK;AAEvF,QAAM,eAAe,YAAY;AAC/B,QAAI,CAAC,cAAc;AACjB,UAAI,aAAa,SAAU,QAAO,KAAK,aAAa,QAAQ;AAC5D;AAAA,IACF;AACA,iBAAa,IAAI;AACjB,QAAI;AACF,YAAM,SAAS,aAAa,EAAE;AAAA,IAChC,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,YAAY;AAAA,MACd;AAAA,MACA,SAAS;AAAA,MACT,WAAW,CAAC,MAAM;AAChB,YAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,YAAE,eAAe;AACjB,uBAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA,MAAK;AAAA,MACL,UAAU;AAAA,MAET;AAAA,oBACC,oBAAC,SAAI,WAAU,8EAA6E;AAAA,QAG9F,qBAAC,SAAI,WAAU,cACb;AAAA,8BAAC,SAAI,WAAU,wBACb,8BAAC,SAAI,WAAU,2FACb,8BAAC,SAAM,WAAU,8CAA6C,GAChE,GACF;AAAA,UAEA,qBAAC,SAAI,WAAU,kBACb;AAAA,iCAAC,SAAI,WAAU,0CACb;AAAA,kCAAC,QAAG,WAAW,GAAG,uBAAuB,YAAY,eAAe,GACjE,uBAAa,OAChB;AAAA,cACA,qBAAC,UAAK,WAAU,uEACd;AAAA,oCAAC,YAAS,WAAU,WAAU;AAAA,gBAC7B,mBAAmB,aAAa,WAAW,EAAE,WAAW,EAAE,CAAC,KAAK;AAAA,iBACnE;AAAA,eACF;AAAA,YAEC,eACC,oBAAC,OAAE,WAAU,sCACV,YAAE,gDAAgD,4BAA4B,EAAE,OAAO,YAAY,CAAC,GACvG;AAAA,YAGF,qBAAC,SAAI,WAAU,mBACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAS,CAAC,UAAU;AAClB,0BAAM,gBAAgB;AACtB,iCAAa;AAAA,kBACf;AAAA,kBACA,UAAU,aAAc,CAAC,gBAAgB,CAAC,aAAa;AAAA,kBACvD,WAAU;AAAA,kBAEV;AAAA,wCAAC,gBAAa,WAAU,WAAU;AAAA,oBACjC,EAAE,2BAA2B,QAAQ;AAAA;AAAA;AAAA,cACxC;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAS,CAAC,UAAU;AAClB,0BAAM,gBAAgB;AACtB,8BAAU;AAAA,kBACZ;AAAA,kBAEC,YAAE,iCAAiC,SAAS;AAAA;AAAA,cAC/C;AAAA,eACF;AAAA,aACF;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,kCAAQ;",
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { Inbox, ExternalLink, Calendar } from 'lucide-react'\nimport { useRouter } from 'next/navigation'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport { formatRelativeTime } from '@open-mercato/shared/lib/time'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { NotificationRendererProps } from '@open-mercato/shared/modules/notifications/types'\n\nexport function ProposalCreatedRenderer({\n notification,\n onAction,\n onDismiss,\n actions = [],\n}: NotificationRendererProps) {\n const t = useT()\n const router = useRouter()\n const [executing, setExecuting] = React.useState(false)\n const isUnread = notification.status === 'unread'\n const actionCount = notification.bodyVariables?.actionCount\n\n const reviewAction = actions.find((action) => action.id === 'review') ?? actions[0] ?? null\n\n const handleReview = async () => {\n if (!reviewAction) {\n if (notification.linkHref) router.push(notification.linkHref)\n return\n }\n setExecuting(true)\n try {\n await onAction(reviewAction.id)\n } finally {\n setExecuting(false)\n }\n }\n\n return (\n <div\n className={cn(\n 'group relative px-4 py-3 hover:bg-muted/50 cursor-pointer transition-colors border-l-4 border-l-status-warning-border',\n isUnread && 'bg-status-warning-bg',\n )}\n onClick={handleReview}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleReview()\n }\n }}\n role=\"button\"\n tabIndex={0}\n >\n {isUnread && (\n <div className=\"absolute left-1.5 top-1/2 -translate-y-1/2 h-2 w-2 rounded-full bg-primary\" />\n )}\n\n <div className=\"flex gap-3\">\n <div className=\"flex-shrink-0 mt-0.5\">\n <div className=\"h-10 w-10 rounded-lg bg-status-warning-bg flex items-center justify-center\">\n <Inbox className=\"h-5 w-5 text-status-warning-icon\" />\n </div>\n </div>\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-start justify-between gap-2\">\n <h4 className={cn('text-sm font-medium', isUnread && 'font-semibold')}>\n {notification.title}\n </h4>\n <span className=\"flex-shrink-0 text-xs text-muted-foreground flex items-center gap-1\">\n <Calendar className=\"h-3 w-3\" />\n {formatRelativeTime(notification.createdAt, { translate: t }) ?? ''}\n </span>\n </div>\n\n {actionCount && (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {t('inbox_ops.notifications.renderer.actionCount', '{count} proposed actions', { count: actionCount })}\n </p>\n )}\n\n <div className=\"mt-3 flex gap-2\">\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={(event) => {\n event.stopPropagation()\n handleReview()\n }}\n disabled={executing || (!reviewAction && !notification.linkHref)}\n className=\"gap-1\"\n >\n <ExternalLink className=\"h-3 w-3\" />\n {t('inbox_ops.action.review', 'Review')}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={(event) => {\n event.stopPropagation()\n onDismiss()\n }}\n >\n {t('notifications.actions.dismiss', 'Dismiss')}\n </Button>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nexport default ProposalCreatedRenderer\n"],
5
+ "mappings": ";AAuDQ,cAeI,YAfJ;AArDR,YAAY,WAAW;AACvB,SAAS,OAAO,cAAc,gBAAgB;AAC9C,SAAS,iBAAiB;AAC1B,SAAS,cAAc;AACvB,SAAS,UAAU;AACnB,SAAS,0BAA0B;AACnC,SAAS,YAAY;AAGd,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU,CAAC;AACb,GAA8B;AAC5B,QAAM,IAAI,KAAK;AACf,QAAM,SAAS,UAAU;AACzB,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAS,KAAK;AACtD,QAAM,WAAW,aAAa,WAAW;AACzC,QAAM,cAAc,aAAa,eAAe;AAEhD,QAAM,eAAe,QAAQ,KAAK,CAAC,WAAW,OAAO,OAAO,QAAQ,KAAK,QAAQ,CAAC,KAAK;AAEvF,QAAM,eAAe,YAAY;AAC/B,QAAI,CAAC,cAAc;AACjB,UAAI,aAAa,SAAU,QAAO,KAAK,aAAa,QAAQ;AAC5D;AAAA,IACF;AACA,iBAAa,IAAI;AACjB,QAAI;AACF,YAAM,SAAS,aAAa,EAAE;AAAA,IAChC,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,YAAY;AAAA,MACd;AAAA,MACA,SAAS;AAAA,MACT,WAAW,CAAC,MAAM;AAChB,YAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,YAAE,eAAe;AACjB,uBAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA,MAAK;AAAA,MACL,UAAU;AAAA,MAET;AAAA,oBACC,oBAAC,SAAI,WAAU,8EAA6E;AAAA,QAG9F,qBAAC,SAAI,WAAU,cACb;AAAA,8BAAC,SAAI,WAAU,wBACb,8BAAC,SAAI,WAAU,8EACb,8BAAC,SAAM,WAAU,oCAAmC,GACtD,GACF;AAAA,UAEA,qBAAC,SAAI,WAAU,kBACb;AAAA,iCAAC,SAAI,WAAU,0CACb;AAAA,kCAAC,QAAG,WAAW,GAAG,uBAAuB,YAAY,eAAe,GACjE,uBAAa,OAChB;AAAA,cACA,qBAAC,UAAK,WAAU,uEACd;AAAA,oCAAC,YAAS,WAAU,WAAU;AAAA,gBAC7B,mBAAmB,aAAa,WAAW,EAAE,WAAW,EAAE,CAAC,KAAK;AAAA,iBACnE;AAAA,eACF;AAAA,YAEC,eACC,oBAAC,OAAE,WAAU,sCACV,YAAE,gDAAgD,4BAA4B,EAAE,OAAO,YAAY,CAAC,GACvG;AAAA,YAGF,qBAAC,SAAI,WAAU,mBACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAS,CAAC,UAAU;AAClB,0BAAM,gBAAgB;AACtB,iCAAa;AAAA,kBACf;AAAA,kBACA,UAAU,aAAc,CAAC,gBAAgB,CAAC,aAAa;AAAA,kBACvD,WAAU;AAAA,kBAEV;AAAA,wCAAC,gBAAa,WAAU,WAAU;AAAA,oBACjC,EAAE,2BAA2B,QAAQ;AAAA;AAAA;AAAA,cACxC;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAS,CAAC,UAAU;AAClB,0BAAM,gBAAgB;AACtB,8BAAU;AAAA,kBACZ;AAAA,kBAEC,YAAE,iCAAiC,SAAS;AAAA;AAAA,cAC/C;AAAA,eACF;AAAA,aACF;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,kCAAQ;",
6
6
  "names": []
7
7
  }