@open-mercato/core 0.4.2-canary-968c919ed2 → 0.4.2-canary-bdaa640a68

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 (497) hide show
  1. package/dist/generated/entities.ids.generated.js +1 -5
  2. package/dist/generated/entities.ids.generated.js.map +2 -2
  3. package/dist/generated/entity-fields-registry.js +0 -2
  4. package/dist/generated/entity-fields-registry.js.map +2 -2
  5. package/dist/modules/api_docs/frontend/docs/api/page.js +2 -3
  6. package/dist/modules/api_docs/frontend/docs/api/page.js.map +2 -2
  7. package/dist/modules/api_keys/backend/api-keys/page.js +1 -1
  8. package/dist/modules/api_keys/backend/api-keys/page.js.map +2 -2
  9. package/dist/modules/attachments/components/AttachmentLibrary.js +0 -4
  10. package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
  11. package/dist/modules/attachments/components/AttachmentPartitionSettings.js +0 -2
  12. package/dist/modules/attachments/components/AttachmentPartitionSettings.js.map +2 -2
  13. package/dist/modules/auth/api/admin/nav.js +3 -4
  14. package/dist/modules/auth/api/admin/nav.js.map +2 -2
  15. package/dist/modules/auth/api/login.js +6 -25
  16. package/dist/modules/auth/api/login.js.map +2 -2
  17. package/dist/modules/auth/api/reset/confirm.js +2 -25
  18. package/dist/modules/auth/api/reset/confirm.js.map +2 -2
  19. package/dist/modules/auth/api/reset.js +0 -23
  20. package/dist/modules/auth/api/reset.js.map +2 -2
  21. package/dist/modules/auth/api/sidebar/preferences/route.js +9 -14
  22. package/dist/modules/auth/api/sidebar/preferences/route.js.map +2 -2
  23. package/dist/modules/auth/api/users/route.js +2 -4
  24. package/dist/modules/auth/api/users/route.js.map +2 -2
  25. package/dist/modules/auth/backend/roles/[id]/edit/page.js +1 -4
  26. package/dist/modules/auth/backend/roles/[id]/edit/page.js.map +2 -2
  27. package/dist/modules/auth/backend/roles/page.js +3 -3
  28. package/dist/modules/auth/backend/roles/page.js.map +2 -2
  29. package/dist/modules/auth/backend/users/[id]/edit/page.js +3 -18
  30. package/dist/modules/auth/backend/users/[id]/edit/page.js.map +2 -2
  31. package/dist/modules/auth/backend/users/create/page.js +2 -15
  32. package/dist/modules/auth/backend/users/create/page.js.map +2 -2
  33. package/dist/modules/auth/backend/users/page.js +3 -3
  34. package/dist/modules/auth/backend/users/page.js.map +2 -2
  35. package/dist/modules/auth/cli.js +11 -25
  36. package/dist/modules/auth/cli.js.map +2 -2
  37. package/dist/modules/auth/commands/users.js +2 -59
  38. package/dist/modules/auth/commands/users.js.map +2 -2
  39. package/dist/modules/auth/data/validators.js +3 -6
  40. package/dist/modules/auth/data/validators.js.map +2 -2
  41. package/dist/modules/auth/frontend/login.js +3 -105
  42. package/dist/modules/auth/frontend/login.js.map +2 -2
  43. package/dist/modules/auth/frontend/reset/[token]/page.js +10 -20
  44. package/dist/modules/auth/frontend/reset/[token]/page.js.map +2 -2
  45. package/dist/modules/auth/lib/setup-app.js +8 -42
  46. package/dist/modules/auth/lib/setup-app.js.map +2 -2
  47. package/dist/modules/auth/services/authService.js +3 -24
  48. package/dist/modules/auth/services/authService.js.map +2 -2
  49. package/dist/modules/business_rules/api/execute/route.js +1 -7
  50. package/dist/modules/business_rules/api/execute/route.js.map +2 -2
  51. package/dist/modules/business_rules/backend/rules/page.js +0 -4
  52. package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
  53. package/dist/modules/business_rules/backend/sets/page.js +0 -3
  54. package/dist/modules/business_rules/backend/sets/page.js.map +2 -2
  55. package/dist/modules/business_rules/cli.js +1 -2
  56. package/dist/modules/business_rules/cli.js.map +2 -2
  57. package/dist/modules/business_rules/lib/rule-engine.js +3 -33
  58. package/dist/modules/business_rules/lib/rule-engine.js.map +2 -2
  59. package/dist/modules/catalog/components/PriceKindSettings.js +0 -2
  60. package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
  61. package/dist/modules/catalog/components/categories/CategoriesDataTable.js +2 -2
  62. package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
  63. package/dist/modules/catalog/components/products/ProductsDataTable.js +0 -2
  64. package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
  65. package/dist/modules/configs/cli.js +0 -6
  66. package/dist/modules/configs/cli.js.map +2 -2
  67. package/dist/modules/configs/components/CachePanel.js +4 -4
  68. package/dist/modules/configs/components/CachePanel.js.map +2 -2
  69. package/dist/modules/configs/lib/system-status.js +1 -48
  70. package/dist/modules/configs/lib/system-status.js.map +2 -2
  71. package/dist/modules/configs/lib/upgrade-actions.js +0 -18
  72. package/dist/modules/configs/lib/upgrade-actions.js.map +2 -2
  73. package/dist/modules/currencies/backend/currencies/page.js +0 -3
  74. package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
  75. package/dist/modules/currencies/backend/exchange-rates/page.js +0 -2
  76. package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
  77. package/dist/modules/customers/backend/customers/companies/page.js +0 -3
  78. package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
  79. package/dist/modules/customers/backend/customers/deals/page.js +0 -3
  80. package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
  81. package/dist/modules/customers/backend/customers/people/page.js +0 -3
  82. package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
  83. package/dist/modules/customers/commands/deals.js +0 -31
  84. package/dist/modules/customers/commands/deals.js.map +2 -2
  85. package/dist/modules/customers/components/CustomerTodosTable.js +0 -1
  86. package/dist/modules/customers/components/CustomerTodosTable.js.map +2 -2
  87. package/dist/modules/customers/widgets/dashboard/customer-todos/widget.js +1 -2
  88. package/dist/modules/customers/widgets/dashboard/customer-todos/widget.js.map +2 -2
  89. package/dist/modules/customers/widgets/dashboard/new-customers/widget.js +1 -2
  90. package/dist/modules/customers/widgets/dashboard/new-customers/widget.js.map +2 -2
  91. package/dist/modules/customers/widgets/dashboard/new-deals/widget.js +1 -2
  92. package/dist/modules/customers/widgets/dashboard/new-deals/widget.js.map +2 -2
  93. package/dist/modules/customers/widgets/dashboard/next-interactions/widget.js +1 -2
  94. package/dist/modules/customers/widgets/dashboard/next-interactions/widget.js.map +2 -2
  95. package/dist/modules/dashboards/cli.js +5 -44
  96. package/dist/modules/dashboards/cli.js.map +2 -2
  97. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js +11 -16
  98. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js.map +3 -3
  99. package/dist/modules/dashboards/services/widgetDataService.js +3 -139
  100. package/dist/modules/dashboards/services/widgetDataService.js.map +2 -2
  101. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.js +1 -2
  102. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.js.map +2 -2
  103. package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.js +1 -2
  104. package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.js.map +2 -2
  105. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.js +1 -2
  106. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.js.map +2 -2
  107. package/dist/modules/dashboards/widgets/dashboard/orders-kpi/widget.js +1 -2
  108. package/dist/modules/dashboards/widgets/dashboard/orders-kpi/widget.js.map +2 -2
  109. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.js +1 -2
  110. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.js.map +2 -2
  111. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.js +1 -2
  112. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.js.map +2 -2
  113. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.js +1 -2
  114. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.js.map +2 -2
  115. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.js +1 -2
  116. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.js.map +2 -2
  117. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.js +1 -2
  118. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.js.map +2 -2
  119. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.js +1 -2
  120. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.js.map +2 -2
  121. package/dist/modules/dictionaries/components/DictionaryTable.js +0 -2
  122. package/dist/modules/dictionaries/components/DictionaryTable.js.map +2 -2
  123. package/dist/modules/directory/backend/directory/organizations/page.js +2 -2
  124. package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
  125. package/dist/modules/directory/backend/directory/tenants/page.js +2 -2
  126. package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
  127. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +2 -2
  128. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
  129. package/dist/modules/entities/components/SystemEntitiesTable.js +1 -1
  130. package/dist/modules/entities/components/SystemEntitiesTable.js.map +2 -2
  131. package/dist/modules/entities/components/UserEntitiesTable.js +2 -2
  132. package/dist/modules/entities/components/UserEntitiesTable.js.map +2 -2
  133. package/dist/modules/feature_toggles/components/FeatureTogglesTable.js +3 -3
  134. package/dist/modules/feature_toggles/components/FeatureTogglesTable.js.map +2 -2
  135. package/dist/modules/feature_toggles/components/OverridesTable.js +1 -1
  136. package/dist/modules/feature_toggles/components/OverridesTable.js.map +2 -2
  137. package/dist/modules/planner/backend/planner/availability-rulesets/page.js +2 -2
  138. package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
  139. package/dist/modules/query_index/cli.js +7 -63
  140. package/dist/modules/query_index/cli.js.map +2 -2
  141. package/dist/modules/query_index/components/QueryIndexesTable.js +1 -7
  142. package/dist/modules/query_index/components/QueryIndexesTable.js.map +2 -2
  143. package/dist/modules/resources/backend/resources/resource-types/page.js +2 -2
  144. package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
  145. package/dist/modules/resources/backend/resources/resources/page.js +2 -2
  146. package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
  147. package/dist/modules/sales/backend/sales/channels/offers/page.js +0 -2
  148. package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
  149. package/dist/modules/sales/backend/sales/channels/page.js +0 -2
  150. package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
  151. package/dist/modules/sales/commands/documents.js +0 -53
  152. package/dist/modules/sales/commands/documents.js.map +2 -2
  153. package/dist/modules/sales/commands/payments.js +0 -26
  154. package/dist/modules/sales/commands/payments.js.map +2 -2
  155. package/dist/modules/sales/components/AdjustmentKindSettings.js +2 -2
  156. package/dist/modules/sales/components/AdjustmentKindSettings.js.map +2 -2
  157. package/dist/modules/sales/components/PaymentMethodsSettings.js +2 -2
  158. package/dist/modules/sales/components/PaymentMethodsSettings.js.map +2 -2
  159. package/dist/modules/sales/components/ShippingMethodsSettings.js +2 -2
  160. package/dist/modules/sales/components/ShippingMethodsSettings.js.map +2 -2
  161. package/dist/modules/sales/components/TaxRatesSettings.js +2 -2
  162. package/dist/modules/sales/components/TaxRatesSettings.js.map +2 -2
  163. package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +0 -2
  164. package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
  165. package/dist/modules/sales/components/documents/AdjustmentsSection.js +0 -2
  166. package/dist/modules/sales/components/documents/AdjustmentsSection.js.map +2 -2
  167. package/dist/modules/sales/components/documents/PaymentsSection.js +1 -2
  168. package/dist/modules/sales/components/documents/PaymentsSection.js.map +2 -2
  169. package/dist/modules/sales/components/documents/SalesDocumentsTable.js +0 -2
  170. package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
  171. package/dist/modules/staff/backend/staff/team-members/page.js +1 -1
  172. package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
  173. package/dist/modules/staff/backend/staff/team-roles/page.js +2 -2
  174. package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
  175. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +2 -2
  176. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
  177. package/dist/modules/staff/backend/staff/teams/page.js +2 -2
  178. package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
  179. package/dist/modules/staff/commands/leave-requests.js +0 -79
  180. package/dist/modules/staff/commands/leave-requests.js.map +2 -2
  181. package/dist/modules/workflows/backend/definitions/page.js +0 -5
  182. package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
  183. package/dist/modules/workflows/backend/instances/page.js +0 -3
  184. package/dist/modules/workflows/backend/instances/page.js.map +2 -2
  185. package/dist/modules/workflows/backend/tasks/page.js +0 -3
  186. package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
  187. package/dist/modules/workflows/cli.js +12 -12
  188. package/dist/modules/workflows/cli.js.map +2 -2
  189. package/dist/modules/workflows/lib/transition-handler.js +6 -14
  190. package/dist/modules/workflows/lib/transition-handler.js.map +2 -2
  191. package/generated/entities.ids.generated.ts +1 -5
  192. package/generated/entity-fields-registry.ts +0 -2
  193. package/package.json +2 -2
  194. package/src/modules/api_docs/frontend/docs/api/page.tsx +2 -3
  195. package/src/modules/api_keys/backend/api-keys/page.tsx +1 -1
  196. package/src/modules/attachments/components/AttachmentLibrary.tsx +0 -4
  197. package/src/modules/attachments/components/AttachmentPartitionSettings.tsx +0 -2
  198. package/src/modules/auth/README.md +1 -1
  199. package/src/modules/auth/__tests__/cli-setup-acl.test.ts +1 -1
  200. package/src/modules/auth/api/__tests__/login.test.ts +0 -2
  201. package/src/modules/auth/api/admin/nav.ts +6 -10
  202. package/src/modules/auth/api/login.ts +7 -26
  203. package/src/modules/auth/api/reset/confirm.ts +2 -25
  204. package/src/modules/auth/api/reset.ts +0 -23
  205. package/src/modules/auth/api/sidebar/preferences/route.ts +12 -21
  206. package/src/modules/auth/api/users/route.ts +2 -5
  207. package/src/modules/auth/backend/roles/[id]/edit/page.tsx +1 -4
  208. package/src/modules/auth/backend/roles/page.tsx +3 -3
  209. package/src/modules/auth/backend/users/[id]/edit/page.tsx +3 -22
  210. package/src/modules/auth/backend/users/create/page.tsx +2 -19
  211. package/src/modules/auth/backend/users/page.tsx +3 -3
  212. package/src/modules/auth/cli.ts +11 -38
  213. package/src/modules/auth/commands/users.ts +2 -73
  214. package/src/modules/auth/data/validators.ts +2 -6
  215. package/src/modules/auth/frontend/login.tsx +5 -131
  216. package/src/modules/auth/frontend/reset/[token]/page.tsx +11 -24
  217. package/src/modules/auth/i18n/de.json +1 -48
  218. package/src/modules/auth/i18n/en.json +1 -48
  219. package/src/modules/auth/i18n/es.json +1 -48
  220. package/src/modules/auth/i18n/pl.json +1 -48
  221. package/src/modules/auth/lib/setup-app.ts +9 -58
  222. package/src/modules/auth/services/authService.ts +4 -27
  223. package/src/modules/business_rules/api/execute/route.ts +1 -8
  224. package/src/modules/business_rules/backend/rules/page.tsx +0 -4
  225. package/src/modules/business_rules/backend/sets/page.tsx +0 -3
  226. package/src/modules/business_rules/cli.ts +1 -2
  227. package/src/modules/business_rules/i18n/en.json +1 -3
  228. package/src/modules/business_rules/lib/__tests__/rule-engine.test.ts +0 -51
  229. package/src/modules/business_rules/lib/rule-engine.ts +3 -57
  230. package/src/modules/catalog/components/PriceKindSettings.tsx +0 -2
  231. package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +2 -2
  232. package/src/modules/catalog/components/products/ProductsDataTable.tsx +0 -2
  233. package/src/modules/catalog/i18n/en.json +1 -3
  234. package/src/modules/configs/cli.ts +0 -6
  235. package/src/modules/configs/components/CachePanel.tsx +4 -4
  236. package/src/modules/configs/i18n/en.json +2 -12
  237. package/src/modules/configs/i18n/pl.json +2 -12
  238. package/src/modules/configs/lib/system-status.ts +1 -48
  239. package/src/modules/configs/lib/system-status.types.ts +0 -1
  240. package/src/modules/configs/lib/upgrade-actions.ts +0 -18
  241. package/src/modules/currencies/backend/currencies/page.tsx +0 -3
  242. package/src/modules/currencies/backend/exchange-rates/page.tsx +0 -2
  243. package/src/modules/customers/backend/customers/companies/page.tsx +0 -3
  244. package/src/modules/customers/backend/customers/deals/page.tsx +0 -3
  245. package/src/modules/customers/backend/customers/people/page.tsx +0 -3
  246. package/src/modules/customers/commands/deals.ts +0 -39
  247. package/src/modules/customers/components/CustomerTodosTable.tsx +0 -1
  248. package/src/modules/customers/i18n/en.json +1 -5
  249. package/src/modules/customers/widgets/dashboard/customer-todos/widget.ts +2 -2
  250. package/src/modules/customers/widgets/dashboard/new-customers/widget.ts +2 -2
  251. package/src/modules/customers/widgets/dashboard/new-deals/widget.ts +2 -2
  252. package/src/modules/customers/widgets/dashboard/next-interactions/widget.ts +2 -2
  253. package/src/modules/dashboards/cli.ts +5 -55
  254. package/src/modules/dashboards/components/WidgetVisibilityEditor.tsx +11 -22
  255. package/src/modules/dashboards/services/widgetDataService.ts +4 -164
  256. package/src/modules/dashboards/widgets/dashboard/aov-kpi/widget.ts +2 -2
  257. package/src/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.ts +2 -2
  258. package/src/modules/dashboards/widgets/dashboard/orders-by-status/widget.ts +2 -2
  259. package/src/modules/dashboards/widgets/dashboard/orders-kpi/widget.ts +2 -2
  260. package/src/modules/dashboards/widgets/dashboard/pipeline-summary/widget.ts +2 -2
  261. package/src/modules/dashboards/widgets/dashboard/revenue-kpi/widget.ts +2 -2
  262. package/src/modules/dashboards/widgets/dashboard/revenue-trend/widget.ts +2 -2
  263. package/src/modules/dashboards/widgets/dashboard/sales-by-region/widget.ts +2 -2
  264. package/src/modules/dashboards/widgets/dashboard/top-customers/widget.ts +2 -2
  265. package/src/modules/dashboards/widgets/dashboard/top-products/widget.ts +2 -2
  266. package/src/modules/dictionaries/components/DictionaryTable.tsx +0 -2
  267. package/src/modules/directory/backend/directory/organizations/page.tsx +2 -2
  268. package/src/modules/directory/backend/directory/tenants/page.tsx +2 -2
  269. package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +2 -2
  270. package/src/modules/entities/components/SystemEntitiesTable.tsx +1 -1
  271. package/src/modules/entities/components/UserEntitiesTable.tsx +2 -2
  272. package/src/modules/feature_toggles/components/FeatureTogglesTable.tsx +4 -3
  273. package/src/modules/feature_toggles/components/OverridesTable.tsx +1 -1
  274. package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +2 -2
  275. package/src/modules/query_index/cli.ts +13 -82
  276. package/src/modules/query_index/components/QueryIndexesTable.tsx +2 -8
  277. package/src/modules/resources/backend/resources/resource-types/page.tsx +2 -2
  278. package/src/modules/resources/backend/resources/resources/page.tsx +2 -2
  279. package/src/modules/sales/backend/sales/channels/offers/page.tsx +0 -2
  280. package/src/modules/sales/backend/sales/channels/page.tsx +0 -2
  281. package/src/modules/sales/commands/documents.ts +0 -65
  282. package/src/modules/sales/commands/payments.ts +0 -33
  283. package/src/modules/sales/components/AdjustmentKindSettings.tsx +2 -2
  284. package/src/modules/sales/components/PaymentMethodsSettings.tsx +2 -2
  285. package/src/modules/sales/components/ShippingMethodsSettings.tsx +2 -2
  286. package/src/modules/sales/components/TaxRatesSettings.tsx +2 -2
  287. package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +0 -2
  288. package/src/modules/sales/components/documents/AdjustmentsSection.tsx +0 -2
  289. package/src/modules/sales/components/documents/PaymentsSection.tsx +1 -2
  290. package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +0 -2
  291. package/src/modules/sales/i18n/de.json +0 -20
  292. package/src/modules/sales/i18n/en.json +1 -25
  293. package/src/modules/sales/i18n/es.json +0 -20
  294. package/src/modules/sales/i18n/pl.json +0 -20
  295. package/src/modules/staff/backend/staff/team-members/page.tsx +1 -1
  296. package/src/modules/staff/backend/staff/team-roles/page.tsx +2 -2
  297. package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +2 -2
  298. package/src/modules/staff/backend/staff/teams/page.tsx +2 -2
  299. package/src/modules/staff/commands/leave-requests.ts +0 -94
  300. package/src/modules/staff/i18n/de.json +0 -4
  301. package/src/modules/staff/i18n/en.json +1 -9
  302. package/src/modules/staff/i18n/es.json +0 -4
  303. package/src/modules/staff/i18n/pl.json +0 -4
  304. package/src/modules/workflows/backend/definitions/page.tsx +0 -5
  305. package/src/modules/workflows/backend/instances/page.tsx +1 -4
  306. package/src/modules/workflows/backend/tasks/page.tsx +1 -4
  307. package/src/modules/workflows/cli.ts +12 -12
  308. package/src/modules/workflows/i18n/en.json +1 -3
  309. package/src/modules/workflows/lib/transition-handler.ts +6 -18
  310. package/dist/generated/entities/notification/index.js +0 -57
  311. package/dist/generated/entities/notification/index.js.map +0 -7
  312. package/dist/modules/auth/api/profile/route.js +0 -157
  313. package/dist/modules/auth/api/profile/route.js.map +0 -7
  314. package/dist/modules/auth/backend/auth/profile/page.js +0 -141
  315. package/dist/modules/auth/backend/auth/profile/page.js.map +0 -7
  316. package/dist/modules/auth/backend/auth/profile/page.meta.js +0 -13
  317. package/dist/modules/auth/backend/auth/profile/page.meta.js.map +0 -7
  318. package/dist/modules/auth/notifications.js +0 -112
  319. package/dist/modules/auth/notifications.js.map +0 -7
  320. package/dist/modules/business_rules/notifications.js +0 -28
  321. package/dist/modules/business_rules/notifications.js.map +0 -7
  322. package/dist/modules/business_rules/subscribers/rule-execution-failed-notification.js +0 -37
  323. package/dist/modules/business_rules/subscribers/rule-execution-failed-notification.js.map +0 -7
  324. package/dist/modules/catalog/notifications.js +0 -28
  325. package/dist/modules/catalog/notifications.js.map +0 -7
  326. package/dist/modules/catalog/subscribers/low-stock-notification.js +0 -38
  327. package/dist/modules/catalog/subscribers/low-stock-notification.js.map +0 -7
  328. package/dist/modules/customers/notifications.js +0 -48
  329. package/dist/modules/customers/notifications.js.map +0 -7
  330. package/dist/modules/dashboards/lib/role-widgets.js +0 -58
  331. package/dist/modules/dashboards/lib/role-widgets.js.map +0 -7
  332. package/dist/modules/directory/api/get/tenants/lookup.js +0 -70
  333. package/dist/modules/directory/api/get/tenants/lookup.js.map +0 -7
  334. package/dist/modules/notifications/acl.js +0 -11
  335. package/dist/modules/notifications/acl.js.map +0 -7
  336. package/dist/modules/notifications/api/[id]/action/route.js +0 -74
  337. package/dist/modules/notifications/api/[id]/action/route.js.map +0 -7
  338. package/dist/modules/notifications/api/[id]/dismiss/route.js +0 -15
  339. package/dist/modules/notifications/api/[id]/dismiss/route.js.map +0 -7
  340. package/dist/modules/notifications/api/[id]/read/route.js +0 -15
  341. package/dist/modules/notifications/api/[id]/read/route.js.map +0 -7
  342. package/dist/modules/notifications/api/[id]/restore/route.js +0 -53
  343. package/dist/modules/notifications/api/[id]/restore/route.js.map +0 -7
  344. package/dist/modules/notifications/api/batch/route.js +0 -17
  345. package/dist/modules/notifications/api/batch/route.js.map +0 -7
  346. package/dist/modules/notifications/api/feature/route.js +0 -17
  347. package/dist/modules/notifications/api/feature/route.js.map +0 -7
  348. package/dist/modules/notifications/api/mark-all-read/route.js +0 -35
  349. package/dist/modules/notifications/api/mark-all-read/route.js.map +0 -7
  350. package/dist/modules/notifications/api/openapi.js +0 -76
  351. package/dist/modules/notifications/api/openapi.js.map +0 -7
  352. package/dist/modules/notifications/api/role/route.js +0 -17
  353. package/dist/modules/notifications/api/role/route.js.map +0 -7
  354. package/dist/modules/notifications/api/route.js +0 -85
  355. package/dist/modules/notifications/api/route.js.map +0 -7
  356. package/dist/modules/notifications/api/settings/route.js +0 -155
  357. package/dist/modules/notifications/api/settings/route.js.map +0 -7
  358. package/dist/modules/notifications/api/unread-count/route.js +0 -38
  359. package/dist/modules/notifications/api/unread-count/route.js.map +0 -7
  360. package/dist/modules/notifications/backend/config/notifications/page.js +0 -10
  361. package/dist/modules/notifications/backend/config/notifications/page.js.map +0 -7
  362. package/dist/modules/notifications/backend/config/notifications/page.meta.js +0 -24
  363. package/dist/modules/notifications/backend/config/notifications/page.meta.js.map +0 -7
  364. package/dist/modules/notifications/cli.js +0 -16
  365. package/dist/modules/notifications/cli.js.map +0 -7
  366. package/dist/modules/notifications/data/entities.js +0 -112
  367. package/dist/modules/notifications/data/entities.js.map +0 -7
  368. package/dist/modules/notifications/data/validators.js +0 -98
  369. package/dist/modules/notifications/data/validators.js.map +0 -7
  370. package/dist/modules/notifications/di.js +0 -13
  371. package/dist/modules/notifications/di.js.map +0 -7
  372. package/dist/modules/notifications/emails/NotificationEmail.js +0 -58
  373. package/dist/modules/notifications/emails/NotificationEmail.js.map +0 -7
  374. package/dist/modules/notifications/frontend/NotificationInboxPageClient.js +0 -44
  375. package/dist/modules/notifications/frontend/NotificationInboxPageClient.js.map +0 -7
  376. package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js +0 -220
  377. package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js.map +0 -7
  378. package/dist/modules/notifications/index.js +0 -14
  379. package/dist/modules/notifications/index.js.map +0 -7
  380. package/dist/modules/notifications/lib/deliveryConfig.js +0 -107
  381. package/dist/modules/notifications/lib/deliveryConfig.js.map +0 -7
  382. package/dist/modules/notifications/lib/deliveryStrategies.js +0 -14
  383. package/dist/modules/notifications/lib/deliveryStrategies.js.map +0 -7
  384. package/dist/modules/notifications/lib/events.js +0 -12
  385. package/dist/modules/notifications/lib/events.js.map +0 -7
  386. package/dist/modules/notifications/lib/notificationBuilder.js +0 -66
  387. package/dist/modules/notifications/lib/notificationBuilder.js.map +0 -7
  388. package/dist/modules/notifications/lib/notificationFactory.js +0 -54
  389. package/dist/modules/notifications/lib/notificationFactory.js.map +0 -7
  390. package/dist/modules/notifications/lib/notificationMapper.js +0 -34
  391. package/dist/modules/notifications/lib/notificationMapper.js.map +0 -7
  392. package/dist/modules/notifications/lib/notificationRecipients.js +0 -35
  393. package/dist/modules/notifications/lib/notificationRecipients.js.map +0 -7
  394. package/dist/modules/notifications/lib/notificationService.js +0 -279
  395. package/dist/modules/notifications/lib/notificationService.js.map +0 -7
  396. package/dist/modules/notifications/lib/routeHelpers.js +0 -101
  397. package/dist/modules/notifications/lib/routeHelpers.js.map +0 -7
  398. package/dist/modules/notifications/lib/safeHref.js +0 -24
  399. package/dist/modules/notifications/lib/safeHref.js.map +0 -7
  400. package/dist/modules/notifications/migrations/Migration20260123000001.js +0 -70
  401. package/dist/modules/notifications/migrations/Migration20260123000001.js.map +0 -7
  402. package/dist/modules/notifications/migrations/Migration20260126150000.js +0 -37
  403. package/dist/modules/notifications/migrations/Migration20260126150000.js.map +0 -7
  404. package/dist/modules/notifications/migrations/Migration20260129082610.js +0 -13
  405. package/dist/modules/notifications/migrations/Migration20260129082610.js.map +0 -7
  406. package/dist/modules/notifications/subscribers/deliver-notification.js +0 -165
  407. package/dist/modules/notifications/subscribers/deliver-notification.js.map +0 -7
  408. package/dist/modules/notifications/workers/create-notification.worker.js +0 -70
  409. package/dist/modules/notifications/workers/create-notification.worker.js.map +0 -7
  410. package/dist/modules/sales/notifications.client.js +0 -51
  411. package/dist/modules/sales/notifications.client.js.map +0 -7
  412. package/dist/modules/sales/notifications.js +0 -88
  413. package/dist/modules/sales/notifications.js.map +0 -7
  414. package/dist/modules/sales/subscribers/quote-expiring-notification.js +0 -38
  415. package/dist/modules/sales/subscribers/quote-expiring-notification.js.map +0 -7
  416. package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js +0 -137
  417. package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js.map +0 -7
  418. package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js +0 -137
  419. package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js.map +0 -7
  420. package/dist/modules/sales/widgets/notifications/index.js +0 -7
  421. package/dist/modules/sales/widgets/notifications/index.js.map +0 -7
  422. package/dist/modules/sales/widgets/notifications/useSalesDocumentTotals.js +0 -60
  423. package/dist/modules/sales/widgets/notifications/useSalesDocumentTotals.js.map +0 -7
  424. package/dist/modules/staff/notifications.js +0 -75
  425. package/dist/modules/staff/notifications.js.map +0 -7
  426. package/dist/modules/workflows/notifications.js +0 -28
  427. package/dist/modules/workflows/notifications.js.map +0 -7
  428. package/dist/modules/workflows/subscribers/task-assigned-notification.js +0 -38
  429. package/dist/modules/workflows/subscribers/task-assigned-notification.js.map +0 -7
  430. package/generated/entities/notification/index.ts +0 -27
  431. package/src/modules/auth/api/profile/route.ts +0 -163
  432. package/src/modules/auth/backend/auth/profile/page.meta.ts +0 -9
  433. package/src/modules/auth/backend/auth/profile/page.tsx +0 -174
  434. package/src/modules/auth/notifications.ts +0 -109
  435. package/src/modules/business_rules/notifications.ts +0 -25
  436. package/src/modules/business_rules/subscribers/rule-execution-failed-notification.ts +0 -50
  437. package/src/modules/catalog/notifications.ts +0 -25
  438. package/src/modules/catalog/subscribers/low-stock-notification.ts +0 -52
  439. package/src/modules/customers/notifications.ts +0 -44
  440. package/src/modules/dashboards/lib/role-widgets.ts +0 -80
  441. package/src/modules/directory/api/get/tenants/lookup.ts +0 -75
  442. package/src/modules/notifications/__tests__/deliver-notification.test.ts +0 -195
  443. package/src/modules/notifications/__tests__/deliveryStrategies.test.ts +0 -19
  444. package/src/modules/notifications/__tests__/notificationService.test.ts +0 -208
  445. package/src/modules/notifications/acl.ts +0 -7
  446. package/src/modules/notifications/api/[id]/action/route.ts +0 -75
  447. package/src/modules/notifications/api/[id]/dismiss/route.ts +0 -12
  448. package/src/modules/notifications/api/[id]/read/route.ts +0 -12
  449. package/src/modules/notifications/api/[id]/restore/route.ts +0 -53
  450. package/src/modules/notifications/api/batch/route.ts +0 -14
  451. package/src/modules/notifications/api/feature/route.ts +0 -14
  452. package/src/modules/notifications/api/mark-all-read/route.ts +0 -34
  453. package/src/modules/notifications/api/openapi.ts +0 -76
  454. package/src/modules/notifications/api/role/route.ts +0 -14
  455. package/src/modules/notifications/api/route.ts +0 -92
  456. package/src/modules/notifications/api/settings/route.ts +0 -157
  457. package/src/modules/notifications/api/unread-count/route.ts +0 -38
  458. package/src/modules/notifications/backend/config/notifications/page.meta.ts +0 -22
  459. package/src/modules/notifications/backend/config/notifications/page.tsx +0 -12
  460. package/src/modules/notifications/cli.ts +0 -18
  461. package/src/modules/notifications/data/entities.ts +0 -99
  462. package/src/modules/notifications/data/validators.ts +0 -115
  463. package/src/modules/notifications/di.ts +0 -11
  464. package/src/modules/notifications/emails/NotificationEmail.tsx +0 -98
  465. package/src/modules/notifications/frontend/NotificationInboxPageClient.tsx +0 -42
  466. package/src/modules/notifications/frontend/NotificationSettingsPageClient.tsx +0 -233
  467. package/src/modules/notifications/i18n/de.json +0 -50
  468. package/src/modules/notifications/i18n/en.json +0 -50
  469. package/src/modules/notifications/i18n/es.json +0 -50
  470. package/src/modules/notifications/i18n/pl.json +0 -50
  471. package/src/modules/notifications/index.ts +0 -12
  472. package/src/modules/notifications/lib/deliveryConfig.ts +0 -153
  473. package/src/modules/notifications/lib/deliveryStrategies.ts +0 -50
  474. package/src/modules/notifications/lib/events.ts +0 -48
  475. package/src/modules/notifications/lib/notificationBuilder.ts +0 -121
  476. package/src/modules/notifications/lib/notificationFactory.ts +0 -76
  477. package/src/modules/notifications/lib/notificationMapper.ts +0 -33
  478. package/src/modules/notifications/lib/notificationRecipients.ts +0 -83
  479. package/src/modules/notifications/lib/notificationService.ts +0 -414
  480. package/src/modules/notifications/lib/routeHelpers.ts +0 -151
  481. package/src/modules/notifications/lib/safeHref.ts +0 -29
  482. package/src/modules/notifications/migrations/.snapshot-open-mercato.json +0 -336
  483. package/src/modules/notifications/migrations/Migration20260123000001.ts +0 -73
  484. package/src/modules/notifications/migrations/Migration20260126150000.ts +0 -39
  485. package/src/modules/notifications/migrations/Migration20260129082610.ts +0 -13
  486. package/src/modules/notifications/subscribers/deliver-notification.ts +0 -204
  487. package/src/modules/notifications/workers/create-notification.worker.ts +0 -122
  488. package/src/modules/sales/notifications.client.ts +0 -65
  489. package/src/modules/sales/notifications.ts +0 -82
  490. package/src/modules/sales/subscribers/quote-expiring-notification.ts +0 -53
  491. package/src/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.tsx +0 -156
  492. package/src/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.tsx +0 -156
  493. package/src/modules/sales/widgets/notifications/index.ts +0 -2
  494. package/src/modules/sales/widgets/notifications/useSalesDocumentTotals.ts +0 -81
  495. package/src/modules/staff/notifications.ts +0 -71
  496. package/src/modules/workflows/notifications.ts +0 -25
  497. package/src/modules/workflows/subscribers/task-assigned-notification.ts +0 -53
@@ -27,10 +27,6 @@ import {
27
27
  import { normalizeTenantId } from '@open-mercato/core/modules/auth/lib/tenantAccess'
28
28
  import { computeEmailHash } from '@open-mercato/core/modules/auth/lib/emailHash'
29
29
  import { findOneWithDecryption, findWithDecryption } from '@open-mercato/shared/lib/encryption/find'
30
- import { buildNotificationFromType } from '@open-mercato/core/modules/notifications/lib/notificationBuilder'
31
- import { resolveNotificationService } from '@open-mercato/core/modules/notifications/lib/notificationService'
32
- import notificationTypes from '@open-mercato/core/modules/auth/notifications'
33
- import { buildPasswordSchema } from '@open-mercato/shared/lib/auth/passwordPolicy'
34
30
 
35
31
  type SerializedUser = {
36
32
  email: string
@@ -67,11 +63,9 @@ type UserSnapshots = {
67
63
  undo: UserUndoSnapshot
68
64
  }
69
65
 
70
- const passwordSchema = buildPasswordSchema()
71
-
72
66
  const createSchema = z.object({
73
67
  email: z.string().email(),
74
- password: passwordSchema,
68
+ password: z.string().min(6),
75
69
  organizationId: z.string().uuid(),
76
70
  roles: z.array(z.string()).optional(),
77
71
  })
@@ -79,7 +73,7 @@ const createSchema = z.object({
79
73
  const updateSchema = z.object({
80
74
  id: z.string().uuid(),
81
75
  email: z.string().email().optional(),
82
- password: passwordSchema.optional(),
76
+ password: z.string().min(6).optional(),
83
77
  organizationId: z.string().uuid().optional(),
84
78
  roles: z.array(z.string()).optional(),
85
79
  })
@@ -111,46 +105,6 @@ export const userCrudIndexer: CrudIndexerConfig = {
111
105
  }),
112
106
  }
113
107
 
114
- async function notifyRoleChanges(
115
- ctx: CommandRuntimeContext,
116
- user: User,
117
- assignedRoles: string[],
118
- revokedRoles: string[],
119
- ): Promise<void> {
120
- const tenantId = user.tenantId ? String(user.tenantId) : null
121
- if (!tenantId) return
122
- const organizationId = user.organizationId ? String(user.organizationId) : null
123
-
124
- try {
125
- const notificationService = resolveNotificationService(ctx.container)
126
- if (assignedRoles.length) {
127
- const assignedType = notificationTypes.find((type) => type.type === 'auth.role.assigned')
128
- if (assignedType) {
129
- const notificationInput = buildNotificationFromType(assignedType, {
130
- recipientUserId: String(user.id),
131
- sourceEntityType: 'auth:user',
132
- sourceEntityId: String(user.id),
133
- })
134
- await notificationService.create(notificationInput, { tenantId, organizationId })
135
- }
136
- }
137
-
138
- if (revokedRoles.length) {
139
- const revokedType = notificationTypes.find((type) => type.type === 'auth.role.revoked')
140
- if (revokedType) {
141
- const notificationInput = buildNotificationFromType(revokedType, {
142
- recipientUserId: String(user.id),
143
- sourceEntityType: 'auth:user',
144
- sourceEntityId: String(user.id),
145
- })
146
- await notificationService.create(notificationInput, { tenantId, organizationId })
147
- }
148
- }
149
- } catch (err) {
150
- console.error('[auth.users.roles] Failed to create notification:', err)
151
- }
152
- }
153
-
154
108
  const createUserCommand: CommandHandler<Record<string, unknown>, User> = {
155
109
  id: 'auth.users.create',
156
110
  async execute(rawInput, ctx) {
@@ -193,10 +147,8 @@ const createUserCommand: CommandHandler<Record<string, unknown>, User> = {
193
147
  throw error
194
148
  }
195
149
 
196
- let assignedRoles: string[] = []
197
150
  if (Array.isArray(parsed.roles) && parsed.roles.length) {
198
151
  await syncUserRoles(em, user, parsed.roles, tenantId)
199
- assignedRoles = await loadUserRoleNames(em, String(user.id))
200
152
  }
201
153
 
202
154
  await setCustomFieldsIfAny({
@@ -221,10 +173,6 @@ const createUserCommand: CommandHandler<Record<string, unknown>, User> = {
221
173
  indexer: userCrudIndexer,
222
174
  })
223
175
 
224
- if (assignedRoles.length) {
225
- await notifyRoleChanges(ctx, user, assignedRoles, [])
226
- }
227
-
228
176
  return user
229
177
  },
230
178
  captureAfter: async (_input, result, ctx) => {
@@ -340,9 +288,6 @@ const updateUserCommand: CommandHandler<Record<string, unknown>, User> = {
340
288
  async execute(rawInput, ctx) {
341
289
  const { parsed, custom } = parseWithCustomFields(updateSchema, rawInput)
342
290
  const em = (ctx.container.resolve('em') as EntityManager)
343
- const rolesBefore = Array.isArray(parsed.roles)
344
- ? await loadUserRoleNames(em, parsed.id)
345
- : null
346
291
 
347
292
  if (parsed.email !== undefined) {
348
293
  const emailHash = computeEmailHash(parsed.email)
@@ -432,14 +377,6 @@ const updateUserCommand: CommandHandler<Record<string, unknown>, User> = {
432
377
  indexer: userCrudIndexer,
433
378
  })
434
379
 
435
- if (Array.isArray(parsed.roles) && rolesBefore) {
436
- const rolesAfter = await loadUserRoleNames(em, String(user.id))
437
- const { assigned, revoked } = diffRoleChanges(rolesBefore, rolesAfter)
438
- if (assigned.length || revoked.length) {
439
- await notifyRoleChanges(ctx, user, assigned, revoked)
440
- }
441
- }
442
-
443
380
  await invalidateUserCache(ctx, parsed.id)
444
381
 
445
382
  return user
@@ -835,14 +772,6 @@ async function invalidateUserCache(ctx: CommandRuntimeContext, userId: string) {
835
772
  }
836
773
  }
837
774
 
838
- function diffRoleChanges(before: string[], after: string[]) {
839
- const beforeSet = new Set(before)
840
- const afterSet = new Set(after)
841
- const assigned = after.filter((role) => !beforeSet.has(role))
842
- const revoked = before.filter((role) => !afterSet.has(role))
843
- return { assigned, revoked }
844
- }
845
-
846
775
  function arrayEquals(left: string[] | undefined, right: string[]): boolean {
847
776
  if (!left) return false
848
777
  if (left.length !== right.length) return false
@@ -1,14 +1,10 @@
1
1
  import { z } from 'zod'
2
- import { buildPasswordSchema } from '@open-mercato/shared/lib/auth/passwordPolicy'
3
-
4
- const passwordSchema = buildPasswordSchema()
5
2
 
6
3
  // Core auth validators
7
4
  export const userLoginSchema = z.object({
8
5
  email: z.string().email(),
9
6
  password: z.string().min(6),
10
7
  requireRole: z.string().optional(),
11
- tenantId: z.string().uuid().optional(),
12
8
  })
13
9
 
14
10
  export const requestPasswordResetSchema = z.object({
@@ -17,7 +13,7 @@ export const requestPasswordResetSchema = z.object({
17
13
 
18
14
  export const confirmPasswordResetSchema = z.object({
19
15
  token: z.string().min(10),
20
- password: passwordSchema,
16
+ password: z.string().min(6),
21
17
  })
22
18
 
23
19
  export const sidebarPreferencesInputSchema = z.object({
@@ -33,7 +29,7 @@ export const sidebarPreferencesInputSchema = z.object({
33
29
  // Optional helpers for CLI or admin forms
34
30
  export const userCreateSchema = z.object({
35
31
  email: z.string().email(),
36
- password: passwordSchema,
32
+ password: z.string().min(6),
37
33
  tenantId: z.string().uuid().optional(),
38
34
  organizationId: z.string().uuid(),
39
35
  rolesCsv: z.string().optional(),
@@ -1,39 +1,14 @@
1
1
  "use client"
2
- import { useCallback, useEffect, useState } from 'react'
2
+ import { useState } from 'react'
3
3
  import Image from 'next/image'
4
4
  import Link from 'next/link'
5
5
  import { useRouter, useSearchParams } from 'next/navigation'
6
- import { Card, CardContent, CardHeader, CardDescription } from '@open-mercato/ui/primitives/card'
6
+ import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@open-mercato/ui/primitives/card'
7
7
  import { Input } from '@open-mercato/ui/primitives/input'
8
8
  import { Label } from '@open-mercato/ui/primitives/label'
9
- import { Button } from '@open-mercato/ui/primitives/button'
10
9
  import { useT } from '@open-mercato/shared/lib/i18n/context'
11
10
  import { translateWithFallback } from '@open-mercato/shared/lib/i18n/translate'
12
11
  import { clearAllOperations } from '@open-mercato/ui/backend/operations/store'
13
- import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
14
-
15
- const loginTenantKey = 'om_login_tenant'
16
- const loginTenantCookieMaxAge = 60 * 60 * 24 * 14
17
-
18
- function readTenantCookie() {
19
- if (typeof document === 'undefined') return null
20
- const entries = document.cookie.split(';')
21
- for (const entry of entries) {
22
- const [name, ...rest] = entry.trim().split('=')
23
- if (name === loginTenantKey) return decodeURIComponent(rest.join('='))
24
- }
25
- return null
26
- }
27
-
28
- function setTenantCookie(value: string) {
29
- if (typeof document === 'undefined') return
30
- document.cookie = `${loginTenantKey}=${encodeURIComponent(value)}; path=/; max-age=${loginTenantCookieMaxAge}; samesite=lax`
31
- }
32
-
33
- function clearTenantCookie() {
34
- if (typeof document === 'undefined') return
35
- document.cookie = `${loginTenantKey}=; path=/; max-age=0; samesite=lax`
36
- }
37
12
 
38
13
  function extractErrorMessage(payload: unknown): string | null {
39
14
  if (!payload) return null
@@ -69,11 +44,8 @@ function looksLikeJsonString(value: string): boolean {
69
44
 
70
45
  export default function LoginPage() {
71
46
  const t = useT()
72
- const translate = useCallback(
73
- (key: string, fallback: string, params?: Record<string, string | number>) =>
74
- translateWithFallback(t, key, fallback, params),
75
- [t],
76
- )
47
+ const translate = (key: string, fallback: string, params?: Record<string, string | number>) =>
48
+ translateWithFallback(t, key, fallback, params)
77
49
  const router = useRouter()
78
50
  const searchParams = useSearchParams()
79
51
  const requireRole = (searchParams.get('requireRole') || searchParams.get('role') || '').trim()
@@ -84,80 +56,6 @@ export default function LoginPage() {
84
56
  const translatedFeatures = requiredFeatures.map((feature) => translate(`features.${feature}`, feature))
85
57
  const [error, setError] = useState<string | null>(null)
86
58
  const [submitting, setSubmitting] = useState(false)
87
- const [tenantId, setTenantId] = useState<string | null>(null)
88
- const [tenantName, setTenantName] = useState<string | null>(null)
89
- const [tenantLoading, setTenantLoading] = useState(false)
90
- const [tenantInvalid, setTenantInvalid] = useState<string | null>(null)
91
- const showTenantInvalid = tenantId != null && tenantInvalid === tenantId
92
-
93
- useEffect(() => {
94
- const tenantParam = (searchParams.get('tenant') || '').trim()
95
- if (tenantParam) {
96
- setTenantId(tenantParam)
97
- window.localStorage.setItem(loginTenantKey, tenantParam)
98
- setTenantCookie(tenantParam)
99
- return
100
- }
101
- const storedTenant = window.localStorage.getItem(loginTenantKey) || readTenantCookie()
102
- if (storedTenant) {
103
- setTenantId(storedTenant)
104
- }
105
- }, [searchParams])
106
-
107
- useEffect(() => {
108
- if (!tenantId) {
109
- setTenantName(null)
110
- setTenantInvalid(null)
111
- return
112
- }
113
- if (tenantInvalid === tenantId) {
114
- setTenantName(null)
115
- setTenantLoading(false)
116
- return
117
- }
118
- let active = true
119
- setTenantLoading(true)
120
- setTenantInvalid(null)
121
- apiCall<{ ok: boolean; tenant?: { id: string; name: string }; error?: string }>(
122
- `/api/directory/tenants/lookup?tenantId=${encodeURIComponent(tenantId)}`,
123
- )
124
- .then(({ result }) => {
125
- if (!active) return
126
- if (result?.ok && result.tenant) {
127
- setTenantName(result.tenant.name)
128
- return
129
- }
130
- const message = translate('auth.login.errors.tenantInvalid', 'Tenant not found. Clear the tenant selection and try again.')
131
- setTenantName(null)
132
- setTenantInvalid(tenantId)
133
- setError(null)
134
- })
135
- .catch(() => {
136
- if (!active) return
137
- setTenantName(null)
138
- setTenantInvalid(tenantId)
139
- setError(null)
140
- })
141
- .finally(() => {
142
- if (active) setTenantLoading(false)
143
- })
144
- return () => {
145
- active = false
146
- }
147
- }, [tenantId, translate])
148
-
149
- function handleClearTenant() {
150
- window.localStorage.removeItem(loginTenantKey)
151
- clearTenantCookie()
152
- setTenantId(null)
153
- setTenantName(null)
154
- setTenantInvalid(null)
155
- const params = new URLSearchParams(searchParams)
156
- params.delete('tenant')
157
- setError(null)
158
- const query = params.toString()
159
- router.replace(query ? `/login?${query}` : '/login')
160
- }
161
59
 
162
60
  async function onSubmit(e: React.FormEvent<HTMLFormElement>) {
163
61
  e.preventDefault()
@@ -243,9 +141,6 @@ export default function LoginPage() {
243
141
  </CardHeader>
244
142
  <CardContent>
245
143
  <form className="grid gap-3" onSubmit={onSubmit} noValidate>
246
- {tenantId ? (
247
- <input type="hidden" name="tenantId" value={tenantId} />
248
- ) : null}
249
144
  {!!translatedRoles.length && (
250
145
  <div className="rounded-md border border-blue-200 bg-blue-50 px-3 py-2 text-center text-xs text-blue-900">
251
146
  {translate(
@@ -264,28 +159,7 @@ export default function LoginPage() {
264
159
  })}
265
160
  </div>
266
161
  )}
267
- {showTenantInvalid ? (
268
- <div className="rounded-md border border-red-200 bg-red-50 px-3 py-2 text-center text-xs text-red-700">
269
- <div className="font-medium">{translate('auth.login.errors.tenantInvalid', 'Tenant not found. Clear the tenant selection and try again.')}</div>
270
- <Button type="button" variant="ghost" size="sm" className="mt-2 text-red-700" onClick={handleClearTenant}>
271
- {translate('auth.login.tenantClear', 'Clear')}
272
- </Button>
273
- </div>
274
- ) : tenantId ? (
275
- <div className="rounded-md border border-emerald-200 bg-emerald-50 px-3 py-2 text-center text-xs text-emerald-900">
276
- <div className="font-medium">
277
- {tenantLoading
278
- ? translate('auth.login.tenantLoading', 'Loading tenant details...')
279
- : translate('auth.login.tenantBanner', "You're logging in to {tenant} tenant.", {
280
- tenant: tenantName || tenantId,
281
- })}
282
- </div>
283
- <Button type="button" variant="ghost" size="sm" className="mt-2 text-emerald-900" onClick={handleClearTenant}>
284
- {translate('auth.login.tenantClear', 'Clear')}
285
- </Button>
286
- </div>
287
- ) : null}
288
- {error && !showTenantInvalid && (
162
+ {error && (
289
163
  <div className="rounded-md border border-red-200 bg-red-50 px-3 py-2 text-center text-sm text-red-700" role="alert" aria-live="polite">
290
164
  {error}
291
165
  </div>
@@ -4,20 +4,11 @@ import { Input } from '@open-mercato/ui/primitives/input'
4
4
  import { Label } from '@open-mercato/ui/primitives/label'
5
5
  import { useState } from 'react'
6
6
  import { useRouter } from 'next/navigation'
7
- import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
8
- import { useT } from '@open-mercato/shared/lib/i18n/context'
9
- import { formatPasswordRequirements, getPasswordPolicy } from '@open-mercato/shared/lib/auth/passwordPolicy'
10
7
 
11
8
  export default function ResetWithTokenPage({ params }: { params: { token: string } }) {
12
9
  const router = useRouter()
13
- const t = useT()
14
10
  const [error, setError] = useState<string | null>(null)
15
11
  const [submitting, setSubmitting] = useState(false)
16
- const passwordPolicy = getPasswordPolicy()
17
- const passwordRequirements = formatPasswordRequirements(passwordPolicy, t)
18
- const passwordDescription = passwordRequirements
19
- ? t('auth.password.requirements.help', 'Password requirements: {requirements}', { requirements: passwordRequirements })
20
- : ''
21
12
 
22
13
  async function onSubmit(e: React.FormEvent<HTMLFormElement>) {
23
14
  e.preventDefault()
@@ -26,15 +17,13 @@ export default function ResetWithTokenPage({ params }: { params: { token: string
26
17
  try {
27
18
  const form = new FormData(e.currentTarget)
28
19
  form.set('token', params.token)
29
- const { ok, result } = await apiCall<{ ok?: boolean; error?: string; redirect?: string }>(
30
- '/api/auth/reset/confirm',
31
- { method: 'POST', body: form },
32
- )
33
- if (!ok || result?.ok === false) {
34
- setError(result?.error || t('auth.reset.errors.failed', 'Unable to reset password'))
20
+ const res = await fetch('/api/auth/reset/confirm', { method: 'POST', body: form })
21
+ const data = await res.json().catch(() => null)
22
+ if (!res.ok) {
23
+ setError(data?.error || 'Unable to reset password')
35
24
  return
36
25
  }
37
- router.replace(result?.redirect || '/login')
26
+ router.replace(data?.redirect || '/login')
38
27
  } finally {
39
28
  setSubmitting(false)
40
29
  }
@@ -44,21 +33,18 @@ export default function ResetWithTokenPage({ params }: { params: { token: string
44
33
  <div className="min-h-svh flex items-center justify-center p-4">
45
34
  <Card className="w-full max-w-sm">
46
35
  <CardHeader>
47
- <CardTitle>{t('auth.reset.title', 'Set a new password')}</CardTitle>
48
- <CardDescription>{t('auth.reset.subtitle', 'Choose a strong password for your account.')}</CardDescription>
36
+ <CardTitle>Set a new password</CardTitle>
37
+ <CardDescription>Choose a strong password for your account.</CardDescription>
49
38
  </CardHeader>
50
39
  <CardContent>
51
40
  <form className="grid gap-3" onSubmit={onSubmit}>
52
41
  {error && <div className="text-sm text-red-600">{error}</div>}
53
42
  <div className="grid gap-1">
54
- <Label htmlFor="password">{t('auth.reset.form.password', 'New password')}</Label>
55
- <Input id="password" name="password" type="password" required minLength={passwordPolicy.minLength} />
56
- {passwordDescription ? (
57
- <p className="text-xs text-muted-foreground">{passwordDescription}</p>
58
- ) : null}
43
+ <Label htmlFor="password">New password</Label>
44
+ <Input id="password" name="password" type="password" required minLength={6} />
59
45
  </div>
60
46
  <button disabled={submitting} className="h-10 rounded-md bg-foreground text-background mt-2 hover:opacity-90 transition disabled:opacity-60">
61
- {submitting ? t('auth.reset.form.loading', '...') : t('auth.reset.form.submit', 'Update password')}
47
+ {submitting ? '...' : 'Update password'}
62
48
  </button>
63
49
  </form>
64
50
  </CardContent>
@@ -66,3 +52,4 @@ export default function ResetWithTokenPage({ params }: { params: { token: string
66
52
  </div>
67
53
  )
68
54
  }
55
+
@@ -2,26 +2,12 @@
2
2
  "auth.signIn": "Anmelden",
3
3
  "auth.email": "E-Mail",
4
4
  "auth.password": "Passwort",
5
- "auth.password.requirements.help": "Passwortanforderungen: {requirements}",
6
- "auth.password.requirements.minLength": "Mindestens {min} Zeichen",
7
- "auth.password.requirements.digit": "Eine Zahl",
8
- "auth.password.requirements.uppercase": "Ein Großbuchstabe",
9
- "auth.password.requirements.special": "Ein Sonderzeichen",
10
- "auth.password.requirements.separator": ", ",
11
5
  "auth.sendResetLink": "Link zum Zurücksetzen senden",
12
6
  "auth.resetPassword": "Passwort zurücksetzen",
13
- "auth.reset.title": "Neues Passwort festlegen",
14
- "auth.reset.subtitle": "Wähle ein sicheres Passwort für dein Konto.",
15
- "auth.reset.form.password": "Neues Passwort",
16
- "auth.reset.form.loading": "...",
17
- "auth.reset.form.submit": "Passwort aktualisieren",
18
- "auth.reset.errors.failed": "Passwort konnte nicht zurückgesetzt werden",
19
7
  "auth.usersRoles": "Benutzer und Rollen",
20
8
  "auth.manageAuthSettings": "Verwalte die Authentifizierungseinstellungen.",
21
9
  "auth.login.errors.permissionDenied": "Du hast keine Berechtigung, auf diesen Bereich zuzugreifen. Bitte wende dich an deine Administration.",
22
10
  "auth.login.errors.invalidCredentials": "Ungültige E-Mail oder ungültiges Passwort",
23
- "auth.login.errors.tenantRequired": "Nutze den Login-Link aus deiner Tenant-Aktivierung, um fortzufahren.",
24
- "auth.login.errors.tenantInvalid": "Tenant nicht gefunden. Entferne die Tenant-Auswahl und versuche es erneut.",
25
11
  "auth.login.errors.generic": "Es ist ein Fehler aufgetreten. Bitte versuche es erneut.",
26
12
  "auth.login.logoAlt": "Open Mercato Logo",
27
13
  "auth.login.brandName": "Open Mercato",
@@ -29,9 +15,6 @@
29
15
  "auth.login.requireRoleMessage": "Für den Zugriff ist die folgende Rolle erforderlich: {roles}",
30
16
  "auth.login.requireRolesMessage": "Für den Zugriff ist eine der folgenden Rollen erforderlich: {roles}",
31
17
  "auth.login.featureDenied": "Du hast keinen Zugriff auf diese Funktion ({feature}). Bitte wende dich an deine Administration.",
32
- "auth.login.tenantBanner": "Du meldest dich beim Tenant {tenant} an.",
33
- "auth.login.tenantLoading": "Tenant-Daten werden geladen...",
34
- "auth.login.tenantClear": "Zurücksetzen",
35
18
  "auth.login.rememberMe": "Angemeldet bleiben",
36
19
  "auth.login.loading": "Wird geladen ...",
37
20
  "auth.login.forgotPassword": "Passwort vergessen?",
@@ -97,21 +80,6 @@
97
80
  "auth.users.form.errors.load": "Benutzerdaten konnten nicht geladen werden",
98
81
  "auth.users.form.errors.aclUpdate": "Aktualisierung der Benutzerberechtigungen fehlgeschlagen",
99
82
  "auth.users.form.errors.delete": "Benutzer konnte nicht gelöscht werden",
100
- "auth.profile.title": "Profil",
101
- "auth.profile.subtitle": "Passwort ändern",
102
- "auth.profile.form.email": "E-Mail",
103
- "auth.profile.form.password": "Neues Passwort",
104
- "auth.profile.form.confirmPassword": "Neues Passwort bestätigen",
105
- "auth.profile.form.save": "Änderungen speichern",
106
- "auth.profile.form.loading": "Profil wird geladen...",
107
- "auth.profile.form.errors.load": "Profil konnte nicht geladen werden.",
108
- "auth.profile.form.errors.save": "Profil konnte nicht aktualisiert werden.",
109
- "auth.profile.form.errors.invalid": "Ungültige Profilaktualisierung.",
110
- "auth.profile.form.errors.passwordMismatch": "Die Passwörter stimmen nicht überein.",
111
- "auth.profile.form.errors.passwordRequirements": "Das Passwort muss die Anforderungen erfüllen.",
112
- "auth.profile.form.errors.noChanges": "Keine Änderungen zu speichern.",
113
- "auth.profile.form.errors.emailRequired": "E-Mail ist erforderlich.",
114
- "auth.profile.form.success": "Profil aktualisiert.",
115
83
  "auth.users.list.error.load": "Benutzer konnten nicht geladen werden",
116
84
  "auth.users.list.error.delete": "Benutzer konnte nicht gelöscht werden",
117
85
  "auth.users.flash.created": "Benutzer erstellt",
@@ -127,20 +95,5 @@
127
95
  "auth.email.resetPassword.title": "Passwort zurücksetzen",
128
96
  "auth.email.resetPassword.body": "Klicken Sie auf den Link unten, um ein neues Passwort festzulegen. Dieser Link läuft in 60 Minuten ab.",
129
97
  "auth.email.resetPassword.cta": "Neues Passwort festlegen",
130
- "auth.email.resetPassword.hint": "Wenn Sie dies nicht angefordert haben, können Sie diese E-Mail ignorieren.",
131
- "auth.notifications.passwordReset.requested.title": "Passwort-Zurücksetzung angefordert",
132
- "auth.notifications.passwordReset.requested.body": "Ein Link zum Zurücksetzen des Passworts wurde an Ihre E-Mail gesendet",
133
- "auth.notifications.passwordReset.completed.title": "Passwort erfolgreich geändert",
134
- "auth.notifications.passwordReset.completed.body": "Ihr Passwort wurde erfolgreich aktualisiert",
135
- "auth.notifications.account.locked.title": "Konto gesperrt",
136
- "auth.notifications.account.locked.body": "Ihr Konto wurde aus Sicherheitsgründen gesperrt. Bitte wenden Sie sich an den Support.",
137
- "auth.notifications.login.newDevice.title": "Neues Gerät erkannt",
138
- "auth.notifications.login.newDevice.body": "Es wurde eine Anmeldung von einem unbekannten Gerät für Ihr Konto erkannt",
139
- "auth.notifications.role.assigned.title": "Neue Rolle zugewiesen",
140
- "auth.notifications.role.assigned.body": "Ihnen wurde eine neue Rolle mit zusätzlichen Berechtigungen zugewiesen",
141
- "auth.notifications.role.revoked.title": "Rolle entfernt",
142
- "auth.notifications.role.revoked.body": "Eine Rolle wurde von Ihrem Konto entfernt",
143
- "auth.actions.contactSupport": "Support kontaktieren",
144
- "auth.actions.viewSessions": "Sitzungen anzeigen",
145
- "auth.actions.viewPermissions": "Berechtigungen anzeigen"
98
+ "auth.email.resetPassword.hint": "Wenn Sie dies nicht angefordert haben, können Sie diese E-Mail ignorieren."
146
99
  }
@@ -2,26 +2,12 @@
2
2
  "auth.signIn": "Sign in",
3
3
  "auth.email": "Email",
4
4
  "auth.password": "Password",
5
- "auth.password.requirements.help": "Password requirements: {requirements}",
6
- "auth.password.requirements.minLength": "At least {min} characters",
7
- "auth.password.requirements.digit": "One number",
8
- "auth.password.requirements.uppercase": "One uppercase letter",
9
- "auth.password.requirements.special": "One special character",
10
- "auth.password.requirements.separator": ", ",
11
5
  "auth.sendResetLink": "Send reset link",
12
6
  "auth.resetPassword": "Reset password",
13
- "auth.reset.title": "Set a new password",
14
- "auth.reset.subtitle": "Choose a strong password for your account.",
15
- "auth.reset.form.password": "New password",
16
- "auth.reset.form.loading": "...",
17
- "auth.reset.form.submit": "Update password",
18
- "auth.reset.errors.failed": "Unable to reset password",
19
7
  "auth.usersRoles": "Users & Roles",
20
8
  "auth.manageAuthSettings": "Manage authentication settings.",
21
9
  "auth.login.errors.permissionDenied": "You do not have permission to access this area. Please contact your administrator.",
22
10
  "auth.login.errors.invalidCredentials": "Invalid email or password",
23
- "auth.login.errors.tenantRequired": "Use the login link provided with your tenant activation to continue.",
24
- "auth.login.errors.tenantInvalid": "Tenant not found. Clear the tenant selection and try again.",
25
11
  "auth.login.errors.generic": "An error occurred. Please try again.",
26
12
  "auth.login.logoAlt": "Open Mercato logo",
27
13
  "auth.login.brandName": "Open Mercato",
@@ -29,9 +15,6 @@
29
15
  "auth.login.requireRoleMessage": "Access requires role: {roles}",
30
16
  "auth.login.requireRolesMessage": "Access requires one of the following roles: {roles}",
31
17
  "auth.login.featureDenied": "You don't have access to this feature ({feature}). Please contact your administrator.",
32
- "auth.login.tenantBanner": "You're logging in to {tenant} tenant.",
33
- "auth.login.tenantLoading": "Loading tenant details...",
34
- "auth.login.tenantClear": "Clear",
35
18
  "auth.login.rememberMe": "Remember me",
36
19
  "auth.login.loading": "Loading...",
37
20
  "auth.login.forgotPassword": "Forgot password?",
@@ -97,21 +80,6 @@
97
80
  "auth.users.form.errors.load": "Failed to load user data",
98
81
  "auth.users.form.errors.aclUpdate": "Failed to update user access control",
99
82
  "auth.users.form.errors.delete": "Failed to delete user",
100
- "auth.profile.title": "Profile",
101
- "auth.profile.subtitle": "Change password",
102
- "auth.profile.form.email": "Email",
103
- "auth.profile.form.password": "New password",
104
- "auth.profile.form.confirmPassword": "Confirm new password",
105
- "auth.profile.form.save": "Save changes",
106
- "auth.profile.form.loading": "Loading profile...",
107
- "auth.profile.form.errors.load": "Failed to load profile.",
108
- "auth.profile.form.errors.save": "Failed to update profile.",
109
- "auth.profile.form.errors.invalid": "Invalid profile update.",
110
- "auth.profile.form.errors.passwordMismatch": "Passwords do not match.",
111
- "auth.profile.form.errors.passwordRequirements": "Password must meet the requirements.",
112
- "auth.profile.form.errors.noChanges": "No changes to save.",
113
- "auth.profile.form.errors.emailRequired": "Email is required.",
114
- "auth.profile.form.success": "Profile updated.",
115
83
  "auth.users.list.error.load": "Failed to load users",
116
84
  "auth.users.list.error.delete": "Failed to delete user",
117
85
  "auth.users.flash.created": "User created",
@@ -127,20 +95,5 @@
127
95
  "auth.email.resetPassword.title": "Reset your password",
128
96
  "auth.email.resetPassword.body": "Click the link below to set a new password. This link will expire in 60 minutes.",
129
97
  "auth.email.resetPassword.cta": "Set a new password",
130
- "auth.email.resetPassword.hint": "If you didn't request this, you can safely ignore this email.",
131
- "auth.notifications.passwordReset.requested.title": "Password reset requested",
132
- "auth.notifications.passwordReset.requested.body": "A password reset link has been sent to your email",
133
- "auth.notifications.passwordReset.completed.title": "Password successfully changed",
134
- "auth.notifications.passwordReset.completed.body": "Your password has been updated successfully",
135
- "auth.notifications.account.locked.title": "Account locked",
136
- "auth.notifications.account.locked.body": "Your account has been locked due to security reasons. Please contact support.",
137
- "auth.notifications.login.newDevice.title": "New device login detected",
138
- "auth.notifications.login.newDevice.body": "A new login from an unrecognized device was detected on your account",
139
- "auth.notifications.role.assigned.title": "New role assigned",
140
- "auth.notifications.role.assigned.body": "You have been assigned a new role with additional permissions",
141
- "auth.notifications.role.revoked.title": "Role removed",
142
- "auth.notifications.role.revoked.body": "A role has been removed from your account",
143
- "auth.actions.contactSupport": "Contact Support",
144
- "auth.actions.viewSessions": "View Sessions",
145
- "auth.actions.viewPermissions": "View Permissions"
98
+ "auth.email.resetPassword.hint": "If you didn't request this, you can safely ignore this email."
146
99
  }