@open-mercato/core 0.5.1-develop.2672.g2128128275 → 0.5.1-develop.2683.4878a05b8e

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 (714) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/generated/entities/action_log/index.js +8 -0
  3. package/dist/generated/entities/action_log/index.js.map +2 -2
  4. package/dist/generated/entities/customer_company_billing/index.js +23 -0
  5. package/dist/generated/entities/customer_company_billing/index.js.map +7 -0
  6. package/dist/generated/entities/customer_deal/index.js +8 -0
  7. package/dist/generated/entities/customer_deal/index.js.map +2 -2
  8. package/dist/generated/entities/customer_deal_stage_transition/index.js +31 -0
  9. package/dist/generated/entities/customer_deal_stage_transition/index.js.map +7 -0
  10. package/dist/generated/entities/customer_dictionary_kind_setting/index.js +21 -0
  11. package/dist/generated/entities/customer_dictionary_kind_setting/index.js.map +7 -0
  12. package/dist/generated/entities/customer_entity/index.js +8 -0
  13. package/dist/generated/entities/customer_entity/index.js.map +2 -2
  14. package/dist/generated/entities/customer_entity_role/index.js +23 -0
  15. package/dist/generated/entities/customer_entity_role/index.js.map +7 -0
  16. package/dist/generated/entities/customer_interaction/index.js +23 -1
  17. package/dist/generated/entities/customer_interaction/index.js.map +2 -2
  18. package/dist/generated/entities/customer_label/index.js +19 -0
  19. package/dist/generated/entities/customer_label/index.js.map +7 -0
  20. package/dist/generated/entities/customer_label_assignment/index.js +17 -0
  21. package/dist/generated/entities/customer_label_assignment/index.js.map +7 -0
  22. package/dist/generated/entities/customer_person_company_link/index.js +21 -0
  23. package/dist/generated/entities/customer_person_company_link/index.js.map +7 -0
  24. package/dist/generated/entities/customer_person_company_role/index.js +17 -0
  25. package/dist/generated/entities/customer_person_company_role/index.js.map +7 -0
  26. package/dist/generated/entities/dictionary_entry/index.js +4 -0
  27. package/dist/generated/entities/dictionary_entry/index.js.map +2 -2
  28. package/dist/generated/entities.ids.generated.js +9 -1
  29. package/dist/generated/entities.ids.generated.js.map +2 -2
  30. package/dist/generated/entity-fields-registry.js +116 -1
  31. package/dist/generated/entity-fields-registry.js.map +2 -2
  32. package/dist/modules/attachments/api/route.js +46 -8
  33. package/dist/modules/attachments/api/route.js.map +2 -2
  34. package/dist/modules/audit_logs/api/audit-logs/actions/export/route.js +208 -0
  35. package/dist/modules/audit_logs/api/audit-logs/actions/export/route.js.map +7 -0
  36. package/dist/modules/audit_logs/api/audit-logs/actions/route.js +52 -6
  37. package/dist/modules/audit_logs/api/audit-logs/actions/route.js.map +2 -2
  38. package/dist/modules/audit_logs/cli.js +62 -0
  39. package/dist/modules/audit_logs/cli.js.map +7 -0
  40. package/dist/modules/audit_logs/components/AuditLogsActions.js +2 -2
  41. package/dist/modules/audit_logs/components/AuditLogsActions.js.map +2 -2
  42. package/dist/modules/audit_logs/data/entities.js +21 -1
  43. package/dist/modules/audit_logs/data/entities.js.map +2 -2
  44. package/dist/modules/audit_logs/data/validators.js +9 -1
  45. package/dist/modules/audit_logs/data/validators.js.map +2 -2
  46. package/dist/modules/audit_logs/lib/changeRows.js +34 -0
  47. package/dist/modules/audit_logs/lib/changeRows.js.map +7 -0
  48. package/dist/modules/audit_logs/lib/display-helpers.js +2 -20
  49. package/dist/modules/audit_logs/lib/display-helpers.js.map +3 -3
  50. package/dist/modules/audit_logs/lib/projections.js +58 -0
  51. package/dist/modules/audit_logs/lib/projections.js.map +7 -0
  52. package/dist/modules/audit_logs/migrations/Migration20260412160533.js +21 -0
  53. package/dist/modules/audit_logs/migrations/Migration20260412160533.js.map +7 -0
  54. package/dist/modules/audit_logs/services/actionLogService.js +313 -79
  55. package/dist/modules/audit_logs/services/actionLogService.js.map +2 -2
  56. package/dist/modules/auth/frontend/login.js +5 -5
  57. package/dist/modules/auth/frontend/login.js.map +2 -2
  58. package/dist/modules/customer_accounts/api/signup.js +3 -3
  59. package/dist/modules/customer_accounts/api/signup.js.map +2 -2
  60. package/dist/modules/customers/acl.js +3 -1
  61. package/dist/modules/customers/acl.js.map +2 -2
  62. package/dist/modules/customers/api/activities/route.js +4 -0
  63. package/dist/modules/customers/api/activities/route.js.map +2 -2
  64. package/dist/modules/customers/api/assignable-staff/route.js +208 -0
  65. package/dist/modules/customers/api/assignable-staff/route.js.map +7 -0
  66. package/dist/modules/customers/api/companies/[id]/people/route.js +205 -0
  67. package/dist/modules/customers/api/companies/[id]/people/route.js.map +7 -0
  68. package/dist/modules/customers/api/companies/[id]/roles/route.js +22 -0
  69. package/dist/modules/customers/api/companies/[id]/roles/route.js.map +7 -0
  70. package/dist/modules/customers/api/companies/[id]/route.js +374 -32
  71. package/dist/modules/customers/api/companies/[id]/route.js.map +2 -2
  72. package/dist/modules/customers/api/companies/route.js +82 -7
  73. package/dist/modules/customers/api/companies/route.js.map +2 -2
  74. package/dist/modules/customers/api/deals/[id]/companies/route.js +172 -0
  75. package/dist/modules/customers/api/deals/[id]/companies/route.js.map +7 -0
  76. package/dist/modules/customers/api/deals/[id]/people/route.js +156 -0
  77. package/dist/modules/customers/api/deals/[id]/people/route.js.map +7 -0
  78. package/dist/modules/customers/api/deals/[id]/route.js +459 -53
  79. package/dist/modules/customers/api/deals/[id]/route.js.map +2 -2
  80. package/dist/modules/customers/api/deals/[id]/stats/route.js +195 -0
  81. package/dist/modules/customers/api/deals/[id]/stats/route.js.map +7 -0
  82. package/dist/modules/customers/api/deals/route.js +20 -10
  83. package/dist/modules/customers/api/deals/route.js.map +3 -3
  84. package/dist/modules/customers/api/dictionaries/[kind]/[id]/route.js +105 -4
  85. package/dist/modules/customers/api/dictionaries/[kind]/[id]/route.js.map +2 -2
  86. package/dist/modules/customers/api/dictionaries/[kind]/route.js +118 -42
  87. package/dist/modules/customers/api/dictionaries/[kind]/route.js.map +2 -2
  88. package/dist/modules/customers/api/dictionaries/context.js +30 -6
  89. package/dist/modules/customers/api/dictionaries/context.js.map +2 -2
  90. package/dist/modules/customers/api/dictionaries/kind-settings/route.js +207 -0
  91. package/dist/modules/customers/api/dictionaries/kind-settings/route.js.map +7 -0
  92. package/dist/modules/customers/api/entity-roles-factory.js +471 -0
  93. package/dist/modules/customers/api/entity-roles-factory.js.map +7 -0
  94. package/dist/modules/customers/api/interactions/conflicts/route.js +158 -0
  95. package/dist/modules/customers/api/interactions/conflicts/route.js.map +7 -0
  96. package/dist/modules/customers/api/interactions/counts/route.js +92 -0
  97. package/dist/modules/customers/api/interactions/counts/route.js.map +7 -0
  98. package/dist/modules/customers/api/interactions/route.js +83 -4
  99. package/dist/modules/customers/api/interactions/route.js.map +2 -2
  100. package/dist/modules/customers/api/labels/assign/route.js +189 -0
  101. package/dist/modules/customers/api/labels/assign/route.js.map +7 -0
  102. package/dist/modules/customers/api/labels/auth.js +17 -0
  103. package/dist/modules/customers/api/labels/auth.js.map +7 -0
  104. package/dist/modules/customers/api/labels/route.js +281 -0
  105. package/dist/modules/customers/api/labels/route.js.map +7 -0
  106. package/dist/modules/customers/api/labels/table-errors.js +38 -0
  107. package/dist/modules/customers/api/labels/table-errors.js.map +7 -0
  108. package/dist/modules/customers/api/labels/unassign/route.js +184 -0
  109. package/dist/modules/customers/api/labels/unassign/route.js.map +7 -0
  110. package/dist/modules/customers/api/people/[id]/companies/[linkId]/route.js +292 -0
  111. package/dist/modules/customers/api/people/[id]/companies/[linkId]/route.js.map +7 -0
  112. package/dist/modules/customers/api/people/[id]/companies/context.js +66 -0
  113. package/dist/modules/customers/api/people/[id]/companies/context.js.map +7 -0
  114. package/dist/modules/customers/api/people/[id]/companies/enriched/route.js +334 -0
  115. package/dist/modules/customers/api/people/[id]/companies/enriched/route.js.map +7 -0
  116. package/dist/modules/customers/api/people/[id]/companies/route.js +205 -0
  117. package/dist/modules/customers/api/people/[id]/companies/route.js.map +7 -0
  118. package/dist/modules/customers/api/people/[id]/roles/route.js +22 -0
  119. package/dist/modules/customers/api/people/[id]/roles/route.js.map +7 -0
  120. package/dist/modules/customers/api/people/[id]/route.js +134 -21
  121. package/dist/modules/customers/api/people/[id]/route.js.map +2 -2
  122. package/dist/modules/customers/api/people/route.js +122 -23
  123. package/dist/modules/customers/api/people/route.js.map +2 -2
  124. package/dist/modules/customers/api/todos/route.js +4 -0
  125. package/dist/modules/customers/api/todos/route.js.map +2 -2
  126. package/dist/modules/customers/api/utils.js +22 -0
  127. package/dist/modules/customers/api/utils.js.map +2 -2
  128. package/dist/modules/customers/backend/config/customers/page.js +2 -6
  129. package/dist/modules/customers/backend/config/customers/page.js.map +2 -2
  130. package/dist/modules/customers/backend/customers/companies/page.js +37 -26
  131. package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
  132. package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js +265 -262
  133. package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js.map +3 -3
  134. package/dist/modules/customers/backend/customers/deals/[id]/hooks/formatters.js +23 -0
  135. package/dist/modules/customers/backend/customers/deals/[id]/hooks/formatters.js.map +7 -0
  136. package/dist/modules/customers/backend/customers/deals/[id]/hooks/types.js +1 -0
  137. package/dist/modules/customers/backend/customers/deals/[id]/hooks/types.js.map +7 -0
  138. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealActivities.js +43 -0
  139. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealActivities.js.map +7 -0
  140. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealAssociations.js +264 -0
  141. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealAssociations.js.map +7 -0
  142. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealClosure.js +88 -0
  143. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealClosure.js.map +7 -0
  144. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealData.js +41 -0
  145. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealData.js.map +7 -0
  146. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealFormHandlers.js +66 -0
  147. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealFormHandlers.js.map +7 -0
  148. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealInjectedTabs.js +39 -0
  149. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealInjectedTabs.js.map +7 -0
  150. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealMutationContext.js +49 -0
  151. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealMutationContext.js.map +7 -0
  152. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealPipeline.js +43 -0
  153. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealPipeline.js.map +7 -0
  154. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useScheduleDialog.js +28 -0
  155. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useScheduleDialog.js.map +7 -0
  156. package/dist/modules/customers/backend/customers/deals/[id]/page.js +556 -503
  157. package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +3 -3
  158. package/dist/modules/customers/backend/customers/deals/page.js +66 -21
  159. package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
  160. package/dist/modules/customers/backend/customers/people/page.js +36 -28
  161. package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
  162. package/dist/modules/customers/backend/customers/people-v2/[id]/page.js +318 -203
  163. package/dist/modules/customers/backend/customers/people-v2/[id]/page.js.map +3 -3
  164. package/dist/modules/customers/cli.js +105 -13
  165. package/dist/modules/customers/cli.js.map +2 -2
  166. package/dist/modules/customers/commands/activities.js +6 -0
  167. package/dist/modules/customers/commands/activities.js.map +2 -2
  168. package/dist/modules/customers/commands/deals.js +315 -107
  169. package/dist/modules/customers/commands/deals.js.map +2 -2
  170. package/dist/modules/customers/commands/dictionaries.js +166 -32
  171. package/dist/modules/customers/commands/dictionaries.js.map +2 -2
  172. package/dist/modules/customers/commands/dictionaryKindSettings.js +208 -0
  173. package/dist/modules/customers/commands/dictionaryKindSettings.js.map +7 -0
  174. package/dist/modules/customers/commands/entity-roles.js +415 -0
  175. package/dist/modules/customers/commands/entity-roles.js.map +7 -0
  176. package/dist/modules/customers/commands/index.js +4 -0
  177. package/dist/modules/customers/commands/index.js.map +2 -2
  178. package/dist/modules/customers/commands/interactions.js +108 -21
  179. package/dist/modules/customers/commands/interactions.js.map +2 -2
  180. package/dist/modules/customers/commands/labels.js +539 -0
  181. package/dist/modules/customers/commands/labels.js.map +7 -0
  182. package/dist/modules/customers/commands/people.js +560 -463
  183. package/dist/modules/customers/commands/people.js.map +3 -3
  184. package/dist/modules/customers/commands/personCompanyLinks.js +568 -0
  185. package/dist/modules/customers/commands/personCompanyLinks.js.map +7 -0
  186. package/dist/modules/customers/commands/shared.js +12 -4
  187. package/dist/modules/customers/commands/shared.js.map +2 -2
  188. package/dist/modules/customers/commands/todos.js +10 -1
  189. package/dist/modules/customers/commands/todos.js.map +2 -2
  190. package/dist/modules/customers/components/AddressEditor.js +1 -1
  191. package/dist/modules/customers/components/AddressEditor.js.map +2 -2
  192. package/dist/modules/customers/components/CustomersConfigurationSections.js +31 -0
  193. package/dist/modules/customers/components/CustomersConfigurationSections.js.map +7 -0
  194. package/dist/modules/customers/components/DictionarySettings.js +37 -2
  195. package/dist/modules/customers/components/DictionarySettings.js.map +2 -2
  196. package/dist/modules/customers/components/detail/ActiveDealCard.js +121 -0
  197. package/dist/modules/customers/components/detail/ActiveDealCard.js.map +7 -0
  198. package/dist/modules/customers/components/detail/ActivitiesSection.js +222 -331
  199. package/dist/modules/customers/components/detail/ActivitiesSection.js.map +3 -3
  200. package/dist/modules/customers/components/detail/ActivityAiActions.js +36 -0
  201. package/dist/modules/customers/components/detail/ActivityAiActions.js.map +7 -0
  202. package/dist/modules/customers/components/detail/ActivityCard.js +126 -0
  203. package/dist/modules/customers/components/detail/ActivityCard.js.map +7 -0
  204. package/dist/modules/customers/components/detail/ActivityHistorySection.js +340 -0
  205. package/dist/modules/customers/components/detail/ActivityHistorySection.js.map +7 -0
  206. package/dist/modules/customers/components/detail/ActivityLogTab.js +56 -0
  207. package/dist/modules/customers/components/detail/ActivityLogTab.js.map +7 -0
  208. package/dist/modules/customers/components/detail/ActivityTimeline.js +108 -0
  209. package/dist/modules/customers/components/detail/ActivityTimeline.js.map +7 -0
  210. package/dist/modules/customers/components/detail/ActivityTimelineFilters.js +139 -0
  211. package/dist/modules/customers/components/detail/ActivityTimelineFilters.js.map +7 -0
  212. package/dist/modules/customers/components/detail/ActivityTypeSelector.js +42 -0
  213. package/dist/modules/customers/components/detail/ActivityTypeSelector.js.map +7 -0
  214. package/dist/modules/customers/components/detail/AiActionChips.js +38 -0
  215. package/dist/modules/customers/components/detail/AiActionChips.js.map +7 -0
  216. package/dist/modules/customers/components/detail/AssignRoleDialog.js +534 -0
  217. package/dist/modules/customers/components/detail/AssignRoleDialog.js.map +7 -0
  218. package/dist/modules/customers/components/detail/ChangelogEntryRow.js +79 -0
  219. package/dist/modules/customers/components/detail/ChangelogEntryRow.js.map +7 -0
  220. package/dist/modules/customers/components/detail/ChangelogFilters.js +176 -0
  221. package/dist/modules/customers/components/detail/ChangelogFilters.js.map +7 -0
  222. package/dist/modules/customers/components/detail/ChangelogKpiCards.js +88 -0
  223. package/dist/modules/customers/components/detail/ChangelogKpiCards.js.map +7 -0
  224. package/dist/modules/customers/components/detail/ChangelogTab.js +470 -0
  225. package/dist/modules/customers/components/detail/ChangelogTab.js.map +7 -0
  226. package/dist/modules/customers/components/detail/ComingSoonPlaceholder.js +16 -0
  227. package/dist/modules/customers/components/detail/ComingSoonPlaceholder.js.map +7 -0
  228. package/dist/modules/customers/components/detail/CompanyCard.js +283 -0
  229. package/dist/modules/customers/components/detail/CompanyCard.js.map +7 -0
  230. package/dist/modules/customers/components/detail/CompanyDashboardTab.js +133 -0
  231. package/dist/modules/customers/components/detail/CompanyDashboardTab.js.map +7 -0
  232. package/dist/modules/customers/components/detail/CompanyDetailHeader.js +191 -0
  233. package/dist/modules/customers/components/detail/CompanyDetailHeader.js.map +7 -0
  234. package/dist/modules/customers/components/detail/CompanyDetailTabs.js +123 -0
  235. package/dist/modules/customers/components/detail/CompanyDetailTabs.js.map +7 -0
  236. package/dist/modules/customers/components/detail/CompanyKpiBar.js +174 -0
  237. package/dist/modules/customers/components/detail/CompanyKpiBar.js.map +7 -0
  238. package/dist/modules/customers/components/detail/CompanyPeopleSection.js +514 -230
  239. package/dist/modules/customers/components/detail/CompanyPeopleSection.js.map +2 -2
  240. package/dist/modules/customers/components/detail/CompanyTagsDialog.js +22 -0
  241. package/dist/modules/customers/components/detail/CompanyTagsDialog.js.map +7 -0
  242. package/dist/modules/customers/components/detail/ConfirmDealLostDialog.js +159 -0
  243. package/dist/modules/customers/components/detail/ConfirmDealLostDialog.js.map +7 -0
  244. package/dist/modules/customers/components/detail/CreatePersonDialog.js +135 -0
  245. package/dist/modules/customers/components/detail/CreatePersonDialog.js.map +7 -0
  246. package/dist/modules/customers/components/detail/DealClosureActionBar.js +59 -0
  247. package/dist/modules/customers/components/detail/DealClosureActionBar.js.map +7 -0
  248. package/dist/modules/customers/components/detail/DealDetailHeader.js +237 -0
  249. package/dist/modules/customers/components/detail/DealDetailHeader.js.map +7 -0
  250. package/dist/modules/customers/components/detail/DealDetailTabs.js +109 -0
  251. package/dist/modules/customers/components/detail/DealDetailTabs.js.map +7 -0
  252. package/dist/modules/customers/components/detail/DealForm.js +219 -92
  253. package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
  254. package/dist/modules/customers/components/detail/DealLinkedEntitiesTab.js +295 -0
  255. package/dist/modules/customers/components/detail/DealLinkedEntitiesTab.js.map +7 -0
  256. package/dist/modules/customers/components/detail/DealLostSummaryDialog.js +107 -0
  257. package/dist/modules/customers/components/detail/DealLostSummaryDialog.js.map +7 -0
  258. package/dist/modules/customers/components/detail/DealWonPopup.js +113 -0
  259. package/dist/modules/customers/components/detail/DealWonPopup.js.map +7 -0
  260. package/dist/modules/customers/components/detail/DealsSection.js +206 -193
  261. package/dist/modules/customers/components/detail/DealsSection.js.map +2 -2
  262. package/dist/modules/customers/components/detail/DecisionMakersFooter.js +39 -0
  263. package/dist/modules/customers/components/detail/DecisionMakersFooter.js.map +7 -0
  264. package/dist/modules/customers/components/detail/EntityTagsDialog.js +1096 -0
  265. package/dist/modules/customers/components/detail/EntityTagsDialog.js.map +7 -0
  266. package/dist/modules/customers/components/detail/InlineActivityComposer.js +197 -0
  267. package/dist/modules/customers/components/detail/InlineActivityComposer.js.map +7 -0
  268. package/dist/modules/customers/components/detail/ManageTagsDialog.js +1091 -0
  269. package/dist/modules/customers/components/detail/ManageTagsDialog.js.map +7 -0
  270. package/dist/modules/customers/components/detail/MiniWeekCalendar.js +272 -0
  271. package/dist/modules/customers/components/detail/MiniWeekCalendar.js.map +7 -0
  272. package/dist/modules/customers/components/detail/MobilePersonDetail.js +106 -0
  273. package/dist/modules/customers/components/detail/MobilePersonDetail.js.map +7 -0
  274. package/dist/modules/customers/components/detail/NextStepCard.js +72 -0
  275. package/dist/modules/customers/components/detail/NextStepCard.js.map +7 -0
  276. package/dist/modules/customers/components/detail/PersonCard.js +192 -0
  277. package/dist/modules/customers/components/detail/PersonCard.js.map +7 -0
  278. package/dist/modules/customers/components/detail/PersonCompaniesSection.js +345 -0
  279. package/dist/modules/customers/components/detail/PersonCompaniesSection.js.map +7 -0
  280. package/dist/modules/customers/components/detail/PersonDetailHeader.js +220 -0
  281. package/dist/modules/customers/components/detail/PersonDetailHeader.js.map +7 -0
  282. package/dist/modules/customers/components/detail/PersonDetailTabs.js +122 -0
  283. package/dist/modules/customers/components/detail/PersonDetailTabs.js.map +7 -0
  284. package/dist/modules/customers/components/detail/PersonTagsDialog.js +24 -0
  285. package/dist/modules/customers/components/detail/PersonTagsDialog.js.map +7 -0
  286. package/dist/modules/customers/components/detail/PipelineStepper.js +191 -0
  287. package/dist/modules/customers/components/detail/PipelineStepper.js.map +7 -0
  288. package/dist/modules/customers/components/detail/PlannedActivitiesSection.js +222 -0
  289. package/dist/modules/customers/components/detail/PlannedActivitiesSection.js.map +7 -0
  290. package/dist/modules/customers/components/detail/RelationshipHealthCard.js +49 -0
  291. package/dist/modules/customers/components/detail/RelationshipHealthCard.js.map +7 -0
  292. package/dist/modules/customers/components/detail/RoleAssignmentRow.js +189 -0
  293. package/dist/modules/customers/components/detail/RoleAssignmentRow.js.map +7 -0
  294. package/dist/modules/customers/components/detail/RolesSection.js +234 -0
  295. package/dist/modules/customers/components/detail/RolesSection.js.map +7 -0
  296. package/dist/modules/customers/components/detail/ScheduleActivityDialog.js +410 -0
  297. package/dist/modules/customers/components/detail/ScheduleActivityDialog.js.map +7 -0
  298. package/dist/modules/customers/components/detail/aiActionCatalog.js +41 -0
  299. package/dist/modules/customers/components/detail/aiActionCatalog.js.map +7 -0
  300. package/dist/modules/customers/components/detail/assignableStaff.js +48 -0
  301. package/dist/modules/customers/components/detail/assignableStaff.js.map +7 -0
  302. package/dist/modules/customers/components/detail/dashboard/ActiveDealWidget.js +48 -0
  303. package/dist/modules/customers/components/detail/dashboard/ActiveDealWidget.js.map +7 -0
  304. package/dist/modules/customers/components/detail/dashboard/OpenTasksWidget.js +86 -0
  305. package/dist/modules/customers/components/detail/dashboard/OpenTasksWidget.js.map +7 -0
  306. package/dist/modules/customers/components/detail/dashboard/RecentActivityWidget.js +53 -0
  307. package/dist/modules/customers/components/detail/dashboard/RecentActivityWidget.js.map +7 -0
  308. package/dist/modules/customers/components/detail/dashboard/RelationshipHealthWidget.js +30 -0
  309. package/dist/modules/customers/components/detail/dashboard/RelationshipHealthWidget.js.map +7 -0
  310. package/dist/modules/customers/components/detail/dashboard/UpcomingMeetingsWidget.js +43 -0
  311. package/dist/modules/customers/components/detail/dashboard/UpcomingMeetingsWidget.js.map +7 -0
  312. package/dist/modules/customers/components/detail/dashboard/helpers.js +71 -0
  313. package/dist/modules/customers/components/detail/dashboard/helpers.js.map +7 -0
  314. package/dist/modules/customers/components/detail/healthScoreUtils.js +69 -0
  315. package/dist/modules/customers/components/detail/healthScoreUtils.js.map +7 -0
  316. package/dist/modules/customers/components/detail/hooks/useCurrencyDictionary.js +5 -5
  317. package/dist/modules/customers/components/detail/hooks/useCurrencyDictionary.js.map +2 -2
  318. package/dist/modules/customers/components/detail/hooks/useCustomerDictionary.js +9 -8
  319. package/dist/modules/customers/components/detail/hooks/useCustomerDictionary.js.map +3 -3
  320. package/dist/modules/customers/components/detail/hooks/useInteractionMutations.js +65 -0
  321. package/dist/modules/customers/components/detail/hooks/useInteractionMutations.js.map +7 -0
  322. package/dist/modules/customers/components/detail/notesAdapter.js +70 -30
  323. package/dist/modules/customers/components/detail/notesAdapter.js.map +2 -2
  324. package/dist/modules/customers/components/detail/pipelineStageUtils.js +26 -0
  325. package/dist/modules/customers/components/detail/pipelineStageUtils.js.map +7 -0
  326. package/dist/modules/customers/components/detail/schedule/DateTimeFields.js +144 -0
  327. package/dist/modules/customers/components/detail/schedule/DateTimeFields.js.map +7 -0
  328. package/dist/modules/customers/components/detail/schedule/FooterFields.js +60 -0
  329. package/dist/modules/customers/components/detail/schedule/FooterFields.js.map +7 -0
  330. package/dist/modules/customers/components/detail/schedule/LinkedEntitiesField.js +216 -0
  331. package/dist/modules/customers/components/detail/schedule/LinkedEntitiesField.js.map +7 -0
  332. package/dist/modules/customers/components/detail/schedule/LocationField.js +34 -0
  333. package/dist/modules/customers/components/detail/schedule/LocationField.js.map +7 -0
  334. package/dist/modules/customers/components/detail/schedule/ParticipantsField.js +226 -0
  335. package/dist/modules/customers/components/detail/schedule/ParticipantsField.js.map +7 -0
  336. package/dist/modules/customers/components/detail/schedule/fieldConfig.js +69 -0
  337. package/dist/modules/customers/components/detail/schedule/fieldConfig.js.map +7 -0
  338. package/dist/modules/customers/components/detail/schedule/index.js +21 -0
  339. package/dist/modules/customers/components/detail/schedule/index.js.map +7 -0
  340. package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js +172 -0
  341. package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js.map +7 -0
  342. package/dist/modules/customers/components/detail/utils.js +23 -0
  343. package/dist/modules/customers/components/detail/utils.js.map +2 -2
  344. package/dist/modules/customers/components/formConfig.js +144 -22
  345. package/dist/modules/customers/components/formConfig.js.map +2 -2
  346. package/dist/modules/customers/components/linking/LinkEntityDialog.js +661 -0
  347. package/dist/modules/customers/components/linking/LinkEntityDialog.js.map +7 -0
  348. package/dist/modules/customers/components/linking/adapters/companyAdapter.js +252 -0
  349. package/dist/modules/customers/components/linking/adapters/companyAdapter.js.map +7 -0
  350. package/dist/modules/customers/components/linking/adapters/dealAdapter.js +384 -0
  351. package/dist/modules/customers/components/linking/adapters/dealAdapter.js.map +7 -0
  352. package/dist/modules/customers/components/linking/adapters/personAdapter.js +324 -0
  353. package/dist/modules/customers/components/linking/adapters/personAdapter.js.map +7 -0
  354. package/dist/modules/customers/components/list/CollectionPreviewCell.js +53 -0
  355. package/dist/modules/customers/components/list/CollectionPreviewCell.js.map +7 -0
  356. package/dist/modules/customers/data/entities.js +407 -1
  357. package/dist/modules/customers/data/entities.js.map +2 -2
  358. package/dist/modules/customers/data/validators.js +139 -21
  359. package/dist/modules/customers/data/validators.js.map +2 -2
  360. package/dist/modules/customers/events.js +19 -1
  361. package/dist/modules/customers/events.js.map +2 -2
  362. package/dist/modules/customers/lib/customerRoleTypes.js +19 -0
  363. package/dist/modules/customers/lib/customerRoleTypes.js.map +7 -0
  364. package/dist/modules/customers/lib/dealClosureNotification.js +39 -0
  365. package/dist/modules/customers/lib/dealClosureNotification.js.map +7 -0
  366. package/dist/modules/customers/lib/dealStageTransitionTable.js +29 -0
  367. package/dist/modules/customers/lib/dealStageTransitionTable.js.map +7 -0
  368. package/dist/modules/customers/lib/dictionaries.js +25 -0
  369. package/dist/modules/customers/lib/dictionaries.js.map +2 -2
  370. package/dist/modules/customers/lib/interactionReadModel.js +10 -0
  371. package/dist/modules/customers/lib/interactionReadModel.js.map +2 -2
  372. package/dist/modules/customers/lib/personCompanies.js +235 -0
  373. package/dist/modules/customers/lib/personCompanies.js.map +7 -0
  374. package/dist/modules/customers/lib/personCompanyLinkTable.js +42 -0
  375. package/dist/modules/customers/lib/personCompanyLinkTable.js.map +7 -0
  376. package/dist/modules/customers/lib/roleTypeUsage.js +104 -0
  377. package/dist/modules/customers/lib/roleTypeUsage.js.map +7 -0
  378. package/dist/modules/customers/migrations/Migration20260406214502.js +18 -0
  379. package/dist/modules/customers/migrations/Migration20260406214502.js.map +7 -0
  380. package/dist/modules/customers/migrations/Migration20260408135736.js +17 -0
  381. package/dist/modules/customers/migrations/Migration20260408135736.js.map +7 -0
  382. package/dist/modules/customers/migrations/Migration20260408225345.js +21 -0
  383. package/dist/modules/customers/migrations/Migration20260408225345.js.map +7 -0
  384. package/dist/modules/customers/migrations/Migration20260411075533.js +27 -0
  385. package/dist/modules/customers/migrations/Migration20260411075533.js.map +7 -0
  386. package/dist/modules/customers/migrations/Migration20260411103551.js +13 -0
  387. package/dist/modules/customers/migrations/Migration20260411103551.js.map +7 -0
  388. package/dist/modules/customers/migrations/Migration20260411130944.js +26 -0
  389. package/dist/modules/customers/migrations/Migration20260411130944.js.map +7 -0
  390. package/dist/modules/customers/migrations/Migration20260415095203.js +13 -0
  391. package/dist/modules/customers/migrations/Migration20260415095203.js.map +7 -0
  392. package/dist/modules/customers/migrations/Migration20260415135056.js +20 -0
  393. package/dist/modules/customers/migrations/Migration20260415135056.js.map +7 -0
  394. package/dist/modules/customers/migrations/Migration20260417140000.js +15 -0
  395. package/dist/modules/customers/migrations/Migration20260417140000.js.map +7 -0
  396. package/dist/modules/customers/migrations/Migration20260417160000.js +17 -0
  397. package/dist/modules/customers/migrations/Migration20260417160000.js.map +7 -0
  398. package/dist/modules/customers/migrations/Migration20260417235407.js +13 -0
  399. package/dist/modules/customers/migrations/Migration20260417235407.js.map +7 -0
  400. package/dist/modules/customers/setup.js +16 -1
  401. package/dist/modules/customers/setup.js.map +2 -2
  402. package/dist/modules/customers/subscribers/deal-closure-notification.js +16 -0
  403. package/dist/modules/customers/subscribers/deal-closure-notification.js.map +7 -0
  404. package/dist/modules/customers/subscribers/deal-lost-notification.js +16 -0
  405. package/dist/modules/customers/subscribers/deal-lost-notification.js.map +7 -0
  406. package/dist/modules/data_sync/backend/data-sync/page.js +3 -3
  407. package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
  408. package/dist/modules/data_sync/components/IntegrationScheduleTab.js +5 -5
  409. package/dist/modules/data_sync/components/IntegrationScheduleTab.js.map +2 -2
  410. package/dist/modules/dictionaries/api/[dictionaryId]/entries/[entryId]/route.js +2 -0
  411. package/dist/modules/dictionaries/api/[dictionaryId]/entries/[entryId]/route.js.map +2 -2
  412. package/dist/modules/dictionaries/api/[dictionaryId]/entries/reorder/route.js +154 -0
  413. package/dist/modules/dictionaries/api/[dictionaryId]/entries/reorder/route.js.map +7 -0
  414. package/dist/modules/dictionaries/api/[dictionaryId]/entries/route.js +6 -2
  415. package/dist/modules/dictionaries/api/[dictionaryId]/entries/route.js.map +2 -2
  416. package/dist/modules/dictionaries/api/[dictionaryId]/entries/set-default/route.js +154 -0
  417. package/dist/modules/dictionaries/api/[dictionaryId]/entries/set-default/route.js.map +7 -0
  418. package/dist/modules/dictionaries/api/context.js +8 -1
  419. package/dist/modules/dictionaries/api/context.js.map +2 -2
  420. package/dist/modules/dictionaries/api/openapi.js +18 -1
  421. package/dist/modules/dictionaries/api/openapi.js.map +2 -2
  422. package/dist/modules/dictionaries/commands/entry-operations.js +388 -0
  423. package/dist/modules/dictionaries/commands/entry-operations.js.map +7 -0
  424. package/dist/modules/dictionaries/commands/factory.js +24 -3
  425. package/dist/modules/dictionaries/commands/factory.js.map +2 -2
  426. package/dist/modules/dictionaries/commands/index.js +1 -0
  427. package/dist/modules/dictionaries/commands/index.js.map +2 -2
  428. package/dist/modules/dictionaries/components/DictionaryTable.js +6 -3
  429. package/dist/modules/dictionaries/components/DictionaryTable.js.map +2 -2
  430. package/dist/modules/dictionaries/data/entities.js +11 -1
  431. package/dist/modules/dictionaries/data/entities.js.map +2 -2
  432. package/dist/modules/dictionaries/data/validators.js +28 -2
  433. package/dist/modules/dictionaries/data/validators.js.map +2 -2
  434. package/dist/modules/dictionaries/events.js +18 -0
  435. package/dist/modules/dictionaries/events.js.map +7 -0
  436. package/dist/modules/dictionaries/lib/clientEntries.js +43 -0
  437. package/dist/modules/dictionaries/lib/clientEntries.js.map +7 -0
  438. package/dist/modules/dictionaries/migrations/Migration20260410171544.js +45 -0
  439. package/dist/modules/dictionaries/migrations/Migration20260410171544.js.map +7 -0
  440. package/dist/modules/inbox_ops/api/proposals/[id]/route.js +4 -1
  441. package/dist/modules/inbox_ops/api/proposals/[id]/route.js.map +2 -2
  442. package/dist/modules/portal/frontend/[orgSlug]/portal/login/page.js +3 -3
  443. package/dist/modules/portal/frontend/[orgSlug]/portal/login/page.js.map +2 -2
  444. package/dist/modules/portal/frontend/[orgSlug]/portal/page.js +2 -2
  445. package/dist/modules/portal/frontend/[orgSlug]/portal/page.js.map +2 -2
  446. package/dist/modules/portal/frontend/[orgSlug]/portal/signup/page.js +3 -3
  447. package/dist/modules/portal/frontend/[orgSlug]/portal/signup/page.js.map +2 -2
  448. package/dist/modules/portal/frontend/[orgSlug]/portal/verify/page.js +2 -2
  449. package/dist/modules/portal/frontend/[orgSlug]/portal/verify/page.js.map +2 -2
  450. package/dist/modules/query_index/lib/engine.js +1 -1
  451. package/dist/modules/query_index/lib/engine.js.map +2 -2
  452. package/dist/modules/sales/components/documents/AddressesSection.js +82 -42
  453. package/dist/modules/sales/components/documents/AddressesSection.js.map +2 -2
  454. package/dist/modules/sales/lib/dictionaries.js +16 -0
  455. package/dist/modules/sales/lib/dictionaries.js.map +2 -2
  456. package/dist/modules/sales/widgets/injection-table.js +5 -1
  457. package/dist/modules/sales/widgets/injection-table.js.map +2 -2
  458. package/generated/entities/action_log/index.ts +4 -0
  459. package/generated/entities/customer_company_billing/index.ts +10 -0
  460. package/generated/entities/customer_deal/index.ts +4 -0
  461. package/generated/entities/customer_deal_stage_transition/index.ts +14 -0
  462. package/generated/entities/customer_dictionary_kind_setting/index.ts +9 -0
  463. package/generated/entities/customer_entity/index.ts +4 -0
  464. package/generated/entities/customer_entity_role/index.ts +10 -0
  465. package/generated/entities/customer_interaction/index.ts +11 -0
  466. package/generated/entities/customer_label/index.ts +8 -0
  467. package/generated/entities/customer_label_assignment/index.ts +7 -0
  468. package/generated/entities/customer_person_company_link/index.ts +9 -0
  469. package/generated/entities/customer_person_company_role/index.ts +7 -0
  470. package/generated/entities/dictionary_entry/index.ts +2 -0
  471. package/generated/entities.ids.generated.ts +9 -1
  472. package/generated/entity-fields-registry.ts +116 -1
  473. package/package.json +3 -3
  474. package/src/modules/attachments/api/route.ts +48 -6
  475. package/src/modules/attachments/i18n/de.json +4 -0
  476. package/src/modules/attachments/i18n/en.json +4 -0
  477. package/src/modules/attachments/i18n/es.json +4 -0
  478. package/src/modules/attachments/i18n/pl.json +4 -0
  479. package/src/modules/audit_logs/api/audit-logs/actions/export/route.ts +260 -0
  480. package/src/modules/audit_logs/api/audit-logs/actions/route.ts +81 -6
  481. package/src/modules/audit_logs/cli.ts +79 -0
  482. package/src/modules/audit_logs/components/AuditLogsActions.tsx +6 -4
  483. package/src/modules/audit_logs/data/entities.ts +17 -0
  484. package/src/modules/audit_logs/data/validators.ts +9 -1
  485. package/src/modules/audit_logs/lib/changeRows.ts +47 -0
  486. package/src/modules/audit_logs/lib/display-helpers.tsx +4 -30
  487. package/src/modules/audit_logs/lib/projections.ts +110 -0
  488. package/src/modules/audit_logs/migrations/.snapshot-open-mercato.json +325 -2
  489. package/src/modules/audit_logs/migrations/Migration20260412160533.ts +21 -0
  490. package/src/modules/audit_logs/services/actionLogService.ts +455 -85
  491. package/src/modules/auth/frontend/login.tsx +19 -15
  492. package/src/modules/catalog/i18n/de.json +1 -0
  493. package/src/modules/catalog/i18n/en.json +1 -0
  494. package/src/modules/catalog/i18n/es.json +1 -0
  495. package/src/modules/catalog/i18n/pl.json +1 -0
  496. package/src/modules/customer_accounts/api/signup.ts +3 -4
  497. package/src/modules/customer_accounts/i18n/de.json +2 -0
  498. package/src/modules/customer_accounts/i18n/en.json +2 -0
  499. package/src/modules/customer_accounts/i18n/es.json +2 -0
  500. package/src/modules/customer_accounts/i18n/pl.json +2 -0
  501. package/src/modules/customers/acl.ts +2 -0
  502. package/src/modules/customers/api/activities/route.ts +4 -0
  503. package/src/modules/customers/api/assignable-staff/route.ts +250 -0
  504. package/src/modules/customers/api/companies/[id]/people/route.ts +244 -0
  505. package/src/modules/customers/api/companies/[id]/roles/route.ts +15 -0
  506. package/src/modules/customers/api/companies/[id]/route.ts +458 -40
  507. package/src/modules/customers/api/companies/route.ts +93 -15
  508. package/src/modules/customers/api/deals/[id]/companies/route.ts +203 -0
  509. package/src/modules/customers/api/deals/[id]/people/route.ts +182 -0
  510. package/src/modules/customers/api/deals/[id]/route.ts +554 -57
  511. package/src/modules/customers/api/deals/[id]/stats/route.ts +221 -0
  512. package/src/modules/customers/api/deals/route.ts +35 -46
  513. package/src/modules/customers/api/dictionaries/[kind]/[id]/route.ts +105 -3
  514. package/src/modules/customers/api/dictionaries/[kind]/route.ts +143 -44
  515. package/src/modules/customers/api/dictionaries/context.ts +45 -16
  516. package/src/modules/customers/api/dictionaries/kind-settings/route.ts +232 -0
  517. package/src/modules/customers/api/entity-roles-factory.ts +520 -0
  518. package/src/modules/customers/api/interactions/conflicts/route.ts +196 -0
  519. package/src/modules/customers/api/interactions/counts/route.ts +112 -0
  520. package/src/modules/customers/api/interactions/route.ts +95 -2
  521. package/src/modules/customers/api/labels/assign/route.ts +202 -0
  522. package/src/modules/customers/api/labels/auth.ts +19 -0
  523. package/src/modules/customers/api/labels/route.ts +310 -0
  524. package/src/modules/customers/api/labels/table-errors.ts +36 -0
  525. package/src/modules/customers/api/labels/unassign/route.ts +197 -0
  526. package/src/modules/customers/api/people/[id]/companies/[linkId]/route.ts +331 -0
  527. package/src/modules/customers/api/people/[id]/companies/context.ts +70 -0
  528. package/src/modules/customers/api/people/[id]/companies/enriched/route.ts +384 -0
  529. package/src/modules/customers/api/people/[id]/companies/route.ts +215 -0
  530. package/src/modules/customers/api/people/[id]/roles/route.ts +15 -0
  531. package/src/modules/customers/api/people/[id]/route.ts +153 -26
  532. package/src/modules/customers/api/people/route.ts +134 -31
  533. package/src/modules/customers/api/todos/route.ts +4 -0
  534. package/src/modules/customers/api/utils.ts +36 -0
  535. package/src/modules/customers/backend/config/customers/page.tsx +2 -6
  536. package/src/modules/customers/backend/customers/companies/page.tsx +36 -26
  537. package/src/modules/customers/backend/customers/companies-v2/[id]/page.tsx +277 -262
  538. package/src/modules/customers/backend/customers/deals/[id]/hooks/formatters.ts +19 -0
  539. package/src/modules/customers/backend/customers/deals/[id]/hooks/types.ts +104 -0
  540. package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealActivities.ts +60 -0
  541. package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealAssociations.ts +362 -0
  542. package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealClosure.ts +113 -0
  543. package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealData.ts +52 -0
  544. package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealFormHandlers.ts +86 -0
  545. package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealInjectedTabs.tsx +60 -0
  546. package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealMutationContext.ts +76 -0
  547. package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealPipeline.ts +56 -0
  548. package/src/modules/customers/backend/customers/deals/[id]/hooks/useScheduleDialog.ts +38 -0
  549. package/src/modules/customers/backend/customers/deals/[id]/page.tsx +587 -624
  550. package/src/modules/customers/backend/customers/deals/page.tsx +71 -28
  551. package/src/modules/customers/backend/customers/people/page.tsx +35 -29
  552. package/src/modules/customers/backend/customers/people-v2/[id]/page.tsx +343 -209
  553. package/src/modules/customers/cli.ts +107 -12
  554. package/src/modules/customers/commands/activities.ts +13 -0
  555. package/src/modules/customers/commands/deals.ts +386 -114
  556. package/src/modules/customers/commands/dictionaries.ts +175 -32
  557. package/src/modules/customers/commands/dictionaryKindSettings.ts +268 -0
  558. package/src/modules/customers/commands/entity-roles.ts +494 -0
  559. package/src/modules/customers/commands/index.ts +4 -0
  560. package/src/modules/customers/commands/interactions.ts +125 -21
  561. package/src/modules/customers/commands/labels.ts +626 -0
  562. package/src/modules/customers/commands/people.ts +373 -259
  563. package/src/modules/customers/commands/personCompanyLinks.ts +654 -0
  564. package/src/modules/customers/commands/shared.ts +16 -15
  565. package/src/modules/customers/commands/todos.ts +17 -1
  566. package/src/modules/customers/components/AddressEditor.tsx +1 -1
  567. package/src/modules/customers/components/CustomersConfigurationSections.tsx +36 -0
  568. package/src/modules/customers/components/DictionarySettings.tsx +43 -2
  569. package/src/modules/customers/components/detail/ActiveDealCard.tsx +175 -0
  570. package/src/modules/customers/components/detail/ActivitiesSection.tsx +267 -361
  571. package/src/modules/customers/components/detail/ActivityAiActions.tsx +49 -0
  572. package/src/modules/customers/components/detail/ActivityCard.tsx +154 -0
  573. package/src/modules/customers/components/detail/ActivityHistorySection.tsx +412 -0
  574. package/src/modules/customers/components/detail/ActivityLogTab.tsx +67 -0
  575. package/src/modules/customers/components/detail/ActivityTimeline.tsx +158 -0
  576. package/src/modules/customers/components/detail/ActivityTimelineFilters.tsx +163 -0
  577. package/src/modules/customers/components/detail/ActivityTypeSelector.tsx +53 -0
  578. package/src/modules/customers/components/detail/AiActionChips.tsx +48 -0
  579. package/src/modules/customers/components/detail/AssignRoleDialog.tsx +672 -0
  580. package/src/modules/customers/components/detail/ChangelogEntryRow.tsx +132 -0
  581. package/src/modules/customers/components/detail/ChangelogFilters.tsx +193 -0
  582. package/src/modules/customers/components/detail/ChangelogKpiCards.tsx +107 -0
  583. package/src/modules/customers/components/detail/ChangelogTab.tsx +629 -0
  584. package/src/modules/customers/components/detail/ComingSoonPlaceholder.tsx +21 -0
  585. package/src/modules/customers/components/detail/CompanyCard.tsx +419 -0
  586. package/src/modules/customers/components/detail/CompanyDashboardTab.tsx +161 -0
  587. package/src/modules/customers/components/detail/CompanyDetailHeader.tsx +243 -0
  588. package/src/modules/customers/components/detail/CompanyDetailTabs.tsx +172 -0
  589. package/src/modules/customers/components/detail/CompanyKpiBar.tsx +206 -0
  590. package/src/modules/customers/components/detail/CompanyPeopleSection.tsx +582 -288
  591. package/src/modules/customers/components/detail/CompanyTagsDialog.tsx +23 -0
  592. package/src/modules/customers/components/detail/ConfirmDealLostDialog.tsx +210 -0
  593. package/src/modules/customers/components/detail/CreatePersonDialog.tsx +178 -0
  594. package/src/modules/customers/components/detail/DealClosureActionBar.tsx +63 -0
  595. package/src/modules/customers/components/detail/DealDetailHeader.tsx +335 -0
  596. package/src/modules/customers/components/detail/DealDetailTabs.tsx +154 -0
  597. package/src/modules/customers/components/detail/DealForm.tsx +253 -101
  598. package/src/modules/customers/components/detail/DealLinkedEntitiesTab.tsx +349 -0
  599. package/src/modules/customers/components/detail/DealLostSummaryDialog.tsx +156 -0
  600. package/src/modules/customers/components/detail/DealWonPopup.tsx +164 -0
  601. package/src/modules/customers/components/detail/DealsSection.tsx +276 -221
  602. package/src/modules/customers/components/detail/DecisionMakersFooter.tsx +56 -0
  603. package/src/modules/customers/components/detail/EntityTagsDialog.tsx +1372 -0
  604. package/src/modules/customers/components/detail/InlineActivityComposer.tsx +239 -0
  605. package/src/modules/customers/components/detail/ManageTagsDialog.tsx +1331 -0
  606. package/src/modules/customers/components/detail/MiniWeekCalendar.tsx +338 -0
  607. package/src/modules/customers/components/detail/MobilePersonDetail.tsx +124 -0
  608. package/src/modules/customers/components/detail/NextStepCard.tsx +104 -0
  609. package/src/modules/customers/components/detail/PersonCard.tsx +238 -0
  610. package/src/modules/customers/components/detail/PersonCompaniesSection.tsx +426 -0
  611. package/src/modules/customers/components/detail/PersonDetailHeader.tsx +294 -0
  612. package/src/modules/customers/components/detail/PersonDetailTabs.tsx +172 -0
  613. package/src/modules/customers/components/detail/PersonTagsDialog.tsx +26 -0
  614. package/src/modules/customers/components/detail/PipelineStepper.tsx +245 -0
  615. package/src/modules/customers/components/detail/PlannedActivitiesSection.tsx +255 -0
  616. package/src/modules/customers/components/detail/RelationshipHealthCard.tsx +63 -0
  617. package/src/modules/customers/components/detail/RoleAssignmentRow.tsx +248 -0
  618. package/src/modules/customers/components/detail/RolesSection.tsx +311 -0
  619. package/src/modules/customers/components/detail/ScheduleActivityDialog.tsx +481 -0
  620. package/src/modules/customers/components/detail/aiActionCatalog.ts +77 -0
  621. package/src/modules/customers/components/detail/assignableStaff.ts +124 -0
  622. package/src/modules/customers/components/detail/dashboard/ActiveDealWidget.tsx +63 -0
  623. package/src/modules/customers/components/detail/dashboard/OpenTasksWidget.tsx +114 -0
  624. package/src/modules/customers/components/detail/dashboard/RecentActivityWidget.tsx +69 -0
  625. package/src/modules/customers/components/detail/dashboard/RelationshipHealthWidget.tsx +40 -0
  626. package/src/modules/customers/components/detail/dashboard/UpcomingMeetingsWidget.tsx +64 -0
  627. package/src/modules/customers/components/detail/dashboard/helpers.ts +78 -0
  628. package/src/modules/customers/components/detail/healthScoreUtils.ts +91 -0
  629. package/src/modules/customers/components/detail/hooks/useCurrencyDictionary.ts +8 -8
  630. package/src/modules/customers/components/detail/hooks/useCustomerDictionary.ts +10 -6
  631. package/src/modules/customers/components/detail/hooks/useInteractionMutations.ts +91 -0
  632. package/src/modules/customers/components/detail/notesAdapter.ts +91 -30
  633. package/src/modules/customers/components/detail/pipelineStageUtils.ts +29 -0
  634. package/src/modules/customers/components/detail/schedule/DateTimeFields.tsx +187 -0
  635. package/src/modules/customers/components/detail/schedule/FooterFields.tsx +79 -0
  636. package/src/modules/customers/components/detail/schedule/LinkedEntitiesField.tsx +277 -0
  637. package/src/modules/customers/components/detail/schedule/LocationField.tsx +42 -0
  638. package/src/modules/customers/components/detail/schedule/ParticipantsField.tsx +255 -0
  639. package/src/modules/customers/components/detail/schedule/fieldConfig.ts +70 -0
  640. package/src/modules/customers/components/detail/schedule/index.ts +9 -0
  641. package/src/modules/customers/components/detail/schedule/useScheduleFormState.ts +221 -0
  642. package/src/modules/customers/components/detail/types.ts +16 -0
  643. package/src/modules/customers/components/detail/utils.ts +25 -0
  644. package/src/modules/customers/components/formConfig.tsx +223 -28
  645. package/src/modules/customers/components/linking/LinkEntityDialog.tsx +920 -0
  646. package/src/modules/customers/components/linking/adapters/companyAdapter.tsx +398 -0
  647. package/src/modules/customers/components/linking/adapters/dealAdapter.tsx +578 -0
  648. package/src/modules/customers/components/linking/adapters/personAdapter.tsx +512 -0
  649. package/src/modules/customers/components/list/CollectionPreviewCell.tsx +66 -0
  650. package/src/modules/customers/data/entities.ts +353 -1
  651. package/src/modules/customers/data/validators.ts +170 -19
  652. package/src/modules/customers/events.ts +22 -0
  653. package/src/modules/customers/i18n/de.json +841 -2
  654. package/src/modules/customers/i18n/en.json +841 -2
  655. package/src/modules/customers/i18n/es.json +840 -1
  656. package/src/modules/customers/i18n/pl.json +841 -2
  657. package/src/modules/customers/lib/customerRoleTypes.ts +24 -0
  658. package/src/modules/customers/lib/dealClosureNotification.ts +64 -0
  659. package/src/modules/customers/lib/dealStageTransitionTable.ts +32 -0
  660. package/src/modules/customers/lib/dictionaries.ts +26 -10
  661. package/src/modules/customers/lib/interactionReadModel.ts +10 -0
  662. package/src/modules/customers/lib/personCompanies.ts +317 -0
  663. package/src/modules/customers/lib/personCompanyLinkTable.ts +58 -0
  664. package/src/modules/customers/lib/roleTypeUsage.ts +146 -0
  665. package/src/modules/customers/migrations/.snapshot-open-mercato.json +2747 -798
  666. package/src/modules/customers/migrations/Migration20260406214502.ts +19 -0
  667. package/src/modules/customers/migrations/Migration20260408135736.ts +15 -0
  668. package/src/modules/customers/migrations/Migration20260408225345.ts +23 -0
  669. package/src/modules/customers/migrations/Migration20260411075533.ts +30 -0
  670. package/src/modules/customers/migrations/Migration20260411103551.ts +13 -0
  671. package/src/modules/customers/migrations/Migration20260411130944.ts +30 -0
  672. package/src/modules/customers/migrations/Migration20260415095203.ts +13 -0
  673. package/src/modules/customers/migrations/Migration20260415135056.ts +22 -0
  674. package/src/modules/customers/migrations/Migration20260417140000.ts +15 -0
  675. package/src/modules/customers/migrations/Migration20260417160000.ts +17 -0
  676. package/src/modules/customers/migrations/Migration20260417235407.ts +13 -0
  677. package/src/modules/customers/setup.ts +15 -0
  678. package/src/modules/customers/subscribers/deal-closure-notification.ts +22 -0
  679. package/src/modules/customers/subscribers/deal-lost-notification.ts +22 -0
  680. package/src/modules/data_sync/backend/data-sync/page.tsx +9 -9
  681. package/src/modules/data_sync/components/IntegrationScheduleTab.tsx +21 -13
  682. package/src/modules/dictionaries/api/[dictionaryId]/entries/[entryId]/route.ts +2 -0
  683. package/src/modules/dictionaries/api/[dictionaryId]/entries/reorder/route.ts +162 -0
  684. package/src/modules/dictionaries/api/[dictionaryId]/entries/route.ts +6 -2
  685. package/src/modules/dictionaries/api/[dictionaryId]/entries/set-default/route.ts +162 -0
  686. package/src/modules/dictionaries/api/context.ts +9 -0
  687. package/src/modules/dictionaries/api/openapi.ts +17 -0
  688. package/src/modules/dictionaries/commands/entry-operations.ts +457 -0
  689. package/src/modules/dictionaries/commands/factory.ts +31 -3
  690. package/src/modules/dictionaries/commands/index.ts +1 -0
  691. package/src/modules/dictionaries/components/DictionaryTable.tsx +15 -6
  692. package/src/modules/dictionaries/data/entities.ts +9 -0
  693. package/src/modules/dictionaries/data/validators.ts +34 -0
  694. package/src/modules/dictionaries/events.ts +20 -0
  695. package/src/modules/dictionaries/i18n/de.json +2 -0
  696. package/src/modules/dictionaries/i18n/en.json +2 -0
  697. package/src/modules/dictionaries/i18n/es.json +2 -0
  698. package/src/modules/dictionaries/i18n/pl.json +2 -0
  699. package/src/modules/dictionaries/lib/clientEntries.ts +66 -0
  700. package/src/modules/dictionaries/migrations/.snapshot-open-mercato.json +185 -3
  701. package/src/modules/dictionaries/migrations/Migration20260410171544.ts +49 -0
  702. package/src/modules/inbox_ops/api/proposals/[id]/route.ts +4 -1
  703. package/src/modules/portal/frontend/[orgSlug]/portal/login/page.tsx +9 -3
  704. package/src/modules/portal/frontend/[orgSlug]/portal/page.tsx +4 -2
  705. package/src/modules/portal/frontend/[orgSlug]/portal/signup/page.tsx +9 -3
  706. package/src/modules/portal/frontend/[orgSlug]/portal/verify/page.tsx +4 -2
  707. package/src/modules/query_index/lib/engine.ts +9 -1
  708. package/src/modules/sales/components/documents/AddressesSection.tsx +92 -42
  709. package/src/modules/sales/i18n/de.json +28 -0
  710. package/src/modules/sales/i18n/en.json +28 -0
  711. package/src/modules/sales/i18n/es.json +28 -0
  712. package/src/modules/sales/i18n/pl.json +28 -0
  713. package/src/modules/sales/lib/dictionaries.ts +18 -0
  714. package/src/modules/sales/widgets/injection-table.ts +4 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/portal/frontend/%5BorgSlug%5D/portal/login/page.tsx"],
4
- "sourcesContent": ["\"use client\"\nimport { useCallback, useMemo, useState } from 'react'\nimport Link from 'next/link'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Notice } from '@open-mercato/ui/primitives/Notice'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { usePortalContext } from '@open-mercato/ui/portal/PortalContext'\nimport { InjectionSpot } from '@open-mercato/ui/backend/injection/InjectionSpot'\nimport { PortalInjectionSpots } from '@open-mercato/ui/backend/injection/spotIds'\n\ntype Props = { params: { orgSlug: string } }\n\nexport default function PortalLoginPage({ params }: Props) {\n const t = useT()\n const orgSlug = params.orgSlug\n const { tenant } = usePortalContext()\n\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [error, setError] = useState<string | null>(null)\n const [submitting, setSubmitting] = useState(false)\n\n const handleSubmit = useCallback(\n async (event: React.FormEvent) => {\n event.preventDefault()\n setError(null)\n\n if (!tenant.tenantId) {\n setError(t('portal.org.invalid', 'Organization not found.'))\n return\n }\n\n setSubmitting(true)\n try {\n const result = await apiCall<{ ok: boolean; error?: string }>('/api/customer_accounts/login', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email, password, tenantId: tenant.tenantId }),\n })\n\n if (result.ok && result.result?.ok) {\n window.location.assign(`/${orgSlug}/portal/dashboard`)\n return\n }\n\n if (result.status === 423) {\n setError(t('portal.login.error.locked', 'Account locked. Try again later.'))\n } else if (result.status === 401) {\n setError(t('portal.login.error.invalidCredentials', 'Invalid email or password.'))\n } else {\n setError(result.result?.error || t('portal.login.error.generic', 'Login failed. Please try again.'))\n }\n } catch {\n setError(t('portal.login.error.generic', 'Login failed. Please try again.'))\n } finally {\n setSubmitting(false)\n }\n },\n [email, password, tenant.tenantId, orgSlug, t],\n )\n\n const injectionContext = useMemo(\n () => ({ orgSlug }),\n [orgSlug],\n )\n\n if (tenant.loading) {\n return <div className=\"flex items-center justify-center py-20\"><Spinner /></div>\n }\n\n if (tenant.error) {\n return (\n <div className=\"mx-auto w-full max-w-md py-12\">\n <Notice variant=\"error\">{t('portal.org.invalid', 'Organization not found.')}</Notice>\n </div>\n )\n }\n\n return (\n <div className=\"mx-auto w-full max-w-sm\">\n <div className=\"mb-8 text-center\">\n <h1 className=\"text-2xl font-bold tracking-tight\">{t('portal.login.title', 'Sign In')}</h1>\n <p className=\"mt-1.5 text-sm text-muted-foreground\">{t('portal.login.description', 'Enter your credentials to access the portal.')}</p>\n </div>\n\n <InjectionSpot spotId={PortalInjectionSpots.pageBefore('login')} context={injectionContext} />\n\n <form onSubmit={handleSubmit} className=\"flex flex-col gap-4\">\n {error ? <Notice variant=\"error\">{error}</Notice> : null}\n\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"login-email\" className=\"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground/70\">{t('portal.login.email', 'Email')}</Label>\n <Input id=\"login-email\" type=\"email\" autoComplete=\"email\" required placeholder={t('portal.login.email.placeholder', 'you@example.com')} value={email} onChange={(e) => setEmail(e.target.value)} disabled={submitting} className=\"rounded-lg\" />\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"login-password\" className=\"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground/70\">{t('portal.login.password', 'Password')}</Label>\n <Input id=\"login-password\" type=\"password\" autoComplete=\"current-password\" required placeholder={t('portal.login.password.placeholder', '\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022')} value={password} onChange={(e) => setPassword(e.target.value)} disabled={submitting} className=\"rounded-lg\" />\n </div>\n\n <Button type=\"submit\" disabled={submitting} className=\"mt-1 w-full rounded-lg\">\n {submitting ? t('portal.login.submitting', 'Signing in...') : t('portal.login.submit', 'Sign In')}\n </Button>\n\n <p className=\"text-center text-[13px] text-muted-foreground\">\n {t('portal.login.noAccount', \"Don't have an account?\")}{' '}\n <Link href={`/${orgSlug}/portal/signup`} className=\"font-medium text-foreground underline underline-offset-4 hover:opacity-80\">\n {t('portal.login.signupLink', 'Sign up')}\n </Link>\n </p>\n </form>\n\n <InjectionSpot spotId={PortalInjectionSpots.pageAfter('login')} context={injectionContext} />\n </div>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\"use client\"\nimport { useCallback, useMemo, useState } from 'react'\nimport Link from 'next/link'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Alert, AlertDescription } from '@open-mercato/ui/primitives/alert'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { usePortalContext } from '@open-mercato/ui/portal/PortalContext'\nimport { InjectionSpot } from '@open-mercato/ui/backend/injection/InjectionSpot'\nimport { PortalInjectionSpots } from '@open-mercato/ui/backend/injection/spotIds'\n\ntype Props = { params: { orgSlug: string } }\n\nexport default function PortalLoginPage({ params }: Props) {\n const t = useT()\n const orgSlug = params.orgSlug\n const { tenant } = usePortalContext()\n\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [error, setError] = useState<string | null>(null)\n const [submitting, setSubmitting] = useState(false)\n\n const handleSubmit = useCallback(\n async (event: React.FormEvent) => {\n event.preventDefault()\n setError(null)\n\n if (!tenant.tenantId) {\n setError(t('portal.org.invalid', 'Organization not found.'))\n return\n }\n\n setSubmitting(true)\n try {\n const result = await apiCall<{ ok: boolean; error?: string }>('/api/customer_accounts/login', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email, password, tenantId: tenant.tenantId }),\n })\n\n if (result.ok && result.result?.ok) {\n window.location.assign(`/${orgSlug}/portal/dashboard`)\n return\n }\n\n if (result.status === 423) {\n setError(t('portal.login.error.locked', 'Account locked. Try again later.'))\n } else if (result.status === 401) {\n setError(t('portal.login.error.invalidCredentials', 'Invalid email or password.'))\n } else {\n setError(result.result?.error || t('portal.login.error.generic', 'Login failed. Please try again.'))\n }\n } catch {\n setError(t('portal.login.error.generic', 'Login failed. Please try again.'))\n } finally {\n setSubmitting(false)\n }\n },\n [email, password, tenant.tenantId, orgSlug, t],\n )\n\n const injectionContext = useMemo(\n () => ({ orgSlug }),\n [orgSlug],\n )\n\n if (tenant.loading) {\n return <div className=\"flex items-center justify-center py-20\"><Spinner /></div>\n }\n\n if (tenant.error) {\n return (\n <div className=\"mx-auto w-full max-w-md py-12\">\n <Alert variant=\"destructive\">\n <AlertDescription>{t('portal.org.invalid', 'Organization not found.')}</AlertDescription>\n </Alert>\n </div>\n )\n }\n\n return (\n <div className=\"mx-auto w-full max-w-sm\">\n <div className=\"mb-8 text-center\">\n <h1 className=\"text-2xl font-bold tracking-tight\">{t('portal.login.title', 'Sign In')}</h1>\n <p className=\"mt-1.5 text-sm text-muted-foreground\">{t('portal.login.description', 'Enter your credentials to access the portal.')}</p>\n </div>\n\n <InjectionSpot spotId={PortalInjectionSpots.pageBefore('login')} context={injectionContext} />\n\n <form onSubmit={handleSubmit} className=\"flex flex-col gap-4\">\n {error ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n ) : null}\n\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"login-email\" className=\"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground/70\">{t('portal.login.email', 'Email')}</Label>\n <Input id=\"login-email\" type=\"email\" autoComplete=\"email\" required placeholder={t('portal.login.email.placeholder', 'you@example.com')} value={email} onChange={(e) => setEmail(e.target.value)} disabled={submitting} className=\"rounded-lg\" />\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"login-password\" className=\"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground/70\">{t('portal.login.password', 'Password')}</Label>\n <Input id=\"login-password\" type=\"password\" autoComplete=\"current-password\" required placeholder={t('portal.login.password.placeholder', '\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022')} value={password} onChange={(e) => setPassword(e.target.value)} disabled={submitting} className=\"rounded-lg\" />\n </div>\n\n <Button type=\"submit\" disabled={submitting} className=\"mt-1 w-full rounded-lg\">\n {submitting ? t('portal.login.submitting', 'Signing in...') : t('portal.login.submit', 'Sign In')}\n </Button>\n\n <p className=\"text-center text-[13px] text-muted-foreground\">\n {t('portal.login.noAccount', \"Don't have an account?\")}{' '}\n <Link href={`/${orgSlug}/portal/signup`} className=\"font-medium text-foreground underline underline-offset-4 hover:opacity-80\">\n {t('portal.login.signupLink', 'Sign up')}\n </Link>\n </p>\n </form>\n\n <InjectionSpot spotId={PortalInjectionSpots.pageAfter('login')} context={injectionContext} />\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -6,7 +6,7 @@ import { useRouter } from "next/navigation";
6
6
  import { useT } from "@open-mercato/shared/lib/i18n/context";
7
7
  import { Button } from "@open-mercato/ui/primitives/button";
8
8
  import { Spinner } from "@open-mercato/ui/primitives/spinner";
9
- import { Notice } from "@open-mercato/ui/primitives/Notice";
9
+ import { Alert, AlertDescription } from "@open-mercato/ui/primitives/alert";
10
10
  import { usePortalContext } from "@open-mercato/ui/portal/PortalContext";
11
11
  import { PortalFeatureCard } from "@open-mercato/ui/portal/components/PortalFeatureCard";
12
12
  import { InjectionSpot } from "@open-mercato/ui/backend/injection/InjectionSpot";
@@ -45,7 +45,7 @@ function PortalLandingPage({ params }) {
45
45
  return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center py-20", children: /* @__PURE__ */ jsx(Spinner, {}) });
46
46
  }
47
47
  if (tenant.error) {
48
- return /* @__PURE__ */ jsx("div", { className: "mx-auto w-full max-w-md py-12", children: /* @__PURE__ */ jsx(Notice, { variant: "error", children: t("portal.org.invalid", "Organization not found.") }) });
48
+ return /* @__PURE__ */ jsx("div", { className: "mx-auto w-full max-w-md py-12", children: /* @__PURE__ */ jsx(Alert, { variant: "destructive", children: /* @__PURE__ */ jsx(AlertDescription, { children: t("portal.org.invalid", "Organization not found.") }) }) });
49
49
  }
50
50
  if (auth.user) return null;
51
51
  return /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/modules/portal/frontend/%5BorgSlug%5D/portal/page.tsx"],
4
- "sourcesContent": ["\"use client\"\nimport { useEffect, useMemo } from 'react'\nimport Link from 'next/link'\nimport { useRouter } from 'next/navigation'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { Notice } from '@open-mercato/ui/primitives/Notice'\nimport { usePortalContext } from '@open-mercato/ui/portal/PortalContext'\nimport { PortalFeatureCard } from '@open-mercato/ui/portal/components/PortalFeatureCard'\nimport { InjectionSpot } from '@open-mercato/ui/backend/injection/InjectionSpot'\nimport { PortalInjectionSpots } from '@open-mercato/ui/backend/injection/spotIds'\n\ntype Props = { params: { orgSlug: string } }\n\nfunction ShoppingBagIcon({ className }: { className?: string }) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <path d=\"M6 2 3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4Z\" /><line x1=\"3\" x2=\"21\" y1=\"6\" y2=\"6\" /><path d=\"M16 10a4 4 0 0 1-8 0\" />\n </svg>\n )\n}\n\nfunction UserIcon({ className }: { className?: string }) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\" /><circle cx=\"12\" cy=\"7\" r=\"4\" />\n </svg>\n )\n}\n\nfunction ShieldIcon({ className }: { className?: string }) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n </svg>\n )\n}\n\nexport default function PortalLandingPage({ params }: Props) {\n const t = useT()\n const router = useRouter()\n const orgSlug = params.orgSlug\n const { auth, tenant } = usePortalContext()\n\n // Redirect authenticated users to dashboard\n useEffect(() => {\n if (!auth.loading && auth.user) {\n router.replace(`/${orgSlug}/portal/dashboard`)\n }\n }, [auth.loading, auth.user, router, orgSlug])\n\n const injectionContext = useMemo(\n () => ({ orgSlug }),\n [orgSlug],\n )\n\n if (auth.loading || tenant.loading) {\n return <div className=\"flex items-center justify-center py-20\"><Spinner /></div>\n }\n\n if (tenant.error) {\n return (\n <div className=\"mx-auto w-full max-w-md py-12\">\n <Notice variant=\"error\">{t('portal.org.invalid', 'Organization not found.')}</Notice>\n </div>\n )\n }\n\n // Authenticated user \u2014 redirect is in progress\n if (auth.user) return null\n\n return (\n <>\n <InjectionSpot spotId={PortalInjectionSpots.pageBefore('home')} context={injectionContext} />\n\n <section className=\"flex flex-col items-center gap-5 py-8 text-center sm:py-16\">\n <p className=\"text-[11px] font-semibold uppercase tracking-[0.15em] text-muted-foreground/60\">\n {t('portal.nav.home', 'Customer Portal')}\n </p>\n <h1 className=\"max-w-2xl text-4xl font-bold tracking-tight text-foreground sm:text-5xl lg:text-6xl\">\n {t('portal.landing.hero.title', 'Welcome to your portal')}\n </h1>\n <p className=\"max-w-lg text-base leading-relaxed text-muted-foreground sm:text-lg\">\n {t('portal.landing.hero.description', 'Access your account, manage orders, and stay up to date.')}\n </p>\n <div className=\"mt-2 flex items-center gap-3\">\n <Button asChild size=\"lg\" className=\"rounded-lg px-6 text-[14px]\">\n <Link href={`/${orgSlug}/portal/login`}>{t('portal.landing.cta.login', 'Sign In')}</Link>\n </Button>\n <Button asChild variant=\"outline\" size=\"lg\" className=\"rounded-lg px-6 text-[14px]\">\n <Link href={`/${orgSlug}/portal/signup`}>{t('portal.landing.cta.signup', 'Create Account')}</Link>\n </Button>\n </div>\n </section>\n\n <section className=\"grid gap-4 sm:grid-cols-3\">\n <PortalFeatureCard\n icon={<ShoppingBagIcon className=\"size-5\" />}\n title={t('portal.landing.feature.orders', 'Orders & Invoices')}\n description={t('portal.landing.feature.orders.description', 'Track your orders, download invoices, and view delivery status in real time.')}\n />\n <PortalFeatureCard\n icon={<UserIcon className=\"size-5\" />}\n title={t('portal.landing.feature.account', 'Account Management')}\n description={t('portal.landing.feature.account.description', 'Update your profile, manage team members, and configure your preferences.')}\n />\n <PortalFeatureCard\n icon={<ShieldIcon className=\"size-5\" />}\n title={t('portal.landing.feature.security', 'Secure Access')}\n description={t('portal.landing.feature.security.description', 'Role-based permissions, session management, and full audit trail.')}\n />\n </section>\n\n <InjectionSpot spotId={PortalInjectionSpots.pageAfter('home')} context={injectionContext} />\n </>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\"use client\"\nimport { useEffect, useMemo } from 'react'\nimport Link from 'next/link'\nimport { useRouter } from 'next/navigation'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { Alert, AlertDescription } from '@open-mercato/ui/primitives/alert'\nimport { usePortalContext } from '@open-mercato/ui/portal/PortalContext'\nimport { PortalFeatureCard } from '@open-mercato/ui/portal/components/PortalFeatureCard'\nimport { InjectionSpot } from '@open-mercato/ui/backend/injection/InjectionSpot'\nimport { PortalInjectionSpots } from '@open-mercato/ui/backend/injection/spotIds'\n\ntype Props = { params: { orgSlug: string } }\n\nfunction ShoppingBagIcon({ className }: { className?: string }) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <path d=\"M6 2 3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4Z\" /><line x1=\"3\" x2=\"21\" y1=\"6\" y2=\"6\" /><path d=\"M16 10a4 4 0 0 1-8 0\" />\n </svg>\n )\n}\n\nfunction UserIcon({ className }: { className?: string }) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\" /><circle cx=\"12\" cy=\"7\" r=\"4\" />\n </svg>\n )\n}\n\nfunction ShieldIcon({ className }: { className?: string }) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n </svg>\n )\n}\n\nexport default function PortalLandingPage({ params }: Props) {\n const t = useT()\n const router = useRouter()\n const orgSlug = params.orgSlug\n const { auth, tenant } = usePortalContext()\n\n // Redirect authenticated users to dashboard\n useEffect(() => {\n if (!auth.loading && auth.user) {\n router.replace(`/${orgSlug}/portal/dashboard`)\n }\n }, [auth.loading, auth.user, router, orgSlug])\n\n const injectionContext = useMemo(\n () => ({ orgSlug }),\n [orgSlug],\n )\n\n if (auth.loading || tenant.loading) {\n return <div className=\"flex items-center justify-center py-20\"><Spinner /></div>\n }\n\n if (tenant.error) {\n return (\n <div className=\"mx-auto w-full max-w-md py-12\">\n <Alert variant=\"destructive\">\n <AlertDescription>{t('portal.org.invalid', 'Organization not found.')}</AlertDescription>\n </Alert>\n </div>\n )\n }\n\n // Authenticated user \u2014 redirect is in progress\n if (auth.user) return null\n\n return (\n <>\n <InjectionSpot spotId={PortalInjectionSpots.pageBefore('home')} context={injectionContext} />\n\n <section className=\"flex flex-col items-center gap-5 py-8 text-center sm:py-16\">\n <p className=\"text-[11px] font-semibold uppercase tracking-[0.15em] text-muted-foreground/60\">\n {t('portal.nav.home', 'Customer Portal')}\n </p>\n <h1 className=\"max-w-2xl text-4xl font-bold tracking-tight text-foreground sm:text-5xl lg:text-6xl\">\n {t('portal.landing.hero.title', 'Welcome to your portal')}\n </h1>\n <p className=\"max-w-lg text-base leading-relaxed text-muted-foreground sm:text-lg\">\n {t('portal.landing.hero.description', 'Access your account, manage orders, and stay up to date.')}\n </p>\n <div className=\"mt-2 flex items-center gap-3\">\n <Button asChild size=\"lg\" className=\"rounded-lg px-6 text-[14px]\">\n <Link href={`/${orgSlug}/portal/login`}>{t('portal.landing.cta.login', 'Sign In')}</Link>\n </Button>\n <Button asChild variant=\"outline\" size=\"lg\" className=\"rounded-lg px-6 text-[14px]\">\n <Link href={`/${orgSlug}/portal/signup`}>{t('portal.landing.cta.signup', 'Create Account')}</Link>\n </Button>\n </div>\n </section>\n\n <section className=\"grid gap-4 sm:grid-cols-3\">\n <PortalFeatureCard\n icon={<ShoppingBagIcon className=\"size-5\" />}\n title={t('portal.landing.feature.orders', 'Orders & Invoices')}\n description={t('portal.landing.feature.orders.description', 'Track your orders, download invoices, and view delivery status in real time.')}\n />\n <PortalFeatureCard\n icon={<UserIcon className=\"size-5\" />}\n title={t('portal.landing.feature.account', 'Account Management')}\n description={t('portal.landing.feature.account.description', 'Update your profile, manage team members, and configure your preferences.')}\n />\n <PortalFeatureCard\n icon={<ShieldIcon className=\"size-5\" />}\n title={t('portal.landing.feature.security', 'Secure Access')}\n description={t('portal.landing.feature.security.description', 'Role-based permissions, session management, and full audit trail.')}\n />\n </section>\n\n <InjectionSpot spotId={PortalInjectionSpots.pageAfter('home')} context={injectionContext} />\n </>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -6,7 +6,7 @@ import { useT } from "@open-mercato/shared/lib/i18n/context";
6
6
  import { Input } from "@open-mercato/ui/primitives/input";
7
7
  import { Label } from "@open-mercato/ui/primitives/label";
8
8
  import { Button } from "@open-mercato/ui/primitives/button";
9
- import { Notice } from "@open-mercato/ui/primitives/Notice";
9
+ import { Alert, AlertDescription } from "@open-mercato/ui/primitives/alert";
10
10
  import { Spinner } from "@open-mercato/ui/primitives/spinner";
11
11
  import { apiCall } from "@open-mercato/ui/backend/utils/apiCall";
12
12
  import { usePortalContext } from "@open-mercato/ui/portal/PortalContext";
@@ -58,7 +58,7 @@ function PortalSignupPage({ params }) {
58
58
  return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center py-20", children: /* @__PURE__ */ jsx(Spinner, {}) });
59
59
  }
60
60
  if (tenant.error) {
61
- return /* @__PURE__ */ jsx("div", { className: "mx-auto w-full max-w-md py-12", children: /* @__PURE__ */ jsx(Notice, { variant: "error", children: t("portal.org.invalid", "Organization not found.") }) });
61
+ return /* @__PURE__ */ jsx("div", { className: "mx-auto w-full max-w-md py-12", children: /* @__PURE__ */ jsx(Alert, { variant: "destructive", children: /* @__PURE__ */ jsx(AlertDescription, { children: t("portal.org.invalid", "Organization not found.") }) }) });
62
62
  }
63
63
  if (success) {
64
64
  return /* @__PURE__ */ jsxs("div", { className: "mx-auto w-full max-w-sm text-center", children: [
@@ -75,7 +75,7 @@ function PortalSignupPage({ params }) {
75
75
  ] }),
76
76
  /* @__PURE__ */ jsx(InjectionSpot, { spotId: PortalInjectionSpots.pageBefore("signup"), context: injectionContext }),
77
77
  /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, className: "flex flex-col gap-4", children: [
78
- error ? /* @__PURE__ */ jsx(Notice, { variant: "error", children: error }) : null,
78
+ error ? /* @__PURE__ */ jsx(Alert, { variant: "destructive", children: /* @__PURE__ */ jsx(AlertDescription, { children: error }) }) : null,
79
79
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
80
80
  /* @__PURE__ */ jsx(Label, { htmlFor: "signup-name", className: "text-[11px] font-semibold uppercase tracking-wider text-muted-foreground/70", children: t("portal.signup.displayName", "Full Name") }),
81
81
  /* @__PURE__ */ jsx(Input, { id: "signup-name", type: "text", autoComplete: "name", required: true, placeholder: t("portal.signup.displayName.placeholder", "Jane Smith"), value: displayName, onChange: (e) => setDisplayName(e.target.value), disabled: submitting, className: "rounded-lg" })
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/portal/frontend/%5BorgSlug%5D/portal/signup/page.tsx"],
4
- "sourcesContent": ["\"use client\"\nimport { useCallback, useMemo, useState } from 'react'\nimport Link from 'next/link'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Notice } from '@open-mercato/ui/primitives/Notice'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { usePortalContext } from '@open-mercato/ui/portal/PortalContext'\nimport { InjectionSpot } from '@open-mercato/ui/backend/injection/InjectionSpot'\nimport { PortalInjectionSpots } from '@open-mercato/ui/backend/injection/spotIds'\n\ntype Props = { params: { orgSlug: string } }\n\nexport default function PortalSignupPage({ params }: Props) {\n const t = useT()\n const orgSlug = params.orgSlug\n const { tenant } = usePortalContext()\n\n const [displayName, setDisplayName] = useState('')\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [error, setError] = useState<string | null>(null)\n const [success, setSuccess] = useState(false)\n const [submitting, setSubmitting] = useState(false)\n\n const handleSubmit = useCallback(\n async (event: React.FormEvent) => {\n event.preventDefault()\n setError(null)\n\n if (!tenant.tenantId || !tenant.organizationId) {\n setError(t('portal.org.invalid', 'Organization not found.'))\n return\n }\n\n setSubmitting(true)\n try {\n const result = await apiCall<{ ok: boolean; error?: string }>('/api/customer_accounts/signup', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email, password, displayName, tenantId: tenant.tenantId, organizationId: tenant.organizationId }),\n })\n\n if (result.status === 202 && result.result?.ok) {\n setSuccess(true)\n return\n }\n\n setError(result.result?.error || t('portal.signup.error.generic', 'Signup failed. Please try again.'))\n } catch {\n setError(t('portal.signup.error.generic', 'Signup failed. Please try again.'))\n } finally {\n setSubmitting(false)\n }\n },\n [displayName, email, password, tenant.tenantId, tenant.organizationId, t],\n )\n\n const injectionContext = useMemo(\n () => ({ orgSlug }),\n [orgSlug],\n )\n\n if (tenant.loading) {\n return <div className=\"flex items-center justify-center py-20\"><Spinner /></div>\n }\n\n if (tenant.error) {\n return (\n <div className=\"mx-auto w-full max-w-md py-12\">\n <Notice variant=\"error\">{t('portal.org.invalid', 'Organization not found.')}</Notice>\n </div>\n )\n }\n\n if (success) {\n return (\n <div className=\"mx-auto w-full max-w-sm text-center\">\n <div className=\"mx-auto mb-4 flex size-12 items-center justify-center rounded-full bg-foreground text-background\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"size-6\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n </div>\n <h1 className=\"text-2xl font-bold tracking-tight\">{t('portal.signup.success.title', 'Account Created')}</h1>\n <p className=\"mt-1.5 text-sm text-muted-foreground\">{t('portal.signup.success.description', 'Your account has been created. You can now sign in.')}</p>\n <Button asChild className=\"mt-6 w-full rounded-lg\">\n <Link href={`/${orgSlug}/portal/login`}>{t('portal.signup.success.loginLink', 'Sign In')}</Link>\n </Button>\n </div>\n )\n }\n\n return (\n <div className=\"mx-auto w-full max-w-sm\">\n <div className=\"mb-8 text-center\">\n <h1 className=\"text-2xl font-bold tracking-tight\">{t('portal.signup.title', 'Create Account')}</h1>\n <p className=\"mt-1.5 text-sm text-muted-foreground\">{t('portal.signup.description', 'Sign up for a portal account.')}</p>\n </div>\n\n <InjectionSpot spotId={PortalInjectionSpots.pageBefore('signup')} context={injectionContext} />\n\n <form onSubmit={handleSubmit} className=\"flex flex-col gap-4\">\n {error ? <Notice variant=\"error\">{error}</Notice> : null}\n\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"signup-name\" className=\"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground/70\">{t('portal.signup.displayName', 'Full Name')}</Label>\n <Input id=\"signup-name\" type=\"text\" autoComplete=\"name\" required placeholder={t('portal.signup.displayName.placeholder', 'Jane Smith')} value={displayName} onChange={(e) => setDisplayName(e.target.value)} disabled={submitting} className=\"rounded-lg\" />\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"signup-email\" className=\"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground/70\">{t('portal.signup.email', 'Email')}</Label>\n <Input id=\"signup-email\" type=\"email\" autoComplete=\"email\" required placeholder={t('portal.signup.email.placeholder', 'you@example.com')} value={email} onChange={(e) => setEmail(e.target.value)} disabled={submitting} className=\"rounded-lg\" />\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"signup-password\" className=\"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground/70\">{t('portal.signup.password', 'Password')}</Label>\n <Input id=\"signup-password\" type=\"password\" autoComplete=\"new-password\" required placeholder={t('portal.signup.password.placeholder', '\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022')} value={password} onChange={(e) => setPassword(e.target.value)} disabled={submitting} className=\"rounded-lg\" />\n </div>\n\n <Button type=\"submit\" disabled={submitting} className=\"mt-1 w-full rounded-lg\">\n {submitting ? t('portal.signup.submitting', 'Creating account...') : t('portal.signup.submit', 'Create Account')}\n </Button>\n\n <p className=\"text-center text-[13px] text-muted-foreground\">\n {t('portal.signup.hasAccount', 'Already have an account?')}{' '}\n <Link href={`/${orgSlug}/portal/login`} className=\"font-medium text-foreground underline underline-offset-4 hover:opacity-80\">\n {t('portal.signup.loginLink', 'Sign in')}\n </Link>\n </p>\n </form>\n\n <InjectionSpot spotId={PortalInjectionSpots.pageAfter('signup')} context={injectionContext} />\n </div>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\"use client\"\nimport { useCallback, useMemo, useState } from 'react'\nimport Link from 'next/link'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Alert, AlertDescription } from '@open-mercato/ui/primitives/alert'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { usePortalContext } from '@open-mercato/ui/portal/PortalContext'\nimport { InjectionSpot } from '@open-mercato/ui/backend/injection/InjectionSpot'\nimport { PortalInjectionSpots } from '@open-mercato/ui/backend/injection/spotIds'\n\ntype Props = { params: { orgSlug: string } }\n\nexport default function PortalSignupPage({ params }: Props) {\n const t = useT()\n const orgSlug = params.orgSlug\n const { tenant } = usePortalContext()\n\n const [displayName, setDisplayName] = useState('')\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [error, setError] = useState<string | null>(null)\n const [success, setSuccess] = useState(false)\n const [submitting, setSubmitting] = useState(false)\n\n const handleSubmit = useCallback(\n async (event: React.FormEvent) => {\n event.preventDefault()\n setError(null)\n\n if (!tenant.tenantId || !tenant.organizationId) {\n setError(t('portal.org.invalid', 'Organization not found.'))\n return\n }\n\n setSubmitting(true)\n try {\n const result = await apiCall<{ ok: boolean; error?: string }>('/api/customer_accounts/signup', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email, password, displayName, tenantId: tenant.tenantId, organizationId: tenant.organizationId }),\n })\n\n if (result.status === 202 && result.result?.ok) {\n setSuccess(true)\n return\n }\n\n setError(result.result?.error || t('portal.signup.error.generic', 'Signup failed. Please try again.'))\n } catch {\n setError(t('portal.signup.error.generic', 'Signup failed. Please try again.'))\n } finally {\n setSubmitting(false)\n }\n },\n [displayName, email, password, tenant.tenantId, tenant.organizationId, t],\n )\n\n const injectionContext = useMemo(\n () => ({ orgSlug }),\n [orgSlug],\n )\n\n if (tenant.loading) {\n return <div className=\"flex items-center justify-center py-20\"><Spinner /></div>\n }\n\n if (tenant.error) {\n return (\n <div className=\"mx-auto w-full max-w-md py-12\">\n <Alert variant=\"destructive\">\n <AlertDescription>{t('portal.org.invalid', 'Organization not found.')}</AlertDescription>\n </Alert>\n </div>\n )\n }\n\n if (success) {\n return (\n <div className=\"mx-auto w-full max-w-sm text-center\">\n <div className=\"mx-auto mb-4 flex size-12 items-center justify-center rounded-full bg-foreground text-background\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"size-6\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n </div>\n <h1 className=\"text-2xl font-bold tracking-tight\">{t('portal.signup.success.title', 'Account Created')}</h1>\n <p className=\"mt-1.5 text-sm text-muted-foreground\">{t('portal.signup.success.description', 'Your account has been created. You can now sign in.')}</p>\n <Button asChild className=\"mt-6 w-full rounded-lg\">\n <Link href={`/${orgSlug}/portal/login`}>{t('portal.signup.success.loginLink', 'Sign In')}</Link>\n </Button>\n </div>\n )\n }\n\n return (\n <div className=\"mx-auto w-full max-w-sm\">\n <div className=\"mb-8 text-center\">\n <h1 className=\"text-2xl font-bold tracking-tight\">{t('portal.signup.title', 'Create Account')}</h1>\n <p className=\"mt-1.5 text-sm text-muted-foreground\">{t('portal.signup.description', 'Sign up for a portal account.')}</p>\n </div>\n\n <InjectionSpot spotId={PortalInjectionSpots.pageBefore('signup')} context={injectionContext} />\n\n <form onSubmit={handleSubmit} className=\"flex flex-col gap-4\">\n {error ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n ) : null}\n\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"signup-name\" className=\"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground/70\">{t('portal.signup.displayName', 'Full Name')}</Label>\n <Input id=\"signup-name\" type=\"text\" autoComplete=\"name\" required placeholder={t('portal.signup.displayName.placeholder', 'Jane Smith')} value={displayName} onChange={(e) => setDisplayName(e.target.value)} disabled={submitting} className=\"rounded-lg\" />\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"signup-email\" className=\"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground/70\">{t('portal.signup.email', 'Email')}</Label>\n <Input id=\"signup-email\" type=\"email\" autoComplete=\"email\" required placeholder={t('portal.signup.email.placeholder', 'you@example.com')} value={email} onChange={(e) => setEmail(e.target.value)} disabled={submitting} className=\"rounded-lg\" />\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"signup-password\" className=\"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground/70\">{t('portal.signup.password', 'Password')}</Label>\n <Input id=\"signup-password\" type=\"password\" autoComplete=\"new-password\" required placeholder={t('portal.signup.password.placeholder', '\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022')} value={password} onChange={(e) => setPassword(e.target.value)} disabled={submitting} className=\"rounded-lg\" />\n </div>\n\n <Button type=\"submit\" disabled={submitting} className=\"mt-1 w-full rounded-lg\">\n {submitting ? t('portal.signup.submitting', 'Creating account...') : t('portal.signup.submit', 'Create Account')}\n </Button>\n\n <p className=\"text-center text-[13px] text-muted-foreground\">\n {t('portal.signup.hasAccount', 'Already have an account?')}{' '}\n <Link href={`/${orgSlug}/portal/login`} className=\"font-medium text-foreground underline underline-offset-4 hover:opacity-80\">\n {t('portal.signup.loginLink', 'Sign in')}\n </Link>\n </p>\n </form>\n\n <InjectionSpot spotId={PortalInjectionSpots.pageAfter('signup')} context={injectionContext} />\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -6,7 +6,7 @@ import { useSearchParams } from "next/navigation";
6
6
  import { useT } from "@open-mercato/shared/lib/i18n/context";
7
7
  import { apiCall } from "@open-mercato/ui/backend/utils/apiCall";
8
8
  import { Button } from "@open-mercato/ui/primitives/button";
9
- import { Notice } from "@open-mercato/ui/primitives/Notice";
9
+ import { Alert, AlertDescription } from "@open-mercato/ui/primitives/alert";
10
10
  import { Spinner } from "@open-mercato/ui/primitives/spinner";
11
11
  function PortalVerifyPage({ params }) {
12
12
  const t = useT();
@@ -58,7 +58,7 @@ function PortalVerifyPage({ params }) {
58
58
  ] });
59
59
  }
60
60
  return /* @__PURE__ */ jsxs("div", { className: "mx-auto flex max-w-sm flex-col gap-4 py-12", children: [
61
- /* @__PURE__ */ jsx(Notice, { variant: "error", children: error || t("portal.verify.error.generic", "Email verification failed. Please try again.") }),
61
+ /* @__PURE__ */ jsx(Alert, { variant: "destructive", children: /* @__PURE__ */ jsx(AlertDescription, { children: error || t("portal.verify.error.generic", "Email verification failed. Please try again.") }) }),
62
62
  /* @__PURE__ */ jsx(Button, { asChild: true, variant: "outline", className: "rounded-lg", children: /* @__PURE__ */ jsx(Link, { href: `/${params.orgSlug}/portal/login`, children: t("portal.verify.error.backToLogin", "Back to sign in") }) })
63
63
  ] });
64
64
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/portal/frontend/%5BorgSlug%5D/portal/verify/page.tsx"],
4
- "sourcesContent": ["\"use client\"\nimport { useEffect, useState } from 'react'\nimport Link from 'next/link'\nimport { useSearchParams } from 'next/navigation'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Notice } from '@open-mercato/ui/primitives/Notice'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\n\ntype Props = { params: { orgSlug: string } }\n\ntype VerifyState = 'verifying' | 'success' | 'error'\n\nexport default function PortalVerifyPage({ params }: Props) {\n const t = useT()\n const searchParams = useSearchParams()\n const token = searchParams.get('token') ?? ''\n const [state, setState] = useState<VerifyState>(token ? 'verifying' : 'error')\n const [error, setError] = useState<string | null>(token ? null : t('portal.verify.error.invalidToken', 'Verification token is missing.'))\n\n useEffect(() => {\n if (!token) return\n\n let active = true\n\n void apiCall<{ ok: boolean; error?: string }>('/api/customer_accounts/email/verify', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ token }),\n }).then((result) => {\n if (!active) return\n if (result.ok && result.result?.ok) {\n setState('success')\n return\n }\n\n setState('error')\n setError(result.result?.error || t('portal.verify.error.generic', 'Email verification failed. Please try again.'))\n }).catch(() => {\n if (!active) return\n setState('error')\n setError(t('portal.verify.error.generic', 'Email verification failed. Please try again.'))\n })\n\n return () => {\n active = false\n }\n }, [token, t])\n\n if (state === 'verifying') {\n return (\n <div className=\"mx-auto flex max-w-sm flex-col items-center gap-4 py-12 text-center\">\n <Spinner />\n <div>\n <h1 className=\"text-2xl font-bold tracking-tight\">{t('portal.verify.title', 'Verifying email')}</h1>\n <p className=\"mt-1.5 text-sm text-muted-foreground\">{t('portal.verify.description', 'Please wait while we verify your email address.')}</p>\n </div>\n </div>\n )\n }\n\n if (state === 'success') {\n return (\n <div className=\"mx-auto flex max-w-sm flex-col items-center gap-4 py-12 text-center\">\n <div className=\"mx-auto flex size-12 items-center justify-center rounded-full bg-foreground text-background\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"size-6\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n </div>\n <div>\n <h1 className=\"text-2xl font-bold tracking-tight\">{t('portal.verify.success.title', 'Email verified')}</h1>\n <p className=\"mt-1.5 text-sm text-muted-foreground\">{t('portal.verify.success.description', 'Your email has been verified. You can now sign in to the portal.')}</p>\n </div>\n <Button asChild className=\"w-full rounded-lg\">\n <Link href={`/${params.orgSlug}/portal/login`}>{t('portal.verify.success.loginLink', 'Sign In')}</Link>\n </Button>\n </div>\n )\n }\n\n return (\n <div className=\"mx-auto flex max-w-sm flex-col gap-4 py-12\">\n <Notice variant=\"error\">{error || t('portal.verify.error.generic', 'Email verification failed. Please try again.')}</Notice>\n <Button asChild variant=\"outline\" className=\"rounded-lg\">\n <Link href={`/${params.orgSlug}/portal/login`}>{t('portal.verify.error.backToLogin', 'Back to sign in')}</Link>\n </Button>\n </div>\n )\n}\n"],
5
- "mappings": ";AAqDQ,cACA,YADA;AApDR,SAAS,WAAW,gBAAgB;AACpC,OAAO,UAAU;AACjB,SAAS,uBAAuB;AAChC,SAAS,YAAY;AACrB,SAAS,eAAe;AACxB,SAAS,cAAc;AACvB,SAAS,cAAc;AACvB,SAAS,eAAe;AAMT,SAAR,iBAAkC,EAAE,OAAO,GAAU;AAC1D,QAAM,IAAI,KAAK;AACf,QAAM,eAAe,gBAAgB;AACrC,QAAM,QAAQ,aAAa,IAAI,OAAO,KAAK;AAC3C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAsB,QAAQ,cAAc,OAAO;AAC7E,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,QAAQ,OAAO,EAAE,oCAAoC,gCAAgC,CAAC;AAExI,YAAU,MAAM;AACd,QAAI,CAAC,MAAO;AAEZ,QAAI,SAAS;AAEb,SAAK,QAAyC,uCAAuC;AAAA,MACnF,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,MAAM,CAAC;AAAA,IAChC,CAAC,EAAE,KAAK,CAAC,WAAW;AAClB,UAAI,CAAC,OAAQ;AACb,UAAI,OAAO,MAAM,OAAO,QAAQ,IAAI;AAClC,iBAAS,SAAS;AAClB;AAAA,MACF;AAEA,eAAS,OAAO;AAChB,eAAS,OAAO,QAAQ,SAAS,EAAE,+BAA+B,8CAA8C,CAAC;AAAA,IACnH,CAAC,EAAE,MAAM,MAAM;AACb,UAAI,CAAC,OAAQ;AACb,eAAS,OAAO;AAChB,eAAS,EAAE,+BAA+B,8CAA8C,CAAC;AAAA,IAC3F,CAAC;AAED,WAAO,MAAM;AACX,eAAS;AAAA,IACX;AAAA,EACF,GAAG,CAAC,OAAO,CAAC,CAAC;AAEb,MAAI,UAAU,aAAa;AACzB,WACE,qBAAC,SAAI,WAAU,uEACb;AAAA,0BAAC,WAAQ;AAAA,MACT,qBAAC,SACC;AAAA,4BAAC,QAAG,WAAU,qCAAqC,YAAE,uBAAuB,iBAAiB,GAAE;AAAA,QAC/F,oBAAC,OAAE,WAAU,wCAAwC,YAAE,6BAA6B,iDAAiD,GAAE;AAAA,SACzI;AAAA,OACF;AAAA,EAEJ;AAEA,MAAI,UAAU,WAAW;AACvB,WACE,qBAAC,SAAI,WAAU,uEACb;AAAA,0BAAC,SAAI,WAAU,+FACb,8BAAC,SAAI,OAAM,8BAA6B,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,WAAU,UACnK,8BAAC,cAAS,QAAO,kBAAiB,GACpC,GACF;AAAA,MACA,qBAAC,SACC;AAAA,4BAAC,QAAG,WAAU,qCAAqC,YAAE,+BAA+B,gBAAgB,GAAE;AAAA,QACtG,oBAAC,OAAE,WAAU,wCAAwC,YAAE,qCAAqC,kEAAkE,GAAE;AAAA,SAClK;AAAA,MACA,oBAAC,UAAO,SAAO,MAAC,WAAU,qBACxB,8BAAC,QAAK,MAAM,IAAI,OAAO,OAAO,iBAAkB,YAAE,mCAAmC,SAAS,GAAE,GAClG;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,qBAAC,SAAI,WAAU,8CACb;AAAA,wBAAC,UAAO,SAAQ,SAAS,mBAAS,EAAE,+BAA+B,8CAA8C,GAAE;AAAA,IACnH,oBAAC,UAAO,SAAO,MAAC,SAAQ,WAAU,WAAU,cAC1C,8BAAC,QAAK,MAAM,IAAI,OAAO,OAAO,iBAAkB,YAAE,mCAAmC,iBAAiB,GAAE,GAC1G;AAAA,KACF;AAEJ;",
4
+ "sourcesContent": ["\"use client\"\nimport { useEffect, useState } from 'react'\nimport Link from 'next/link'\nimport { useSearchParams } from 'next/navigation'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Alert, AlertDescription } from '@open-mercato/ui/primitives/alert'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\n\ntype Props = { params: { orgSlug: string } }\n\ntype VerifyState = 'verifying' | 'success' | 'error'\n\nexport default function PortalVerifyPage({ params }: Props) {\n const t = useT()\n const searchParams = useSearchParams()\n const token = searchParams.get('token') ?? ''\n const [state, setState] = useState<VerifyState>(token ? 'verifying' : 'error')\n const [error, setError] = useState<string | null>(token ? null : t('portal.verify.error.invalidToken', 'Verification token is missing.'))\n\n useEffect(() => {\n if (!token) return\n\n let active = true\n\n void apiCall<{ ok: boolean; error?: string }>('/api/customer_accounts/email/verify', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ token }),\n }).then((result) => {\n if (!active) return\n if (result.ok && result.result?.ok) {\n setState('success')\n return\n }\n\n setState('error')\n setError(result.result?.error || t('portal.verify.error.generic', 'Email verification failed. Please try again.'))\n }).catch(() => {\n if (!active) return\n setState('error')\n setError(t('portal.verify.error.generic', 'Email verification failed. Please try again.'))\n })\n\n return () => {\n active = false\n }\n }, [token, t])\n\n if (state === 'verifying') {\n return (\n <div className=\"mx-auto flex max-w-sm flex-col items-center gap-4 py-12 text-center\">\n <Spinner />\n <div>\n <h1 className=\"text-2xl font-bold tracking-tight\">{t('portal.verify.title', 'Verifying email')}</h1>\n <p className=\"mt-1.5 text-sm text-muted-foreground\">{t('portal.verify.description', 'Please wait while we verify your email address.')}</p>\n </div>\n </div>\n )\n }\n\n if (state === 'success') {\n return (\n <div className=\"mx-auto flex max-w-sm flex-col items-center gap-4 py-12 text-center\">\n <div className=\"mx-auto flex size-12 items-center justify-center rounded-full bg-foreground text-background\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"size-6\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n </div>\n <div>\n <h1 className=\"text-2xl font-bold tracking-tight\">{t('portal.verify.success.title', 'Email verified')}</h1>\n <p className=\"mt-1.5 text-sm text-muted-foreground\">{t('portal.verify.success.description', 'Your email has been verified. You can now sign in to the portal.')}</p>\n </div>\n <Button asChild className=\"w-full rounded-lg\">\n <Link href={`/${params.orgSlug}/portal/login`}>{t('portal.verify.success.loginLink', 'Sign In')}</Link>\n </Button>\n </div>\n )\n }\n\n return (\n <div className=\"mx-auto flex max-w-sm flex-col gap-4 py-12\">\n <Alert variant=\"destructive\">\n <AlertDescription>{error || t('portal.verify.error.generic', 'Email verification failed. Please try again.')}</AlertDescription>\n </Alert>\n <Button asChild variant=\"outline\" className=\"rounded-lg\">\n <Link href={`/${params.orgSlug}/portal/login`}>{t('portal.verify.error.backToLogin', 'Back to sign in')}</Link>\n </Button>\n </div>\n )\n}\n"],
5
+ "mappings": ";AAqDQ,cACA,YADA;AApDR,SAAS,WAAW,gBAAgB;AACpC,OAAO,UAAU;AACjB,SAAS,uBAAuB;AAChC,SAAS,YAAY;AACrB,SAAS,eAAe;AACxB,SAAS,cAAc;AACvB,SAAS,OAAO,wBAAwB;AACxC,SAAS,eAAe;AAMT,SAAR,iBAAkC,EAAE,OAAO,GAAU;AAC1D,QAAM,IAAI,KAAK;AACf,QAAM,eAAe,gBAAgB;AACrC,QAAM,QAAQ,aAAa,IAAI,OAAO,KAAK;AAC3C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAsB,QAAQ,cAAc,OAAO;AAC7E,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,QAAQ,OAAO,EAAE,oCAAoC,gCAAgC,CAAC;AAExI,YAAU,MAAM;AACd,QAAI,CAAC,MAAO;AAEZ,QAAI,SAAS;AAEb,SAAK,QAAyC,uCAAuC;AAAA,MACnF,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,MAAM,CAAC;AAAA,IAChC,CAAC,EAAE,KAAK,CAAC,WAAW;AAClB,UAAI,CAAC,OAAQ;AACb,UAAI,OAAO,MAAM,OAAO,QAAQ,IAAI;AAClC,iBAAS,SAAS;AAClB;AAAA,MACF;AAEA,eAAS,OAAO;AAChB,eAAS,OAAO,QAAQ,SAAS,EAAE,+BAA+B,8CAA8C,CAAC;AAAA,IACnH,CAAC,EAAE,MAAM,MAAM;AACb,UAAI,CAAC,OAAQ;AACb,eAAS,OAAO;AAChB,eAAS,EAAE,+BAA+B,8CAA8C,CAAC;AAAA,IAC3F,CAAC;AAED,WAAO,MAAM;AACX,eAAS;AAAA,IACX;AAAA,EACF,GAAG,CAAC,OAAO,CAAC,CAAC;AAEb,MAAI,UAAU,aAAa;AACzB,WACE,qBAAC,SAAI,WAAU,uEACb;AAAA,0BAAC,WAAQ;AAAA,MACT,qBAAC,SACC;AAAA,4BAAC,QAAG,WAAU,qCAAqC,YAAE,uBAAuB,iBAAiB,GAAE;AAAA,QAC/F,oBAAC,OAAE,WAAU,wCAAwC,YAAE,6BAA6B,iDAAiD,GAAE;AAAA,SACzI;AAAA,OACF;AAAA,EAEJ;AAEA,MAAI,UAAU,WAAW;AACvB,WACE,qBAAC,SAAI,WAAU,uEACb;AAAA,0BAAC,SAAI,WAAU,+FACb,8BAAC,SAAI,OAAM,8BAA6B,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,WAAU,UACnK,8BAAC,cAAS,QAAO,kBAAiB,GACpC,GACF;AAAA,MACA,qBAAC,SACC;AAAA,4BAAC,QAAG,WAAU,qCAAqC,YAAE,+BAA+B,gBAAgB,GAAE;AAAA,QACtG,oBAAC,OAAE,WAAU,wCAAwC,YAAE,qCAAqC,kEAAkE,GAAE;AAAA,SAClK;AAAA,MACA,oBAAC,UAAO,SAAO,MAAC,WAAU,qBACxB,8BAAC,QAAK,MAAM,IAAI,OAAO,OAAO,iBAAkB,YAAE,mCAAmC,SAAS,GAAE,GAClG;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,qBAAC,SAAI,WAAU,8CACb;AAAA,wBAAC,SAAM,SAAQ,eACb,8BAAC,oBAAkB,mBAAS,EAAE,+BAA+B,8CAA8C,GAAE,GAC/G;AAAA,IACA,oBAAC,UAAO,SAAO,MAAC,SAAQ,WAAU,WAAU,cAC1C,8BAAC,QAAK,MAAM,IAAI,OAAO,OAAO,iBAAkB,YAAE,mCAAmC,iBAAiB,GAAE,GAC1G;AAAA,KACF;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -637,7 +637,7 @@ class HybridQueryEngine {
637
637
  };
638
638
  const applyJoinSearchFilterOp = async (target, filter, _qualified, join) => {
639
639
  if (!searchEnabled || !join.entityId) return false;
640
- if (!["like", "ilike"].includes(filter.op)) return false;
640
+ if (!["eq", "like", "ilike"].includes(filter.op)) return false;
641
641
  if (typeof filter.value !== "string" || filter.value.trim().length === 0) return false;
642
642
  let searchAvailable = joinSearchAvailability.get(join.entityId);
643
643
  if (searchAvailable === void 0) {