@open-mercato/core 0.4.2-canary-3b5064ce72 → 0.4.2-canary-7732371765

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 -112
  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 -134
  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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/entities/components/UserEntitiesTable.tsx"],
4
- "sourcesContent": ["\n\"use client\"\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { useQuery } from '@tanstack/react-query'\nimport type { ColumnDef, SortingState } from '@tanstack/react-table'\nimport { DataTable, RowActions, Button } from '@open-mercato/ui'\nimport { readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\n\ntype EntityRow = {\n entityId: string\n label: string\n source: 'code' | 'custom'\n count: number\n showInSidebar?: boolean\n}\n\ntype EntitiesResponse = { items: EntityRow[] }\n\nfunction buildColumns(t: (key: string, fallback: string) => string): ColumnDef<EntityRow>[] {\n return [\n { accessorKey: 'entityId', header: t('entities.user.table.column.entity', 'Entity'), meta: { priority: 1 }, cell: ({ getValue }) => <span className=\"font-mono\">{String(getValue())}</span> },\n { accessorKey: 'label', header: t('entities.user.table.column.label', 'Label'), meta: { priority: 2 } },\n { accessorKey: 'source', header: t('entities.user.table.column.source', 'Source'), meta: { priority: 3 } },\n { accessorKey: 'count', header: t('entities.user.table.column.fields', 'Fields'), meta: { priority: 4 } },\n { \n accessorKey: 'showInSidebar', \n header: t('entities.user.table.column.inSidebar', 'In Sidebar'), \n meta: { priority: 5 },\n cell: ({ getValue }) => (\n <span className={`px-2 py-1 rounded text-xs ${\n getValue() ? 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400' : 'bg-muted text-muted-foreground'\n }`}>\n {getValue() ? t('common.yes', 'Yes') : t('common.no', 'No')}\n </span>\n )\n },\n ]\n}\n\nfunction toCsv(rows: EntityRow[]) {\n const header = ['entityId','label','source','count','showInSidebar']\n const esc = (s: string | number | boolean) => {\n const str = String(s ?? '')\n if (/[\",\\n]/.test(str)) return '\"' + str.replace(/\"/g, '\"\"') + '\"'\n return str\n }\n const lines = [header.join(',')]\n for (const r of rows) lines.push([r.entityId, r.label, r.source, r.count, r.showInSidebar || false].map(esc).join(','))\n return lines.join('\\n')\n}\n\nexport default function UserEntitiesTable() {\n const t = useT()\n const [sorting, setSorting] = React.useState<SortingState>([{ id: 'entityId', desc: false }])\n const [page, setPage] = React.useState(1)\n const [search, setSearch] = React.useState('')\n const scopeVersion = useOrganizationScopeVersion()\n \n const columns = React.useMemo(() => buildColumns(t), [t])\n\n const { data, isLoading } = useQuery<EntitiesResponse>({\n queryKey: ['custom-entities', scopeVersion],\n queryFn: async () => {\n return readApiResultOrThrow<EntitiesResponse>('/api/entities/entities', undefined, {\n errorMessage: 'Failed to load entities',\n })\n },\n })\n\n const rowsAll = data?.items || []\n // Filter to only show user entities (source: 'custom')\n const userRows = rowsAll.filter(row => row.source === 'custom')\n const rows = React.useMemo(() => {\n if (!search) return userRows\n const q = search.toLowerCase()\n return userRows.filter(r => r.entityId.toLowerCase().includes(q) || r.label.toLowerCase().includes(q))\n }, [userRows, search])\n\n return (\n <DataTable\n title={t('entities.user.table.title', 'User Entities')}\n actions={(\n <>\n <Button variant=\"outline\" onClick={() => {\n const csv = toCsv(rows)\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = 'entities-user.csv'\n a.click()\n URL.revokeObjectURL(url)\n }}>{t('common.export', 'Export')}</Button>\n <Button asChild>\n <Link href=\"/backend/entities/user/create\">{t('common.create', 'Create')}</Link>\n </Button>\n </>\n )}\n columns={columns}\n data={rows}\n searchValue={search}\n onSearchChange={(v) => { setSearch(v); setPage(1) }}\n sortable\n sorting={sorting}\n onSortingChange={setSorting}\n perspective={{ tableId: 'entities.user.list' }}\n rowActions={(row) => (\n <RowActions\n items={[\n { id: 'edit', label: t('common.edit', 'Edit'), href: `/backend/entities/user/${encodeURIComponent(row.entityId)}` },\n { id: 'show-records', label: t('entities.user.table.actions.showRecords', 'Show records'), href: `/backend/entities/user/${encodeURIComponent(row.entityId)}/records` },\n ]}\n />\n )}\n pagination={{ page, pageSize: 50, total: rows.length, totalPages: 1, onPageChange: setPage }}\n isLoading={isLoading}\n />\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\n\"use client\"\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { useQuery } from '@tanstack/react-query'\nimport type { ColumnDef, SortingState } from '@tanstack/react-table'\nimport { DataTable, RowActions, Button } from '@open-mercato/ui'\nimport { readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\n\ntype EntityRow = {\n entityId: string\n label: string\n source: 'code' | 'custom'\n count: number\n showInSidebar?: boolean\n}\n\ntype EntitiesResponse = { items: EntityRow[] }\n\nfunction buildColumns(t: (key: string, fallback: string) => string): ColumnDef<EntityRow>[] {\n return [\n { accessorKey: 'entityId', header: t('entities.user.table.column.entity', 'Entity'), meta: { priority: 1 }, cell: ({ getValue }) => <span className=\"font-mono\">{String(getValue())}</span> },\n { accessorKey: 'label', header: t('entities.user.table.column.label', 'Label'), meta: { priority: 2 } },\n { accessorKey: 'source', header: t('entities.user.table.column.source', 'Source'), meta: { priority: 3 } },\n { accessorKey: 'count', header: t('entities.user.table.column.fields', 'Fields'), meta: { priority: 4 } },\n { \n accessorKey: 'showInSidebar', \n header: t('entities.user.table.column.inSidebar', 'In Sidebar'), \n meta: { priority: 5 },\n cell: ({ getValue }) => (\n <span className={`px-2 py-1 rounded text-xs ${\n getValue() ? 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400' : 'bg-muted text-muted-foreground'\n }`}>\n {getValue() ? t('common.yes', 'Yes') : t('common.no', 'No')}\n </span>\n )\n },\n ]\n}\n\nfunction toCsv(rows: EntityRow[]) {\n const header = ['entityId','label','source','count','showInSidebar']\n const esc = (s: string | number | boolean) => {\n const str = String(s ?? '')\n if (/[\",\\n]/.test(str)) return '\"' + str.replace(/\"/g, '\"\"') + '\"'\n return str\n }\n const lines = [header.join(',')]\n for (const r of rows) lines.push([r.entityId, r.label, r.source, r.count, r.showInSidebar || false].map(esc).join(','))\n return lines.join('\\n')\n}\n\nexport default function UserEntitiesTable() {\n const t = useT()\n const [sorting, setSorting] = React.useState<SortingState>([{ id: 'entityId', desc: false }])\n const [page, setPage] = React.useState(1)\n const [search, setSearch] = React.useState('')\n const scopeVersion = useOrganizationScopeVersion()\n \n const columns = React.useMemo(() => buildColumns(t), [t])\n\n const { data, isLoading } = useQuery<EntitiesResponse>({\n queryKey: ['custom-entities', scopeVersion],\n queryFn: async () => {\n return readApiResultOrThrow<EntitiesResponse>('/api/entities/entities', undefined, {\n errorMessage: 'Failed to load entities',\n })\n },\n })\n\n const rowsAll = data?.items || []\n // Filter to only show user entities (source: 'custom')\n const userRows = rowsAll.filter(row => row.source === 'custom')\n const rows = React.useMemo(() => {\n if (!search) return userRows\n const q = search.toLowerCase()\n return userRows.filter(r => r.entityId.toLowerCase().includes(q) || r.label.toLowerCase().includes(q))\n }, [userRows, search])\n\n return (\n <DataTable\n title={t('entities.user.table.title', 'User Entities')}\n actions={(\n <>\n <Button variant=\"outline\" onClick={() => {\n const csv = toCsv(rows)\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = 'entities-user.csv'\n a.click()\n URL.revokeObjectURL(url)\n }}>{t('common.export', 'Export')}</Button>\n <Button asChild>\n <Link href=\"/backend/entities/user/create\">{t('common.create', 'Create')}</Link>\n </Button>\n </>\n )}\n columns={columns}\n data={rows}\n searchValue={search}\n onSearchChange={(v) => { setSearch(v); setPage(1) }}\n sortable\n sorting={sorting}\n onSortingChange={setSorting}\n perspective={{ tableId: 'entities.user.list' }}\n rowActions={(row) => (\n <RowActions\n items={[\n { label: t('common.edit', 'Edit'), href: `/backend/entities/user/${encodeURIComponent(row.entityId)}` },\n { label: t('entities.user.table.actions.showRecords', 'Show records'), href: `/backend/entities/user/${encodeURIComponent(row.entityId)}/records` },\n ]}\n />\n )}\n pagination={{ page, pageSize: 50, total: rows.length, totalPages: 1, onPageChange: setPage }}\n isLoading={isLoading}\n />\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -163,9 +163,9 @@ function FeatureTogglesTable() {
163
163
  onPageChange: handlePageChange
164
164
  },
165
165
  rowActions: (row) => /* @__PURE__ */ jsx(RowActions, { items: [
166
- { id: "edit", label: t("common.edit", "Edit"), href: `/backend/feature-toggles/global/${row.id}/edit` },
167
- { id: "view", label: t("common.view", "Overrides"), href: `/backend/feature-toggles/global/${row.id}` },
168
- { id: "delete", label: t("common.delete", "Delete"), destructive: true, onSelect: () => {
166
+ { label: t("common.edit", "Edit"), href: `/backend/feature-toggles/global/${row.id}/edit` },
167
+ { label: t("common.view", "Overrides"), href: `/backend/feature-toggles/global/${row.id}` },
168
+ { label: t("common.delete", "Delete"), destructive: true, onSelect: () => {
169
169
  void handleDelete(row);
170
170
  } }
171
171
  ] })
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/feature_toggles/components/FeatureTogglesTable.tsx"],
4
- "sourcesContent": ["\"use client\"\nimport { DataTable } from \"@open-mercato/ui/backend/DataTable\";\nimport { RowActions } from \"@open-mercato/ui/backend/RowActions\";\nimport { useT } from \"@open-mercato/shared/lib/i18n/context\";\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { raiseCrudError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport type { ColumnDef, SortingState } from '@tanstack/react-table'\nimport * as React from 'react'\nimport type { FilterDef, FilterValues } from \"@open-mercato/ui/backend/FilterBar\"\nimport { useMutation } from '@tanstack/react-query'\nimport { deleteCrud, updateCrud } from \"@open-mercato/ui/backend/utils/crud\";\nimport { Button } from \"@open-mercato/ui/primitives/button\";\nimport { Badge } from \"@open-mercato/ui/primitives/badge\";\nimport Link from \"next/link\";\nimport { FeatureToggleType } from \"../data/entities\";\n\ntype Row = {\n id: string\n identifier: string\n name: string\n description: string\n category?: string\n type: FeatureToggleType\n}\n\ntype BadgeVariant = 'default' | 'secondary' | 'destructive' | 'outline' | 'muted'\n\nexport function FeatureTogglesTable() {\n const t = useT()\n const queryClient = useQueryClient()\n\n const featureToggleTypeLabelMap = React.useMemo(() => new Map<FeatureToggleType, { label: string; variant: BadgeVariant }>([\n ['boolean', { label: t('feature_toggles.types.boolean', 'Boolean'), variant: 'default' }],\n ['string', { label: t('feature_toggles.types.string', 'String'), variant: 'secondary' }],\n ['number', { label: t('feature_toggles.types.number', 'Number'), variant: 'outline' }],\n ['json', { label: t('feature_toggles.types.json', 'JSON'), variant: 'destructive' }],\n ]), [t])\n\n const [filterValues, setFilterValues] = React.useState<FilterValues>({})\n const [sorting, setSorting] = React.useState<SortingState>([])\n const [pagination, setPagination] = React.useState({ page: 1, pageSize: 25 })\n\n const categoryFilterValue = typeof filterValues.category === 'string' ? filterValues.category.trim() : ''\n const nameFilterValue = typeof filterValues.name === 'string' ? filterValues.name.trim() : ''\n const identifierFilterValue = typeof filterValues.identifier === 'string' ? filterValues.identifier.trim() : ''\n const typeFilterValue = typeof filterValues.type === 'string' ? filterValues.type.trim() : ''\n const sortField = sorting.length > 0 ? sorting[0].id : 'category'\n const sortDir = sorting.length > 0 && sorting[0].desc ? 'desc' : 'asc'\n\n const queryParams = React.useMemo(() => {\n const params = new URLSearchParams()\n if (categoryFilterValue) params.set('category', categoryFilterValue)\n if (nameFilterValue) params.set('name', nameFilterValue)\n if (identifierFilterValue) params.set('identifier', identifierFilterValue)\n if (typeFilterValue) params.set('type', typeFilterValue)\n\n params.set('sortField', sortField)\n params.set('sortDir', sortDir)\n\n params.set('page', pagination.page.toString())\n params.set('pageSize', pagination.pageSize.toString())\n\n return params.toString()\n }, [categoryFilterValue, identifierFilterValue, nameFilterValue, sortField, sortDir, typeFilterValue, pagination])\n\n const handleSortingChange = React.useCallback((newSorting: SortingState) => {\n setSorting(newSorting)\n }, [])\n\n const handlePageChange = React.useCallback((page: number) => {\n setPagination(prev => ({ ...prev, page }))\n }, [])\n\n const { data: featureTogglesData, isLoading } = useQuery({\n queryKey: ['feature_toggles', queryParams],\n queryFn: async () => {\n const call = await apiCall<{ items: Row[]; total: number; totalPages: number; page: number; pageSize: number; isSuperAdmin?: boolean }>(\n `/api/feature_toggles/global${queryParams ? `?${queryParams}` : ''}`,\n )\n if (!call.ok) {\n await raiseCrudError(call.response, t('feature_toggles.list.error.load', 'Failed to load feature toggles'))\n }\n return call.result ?? { items: [], total: 0, totalPages: 1, page: 1, pageSize: 25 }\n },\n })\n\n const filters = React.useMemo<FilterDef[]>(() => [\n {\n id: 'identifier',\n label: t('feature_toggles.list.filters.identifier', 'Identifier'),\n type: 'text',\n },\n {\n id: 'name',\n label: t('feature_toggles.list.filters.name', 'Name'),\n type: 'text',\n },\n {\n id: 'category',\n label: t('feature_toggles.list.filters.category', 'Category'),\n type: 'text',\n },\n {\n id: 'type',\n label: t('feature_toggles.list.filters.type', 'Type'),\n type: 'select',\n options: [\n { label: t('feature_toggles.types.boolean', 'Boolean'), value: 'boolean' },\n { label: t('feature_toggles.types.string', 'String'), value: 'string' },\n { label: t('feature_toggles.types.number', 'Number'), value: 'number' },\n { label: t('feature_toggles.types.json', 'JSON'), value: 'json' },\n ],\n },\n ], [t])\n\n const handleFiltersApply = React.useCallback((values: FilterValues) => {\n setFilterValues(values)\n }, [])\n\n const handleFiltersClear = React.useCallback(() => {\n setFilterValues({})\n }, [])\n\n const deleteFeatureToggleMutation = useMutation({\n mutationFn: async (row: Row) => {\n await deleteCrud('feature_toggles/global', row.id)\n },\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: ['feature_toggles'] })\n },\n })\n\n const handleDelete = React.useCallback(async (row: Row) => {\n if (!window.confirm(t('feature_toggles.list.confirmDelete', 'Delete feature toggle \"{identifier}\"?', { identifier: row.identifier }))) return\n await deleteFeatureToggleMutation.mutateAsync(row)\n }, [deleteFeatureToggleMutation, t])\n\n const columns = React.useMemo<ColumnDef<Row>[]>(() => {\n const base: ColumnDef<Row>[] = [\n {\n accessorKey: 'category',\n header: t('feature_toggles.list.headers.category', 'Category'),\n enableSorting: true,\n cell: ({ row }) => {\n return row.original.category || '-'\n },\n },\n {\n accessorKey: 'identifier',\n header: t('feature_toggles.list.headers.identifier', 'Identifier'),\n enableSorting: true\n },\n {\n accessorKey: 'name',\n header: t('feature_toggles.list.headers.name', 'Name'),\n enableSorting: true\n },\n {\n accessorKey: 'type',\n header: t('feature_toggles.list.headers.type', 'Type'),\n enableSorting: true,\n cell: ({ row }) => {\n const typeInfo = featureToggleTypeLabelMap.get(row.original.type)\n if (!typeInfo) return '-'\n\n return (\n <Badge variant={typeInfo.variant}>\n {typeInfo.label}\n </Badge>\n )\n },\n },\n ]\n return base\n }, [t, featureToggleTypeLabelMap])\n\n return (\n <DataTable\n title={t('feature_toggles.global.help.title', 'Feature Toggles')}\n disableRowClick\n actions={\n <Button asChild>\n <Link href=\"/backend/feature-toggles/global/create\">\n {t('common.create', 'Create')}\n </Link>\n </Button>\n }\n columns={columns}\n data={featureTogglesData?.items ?? []}\n isLoading={isLoading}\n filters={filters}\n filterValues={filterValues}\n onFiltersApply={handleFiltersApply}\n onFiltersClear={handleFiltersClear}\n sorting={sorting}\n onSortingChange={handleSortingChange}\n sortable={true}\n pagination={{\n page: featureTogglesData?.page ?? 1,\n pageSize: featureTogglesData?.pageSize ?? 25,\n total: featureTogglesData?.total ?? 0,\n totalPages: featureTogglesData?.totalPages ?? 1,\n onPageChange: handlePageChange,\n }}\n rowActions={(row) => (\n <RowActions items={[\n { id: 'edit', label: t('common.edit', 'Edit'), href: `/backend/feature-toggles/global/${row.id}/edit` },\n { id: 'view', label: t('common.view', 'Overrides'), href: `/backend/feature-toggles/global/${row.id}` },\n { id: 'delete', label: t('common.delete', 'Delete'), destructive: true, onSelect: () => { void handleDelete(row) } },\n ]} />\n )}\n />\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\"use client\"\nimport { DataTable } from \"@open-mercato/ui/backend/DataTable\";\nimport { RowActions } from \"@open-mercato/ui/backend/RowActions\";\nimport { useT } from \"@open-mercato/shared/lib/i18n/context\";\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { raiseCrudError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport type { ColumnDef, SortingState } from '@tanstack/react-table'\nimport * as React from 'react'\nimport type { FilterDef, FilterValues } from \"@open-mercato/ui/backend/FilterBar\"\nimport { useMutation } from '@tanstack/react-query'\nimport { deleteCrud, updateCrud } from \"@open-mercato/ui/backend/utils/crud\";\nimport { Button } from \"@open-mercato/ui/primitives/button\";\nimport { Badge } from \"@open-mercato/ui/primitives/badge\";\nimport Link from \"next/link\";\nimport { FeatureToggleType } from \"../data/entities\";\n\ntype Row = {\n id: string\n identifier: string\n name: string\n description: string\n category?: string\n type: FeatureToggleType\n}\n\ntype BadgeVariant = 'default' | 'secondary' | 'destructive' | 'outline' | 'muted'\n\nexport function FeatureTogglesTable() {\n const t = useT()\n const queryClient = useQueryClient()\n\n const featureToggleTypeLabelMap = React.useMemo(() => new Map<FeatureToggleType, { label: string; variant: BadgeVariant }>([\n ['boolean', { label: t('feature_toggles.types.boolean', 'Boolean'), variant: 'default' }],\n ['string', { label: t('feature_toggles.types.string', 'String'), variant: 'secondary' }],\n ['number', { label: t('feature_toggles.types.number', 'Number'), variant: 'outline' }],\n ['json', { label: t('feature_toggles.types.json', 'JSON'), variant: 'destructive' }],\n ]), [t])\n\n const [filterValues, setFilterValues] = React.useState<FilterValues>({})\n const [sorting, setSorting] = React.useState<SortingState>([])\n const [pagination, setPagination] = React.useState({ page: 1, pageSize: 25 })\n\n const categoryFilterValue = typeof filterValues.category === 'string' ? filterValues.category.trim() : ''\n const nameFilterValue = typeof filterValues.name === 'string' ? filterValues.name.trim() : ''\n const identifierFilterValue = typeof filterValues.identifier === 'string' ? filterValues.identifier.trim() : ''\n const typeFilterValue = typeof filterValues.type === 'string' ? filterValues.type.trim() : ''\n const sortField = sorting.length > 0 ? sorting[0].id : 'category'\n const sortDir = sorting.length > 0 && sorting[0].desc ? 'desc' : 'asc'\n\n const queryParams = React.useMemo(() => {\n const params = new URLSearchParams()\n if (categoryFilterValue) params.set('category', categoryFilterValue)\n if (nameFilterValue) params.set('name', nameFilterValue)\n if (identifierFilterValue) params.set('identifier', identifierFilterValue)\n if (typeFilterValue) params.set('type', typeFilterValue)\n\n params.set('sortField', sortField)\n params.set('sortDir', sortDir)\n\n params.set('page', pagination.page.toString())\n params.set('pageSize', pagination.pageSize.toString())\n\n return params.toString()\n }, [categoryFilterValue, identifierFilterValue, nameFilterValue, sortField, sortDir, typeFilterValue, pagination])\n\n const handleSortingChange = React.useCallback((newSorting: SortingState) => {\n setSorting(newSorting)\n }, [])\n\n const handlePageChange = React.useCallback((page: number) => {\n setPagination(prev => ({ ...prev, page }))\n }, [])\n\n const { data: featureTogglesData, isLoading } = useQuery({\n queryKey: ['feature_toggles', queryParams],\n queryFn: async () => {\n const call = await apiCall<{ items: Row[]; total: number; totalPages: number; page: number; pageSize: number; isSuperAdmin?: boolean }>(\n `/api/feature_toggles/global${queryParams ? `?${queryParams}` : ''}`,\n )\n if (!call.ok) {\n await raiseCrudError(call.response, t('feature_toggles.list.error.load', 'Failed to load feature toggles'))\n }\n return call.result ?? { items: [], total: 0, totalPages: 1, page: 1, pageSize: 25 }\n },\n })\n\n const filters = React.useMemo<FilterDef[]>(() => [\n {\n id: 'identifier',\n label: t('feature_toggles.list.filters.identifier', 'Identifier'),\n type: 'text',\n },\n {\n id: 'name',\n label: t('feature_toggles.list.filters.name', 'Name'),\n type: 'text',\n },\n {\n id: 'category',\n label: t('feature_toggles.list.filters.category', 'Category'),\n type: 'text',\n },\n {\n id: 'type',\n label: t('feature_toggles.list.filters.type', 'Type'),\n type: 'select',\n options: [\n { label: t('feature_toggles.types.boolean', 'Boolean'), value: 'boolean' },\n { label: t('feature_toggles.types.string', 'String'), value: 'string' },\n { label: t('feature_toggles.types.number', 'Number'), value: 'number' },\n { label: t('feature_toggles.types.json', 'JSON'), value: 'json' },\n ],\n },\n ], [t])\n\n const handleFiltersApply = React.useCallback((values: FilterValues) => {\n setFilterValues(values)\n }, [])\n\n const handleFiltersClear = React.useCallback(() => {\n setFilterValues({})\n }, [])\n\n const deleteFeatureToggleMutation = useMutation({\n mutationFn: async (row: Row) => {\n await deleteCrud('feature_toggles/global', row.id)\n },\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: ['feature_toggles'] })\n },\n })\n\n const handleDelete = React.useCallback(async (row: Row) => {\n if (!window.confirm(t('feature_toggles.list.confirmDelete', 'Delete feature toggle \"{identifier}\"?', { identifier: row.identifier }))) return\n await deleteFeatureToggleMutation.mutateAsync(row)\n }, [deleteFeatureToggleMutation, t])\n\n const columns = React.useMemo<ColumnDef<Row>[]>(() => {\n const base: ColumnDef<Row>[] = [\n {\n accessorKey: 'category',\n header: t('feature_toggles.list.headers.category', 'Category'),\n enableSorting: true,\n cell: ({ row }) => {\n return row.original.category || '-'\n },\n },\n {\n accessorKey: 'identifier',\n header: t('feature_toggles.list.headers.identifier', 'Identifier'),\n enableSorting: true\n },\n {\n accessorKey: 'name',\n header: t('feature_toggles.list.headers.name', 'Name'),\n enableSorting: true\n },\n {\n accessorKey: 'type',\n header: t('feature_toggles.list.headers.type', 'Type'),\n enableSorting: true,\n cell: ({ row }) => {\n const typeInfo = featureToggleTypeLabelMap.get(row.original.type)\n if (!typeInfo) return '-'\n\n return (\n <Badge variant={typeInfo.variant}>\n {typeInfo.label}\n </Badge>\n )\n },\n },\n ]\n return base\n }, [t, featureToggleTypeLabelMap])\n\n return (\n <DataTable\n title={t('feature_toggles.global.help.title', 'Feature Toggles')}\n disableRowClick\n actions={\n <Button asChild>\n <Link href=\"/backend/feature-toggles/global/create\">\n {t('common.create', 'Create')}\n </Link>\n </Button>\n }\n columns={columns}\n data={featureTogglesData?.items ?? []}\n isLoading={isLoading}\n filters={filters}\n filterValues={filterValues}\n onFiltersApply={handleFiltersApply}\n onFiltersClear={handleFiltersClear}\n sorting={sorting}\n onSortingChange={handleSortingChange}\n sortable={true}\n pagination={{\n page: featureTogglesData?.page ?? 1,\n pageSize: featureTogglesData?.pageSize ?? 25,\n total: featureTogglesData?.total ?? 0,\n totalPages: featureTogglesData?.totalPages ?? 1,\n onPageChange: handlePageChange,\n }}\n rowActions={(row) => (\n <RowActions items={[\n { label: t('common.edit', 'Edit'), href: `/backend/feature-toggles/global/${row.id}/edit` },\n { label: t('common.view', 'Overrides'), href: `/backend/feature-toggles/global/${row.id}` },\n { label: t('common.delete', 'Delete'), destructive: true, onSelect: () => { void handleDelete(row) } },\n ]} />\n )}\n />\n )\n}\n\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -134,7 +134,7 @@ function OverridesTable() {
134
134
  isRefreshing: isLoading
135
135
  },
136
136
  rowActions: (row) => /* @__PURE__ */ jsx(RowActions, { items: [
137
- { id: "edit", label: t("common.edit", "Edit"), href: `/backend/feature-toggles/global/${row.toggleId}` }
137
+ { label: t("common.edit", "Edit"), href: `/backend/feature-toggles/global/${row.toggleId}` }
138
138
  ] }),
139
139
  error: error ? error.message : void 0
140
140
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/feature_toggles/components/OverridesTable.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport { DataTable } from \"@open-mercato/ui/backend/DataTable\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { apiCall } from \"@open-mercato/ui/backend/utils/apiCall\";\nimport { raiseCrudError } from \"@open-mercato/ui/backend/utils/serverErrors\";\nimport { useT } from \"@open-mercato/shared/lib/i18n/context\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { ColumnDef, SortingState } from \"@tanstack/react-table\";\nimport * as React from 'react'\nimport type { FilterDef, FilterValues } from \"@open-mercato/ui/backend/FilterBar\"\nimport { RowActions } from \"@open-mercato/ui/backend/RowActions\";\nimport { OverrideListResponse } from \"../data/validators\";\n\n\nexport default function OverridesTable() {\n const [filterValues, setFilterValues] = React.useState<FilterValues>({})\n const [sorting, setSorting] = React.useState<SortingState>([])\n const [pagination, setPagination] = React.useState({ page: 1, pageSize: 25 })\n\n const t = useT()\n const queryClient = useQueryClient()\n\n const sortField = sorting.length > 0 ? sorting[0].id : undefined\n const sortDir = sorting.length > 0 && sorting[0].desc ? 'desc' : 'asc'\n\n const queryParams = React.useMemo(() => {\n const params = new URLSearchParams()\n Object.entries(filterValues).forEach(([key, value]) => {\n params.set(key, value as string)\n })\n if (sortField) params.set('sortField', sortField)\n if (sorting.length > 0) params.set('sortDir', sortDir)\n\n params.set('page', pagination.page.toString())\n params.set('pageSize', pagination.pageSize.toString())\n\n return params.toString()\n }, [filterValues, sortField, sortDir, pagination])\n\n const { data: featureTogglesData, isLoading, error } = useQuery({\n queryKey: ['feature_toggle_overrides', queryParams],\n queryFn: async () => {\n const call = await apiCall<{\n items: OverrideListResponse[];\n total: number;\n totalPages: number;\n page: number;\n pageSize: number;\n isSuperAdmin?: boolean\n }>(`/api/feature_toggles/overrides?${queryParams}`)\n if (!call.ok) {\n await raiseCrudError(call.response, t('feature_toggles.list.error.load', 'Failed to load feature toggles'))\n }\n return call.result ?? {\n items: [],\n total: 0,\n totalPages: 1,\n page: 1,\n pageSize: 25\n }\n },\n })\n\n const handleFiltersApply = React.useCallback((values: FilterValues) => {\n setFilterValues(values)\n }, [])\n\n const handleFiltersClear = React.useCallback(() => {\n setFilterValues({})\n }, [])\n\n const handleSortingChange = React.useCallback((newSorting: SortingState) => {\n setSorting(newSorting)\n }, [])\n\n const handlePageChange = React.useCallback((page: number) => {\n setPagination(prev => ({ ...prev, page }))\n }, [])\n\n const handleRefresh = React.useCallback(() => {\n void queryClient.refetchQueries({ queryKey: ['feature_toggle_overrides'] })\n }, [queryClient])\n\n const columns = React.useMemo<ColumnDef<OverrideListResponse>[]>(() => {\n return [\n {\n accessorKey: 'tenantName',\n header: t('feature_toggles.overrides.headers.tenant', 'Tenant'),\n enableSorting: true\n },\n {\n accessorKey: 'identifier',\n header: t('feature_toggles.overrides.headers.identifier', 'Identifier'),\n enableSorting: true\n },\n {\n accessorKey: 'name',\n header: t('feature_toggles.overrides.headers.name', 'Name'),\n enableSorting: true\n },\n {\n accessorKey: 'category',\n header: t('feature_toggles.overrides.headers.category', 'Category'),\n enableSorting: true\n },\n {\n accessorKey: 'isOverride',\n header: t('feature_toggles.overrides.headers.overrideState', 'Override'),\n enableSorting: false,\n cell: ({ row }) => {\n return row.original.isOverride ? t('feature_toggles.overrides.headers.isOverride.true', 'Yes') : t('feature_toggles.overrides.headers.isOverride.false', 'No')\n },\n },\n ]\n }, [])\n\n\n const filters = React.useMemo<FilterDef[]>(() => [\n {\n id: 'identifier',\n label: t('feature_toggles.list.filters.identifier', 'Identifier'),\n type: 'text',\n },\n {\n id: 'name',\n label: t('feature_toggles.list.filters.name', 'Name'),\n type: 'text',\n },\n {\n id: 'category',\n label: t('feature_toggles.list.filters.category', 'Category'),\n type: 'text',\n }\n ], [t])\n\n return (\n <DataTable\n title={t('feature_toggles.overrides.help.title', 'Feature Toggle Overrides')}\n columns={columns}\n filters={filters}\n filterValues={filterValues}\n onFiltersApply={handleFiltersApply}\n onFiltersClear={handleFiltersClear}\n data={featureTogglesData?.items ?? []}\n isLoading={isLoading}\n sorting={sorting}\n onSortingChange={handleSortingChange}\n sortable={true}\n pagination={{\n page: featureTogglesData?.page ?? 1,\n pageSize: featureTogglesData?.pageSize ?? 25,\n total: featureTogglesData?.total ?? 0,\n totalPages: featureTogglesData?.totalPages ?? 1,\n onPageChange: handlePageChange,\n }}\n refreshButton={{\n label: t('feature_toggles.list.table.refresh', 'Refresh'),\n onRefresh: handleRefresh,\n isRefreshing: isLoading,\n }}\n rowActions={(row) => (\n <RowActions items={[\n { id: 'edit', label: t('common.edit', 'Edit'), href: `/backend/feature-toggles/global/${row.toggleId}` },\n ]} />\n )}\n error={error ? error.message : undefined}\n />\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\"use client\"\n\nimport { DataTable } from \"@open-mercato/ui/backend/DataTable\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { apiCall } from \"@open-mercato/ui/backend/utils/apiCall\";\nimport { raiseCrudError } from \"@open-mercato/ui/backend/utils/serverErrors\";\nimport { useT } from \"@open-mercato/shared/lib/i18n/context\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { ColumnDef, SortingState } from \"@tanstack/react-table\";\nimport * as React from 'react'\nimport type { FilterDef, FilterValues } from \"@open-mercato/ui/backend/FilterBar\"\nimport { RowActions } from \"@open-mercato/ui/backend/RowActions\";\nimport { OverrideListResponse } from \"../data/validators\";\n\n\nexport default function OverridesTable() {\n const [filterValues, setFilterValues] = React.useState<FilterValues>({})\n const [sorting, setSorting] = React.useState<SortingState>([])\n const [pagination, setPagination] = React.useState({ page: 1, pageSize: 25 })\n\n const t = useT()\n const queryClient = useQueryClient()\n\n const sortField = sorting.length > 0 ? sorting[0].id : undefined\n const sortDir = sorting.length > 0 && sorting[0].desc ? 'desc' : 'asc'\n\n const queryParams = React.useMemo(() => {\n const params = new URLSearchParams()\n Object.entries(filterValues).forEach(([key, value]) => {\n params.set(key, value as string)\n })\n if (sortField) params.set('sortField', sortField)\n if (sorting.length > 0) params.set('sortDir', sortDir)\n\n params.set('page', pagination.page.toString())\n params.set('pageSize', pagination.pageSize.toString())\n\n return params.toString()\n }, [filterValues, sortField, sortDir, pagination])\n\n const { data: featureTogglesData, isLoading, error } = useQuery({\n queryKey: ['feature_toggle_overrides', queryParams],\n queryFn: async () => {\n const call = await apiCall<{\n items: OverrideListResponse[];\n total: number;\n totalPages: number;\n page: number;\n pageSize: number;\n isSuperAdmin?: boolean\n }>(`/api/feature_toggles/overrides?${queryParams}`)\n if (!call.ok) {\n await raiseCrudError(call.response, t('feature_toggles.list.error.load', 'Failed to load feature toggles'))\n }\n return call.result ?? {\n items: [],\n total: 0,\n totalPages: 1,\n page: 1,\n pageSize: 25\n }\n },\n })\n\n const handleFiltersApply = React.useCallback((values: FilterValues) => {\n setFilterValues(values)\n }, [])\n\n const handleFiltersClear = React.useCallback(() => {\n setFilterValues({})\n }, [])\n\n const handleSortingChange = React.useCallback((newSorting: SortingState) => {\n setSorting(newSorting)\n }, [])\n\n const handlePageChange = React.useCallback((page: number) => {\n setPagination(prev => ({ ...prev, page }))\n }, [])\n\n const handleRefresh = React.useCallback(() => {\n void queryClient.refetchQueries({ queryKey: ['feature_toggle_overrides'] })\n }, [queryClient])\n\n const columns = React.useMemo<ColumnDef<OverrideListResponse>[]>(() => {\n return [\n {\n accessorKey: 'tenantName',\n header: t('feature_toggles.overrides.headers.tenant', 'Tenant'),\n enableSorting: true\n },\n {\n accessorKey: 'identifier',\n header: t('feature_toggles.overrides.headers.identifier', 'Identifier'),\n enableSorting: true\n },\n {\n accessorKey: 'name',\n header: t('feature_toggles.overrides.headers.name', 'Name'),\n enableSorting: true\n },\n {\n accessorKey: 'category',\n header: t('feature_toggles.overrides.headers.category', 'Category'),\n enableSorting: true\n },\n {\n accessorKey: 'isOverride',\n header: t('feature_toggles.overrides.headers.overrideState', 'Override'),\n enableSorting: false,\n cell: ({ row }) => {\n return row.original.isOverride ? t('feature_toggles.overrides.headers.isOverride.true', 'Yes') : t('feature_toggles.overrides.headers.isOverride.false', 'No')\n },\n },\n ]\n }, [])\n\n\n const filters = React.useMemo<FilterDef[]>(() => [\n {\n id: 'identifier',\n label: t('feature_toggles.list.filters.identifier', 'Identifier'),\n type: 'text',\n },\n {\n id: 'name',\n label: t('feature_toggles.list.filters.name', 'Name'),\n type: 'text',\n },\n {\n id: 'category',\n label: t('feature_toggles.list.filters.category', 'Category'),\n type: 'text',\n }\n ], [t])\n\n return (\n <DataTable\n title={t('feature_toggles.overrides.help.title', 'Feature Toggle Overrides')}\n columns={columns}\n filters={filters}\n filterValues={filterValues}\n onFiltersApply={handleFiltersApply}\n onFiltersClear={handleFiltersClear}\n data={featureTogglesData?.items ?? []}\n isLoading={isLoading}\n sorting={sorting}\n onSortingChange={handleSortingChange}\n sortable={true}\n pagination={{\n page: featureTogglesData?.page ?? 1,\n pageSize: featureTogglesData?.pageSize ?? 25,\n total: featureTogglesData?.total ?? 0,\n totalPages: featureTogglesData?.totalPages ?? 1,\n onPageChange: handlePageChange,\n }}\n refreshButton={{\n label: t('feature_toggles.list.table.refresh', 'Refresh'),\n onRefresh: handleRefresh,\n isRefreshing: isLoading,\n }}\n rowActions={(row) => (\n <RowActions items={[\n { label: t('common.edit', 'Edit'), href: `/backend/feature-toggles/global/${row.toggleId}` },\n ]} />\n )}\n error={error ? error.message : undefined}\n />\n )\n}\n"],
5
+ "mappings": ";AAkKgB;AAhKhB,SAAS,iBAAiB;AAC1B,SAAS,gBAAgB;AACzB,SAAS,eAAe;AACxB,SAAS,sBAAsB;AAC/B,SAAS,YAAY;AACrB,SAAS,sBAAsB;AAE/B,YAAY,WAAW;AAEvB,SAAS,kBAAkB;AAIZ,SAAR,iBAAkC;AACrC,QAAM,CAAC,cAAc,eAAe,IAAI,MAAM,SAAuB,CAAC,CAAC;AACvE,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAAuB,CAAC,CAAC;AAC7D,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,CAAC;AAE5E,QAAM,IAAI,KAAK;AACf,QAAM,cAAc,eAAe;AAEnC,QAAM,YAAY,QAAQ,SAAS,IAAI,QAAQ,CAAC,EAAE,KAAK;AACvD,QAAM,UAAU,QAAQ,SAAS,KAAK,QAAQ,CAAC,EAAE,OAAO,SAAS;AAEjE,QAAM,cAAc,MAAM,QAAQ,MAAM;AACpC,UAAM,SAAS,IAAI,gBAAgB;AACnC,WAAO,QAAQ,YAAY,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACnD,aAAO,IAAI,KAAK,KAAe;AAAA,IACnC,CAAC;AACD,QAAI,UAAW,QAAO,IAAI,aAAa,SAAS;AAChD,QAAI,QAAQ,SAAS,EAAG,QAAO,IAAI,WAAW,OAAO;AAErD,WAAO,IAAI,QAAQ,WAAW,KAAK,SAAS,CAAC;AAC7C,WAAO,IAAI,YAAY,WAAW,SAAS,SAAS,CAAC;AAErD,WAAO,OAAO,SAAS;AAAA,EAC3B,GAAG,CAAC,cAAc,WAAW,SAAS,UAAU,CAAC;AAEjD,QAAM,EAAE,MAAM,oBAAoB,WAAW,MAAM,IAAI,SAAS;AAAA,IAC5D,UAAU,CAAC,4BAA4B,WAAW;AAAA,IAClD,SAAS,YAAY;AACjB,YAAM,OAAO,MAAM,QAOhB,kCAAkC,WAAW,EAAE;AAClD,UAAI,CAAC,KAAK,IAAI;AACV,cAAM,eAAe,KAAK,UAAU,EAAE,mCAAmC,gCAAgC,CAAC;AAAA,MAC9G;AACA,aAAO,KAAK,UAAU;AAAA,QAClB,OAAO,CAAC;AAAA,QACR,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,MAAM;AAAA,QACN,UAAU;AAAA,MACd;AAAA,IACJ;AAAA,EACJ,CAAC;AAED,QAAM,qBAAqB,MAAM,YAAY,CAAC,WAAyB;AACnE,oBAAgB,MAAM;AAAA,EAC1B,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAqB,MAAM,YAAY,MAAM;AAC/C,oBAAgB,CAAC,CAAC;AAAA,EACtB,GAAG,CAAC,CAAC;AAEL,QAAM,sBAAsB,MAAM,YAAY,CAAC,eAA6B;AACxE,eAAW,UAAU;AAAA,EACzB,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAmB,MAAM,YAAY,CAAC,SAAiB;AACzD,kBAAc,WAAS,EAAE,GAAG,MAAM,KAAK,EAAE;AAAA,EAC7C,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgB,MAAM,YAAY,MAAM;AAC1C,SAAK,YAAY,eAAe,EAAE,UAAU,CAAC,0BAA0B,EAAE,CAAC;AAAA,EAC9E,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,UAAU,MAAM,QAA2C,MAAM;AACnE,WAAO;AAAA,MACH;AAAA,QACI,aAAa;AAAA,QACb,QAAQ,EAAE,4CAA4C,QAAQ;AAAA,QAC9D,eAAe;AAAA,MACnB;AAAA,MACA;AAAA,QACI,aAAa;AAAA,QACb,QAAQ,EAAE,gDAAgD,YAAY;AAAA,QACtE,eAAe;AAAA,MACnB;AAAA,MACA;AAAA,QACI,aAAa;AAAA,QACb,QAAQ,EAAE,0CAA0C,MAAM;AAAA,QAC1D,eAAe;AAAA,MACnB;AAAA,MACA;AAAA,QACI,aAAa;AAAA,QACb,QAAQ,EAAE,8CAA8C,UAAU;AAAA,QAClE,eAAe;AAAA,MACnB;AAAA,MACA;AAAA,QACI,aAAa;AAAA,QACb,QAAQ,EAAE,mDAAmD,UAAU;AAAA,QACvE,eAAe;AAAA,QACf,MAAM,CAAC,EAAE,IAAI,MAAM;AACf,iBAAO,IAAI,SAAS,aAAa,EAAE,qDAAqD,KAAK,IAAI,EAAE,sDAAsD,IAAI;AAAA,QACjK;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,CAAC;AAGL,QAAM,UAAU,MAAM,QAAqB,MAAM;AAAA,IAC7C;AAAA,MACI,IAAI;AAAA,MACJ,OAAO,EAAE,2CAA2C,YAAY;AAAA,MAChE,MAAM;AAAA,IACV;AAAA,IACA;AAAA,MACI,IAAI;AAAA,MACJ,OAAO,EAAE,qCAAqC,MAAM;AAAA,MACpD,MAAM;AAAA,IACV;AAAA,IACA;AAAA,MACI,IAAI;AAAA,MACJ,OAAO,EAAE,yCAAyC,UAAU;AAAA,MAC5D,MAAM;AAAA,IACV;AAAA,EACJ,GAAG,CAAC,CAAC,CAAC;AAEN,SACI;AAAA,IAAC;AAAA;AAAA,MACG,OAAO,EAAE,wCAAwC,0BAA0B;AAAA,MAC3E;AAAA,MACA;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,MAAM,oBAAoB,SAAS,CAAC;AAAA,MACpC;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB,UAAU;AAAA,MACV,YAAY;AAAA,QACR,MAAM,oBAAoB,QAAQ;AAAA,QAClC,UAAU,oBAAoB,YAAY;AAAA,QAC1C,OAAO,oBAAoB,SAAS;AAAA,QACpC,YAAY,oBAAoB,cAAc;AAAA,QAC9C,cAAc;AAAA,MAClB;AAAA,MACA,eAAe;AAAA,QACX,OAAO,EAAE,sCAAsC,SAAS;AAAA,QACxD,WAAW;AAAA,QACX,cAAc;AAAA,MAClB;AAAA,MACA,YAAY,CAAC,QACT,oBAAC,cAAW,OAAO;AAAA,QACf,EAAE,OAAO,EAAE,eAAe,MAAM,GAAG,MAAM,mCAAmC,IAAI,QAAQ,GAAG;AAAA,MAC/F,GAAG;AAAA,MAEP,OAAO,QAAQ,MAAM,UAAU;AAAA;AAAA,EACnC;AAER;",
6
6
  "names": []
7
7
  }
@@ -161,8 +161,8 @@ function PlannerAvailabilityRuleSetsPage() {
161
161
  RowActions,
162
162
  {
163
163
  items: [
164
- { id: "edit", label: labels.actions.edit, href: `/backend/planner/availability-rulesets/${row.id}` },
165
- { id: "delete", label: labels.actions.delete, destructive: true, onSelect: () => {
164
+ { label: labels.actions.edit, href: `/backend/planner/availability-rulesets/${row.id}` },
165
+ { label: labels.actions.delete, destructive: true, onSelect: () => {
166
166
  void handleDelete(row);
167
167
  } }
168
168
  ]
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/modules/planner/backend/planner/availability-rulesets/page.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { useRouter } from 'next/navigation'\nimport type { ColumnDef, SortingState } from '@tanstack/react-table'\nimport type { PluggableList } from 'unified'\nimport ReactMarkdown from 'react-markdown'\nimport remarkGfm from 'remark-gfm'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport { RowActions } from '@open-mercato/ui/backend/RowActions'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { deleteCrud } from '@open-mercato/ui/backend/utils/crud'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { normalizeCrudServerError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\n\nconst PAGE_SIZE = 50\nconst MARKDOWN_PLUGINS: PluggableList = [remarkGfm]\nconst MARKDOWN_SUBTEXT_CLASSNAME =\n 'line-clamp-2 text-xs text-muted-foreground [&>p]:m-0 [&_ul]:ml-4 [&_ul]:list-disc [&_ol]:ml-4 [&_ol]:list-decimal [&_code]:rounded [&_code]:bg-muted [&_code]:px-1 [&_code]:py-0.5'\n\ntype RuleSetRow = {\n id: string\n name: string\n description: string | null\n timezone: string\n updatedAt: string | null\n}\n\ntype RuleSetResponse = {\n items?: Array<Record<string, unknown>>\n total?: number\n totalPages?: number\n}\n\nexport default function PlannerAvailabilityRuleSetsPage() {\n const t = useT()\n const router = useRouter()\n const scopeVersion = useOrganizationScopeVersion()\n const [rows, setRows] = React.useState<RuleSetRow[]>([])\n const [page, setPage] = React.useState(1)\n const [total, setTotal] = React.useState(0)\n const [totalPages, setTotalPages] = React.useState(1)\n const [sorting, setSorting] = React.useState<SortingState>([{ id: 'name', desc: false }])\n const [search, setSearch] = React.useState('')\n const [isLoading, setIsLoading] = React.useState(true)\n const [reloadToken, setReloadToken] = React.useState(0)\n\n const labels = React.useMemo(() => ({\n title: t('planner.availabilityRuleSets.page.title', 'Availability schedules'),\n description: t('planner.availabilityRuleSets.page.description', 'Manage shared availability rulesets.'),\n table: {\n name: t('planner.availabilityRuleSets.table.name', 'Name'),\n timezone: t('planner.availabilityRuleSets.table.timezone', 'Timezone'),\n updatedAt: t('planner.availabilityRuleSets.table.updatedAt', 'Updated'),\n empty: t('planner.availabilityRuleSets.table.empty', 'No schedules yet.'),\n search: t('planner.availabilityRuleSets.table.search', 'Search schedules...'),\n },\n actions: {\n add: t('planner.availabilityRuleSets.actions.add', 'New schedule'),\n edit: t('planner.availabilityRuleSets.actions.edit', 'Edit'),\n delete: t('planner.availabilityRuleSets.actions.delete', 'Delete'),\n deleteConfirm: t('planner.availabilityRuleSets.actions.deleteConfirm', 'Delete schedule \"{{name}}\"?'),\n refresh: t('planner.availabilityRuleSets.actions.refresh', 'Refresh'),\n },\n messages: {\n deleted: t('planner.availabilityRuleSets.messages.deleted', 'Schedule deleted.'),\n },\n errors: {\n load: t('planner.availabilityRuleSets.errors.load', 'Failed to load schedules.'),\n delete: t('planner.availabilityRuleSets.errors.delete', 'Failed to delete schedule.'),\n },\n }), [t])\n\n const loadRuleSets = React.useCallback(async () => {\n setIsLoading(true)\n try {\n const params = new URLSearchParams({\n page: String(page),\n pageSize: String(PAGE_SIZE),\n })\n const sort = sorting[0]\n if (sort?.id) {\n params.set('sortField', sort.id)\n params.set('sortDir', sort.desc ? 'desc' : 'asc')\n }\n if (search.trim()) params.set('search', search.trim())\n const payload = await readApiResultOrThrow<RuleSetResponse>(\n `/api/planner/availability-rule-sets?${params.toString()}`,\n undefined,\n { errorMessage: labels.errors.load, fallback: { items: [], total: 0, totalPages: 1 } },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n setRows(items.map(mapRuleSet))\n setTotal(typeof payload.total === 'number' ? payload.total : items.length)\n setTotalPages(typeof payload.totalPages === 'number' ? payload.totalPages : Math.max(1, Math.ceil(items.length / PAGE_SIZE)))\n } catch (error) {\n console.error('planner.availability-rule-sets.list', error)\n flash(labels.errors.load, 'error')\n } finally {\n setIsLoading(false)\n }\n }, [labels.errors.load, page, search, sorting])\n\n React.useEffect(() => {\n void loadRuleSets()\n }, [loadRuleSets, scopeVersion, reloadToken])\n\n const handleSearchChange = React.useCallback((value: string) => {\n setSearch(value)\n setPage(1)\n }, [])\n\n const handleRefresh = React.useCallback(() => {\n setReloadToken((token) => token + 1)\n }, [])\n\n const handleDelete = React.useCallback(async (entry: RuleSetRow) => {\n const message = labels.actions.deleteConfirm.replace('{{name}}', entry.name)\n if (typeof window !== 'undefined' && !window.confirm(message)) return\n try {\n await deleteCrud('planner/availability-rule-sets', entry.id, { errorMessage: labels.errors.delete })\n flash(labels.messages.deleted, 'success')\n handleRefresh()\n } catch (error) {\n console.error('planner.availability-rule-sets.delete', error)\n const normalized = normalizeCrudServerError(error)\n flash(normalized.message ?? labels.errors.delete, 'error')\n }\n }, [handleRefresh, labels.actions.deleteConfirm, labels.errors.delete, labels.messages.deleted])\n\n const columns = React.useMemo<ColumnDef<RuleSetRow>[]>(() => [\n {\n accessorKey: 'name',\n header: labels.table.name,\n meta: { priority: 1, sticky: true },\n cell: ({ row }) => (\n <div className=\"flex flex-col\">\n <span className=\"font-medium\">{row.original.name}</span>\n {row.original.description ? (\n <ReactMarkdown remarkPlugins={MARKDOWN_PLUGINS} className={MARKDOWN_SUBTEXT_CLASSNAME}>\n {row.original.description}\n </ReactMarkdown>\n ) : null}\n </div>\n ),\n },\n {\n accessorKey: 'timezone',\n header: labels.table.timezone,\n meta: { priority: 2 },\n cell: ({ row }) => <span className=\"text-sm\">{row.original.timezone}</span>,\n },\n {\n accessorKey: 'updatedAt',\n header: labels.table.updatedAt,\n meta: { priority: 3 },\n cell: ({ row }) => row.original.updatedAt\n ? <span className=\"text-xs text-muted-foreground\">{formatDateTime(row.original.updatedAt)}</span>\n : <span className=\"text-xs text-muted-foreground\">-</span>,\n },\n ], [labels.table.name, labels.table.timezone, labels.table.updatedAt])\n\n return (\n <Page>\n <PageBody>\n <DataTable<RuleSetRow>\n title={labels.title}\n data={rows}\n columns={columns}\n isLoading={isLoading}\n searchValue={search}\n onSearchChange={handleSearchChange}\n searchPlaceholder={labels.table.search}\n emptyState={<p className=\"py-8 text-center text-sm text-muted-foreground\">{labels.table.empty}</p>}\n actions={(\n <Button asChild size=\"sm\">\n <Link href=\"/backend/planner/availability-rulesets/create\">\n {labels.actions.add}\n </Link>\n </Button>\n )}\n refreshButton={{\n label: labels.actions.refresh,\n onRefresh: handleRefresh,\n isRefreshing: isLoading,\n }}\n sortable\n sorting={sorting}\n onSortingChange={setSorting}\n pagination={{\n page,\n pageSize: PAGE_SIZE,\n total,\n totalPages,\n onPageChange: setPage,\n }}\n rowActions={(row) => (\n <RowActions\n items={[\n { id: 'edit', label: labels.actions.edit, href: `/backend/planner/availability-rulesets/${row.id}` },\n { id: 'delete', label: labels.actions.delete, destructive: true, onSelect: () => { void handleDelete(row) } },\n ]}\n />\n )}\n onRowClick={(row) => router.push(`/backend/planner/availability-rulesets/${row.id}`)}\n />\n </PageBody>\n </Page>\n )\n}\n\nfunction mapRuleSet(item: Record<string, unknown>): RuleSetRow {\n const id = typeof item.id === 'string' ? item.id : ''\n const name = typeof item.name === 'string' ? item.name : id\n const description = typeof item.description === 'string' ? item.description : null\n const timezone = typeof item.timezone === 'string' ? item.timezone : 'UTC'\n const updatedAt =\n typeof item.updatedAt === 'string'\n ? item.updatedAt\n : typeof item.updated_at === 'string'\n ? item.updated_at\n : null\n return {\n id,\n name,\n description,\n timezone,\n updatedAt,\n }\n}\n\nfunction formatDateTime(value: string): string {\n const parsed = new Date(value)\n if (Number.isNaN(parsed.getTime())) return value\n return parsed.toLocaleString()\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { useRouter } from 'next/navigation'\nimport type { ColumnDef, SortingState } from '@tanstack/react-table'\nimport type { PluggableList } from 'unified'\nimport ReactMarkdown from 'react-markdown'\nimport remarkGfm from 'remark-gfm'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport { RowActions } from '@open-mercato/ui/backend/RowActions'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { deleteCrud } from '@open-mercato/ui/backend/utils/crud'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { normalizeCrudServerError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\n\nconst PAGE_SIZE = 50\nconst MARKDOWN_PLUGINS: PluggableList = [remarkGfm]\nconst MARKDOWN_SUBTEXT_CLASSNAME =\n 'line-clamp-2 text-xs text-muted-foreground [&>p]:m-0 [&_ul]:ml-4 [&_ul]:list-disc [&_ol]:ml-4 [&_ol]:list-decimal [&_code]:rounded [&_code]:bg-muted [&_code]:px-1 [&_code]:py-0.5'\n\ntype RuleSetRow = {\n id: string\n name: string\n description: string | null\n timezone: string\n updatedAt: string | null\n}\n\ntype RuleSetResponse = {\n items?: Array<Record<string, unknown>>\n total?: number\n totalPages?: number\n}\n\nexport default function PlannerAvailabilityRuleSetsPage() {\n const t = useT()\n const router = useRouter()\n const scopeVersion = useOrganizationScopeVersion()\n const [rows, setRows] = React.useState<RuleSetRow[]>([])\n const [page, setPage] = React.useState(1)\n const [total, setTotal] = React.useState(0)\n const [totalPages, setTotalPages] = React.useState(1)\n const [sorting, setSorting] = React.useState<SortingState>([{ id: 'name', desc: false }])\n const [search, setSearch] = React.useState('')\n const [isLoading, setIsLoading] = React.useState(true)\n const [reloadToken, setReloadToken] = React.useState(0)\n\n const labels = React.useMemo(() => ({\n title: t('planner.availabilityRuleSets.page.title', 'Availability schedules'),\n description: t('planner.availabilityRuleSets.page.description', 'Manage shared availability rulesets.'),\n table: {\n name: t('planner.availabilityRuleSets.table.name', 'Name'),\n timezone: t('planner.availabilityRuleSets.table.timezone', 'Timezone'),\n updatedAt: t('planner.availabilityRuleSets.table.updatedAt', 'Updated'),\n empty: t('planner.availabilityRuleSets.table.empty', 'No schedules yet.'),\n search: t('planner.availabilityRuleSets.table.search', 'Search schedules...'),\n },\n actions: {\n add: t('planner.availabilityRuleSets.actions.add', 'New schedule'),\n edit: t('planner.availabilityRuleSets.actions.edit', 'Edit'),\n delete: t('planner.availabilityRuleSets.actions.delete', 'Delete'),\n deleteConfirm: t('planner.availabilityRuleSets.actions.deleteConfirm', 'Delete schedule \"{{name}}\"?'),\n refresh: t('planner.availabilityRuleSets.actions.refresh', 'Refresh'),\n },\n messages: {\n deleted: t('planner.availabilityRuleSets.messages.deleted', 'Schedule deleted.'),\n },\n errors: {\n load: t('planner.availabilityRuleSets.errors.load', 'Failed to load schedules.'),\n delete: t('planner.availabilityRuleSets.errors.delete', 'Failed to delete schedule.'),\n },\n }), [t])\n\n const loadRuleSets = React.useCallback(async () => {\n setIsLoading(true)\n try {\n const params = new URLSearchParams({\n page: String(page),\n pageSize: String(PAGE_SIZE),\n })\n const sort = sorting[0]\n if (sort?.id) {\n params.set('sortField', sort.id)\n params.set('sortDir', sort.desc ? 'desc' : 'asc')\n }\n if (search.trim()) params.set('search', search.trim())\n const payload = await readApiResultOrThrow<RuleSetResponse>(\n `/api/planner/availability-rule-sets?${params.toString()}`,\n undefined,\n { errorMessage: labels.errors.load, fallback: { items: [], total: 0, totalPages: 1 } },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n setRows(items.map(mapRuleSet))\n setTotal(typeof payload.total === 'number' ? payload.total : items.length)\n setTotalPages(typeof payload.totalPages === 'number' ? payload.totalPages : Math.max(1, Math.ceil(items.length / PAGE_SIZE)))\n } catch (error) {\n console.error('planner.availability-rule-sets.list', error)\n flash(labels.errors.load, 'error')\n } finally {\n setIsLoading(false)\n }\n }, [labels.errors.load, page, search, sorting])\n\n React.useEffect(() => {\n void loadRuleSets()\n }, [loadRuleSets, scopeVersion, reloadToken])\n\n const handleSearchChange = React.useCallback((value: string) => {\n setSearch(value)\n setPage(1)\n }, [])\n\n const handleRefresh = React.useCallback(() => {\n setReloadToken((token) => token + 1)\n }, [])\n\n const handleDelete = React.useCallback(async (entry: RuleSetRow) => {\n const message = labels.actions.deleteConfirm.replace('{{name}}', entry.name)\n if (typeof window !== 'undefined' && !window.confirm(message)) return\n try {\n await deleteCrud('planner/availability-rule-sets', entry.id, { errorMessage: labels.errors.delete })\n flash(labels.messages.deleted, 'success')\n handleRefresh()\n } catch (error) {\n console.error('planner.availability-rule-sets.delete', error)\n const normalized = normalizeCrudServerError(error)\n flash(normalized.message ?? labels.errors.delete, 'error')\n }\n }, [handleRefresh, labels.actions.deleteConfirm, labels.errors.delete, labels.messages.deleted])\n\n const columns = React.useMemo<ColumnDef<RuleSetRow>[]>(() => [\n {\n accessorKey: 'name',\n header: labels.table.name,\n meta: { priority: 1, sticky: true },\n cell: ({ row }) => (\n <div className=\"flex flex-col\">\n <span className=\"font-medium\">{row.original.name}</span>\n {row.original.description ? (\n <ReactMarkdown remarkPlugins={MARKDOWN_PLUGINS} className={MARKDOWN_SUBTEXT_CLASSNAME}>\n {row.original.description}\n </ReactMarkdown>\n ) : null}\n </div>\n ),\n },\n {\n accessorKey: 'timezone',\n header: labels.table.timezone,\n meta: { priority: 2 },\n cell: ({ row }) => <span className=\"text-sm\">{row.original.timezone}</span>,\n },\n {\n accessorKey: 'updatedAt',\n header: labels.table.updatedAt,\n meta: { priority: 3 },\n cell: ({ row }) => row.original.updatedAt\n ? <span className=\"text-xs text-muted-foreground\">{formatDateTime(row.original.updatedAt)}</span>\n : <span className=\"text-xs text-muted-foreground\">-</span>,\n },\n ], [labels.table.name, labels.table.timezone, labels.table.updatedAt])\n\n return (\n <Page>\n <PageBody>\n <DataTable<RuleSetRow>\n title={labels.title}\n data={rows}\n columns={columns}\n isLoading={isLoading}\n searchValue={search}\n onSearchChange={handleSearchChange}\n searchPlaceholder={labels.table.search}\n emptyState={<p className=\"py-8 text-center text-sm text-muted-foreground\">{labels.table.empty}</p>}\n actions={(\n <Button asChild size=\"sm\">\n <Link href=\"/backend/planner/availability-rulesets/create\">\n {labels.actions.add}\n </Link>\n </Button>\n )}\n refreshButton={{\n label: labels.actions.refresh,\n onRefresh: handleRefresh,\n isRefreshing: isLoading,\n }}\n sortable\n sorting={sorting}\n onSortingChange={setSorting}\n pagination={{\n page,\n pageSize: PAGE_SIZE,\n total,\n totalPages,\n onPageChange: setPage,\n }}\n rowActions={(row) => (\n <RowActions\n items={[\n { label: labels.actions.edit, href: `/backend/planner/availability-rulesets/${row.id}` },\n { label: labels.actions.delete, destructive: true, onSelect: () => { void handleDelete(row) } },\n ]}\n />\n )}\n onRowClick={(row) => router.push(`/backend/planner/availability-rulesets/${row.id}`)}\n />\n </PageBody>\n </Page>\n )\n}\n\nfunction mapRuleSet(item: Record<string, unknown>): RuleSetRow {\n const id = typeof item.id === 'string' ? item.id : ''\n const name = typeof item.name === 'string' ? item.name : id\n const description = typeof item.description === 'string' ? item.description : null\n const timezone = typeof item.timezone === 'string' ? item.timezone : 'UTC'\n const updatedAt =\n typeof item.updatedAt === 'string'\n ? item.updatedAt\n : typeof item.updated_at === 'string'\n ? item.updated_at\n : null\n return {\n id,\n name,\n description,\n timezone,\n updatedAt,\n }\n}\n\nfunction formatDateTime(value: string): string {\n const parsed = new Date(value)\n if (Number.isNaN(parsed.getTime())) return value\n return parsed.toLocaleString()\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -10,43 +10,6 @@ import { upsertIndexBatch } from "./lib/batch.js";
10
10
  import { reindexEntity, DEFAULT_REINDEX_PARTITIONS } from "./lib/reindexer.js";
11
11
  import { purgeIndexScope } from "./lib/purge.js";
12
12
  import { flattenSystemEntityIds } from "@open-mercato/shared/lib/entities/system-entities";
13
- function isIndexerVerbose() {
14
- const parsed = parseBooleanToken(process.env.OM_INDEXER_VERBOSE ?? "");
15
- return parsed === true;
16
- }
17
- function createGroupedProgress(label, partitionTargets) {
18
- const totals = /* @__PURE__ */ new Map();
19
- const processed = /* @__PURE__ */ new Map();
20
- let bar = null;
21
- const getTotals = () => {
22
- let total = 0;
23
- let done = 0;
24
- for (const value of totals.values()) total += value;
25
- for (const value of processed.values()) done += value;
26
- return { total, done };
27
- };
28
- const tryInitBar = () => {
29
- if (bar) return;
30
- if (totals.size < partitionTargets.length) return;
31
- const { total } = getTotals();
32
- if (total <= 0) return;
33
- bar = createProgressBar(label, total);
34
- };
35
- return {
36
- onProgress(partition, info) {
37
- processed.set(partition, info.processed);
38
- if (!totals.has(partition)) totals.set(partition, info.total);
39
- tryInitBar();
40
- if (!bar) return;
41
- const { done } = getTotals();
42
- bar.update(done);
43
- },
44
- complete() {
45
- if (bar) bar.complete();
46
- },
47
- getTotals
48
- };
49
- }
50
13
  function parseArgs(rest) {
51
14
  const args = {};
52
15
  for (let i = 0; i < rest.length; i += 1) {
@@ -481,11 +444,8 @@ const reindex = {
481
444
  await purgeIndexScope(baseEm, { entityType: entity, organizationId: orgId, tenantId });
482
445
  }
483
446
  console.log(`Reindexing ${entity}${force ? " (forced)" : ""} in ${partitionTargets.length} partition(s)...`);
484
- const verbose = isIndexerVerbose();
485
- const progressState = verbose ? /* @__PURE__ */ new Map() : null;
486
- const groupedProgress = !verbose && partitionTargets.length > 1 ? createGroupedProgress(`Reindexing ${entity}`, partitionTargets) : null;
447
+ const progressState = /* @__PURE__ */ new Map();
487
448
  const renderProgress = (part, entityId, info) => {
488
- if (!progressState) return;
489
449
  const state = progressState.get(part) ?? { last: 0 };
490
450
  const now = Date.now();
491
451
  if (now - state.last < 1e3 && info.processed < info.total) return;
@@ -501,7 +461,7 @@ const reindex = {
501
461
  const label = partitionTargets.length > 1 ? ` [partition ${part + 1}/${partitionCount}]` : "";
502
462
  if (partitionTargets.length === 1) {
503
463
  console.log(` -> processing${label}`);
504
- } else if (verbose && idx === 0) {
464
+ } else if (idx === 0) {
505
465
  console.log(` -> processing partitions in parallel (count=${partitionTargets.length})`);
506
466
  }
507
467
  const partitionContainer = await createRequestContainer();
@@ -529,14 +489,9 @@ const reindex = {
529
489
  onProgress(info) {
530
490
  if (useBar) {
531
491
  if (info.total > 0 && !progressBar) {
532
- progressBar = createProgressBar(
533
- `Reindexing ${entity}${label}`,
534
- info.total
535
- );
492
+ progressBar = createProgressBar(`Reindexing ${entity}${label}`, info.total);
536
493
  }
537
494
  progressBar?.update(info.processed);
538
- } else if (groupedProgress) {
539
- groupedProgress.onProgress(part, info);
540
495
  } else {
541
496
  renderProgress(part, entity, info);
542
497
  }
@@ -545,9 +500,7 @@ const reindex = {
545
500
  if (progressBar) {
546
501
  progressBar.complete();
547
502
  }
548
- if (!useBar && groupedProgress) {
549
- groupedProgress.onProgress(part, { processed: partitionStats.processed, total: partitionStats.total });
550
- } else if (!useBar) {
503
+ if (!useBar) {
551
504
  renderProgress(part, entity, { processed: partitionStats.processed, total: partitionStats.total });
552
505
  } else {
553
506
  console.log(
@@ -562,7 +515,6 @@ const reindex = {
562
515
  }
563
516
  })
564
517
  );
565
- groupedProgress?.complete();
566
518
  const totalProcessed = stats.reduce((acc, value) => acc + value, 0);
567
519
  console.log(`Finished ${entity}: processed ${totalProcessed} row(s) across ${partitionTargets.length} partition(s)`);
568
520
  await recordIndexerLog(
@@ -617,11 +569,8 @@ const reindex = {
617
569
  console.log(
618
570
  `[${idx + 1}/${entityIds.length}] Reindexing ${id}${force ? " (forced)" : ""} in ${partitionTargets.length} partition(s)...`
619
571
  );
620
- const verbose = isIndexerVerbose();
621
- const progressState = verbose ? /* @__PURE__ */ new Map() : null;
622
- const groupedProgress = !verbose && partitionTargets.length > 1 ? createGroupedProgress(`Reindexing ${id}`, partitionTargets) : null;
572
+ const progressState = /* @__PURE__ */ new Map();
623
573
  const renderProgress = (part, entityId, info) => {
624
- if (!progressState) return;
625
574
  const state = progressState.get(part) ?? { last: 0 };
626
575
  const now = Date.now();
627
576
  if (now - state.last < 1e3 && info.processed < info.total) return;
@@ -637,7 +586,7 @@ const reindex = {
637
586
  const label = partitionTargets.length > 1 ? ` [partition ${part + 1}/${partitionCount}]` : "";
638
587
  if (partitionTargets.length === 1) {
639
588
  console.log(` -> processing${label}`);
640
- } else if (verbose && partitionIdx === 0) {
589
+ } else if (partitionIdx === 0) {
641
590
  console.log(` -> processing partitions in parallel (count=${partitionTargets.length})`);
642
591
  }
643
592
  const partitionContainer = await createRequestContainer();
@@ -668,8 +617,6 @@ const reindex = {
668
617
  progressBar = createProgressBar(`Reindexing ${id}${label}`, info.total);
669
618
  }
670
619
  progressBar?.update(info.processed);
671
- } else if (groupedProgress) {
672
- groupedProgress.onProgress(part, info);
673
620
  } else {
674
621
  renderProgress(part, id, info);
675
622
  }
@@ -678,9 +625,7 @@ const reindex = {
678
625
  if (progressBar) {
679
626
  progressBar.complete();
680
627
  }
681
- if (!useBar && groupedProgress) {
682
- groupedProgress.onProgress(part, { processed: result.processed, total: result.total });
683
- } else if (!useBar) {
628
+ if (!useBar) {
684
629
  renderProgress(part, id, { processed: result.processed, total: result.total });
685
630
  } else {
686
631
  console.log(
@@ -695,7 +640,6 @@ const reindex = {
695
640
  }
696
641
  })
697
642
  );
698
- groupedProgress?.complete();
699
643
  const totalProcessed = partitionResults.reduce((acc, value) => acc + value, 0);
700
644
  console.log(` -> ${id} complete: processed ${totalProcessed} row(s) across ${partitionTargets.length} partition(s)`);
701
645
  await recordIndexerLog(