@open-mercato/core 0.4.2-canary-3b5064ce72 → 0.4.2-canary-15e78de280

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 (512) hide show
  1. package/dist/generated/entities/api_key/index.js +2 -0
  2. package/dist/generated/entities/api_key/index.js.map +2 -2
  3. package/dist/generated/entities.ids.generated.js +1 -5
  4. package/dist/generated/entities.ids.generated.js.map +2 -2
  5. package/dist/generated/entity-fields-registry.js +0 -2
  6. package/dist/generated/entity-fields-registry.js.map +2 -2
  7. package/dist/modules/api_docs/frontend/docs/api/page.js +2 -3
  8. package/dist/modules/api_docs/frontend/docs/api/page.js.map +2 -2
  9. package/dist/modules/api_keys/backend/api-keys/page.js +1 -1
  10. package/dist/modules/api_keys/backend/api-keys/page.js.map +2 -2
  11. package/dist/modules/api_keys/data/entities.js +3 -0
  12. package/dist/modules/api_keys/data/entities.js.map +2 -2
  13. package/dist/modules/api_keys/migrations/Migration20260125204102.js +13 -0
  14. package/dist/modules/api_keys/migrations/Migration20260125204102.js.map +7 -0
  15. package/dist/modules/api_keys/services/apiKeyService.js +41 -0
  16. package/dist/modules/api_keys/services/apiKeyService.js.map +3 -3
  17. package/dist/modules/attachments/components/AttachmentLibrary.js +0 -4
  18. package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
  19. package/dist/modules/attachments/components/AttachmentPartitionSettings.js +0 -2
  20. package/dist/modules/attachments/components/AttachmentPartitionSettings.js.map +2 -2
  21. package/dist/modules/auth/api/admin/nav.js +3 -4
  22. package/dist/modules/auth/api/admin/nav.js.map +2 -2
  23. package/dist/modules/auth/api/login.js +6 -25
  24. package/dist/modules/auth/api/login.js.map +2 -2
  25. package/dist/modules/auth/api/reset/confirm.js +2 -25
  26. package/dist/modules/auth/api/reset/confirm.js.map +2 -2
  27. package/dist/modules/auth/api/reset.js +0 -23
  28. package/dist/modules/auth/api/reset.js.map +2 -2
  29. package/dist/modules/auth/api/sidebar/preferences/route.js +9 -14
  30. package/dist/modules/auth/api/sidebar/preferences/route.js.map +2 -2
  31. package/dist/modules/auth/api/users/route.js +2 -4
  32. package/dist/modules/auth/api/users/route.js.map +2 -2
  33. package/dist/modules/auth/backend/roles/[id]/edit/page.js +1 -4
  34. package/dist/modules/auth/backend/roles/[id]/edit/page.js.map +2 -2
  35. package/dist/modules/auth/backend/roles/page.js +3 -3
  36. package/dist/modules/auth/backend/roles/page.js.map +2 -2
  37. package/dist/modules/auth/backend/users/[id]/edit/page.js +3 -18
  38. package/dist/modules/auth/backend/users/[id]/edit/page.js.map +2 -2
  39. package/dist/modules/auth/backend/users/create/page.js +2 -15
  40. package/dist/modules/auth/backend/users/create/page.js.map +2 -2
  41. package/dist/modules/auth/backend/users/page.js +3 -3
  42. package/dist/modules/auth/backend/users/page.js.map +2 -2
  43. package/dist/modules/auth/cli.js +11 -25
  44. package/dist/modules/auth/cli.js.map +2 -2
  45. package/dist/modules/auth/commands/users.js +2 -59
  46. package/dist/modules/auth/commands/users.js.map +2 -2
  47. package/dist/modules/auth/data/validators.js +3 -6
  48. package/dist/modules/auth/data/validators.js.map +2 -2
  49. package/dist/modules/auth/frontend/login.js +3 -112
  50. package/dist/modules/auth/frontend/login.js.map +2 -2
  51. package/dist/modules/auth/frontend/reset/[token]/page.js +10 -20
  52. package/dist/modules/auth/frontend/reset/[token]/page.js.map +2 -2
  53. package/dist/modules/auth/lib/setup-app.js +8 -42
  54. package/dist/modules/auth/lib/setup-app.js.map +2 -2
  55. package/dist/modules/auth/services/authService.js +3 -24
  56. package/dist/modules/auth/services/authService.js.map +2 -2
  57. package/dist/modules/auth/services/rbacService.js.map +2 -2
  58. package/dist/modules/business_rules/api/execute/route.js +1 -7
  59. package/dist/modules/business_rules/api/execute/route.js.map +2 -2
  60. package/dist/modules/business_rules/backend/rules/page.js +0 -4
  61. package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
  62. package/dist/modules/business_rules/backend/sets/page.js +0 -3
  63. package/dist/modules/business_rules/backend/sets/page.js.map +2 -2
  64. package/dist/modules/business_rules/cli.js +1 -2
  65. package/dist/modules/business_rules/cli.js.map +2 -2
  66. package/dist/modules/business_rules/lib/rule-engine.js +3 -33
  67. package/dist/modules/business_rules/lib/rule-engine.js.map +2 -2
  68. package/dist/modules/catalog/components/PriceKindSettings.js +0 -2
  69. package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
  70. package/dist/modules/catalog/components/categories/CategoriesDataTable.js +2 -2
  71. package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
  72. package/dist/modules/catalog/components/products/ProductsDataTable.js +0 -2
  73. package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
  74. package/dist/modules/configs/cli.js +0 -6
  75. package/dist/modules/configs/cli.js.map +2 -2
  76. package/dist/modules/configs/components/CachePanel.js +4 -4
  77. package/dist/modules/configs/components/CachePanel.js.map +2 -2
  78. package/dist/modules/configs/lib/system-status.js +1 -48
  79. package/dist/modules/configs/lib/system-status.js.map +2 -2
  80. package/dist/modules/configs/lib/upgrade-actions.js +0 -18
  81. package/dist/modules/configs/lib/upgrade-actions.js.map +2 -2
  82. package/dist/modules/currencies/backend/currencies/page.js +0 -3
  83. package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
  84. package/dist/modules/currencies/backend/exchange-rates/page.js +0 -2
  85. package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
  86. package/dist/modules/customers/backend/customers/companies/page.js +0 -3
  87. package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
  88. package/dist/modules/customers/backend/customers/deals/page.js +0 -3
  89. package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
  90. package/dist/modules/customers/backend/customers/people/page.js +0 -3
  91. package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
  92. package/dist/modules/customers/commands/deals.js +0 -31
  93. package/dist/modules/customers/commands/deals.js.map +2 -2
  94. package/dist/modules/customers/components/CustomerTodosTable.js +0 -1
  95. package/dist/modules/customers/components/CustomerTodosTable.js.map +2 -2
  96. package/dist/modules/customers/widgets/dashboard/customer-todos/widget.js +1 -2
  97. package/dist/modules/customers/widgets/dashboard/customer-todos/widget.js.map +2 -2
  98. package/dist/modules/customers/widgets/dashboard/new-customers/widget.js +1 -2
  99. package/dist/modules/customers/widgets/dashboard/new-customers/widget.js.map +2 -2
  100. package/dist/modules/customers/widgets/dashboard/new-deals/widget.js +1 -2
  101. package/dist/modules/customers/widgets/dashboard/new-deals/widget.js.map +2 -2
  102. package/dist/modules/customers/widgets/dashboard/next-interactions/widget.js +1 -2
  103. package/dist/modules/customers/widgets/dashboard/next-interactions/widget.js.map +2 -2
  104. package/dist/modules/dashboards/cli.js +5 -44
  105. package/dist/modules/dashboards/cli.js.map +2 -2
  106. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js +11 -16
  107. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js.map +3 -3
  108. package/dist/modules/dashboards/services/widgetDataService.js +3 -139
  109. package/dist/modules/dashboards/services/widgetDataService.js.map +2 -2
  110. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.js +1 -2
  111. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.js.map +2 -2
  112. package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.js +1 -2
  113. package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.js.map +2 -2
  114. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.js +1 -2
  115. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.js.map +2 -2
  116. package/dist/modules/dashboards/widgets/dashboard/orders-kpi/widget.js +1 -2
  117. package/dist/modules/dashboards/widgets/dashboard/orders-kpi/widget.js.map +2 -2
  118. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.js +1 -2
  119. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.js.map +2 -2
  120. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.js +1 -2
  121. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.js.map +2 -2
  122. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.js +1 -2
  123. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.js.map +2 -2
  124. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.js +1 -2
  125. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.js.map +2 -2
  126. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.js +1 -2
  127. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.js.map +2 -2
  128. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.js +1 -2
  129. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.js.map +2 -2
  130. package/dist/modules/dictionaries/components/DictionaryTable.js +0 -2
  131. package/dist/modules/dictionaries/components/DictionaryTable.js.map +2 -2
  132. package/dist/modules/directory/backend/directory/organizations/page.js +2 -2
  133. package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
  134. package/dist/modules/directory/backend/directory/tenants/page.js +2 -2
  135. package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
  136. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +2 -2
  137. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
  138. package/dist/modules/entities/components/SystemEntitiesTable.js +1 -1
  139. package/dist/modules/entities/components/SystemEntitiesTable.js.map +2 -2
  140. package/dist/modules/entities/components/UserEntitiesTable.js +2 -2
  141. package/dist/modules/entities/components/UserEntitiesTable.js.map +2 -2
  142. package/dist/modules/feature_toggles/components/FeatureTogglesTable.js +3 -3
  143. package/dist/modules/feature_toggles/components/FeatureTogglesTable.js.map +2 -2
  144. package/dist/modules/feature_toggles/components/OverridesTable.js +1 -1
  145. package/dist/modules/feature_toggles/components/OverridesTable.js.map +2 -2
  146. package/dist/modules/planner/backend/planner/availability-rulesets/page.js +2 -2
  147. package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
  148. package/dist/modules/query_index/cli.js +7 -63
  149. package/dist/modules/query_index/cli.js.map +2 -2
  150. package/dist/modules/query_index/components/QueryIndexesTable.js +1 -7
  151. package/dist/modules/query_index/components/QueryIndexesTable.js.map +2 -2
  152. package/dist/modules/resources/backend/resources/resource-types/page.js +2 -2
  153. package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
  154. package/dist/modules/resources/backend/resources/resources/page.js +2 -2
  155. package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
  156. package/dist/modules/sales/backend/sales/channels/offers/page.js +0 -2
  157. package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
  158. package/dist/modules/sales/backend/sales/channels/page.js +0 -2
  159. package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
  160. package/dist/modules/sales/commands/documents.js +0 -53
  161. package/dist/modules/sales/commands/documents.js.map +2 -2
  162. package/dist/modules/sales/commands/payments.js +0 -26
  163. package/dist/modules/sales/commands/payments.js.map +2 -2
  164. package/dist/modules/sales/components/AdjustmentKindSettings.js +2 -2
  165. package/dist/modules/sales/components/AdjustmentKindSettings.js.map +2 -2
  166. package/dist/modules/sales/components/PaymentMethodsSettings.js +2 -2
  167. package/dist/modules/sales/components/PaymentMethodsSettings.js.map +2 -2
  168. package/dist/modules/sales/components/ShippingMethodsSettings.js +2 -2
  169. package/dist/modules/sales/components/ShippingMethodsSettings.js.map +2 -2
  170. package/dist/modules/sales/components/TaxRatesSettings.js +2 -2
  171. package/dist/modules/sales/components/TaxRatesSettings.js.map +2 -2
  172. package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +0 -2
  173. package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
  174. package/dist/modules/sales/components/documents/AdjustmentsSection.js +0 -2
  175. package/dist/modules/sales/components/documents/AdjustmentsSection.js.map +2 -2
  176. package/dist/modules/sales/components/documents/PaymentsSection.js +1 -2
  177. package/dist/modules/sales/components/documents/PaymentsSection.js.map +2 -2
  178. package/dist/modules/sales/components/documents/SalesDocumentsTable.js +0 -2
  179. package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
  180. package/dist/modules/staff/backend/staff/team-members/page.js +1 -1
  181. package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
  182. package/dist/modules/staff/backend/staff/team-roles/page.js +2 -2
  183. package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
  184. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +2 -2
  185. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
  186. package/dist/modules/staff/backend/staff/teams/page.js +2 -2
  187. package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
  188. package/dist/modules/staff/commands/leave-requests.js +0 -79
  189. package/dist/modules/staff/commands/leave-requests.js.map +2 -2
  190. package/dist/modules/workflows/backend/definitions/page.js +0 -5
  191. package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
  192. package/dist/modules/workflows/backend/instances/page.js +0 -3
  193. package/dist/modules/workflows/backend/instances/page.js.map +2 -2
  194. package/dist/modules/workflows/backend/tasks/page.js +0 -3
  195. package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
  196. package/dist/modules/workflows/cli.js +12 -12
  197. package/dist/modules/workflows/cli.js.map +2 -2
  198. package/dist/modules/workflows/lib/transition-handler.js +6 -14
  199. package/dist/modules/workflows/lib/transition-handler.js.map +2 -2
  200. package/generated/entities/api_key/index.ts +1 -0
  201. package/generated/entities.ids.generated.ts +1 -5
  202. package/generated/entity-fields-registry.ts +0 -2
  203. package/package.json +2 -2
  204. package/src/modules/api_docs/frontend/docs/api/page.tsx +2 -3
  205. package/src/modules/api_keys/backend/api-keys/page.tsx +1 -1
  206. package/src/modules/api_keys/data/entities.ts +4 -0
  207. package/src/modules/api_keys/migrations/.snapshot-open-mercato.json +9 -0
  208. package/src/modules/api_keys/migrations/Migration20260125204102.ts +13 -0
  209. package/src/modules/api_keys/services/apiKeyService.ts +85 -0
  210. package/src/modules/attachments/components/AttachmentLibrary.tsx +0 -4
  211. package/src/modules/attachments/components/AttachmentPartitionSettings.tsx +0 -2
  212. package/src/modules/auth/README.md +1 -1
  213. package/src/modules/auth/__tests__/cli-setup-acl.test.ts +1 -1
  214. package/src/modules/auth/api/__tests__/login.test.ts +0 -2
  215. package/src/modules/auth/api/admin/nav.ts +6 -10
  216. package/src/modules/auth/api/login.ts +7 -26
  217. package/src/modules/auth/api/reset/confirm.ts +2 -25
  218. package/src/modules/auth/api/reset.ts +0 -23
  219. package/src/modules/auth/api/sidebar/preferences/route.ts +12 -21
  220. package/src/modules/auth/api/users/route.ts +2 -5
  221. package/src/modules/auth/backend/roles/[id]/edit/page.tsx +1 -4
  222. package/src/modules/auth/backend/roles/page.tsx +3 -3
  223. package/src/modules/auth/backend/users/[id]/edit/page.tsx +3 -22
  224. package/src/modules/auth/backend/users/create/page.tsx +2 -19
  225. package/src/modules/auth/backend/users/page.tsx +3 -3
  226. package/src/modules/auth/cli.ts +11 -38
  227. package/src/modules/auth/commands/users.ts +2 -73
  228. package/src/modules/auth/data/validators.ts +2 -6
  229. package/src/modules/auth/frontend/login.tsx +5 -134
  230. package/src/modules/auth/frontend/reset/[token]/page.tsx +11 -24
  231. package/src/modules/auth/i18n/de.json +1 -48
  232. package/src/modules/auth/i18n/en.json +1 -48
  233. package/src/modules/auth/i18n/es.json +1 -48
  234. package/src/modules/auth/i18n/pl.json +1 -48
  235. package/src/modules/auth/lib/setup-app.ts +9 -58
  236. package/src/modules/auth/services/authService.ts +4 -27
  237. package/src/modules/auth/services/rbacService.ts +1 -1
  238. package/src/modules/business_rules/api/execute/route.ts +1 -8
  239. package/src/modules/business_rules/backend/rules/page.tsx +0 -4
  240. package/src/modules/business_rules/backend/sets/page.tsx +0 -3
  241. package/src/modules/business_rules/cli.ts +1 -2
  242. package/src/modules/business_rules/i18n/en.json +1 -3
  243. package/src/modules/business_rules/lib/__tests__/rule-engine.test.ts +0 -51
  244. package/src/modules/business_rules/lib/rule-engine.ts +3 -57
  245. package/src/modules/catalog/components/PriceKindSettings.tsx +0 -2
  246. package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +2 -2
  247. package/src/modules/catalog/components/products/ProductsDataTable.tsx +0 -2
  248. package/src/modules/catalog/i18n/en.json +1 -3
  249. package/src/modules/configs/cli.ts +0 -6
  250. package/src/modules/configs/components/CachePanel.tsx +4 -4
  251. package/src/modules/configs/i18n/en.json +2 -12
  252. package/src/modules/configs/i18n/pl.json +2 -12
  253. package/src/modules/configs/lib/system-status.ts +1 -48
  254. package/src/modules/configs/lib/system-status.types.ts +0 -1
  255. package/src/modules/configs/lib/upgrade-actions.ts +0 -18
  256. package/src/modules/currencies/backend/currencies/page.tsx +0 -3
  257. package/src/modules/currencies/backend/exchange-rates/page.tsx +0 -2
  258. package/src/modules/customers/backend/customers/companies/page.tsx +0 -3
  259. package/src/modules/customers/backend/customers/deals/page.tsx +0 -3
  260. package/src/modules/customers/backend/customers/people/page.tsx +0 -3
  261. package/src/modules/customers/commands/deals.ts +0 -39
  262. package/src/modules/customers/components/CustomerTodosTable.tsx +0 -1
  263. package/src/modules/customers/i18n/en.json +1 -5
  264. package/src/modules/customers/widgets/dashboard/customer-todos/widget.ts +2 -2
  265. package/src/modules/customers/widgets/dashboard/new-customers/widget.ts +2 -2
  266. package/src/modules/customers/widgets/dashboard/new-deals/widget.ts +2 -2
  267. package/src/modules/customers/widgets/dashboard/next-interactions/widget.ts +2 -2
  268. package/src/modules/dashboards/cli.ts +5 -55
  269. package/src/modules/dashboards/components/WidgetVisibilityEditor.tsx +11 -22
  270. package/src/modules/dashboards/services/widgetDataService.ts +4 -164
  271. package/src/modules/dashboards/widgets/dashboard/aov-kpi/widget.ts +2 -2
  272. package/src/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.ts +2 -2
  273. package/src/modules/dashboards/widgets/dashboard/orders-by-status/widget.ts +2 -2
  274. package/src/modules/dashboards/widgets/dashboard/orders-kpi/widget.ts +2 -2
  275. package/src/modules/dashboards/widgets/dashboard/pipeline-summary/widget.ts +2 -2
  276. package/src/modules/dashboards/widgets/dashboard/revenue-kpi/widget.ts +2 -2
  277. package/src/modules/dashboards/widgets/dashboard/revenue-trend/widget.ts +2 -2
  278. package/src/modules/dashboards/widgets/dashboard/sales-by-region/widget.ts +2 -2
  279. package/src/modules/dashboards/widgets/dashboard/top-customers/widget.ts +2 -2
  280. package/src/modules/dashboards/widgets/dashboard/top-products/widget.ts +2 -2
  281. package/src/modules/dictionaries/components/DictionaryTable.tsx +0 -2
  282. package/src/modules/directory/backend/directory/organizations/page.tsx +2 -2
  283. package/src/modules/directory/backend/directory/tenants/page.tsx +2 -2
  284. package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +2 -2
  285. package/src/modules/entities/components/SystemEntitiesTable.tsx +1 -1
  286. package/src/modules/entities/components/UserEntitiesTable.tsx +2 -2
  287. package/src/modules/feature_toggles/components/FeatureTogglesTable.tsx +4 -3
  288. package/src/modules/feature_toggles/components/OverridesTable.tsx +1 -1
  289. package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +2 -2
  290. package/src/modules/query_index/cli.ts +13 -82
  291. package/src/modules/query_index/components/QueryIndexesTable.tsx +2 -8
  292. package/src/modules/resources/backend/resources/resource-types/page.tsx +2 -2
  293. package/src/modules/resources/backend/resources/resources/page.tsx +2 -2
  294. package/src/modules/sales/backend/sales/channels/offers/page.tsx +0 -2
  295. package/src/modules/sales/backend/sales/channels/page.tsx +0 -2
  296. package/src/modules/sales/commands/documents.ts +0 -65
  297. package/src/modules/sales/commands/payments.ts +0 -33
  298. package/src/modules/sales/components/AdjustmentKindSettings.tsx +2 -2
  299. package/src/modules/sales/components/PaymentMethodsSettings.tsx +2 -2
  300. package/src/modules/sales/components/ShippingMethodsSettings.tsx +2 -2
  301. package/src/modules/sales/components/TaxRatesSettings.tsx +2 -2
  302. package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +0 -2
  303. package/src/modules/sales/components/documents/AdjustmentsSection.tsx +0 -2
  304. package/src/modules/sales/components/documents/PaymentsSection.tsx +1 -2
  305. package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +0 -2
  306. package/src/modules/sales/i18n/de.json +0 -20
  307. package/src/modules/sales/i18n/en.json +1 -25
  308. package/src/modules/sales/i18n/es.json +0 -20
  309. package/src/modules/sales/i18n/pl.json +0 -20
  310. package/src/modules/staff/backend/staff/team-members/page.tsx +1 -1
  311. package/src/modules/staff/backend/staff/team-roles/page.tsx +2 -2
  312. package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +2 -2
  313. package/src/modules/staff/backend/staff/teams/page.tsx +2 -2
  314. package/src/modules/staff/commands/leave-requests.ts +0 -94
  315. package/src/modules/staff/i18n/de.json +0 -4
  316. package/src/modules/staff/i18n/en.json +1 -9
  317. package/src/modules/staff/i18n/es.json +0 -4
  318. package/src/modules/staff/i18n/pl.json +0 -4
  319. package/src/modules/workflows/backend/definitions/page.tsx +0 -5
  320. package/src/modules/workflows/backend/instances/page.tsx +1 -4
  321. package/src/modules/workflows/backend/tasks/page.tsx +1 -4
  322. package/src/modules/workflows/cli.ts +12 -12
  323. package/src/modules/workflows/i18n/en.json +1 -3
  324. package/src/modules/workflows/lib/transition-handler.ts +6 -18
  325. package/dist/generated/entities/notification/index.js +0 -57
  326. package/dist/generated/entities/notification/index.js.map +0 -7
  327. package/dist/modules/auth/api/profile/route.js +0 -157
  328. package/dist/modules/auth/api/profile/route.js.map +0 -7
  329. package/dist/modules/auth/backend/auth/profile/page.js +0 -141
  330. package/dist/modules/auth/backend/auth/profile/page.js.map +0 -7
  331. package/dist/modules/auth/backend/auth/profile/page.meta.js +0 -13
  332. package/dist/modules/auth/backend/auth/profile/page.meta.js.map +0 -7
  333. package/dist/modules/auth/notifications.js +0 -112
  334. package/dist/modules/auth/notifications.js.map +0 -7
  335. package/dist/modules/business_rules/notifications.js +0 -28
  336. package/dist/modules/business_rules/notifications.js.map +0 -7
  337. package/dist/modules/business_rules/subscribers/rule-execution-failed-notification.js +0 -37
  338. package/dist/modules/business_rules/subscribers/rule-execution-failed-notification.js.map +0 -7
  339. package/dist/modules/catalog/notifications.js +0 -28
  340. package/dist/modules/catalog/notifications.js.map +0 -7
  341. package/dist/modules/catalog/subscribers/low-stock-notification.js +0 -38
  342. package/dist/modules/catalog/subscribers/low-stock-notification.js.map +0 -7
  343. package/dist/modules/customers/notifications.js +0 -48
  344. package/dist/modules/customers/notifications.js.map +0 -7
  345. package/dist/modules/dashboards/lib/role-widgets.js +0 -58
  346. package/dist/modules/dashboards/lib/role-widgets.js.map +0 -7
  347. package/dist/modules/directory/api/get/tenants/lookup.js +0 -70
  348. package/dist/modules/directory/api/get/tenants/lookup.js.map +0 -7
  349. package/dist/modules/notifications/acl.js +0 -11
  350. package/dist/modules/notifications/acl.js.map +0 -7
  351. package/dist/modules/notifications/api/[id]/action/route.js +0 -74
  352. package/dist/modules/notifications/api/[id]/action/route.js.map +0 -7
  353. package/dist/modules/notifications/api/[id]/dismiss/route.js +0 -15
  354. package/dist/modules/notifications/api/[id]/dismiss/route.js.map +0 -7
  355. package/dist/modules/notifications/api/[id]/read/route.js +0 -15
  356. package/dist/modules/notifications/api/[id]/read/route.js.map +0 -7
  357. package/dist/modules/notifications/api/[id]/restore/route.js +0 -53
  358. package/dist/modules/notifications/api/[id]/restore/route.js.map +0 -7
  359. package/dist/modules/notifications/api/batch/route.js +0 -17
  360. package/dist/modules/notifications/api/batch/route.js.map +0 -7
  361. package/dist/modules/notifications/api/feature/route.js +0 -17
  362. package/dist/modules/notifications/api/feature/route.js.map +0 -7
  363. package/dist/modules/notifications/api/mark-all-read/route.js +0 -35
  364. package/dist/modules/notifications/api/mark-all-read/route.js.map +0 -7
  365. package/dist/modules/notifications/api/openapi.js +0 -76
  366. package/dist/modules/notifications/api/openapi.js.map +0 -7
  367. package/dist/modules/notifications/api/role/route.js +0 -17
  368. package/dist/modules/notifications/api/role/route.js.map +0 -7
  369. package/dist/modules/notifications/api/route.js +0 -85
  370. package/dist/modules/notifications/api/route.js.map +0 -7
  371. package/dist/modules/notifications/api/settings/route.js +0 -155
  372. package/dist/modules/notifications/api/settings/route.js.map +0 -7
  373. package/dist/modules/notifications/api/unread-count/route.js +0 -38
  374. package/dist/modules/notifications/api/unread-count/route.js.map +0 -7
  375. package/dist/modules/notifications/backend/config/notifications/page.js +0 -10
  376. package/dist/modules/notifications/backend/config/notifications/page.js.map +0 -7
  377. package/dist/modules/notifications/backend/config/notifications/page.meta.js +0 -24
  378. package/dist/modules/notifications/backend/config/notifications/page.meta.js.map +0 -7
  379. package/dist/modules/notifications/cli.js +0 -16
  380. package/dist/modules/notifications/cli.js.map +0 -7
  381. package/dist/modules/notifications/data/entities.js +0 -112
  382. package/dist/modules/notifications/data/entities.js.map +0 -7
  383. package/dist/modules/notifications/data/validators.js +0 -98
  384. package/dist/modules/notifications/data/validators.js.map +0 -7
  385. package/dist/modules/notifications/di.js +0 -13
  386. package/dist/modules/notifications/di.js.map +0 -7
  387. package/dist/modules/notifications/emails/NotificationEmail.js +0 -58
  388. package/dist/modules/notifications/emails/NotificationEmail.js.map +0 -7
  389. package/dist/modules/notifications/frontend/NotificationInboxPageClient.js +0 -44
  390. package/dist/modules/notifications/frontend/NotificationInboxPageClient.js.map +0 -7
  391. package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js +0 -220
  392. package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js.map +0 -7
  393. package/dist/modules/notifications/index.js +0 -14
  394. package/dist/modules/notifications/index.js.map +0 -7
  395. package/dist/modules/notifications/lib/deliveryConfig.js +0 -107
  396. package/dist/modules/notifications/lib/deliveryConfig.js.map +0 -7
  397. package/dist/modules/notifications/lib/deliveryStrategies.js +0 -14
  398. package/dist/modules/notifications/lib/deliveryStrategies.js.map +0 -7
  399. package/dist/modules/notifications/lib/events.js +0 -12
  400. package/dist/modules/notifications/lib/events.js.map +0 -7
  401. package/dist/modules/notifications/lib/notificationBuilder.js +0 -66
  402. package/dist/modules/notifications/lib/notificationBuilder.js.map +0 -7
  403. package/dist/modules/notifications/lib/notificationFactory.js +0 -54
  404. package/dist/modules/notifications/lib/notificationFactory.js.map +0 -7
  405. package/dist/modules/notifications/lib/notificationMapper.js +0 -34
  406. package/dist/modules/notifications/lib/notificationMapper.js.map +0 -7
  407. package/dist/modules/notifications/lib/notificationRecipients.js +0 -35
  408. package/dist/modules/notifications/lib/notificationRecipients.js.map +0 -7
  409. package/dist/modules/notifications/lib/notificationService.js +0 -279
  410. package/dist/modules/notifications/lib/notificationService.js.map +0 -7
  411. package/dist/modules/notifications/lib/routeHelpers.js +0 -101
  412. package/dist/modules/notifications/lib/routeHelpers.js.map +0 -7
  413. package/dist/modules/notifications/lib/safeHref.js +0 -24
  414. package/dist/modules/notifications/lib/safeHref.js.map +0 -7
  415. package/dist/modules/notifications/migrations/Migration20260123000001.js +0 -70
  416. package/dist/modules/notifications/migrations/Migration20260123000001.js.map +0 -7
  417. package/dist/modules/notifications/migrations/Migration20260126150000.js +0 -37
  418. package/dist/modules/notifications/migrations/Migration20260126150000.js.map +0 -7
  419. package/dist/modules/notifications/migrations/Migration20260129082610.js +0 -13
  420. package/dist/modules/notifications/migrations/Migration20260129082610.js.map +0 -7
  421. package/dist/modules/notifications/subscribers/deliver-notification.js +0 -165
  422. package/dist/modules/notifications/subscribers/deliver-notification.js.map +0 -7
  423. package/dist/modules/notifications/workers/create-notification.worker.js +0 -70
  424. package/dist/modules/notifications/workers/create-notification.worker.js.map +0 -7
  425. package/dist/modules/sales/notifications.client.js +0 -51
  426. package/dist/modules/sales/notifications.client.js.map +0 -7
  427. package/dist/modules/sales/notifications.js +0 -88
  428. package/dist/modules/sales/notifications.js.map +0 -7
  429. package/dist/modules/sales/subscribers/quote-expiring-notification.js +0 -38
  430. package/dist/modules/sales/subscribers/quote-expiring-notification.js.map +0 -7
  431. package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js +0 -137
  432. package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js.map +0 -7
  433. package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js +0 -137
  434. package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js.map +0 -7
  435. package/dist/modules/sales/widgets/notifications/index.js +0 -7
  436. package/dist/modules/sales/widgets/notifications/index.js.map +0 -7
  437. package/dist/modules/sales/widgets/notifications/useSalesDocumentTotals.js +0 -60
  438. package/dist/modules/sales/widgets/notifications/useSalesDocumentTotals.js.map +0 -7
  439. package/dist/modules/staff/notifications.js +0 -75
  440. package/dist/modules/staff/notifications.js.map +0 -7
  441. package/dist/modules/workflows/notifications.js +0 -28
  442. package/dist/modules/workflows/notifications.js.map +0 -7
  443. package/dist/modules/workflows/subscribers/task-assigned-notification.js +0 -38
  444. package/dist/modules/workflows/subscribers/task-assigned-notification.js.map +0 -7
  445. package/generated/entities/notification/index.ts +0 -27
  446. package/src/modules/auth/api/profile/route.ts +0 -163
  447. package/src/modules/auth/backend/auth/profile/page.meta.ts +0 -9
  448. package/src/modules/auth/backend/auth/profile/page.tsx +0 -174
  449. package/src/modules/auth/notifications.ts +0 -109
  450. package/src/modules/business_rules/notifications.ts +0 -25
  451. package/src/modules/business_rules/subscribers/rule-execution-failed-notification.ts +0 -50
  452. package/src/modules/catalog/notifications.ts +0 -25
  453. package/src/modules/catalog/subscribers/low-stock-notification.ts +0 -52
  454. package/src/modules/customers/notifications.ts +0 -44
  455. package/src/modules/dashboards/lib/role-widgets.ts +0 -80
  456. package/src/modules/directory/api/get/tenants/lookup.ts +0 -75
  457. package/src/modules/notifications/__tests__/deliver-notification.test.ts +0 -195
  458. package/src/modules/notifications/__tests__/deliveryStrategies.test.ts +0 -19
  459. package/src/modules/notifications/__tests__/notificationService.test.ts +0 -208
  460. package/src/modules/notifications/acl.ts +0 -7
  461. package/src/modules/notifications/api/[id]/action/route.ts +0 -75
  462. package/src/modules/notifications/api/[id]/dismiss/route.ts +0 -12
  463. package/src/modules/notifications/api/[id]/read/route.ts +0 -12
  464. package/src/modules/notifications/api/[id]/restore/route.ts +0 -53
  465. package/src/modules/notifications/api/batch/route.ts +0 -14
  466. package/src/modules/notifications/api/feature/route.ts +0 -14
  467. package/src/modules/notifications/api/mark-all-read/route.ts +0 -34
  468. package/src/modules/notifications/api/openapi.ts +0 -76
  469. package/src/modules/notifications/api/role/route.ts +0 -14
  470. package/src/modules/notifications/api/route.ts +0 -92
  471. package/src/modules/notifications/api/settings/route.ts +0 -157
  472. package/src/modules/notifications/api/unread-count/route.ts +0 -38
  473. package/src/modules/notifications/backend/config/notifications/page.meta.ts +0 -22
  474. package/src/modules/notifications/backend/config/notifications/page.tsx +0 -12
  475. package/src/modules/notifications/cli.ts +0 -18
  476. package/src/modules/notifications/data/entities.ts +0 -99
  477. package/src/modules/notifications/data/validators.ts +0 -115
  478. package/src/modules/notifications/di.ts +0 -11
  479. package/src/modules/notifications/emails/NotificationEmail.tsx +0 -98
  480. package/src/modules/notifications/frontend/NotificationInboxPageClient.tsx +0 -42
  481. package/src/modules/notifications/frontend/NotificationSettingsPageClient.tsx +0 -233
  482. package/src/modules/notifications/i18n/de.json +0 -50
  483. package/src/modules/notifications/i18n/en.json +0 -50
  484. package/src/modules/notifications/i18n/es.json +0 -50
  485. package/src/modules/notifications/i18n/pl.json +0 -50
  486. package/src/modules/notifications/index.ts +0 -12
  487. package/src/modules/notifications/lib/deliveryConfig.ts +0 -153
  488. package/src/modules/notifications/lib/deliveryStrategies.ts +0 -50
  489. package/src/modules/notifications/lib/events.ts +0 -48
  490. package/src/modules/notifications/lib/notificationBuilder.ts +0 -121
  491. package/src/modules/notifications/lib/notificationFactory.ts +0 -76
  492. package/src/modules/notifications/lib/notificationMapper.ts +0 -33
  493. package/src/modules/notifications/lib/notificationRecipients.ts +0 -83
  494. package/src/modules/notifications/lib/notificationService.ts +0 -414
  495. package/src/modules/notifications/lib/routeHelpers.ts +0 -151
  496. package/src/modules/notifications/lib/safeHref.ts +0 -29
  497. package/src/modules/notifications/migrations/.snapshot-open-mercato.json +0 -336
  498. package/src/modules/notifications/migrations/Migration20260123000001.ts +0 -73
  499. package/src/modules/notifications/migrations/Migration20260126150000.ts +0 -39
  500. package/src/modules/notifications/migrations/Migration20260129082610.ts +0 -13
  501. package/src/modules/notifications/subscribers/deliver-notification.ts +0 -204
  502. package/src/modules/notifications/workers/create-notification.worker.ts +0 -122
  503. package/src/modules/sales/notifications.client.ts +0 -65
  504. package/src/modules/sales/notifications.ts +0 -82
  505. package/src/modules/sales/subscribers/quote-expiring-notification.ts +0 -53
  506. package/src/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.tsx +0 -156
  507. package/src/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.tsx +0 -156
  508. package/src/modules/sales/widgets/notifications/index.ts +0 -2
  509. package/src/modules/sales/widgets/notifications/useSalesDocumentTotals.ts +0 -81
  510. package/src/modules/staff/notifications.ts +0 -71
  511. package/src/modules/workflows/notifications.ts +0 -25
  512. 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/sales/components/documents/SalesDocumentsTable.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 { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { DataTable, type DataTableExportFormat } from '@open-mercato/ui/backend/DataTable'\nimport type { FilterDef, FilterValues } from '@open-mercato/ui/backend/FilterBar'\nimport { RowActions } from '@open-mercato/ui/backend/RowActions'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { buildCrudExportUrl, deleteCrud } from '@open-mercato/ui/backend/utils/crud'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { E } from '#generated/entities.ids.generated'\nimport {\n DictionaryValue,\n type DictionaryMap,\n createDictionaryMap,\n normalizeDictionaryEntries,\n} from '@open-mercato/core/modules/dictionaries/components/dictionaryAppearance'\n\ntype SalesDocumentKind = 'order' | 'quote'\n\ntype FilterOption = { value: string; label: string }\n\ntype CustomerSnapshot = {\n customer?: {\n displayName?: string | null\n primaryEmail?: string | null\n } | null\n contact?: {\n firstName?: string | null\n lastName?: string | null\n preferredName?: string | null\n } | null\n}\n\ntype ApiDocument = {\n id: string\n orderNumber?: string | null\n quoteNumber?: string | null\n status?: string | null\n customerEntityId?: string | null\n customerSnapshot?: Record<string, unknown> | null\n channelId?: string | null\n lineItemCount?: number | null\n grandTotalNetAmount?: number | null\n grandTotalGrossAmount?: number | null\n currencyCode?: string | null\n placedAt?: string | null\n validUntil?: string | null\n validFrom?: string | null\n createdAt?: string | null\n updatedAt?: string | null\n}\n\ntype DocumentsResponse = {\n items?: Array<Record<string, unknown>>\n total?: number\n totalPages?: number\n}\n\ntype SalesDocumentRow = {\n id: string\n number: string\n status?: string | null\n customerName?: string | null\n customerEmail?: string | null\n channelId?: string | null\n lineItemCount?: number | null\n totalNet?: number | null\n totalGross?: number | null\n currency?: string | null\n date?: string | null\n}\n\nconst PAGE_SIZE = 20\n\nfunction resolveCustomerName(snapshot: CustomerSnapshot | null | undefined, fallback?: string | null) {\n if (!snapshot) return fallback ?? null\n const base = snapshot.customer?.displayName ?? null\n if (base) return base\n const contact = snapshot.contact\n if (contact) {\n const parts = [contact.preferredName, contact.firstName, contact.lastName].filter(\n (part) => part && part.trim().length\n ) as string[]\n if (parts.length) return parts.join(' ')\n }\n return fallback ?? null\n}\n\nfunction resolveCustomerEmail(snapshot: CustomerSnapshot | null | undefined) {\n if (!snapshot) return null\n if (snapshot.customer?.primaryEmail) return snapshot.customer.primaryEmail\n return null\n}\n\nfunction toNumber(value: unknown): number | null {\n if (typeof value === 'number') return Number.isNaN(value) ? null : value\n if (typeof value === 'string' && value.trim().length) {\n const parsed = Number(value)\n return Number.isNaN(parsed) ? null : parsed\n }\n return null\n}\n\nfunction formatCurrency(amount: number | null | undefined, currency: string | null | undefined, fallback = '\u2014') {\n if (amount == null || Number.isNaN(amount)) return fallback\n try {\n if (currency && currency.trim().length) {\n const formatter = new Intl.NumberFormat(undefined, { style: 'currency', currency })\n return formatter.format(amount)\n }\n return new Intl.NumberFormat(undefined, { style: 'decimal', maximumFractionDigits: 2 }).format(amount)\n } catch {\n return String(amount)\n }\n}\n\nfunction mergeOptions(existing: FilterOption[], next: FilterOption[]): FilterOption[] {\n const map = new Map<string, FilterOption>()\n existing.forEach((opt) => map.set(opt.value, opt))\n next.forEach((opt) => map.set(opt.value, opt))\n return Array.from(map.values()).sort((a, b) => a.label.localeCompare(b.label))\n}\n\nfunction normalizeNumberInput(value: unknown): number | null {\n if (typeof value === 'number') return Number.isNaN(value) ? null : value\n if (typeof value === 'string' && value.trim().length) {\n const parsed = Number(value)\n return Number.isNaN(parsed) ? null : parsed\n }\n return null\n}\n\nexport function SalesDocumentsTable({ kind }: { kind: SalesDocumentKind }) {\n const t = useT()\n const router = useRouter()\n const scopeVersion = useOrganizationScopeVersion()\n const [rows, setRows] = React.useState<SalesDocumentRow[]>([])\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: 'createdAt', desc: true }])\n const [search, setSearch] = React.useState('')\n const [filterValues, setFilterValues] = React.useState<FilterValues>({})\n const [isLoading, setLoading] = React.useState(false)\n const [cacheStatus, setCacheStatus] = React.useState<'hit' | 'miss' | null>(null)\n const [reloadToken, setReloadToken] = React.useState(0)\n const [channelOptions, setChannelOptions] = React.useState<FilterOption[]>([])\n const [tagOptions, setTagOptions] = React.useState<FilterOption[]>([])\n const [customerOptions, setCustomerOptions] = React.useState<FilterOption[]>([])\n const [statusMap, setStatusMap] = React.useState<DictionaryMap>({})\n\n const resource = kind === 'order' ? 'orders' : 'quotes'\n const entityId = kind === 'order' ? E.sales.sales_order : E.sales.sales_quote\n const title = kind === 'order'\n ? t('sales.documents.list.ordersTitle', 'Sales orders')\n : t('sales.documents.list.quotesTitle', 'Sales quotes')\n const subtitle = t(\n 'sales.documents.list.subtitle',\n 'Review documents with customer context, totals, and channels.'\n )\n\n const fetchChannelOptions = React.useCallback(async (query?: string): Promise<FilterOption[]> => {\n const params = new URLSearchParams({ page: '1', pageSize: '50' })\n if (query && query.trim()) params.set('search', query.trim())\n try {\n const call = await apiCall<{ items?: unknown[] }>(`/api/sales/channels?${params.toString()}`)\n if (!call.ok) return []\n const items = Array.isArray(call.result?.items) ? call.result!.items : []\n return items\n .map((item: any): FilterOption | null => {\n const id = typeof item?.id === 'string' ? item.id : null\n const name = typeof item?.name === 'string' ? item.name : null\n if (!id || !name) return null\n return { value: id, label: name }\n })\n .filter((opt): opt is FilterOption => opt !== null)\n } catch {\n return []\n }\n }, [])\n\n const fetchTagOptions = React.useCallback(async (query?: string): Promise<FilterOption[]> => {\n const params = new URLSearchParams({ page: '1', pageSize: '50' })\n if (query && query.trim()) params.set('search', query.trim())\n try {\n const call = await apiCall<{ items?: unknown[] }>(`/api/sales/tags?${params.toString()}`)\n if (!call.ok) return []\n const items = Array.isArray(call.result?.items) ? call.result!.items : []\n return items\n .map((item: any): FilterOption | null => {\n const id = typeof item?.id === 'string' ? item.id : null\n const label = typeof item?.label === 'string' ? item.label : null\n if (!id || !label) return null\n return { value: id, label }\n })\n .filter((opt): opt is FilterOption => opt !== null)\n } catch {\n return []\n }\n }, [])\n\n const fetchCustomerOptions = React.useCallback(async (query?: string): Promise<FilterOption[]> => {\n const params = new URLSearchParams({ page: '1', pageSize: '20' })\n if (query && query.trim().length) params.set('search', query.trim())\n try {\n const [people, companies] = await Promise.all([\n apiCall<{ items?: unknown[] }>(`/api/customers/people?${params.toString()}`),\n apiCall<{ items?: unknown[] }>(`/api/customers/companies?${params.toString()}`),\n ])\n const peopleItems = Array.isArray(people.result?.items) ? people.result?.items ?? [] : []\n const companyItems = Array.isArray(companies.result?.items) ? companies.result?.items ?? [] : []\n const parseOption = (item: any, kind: 'person' | 'company'): FilterOption | null => {\n const id = typeof item?.id === 'string' ? item.id : null\n if (!id) return null\n const name =\n typeof item?.display_name === 'string' && item.display_name.trim().length\n ? item.display_name\n : typeof item?.name === 'string' && item.name.trim().length\n ? item.name\n : id\n const email =\n typeof item?.primary_email === 'string' && item.primary_email.trim().length\n ? item.primary_email.trim()\n : null\n const label = email ? `${name} (${email})` : name\n return { value: id, label: kind === 'company' ? label : label }\n }\n const options = [...peopleItems.map((i) => parseOption(i, 'person')), ...companyItems.map((i) => parseOption(i, 'company'))]\n .filter((opt): opt is FilterOption => !!opt)\n return options\n } catch {\n return []\n }\n }, [])\n\n const loadStatusMap = React.useCallback(async () => {\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100' })\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/order-statuses?${params.toString()}`,\n undefined,\n { fallback: { items: [] } }\n )\n const entries = normalizeDictionaryEntries(response.result?.items ?? [])\n setStatusMap(createDictionaryMap(entries))\n } catch (err) {\n console.error('sales.documents.statuses.load', err)\n setStatusMap({})\n }\n }, [])\n\n const loadChannelOptions = React.useCallback(\n async (query?: string) => {\n const opts = await fetchChannelOptions(query)\n if (opts.length) setChannelOptions((prev) => mergeOptions(prev, opts))\n return opts\n },\n [fetchChannelOptions]\n )\n\n const loadTagOptions = React.useCallback(\n async (query?: string) => {\n const opts = await fetchTagOptions(query)\n if (opts.length) setTagOptions((prev) => mergeOptions(prev, opts))\n return opts\n },\n [fetchTagOptions]\n )\n\n const loadCustomerOptions = React.useCallback(\n async (query?: string) => {\n const opts = await fetchCustomerOptions(query)\n if (opts.length) setCustomerOptions((prev) => mergeOptions(prev, opts))\n return opts\n },\n [fetchCustomerOptions]\n )\n\n React.useEffect(() => {\n loadChannelOptions().catch(() => {})\n loadTagOptions().catch(() => {})\n loadCustomerOptions().catch(() => {})\n loadStatusMap().catch(() => setStatusMap({}))\n }, [loadChannelOptions, loadCustomerOptions, loadStatusMap, loadTagOptions, scopeVersion])\n\n const filters = React.useMemo<FilterDef[]>(() => [\n {\n id: 'channelId',\n label: t('sales.documents.list.filters.channel', 'Channel'),\n type: 'select',\n options: channelOptions,\n loadOptions: loadChannelOptions,\n },\n {\n id: 'date',\n label: t('sales.documents.list.filters.date', 'Date'),\n type: 'dateRange',\n },\n {\n id: 'lineItemCountMin',\n label: t('sales.documents.list.filters.itemsMin', 'Min items'),\n type: 'text',\n },\n {\n id: 'lineItemCountMax',\n label: t('sales.documents.list.filters.itemsMax', 'Max items'),\n type: 'text',\n },\n {\n id: 'totalNetMin',\n label: t('sales.documents.list.filters.totalNetMin', 'Min total (net)'),\n type: 'text',\n },\n {\n id: 'totalNetMax',\n label: t('sales.documents.list.filters.totalNetMax', 'Max total (net)'),\n type: 'text',\n },\n {\n id: 'totalGrossMin',\n label: t('sales.documents.list.filters.totalGrossMin', 'Min total (gross)'),\n type: 'text',\n },\n {\n id: 'totalGrossMax',\n label: t('sales.documents.list.filters.totalGrossMax', 'Max total (gross)'),\n type: 'text',\n },\n {\n id: 'customerId',\n label: t('sales.documents.list.filters.customer', 'Customer'),\n type: 'tags',\n options: customerOptions,\n loadOptions: loadCustomerOptions,\n placeholder: t('sales.documents.list.filters.customerPlaceholder', 'Search customers'),\n formatValue: (val: string) => {\n const match = customerOptions.find((opt) => opt.value === val)\n return match?.label ?? val\n },\n },\n {\n id: 'tagIds',\n label: t('sales.documents.list.filters.tags', 'Tags'),\n type: 'tags',\n options: tagOptions,\n loadOptions: loadTagOptions,\n },\n ], [channelOptions, loadChannelOptions, loadTagOptions, tagOptions, t])\n\n const queryParams = React.useMemo(() => {\n const params = new URLSearchParams()\n params.set('page', String(page))\n params.set('pageSize', String(PAGE_SIZE))\n if (search.trim()) params.set('search', search.trim())\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 const channelId = typeof filterValues.channelId === 'string' ? filterValues.channelId : ''\n if (channelId) params.set('channelId', channelId)\n const customerIds = Array.isArray(filterValues.customerId)\n ? filterValues.customerId\n .map((value) => (typeof value === 'string' ? value.trim() : String(value || '').trim()))\n .filter((value) => value.length > 0)\n : []\n if (customerIds.length > 0) {\n params.set('customerId', customerIds[0])\n }\n const date = filterValues.date\n if (date && typeof date === 'object') {\n if (date.from) params.set('dateFrom', date.from)\n if (date.to) params.set('dateTo', date.to)\n }\n const numberFilters: Array<[keyof FilterValues, string]> = [\n ['lineItemCountMin', 'lineItemCountMin'],\n ['lineItemCountMax', 'lineItemCountMax'],\n ['totalNetMin', 'totalNetMin'],\n ['totalNetMax', 'totalNetMax'],\n ['totalGrossMin', 'totalGrossMin'],\n ['totalGrossMax', 'totalGrossMax'],\n ]\n numberFilters.forEach(([key, queryKey]) => {\n const value = normalizeNumberInput((filterValues as any)[key])\n if (value != null) params.set(queryKey, String(value))\n })\n const tagIds = Array.isArray(filterValues.tagIds)\n ? filterValues.tagIds.map((value) => (typeof value === 'string' ? value.trim() : String(value || '').trim())).filter((v) => v.length > 0)\n : []\n if (tagIds.length > 0) {\n params.set('tagIds', tagIds.join(','))\n }\n Object.entries(filterValues).forEach(([key, value]) => {\n if (!key.startsWith('cf_') || value == null) return\n if (Array.isArray(value)) {\n const normalized = value\n .map((item) => {\n if (item == null) return ''\n if (typeof item === 'string') return item.trim()\n return String(item).trim()\n })\n .filter((item) => item.length > 0)\n if (normalized.length) params.set(key, normalized.join(','))\n } else if (typeof value === 'object') {\n return\n } else if (value !== '') {\n const stringValue = typeof value === 'string' ? value.trim() : String(value)\n if (stringValue) params.set(key, stringValue)\n }\n })\n return params.toString()\n }, [filterValues, page, search, sorting])\n\n const currentParams = React.useMemo(() => Object.fromEntries(new URLSearchParams(queryParams)), [queryParams])\n\n const exportConfig = React.useMemo(() => ({\n view: {\n getUrl: (format: DataTableExportFormat) =>\n buildCrudExportUrl(`sales/${resource}`, { ...currentParams, exportScope: 'view' }, format),\n },\n full: {\n getUrl: (format: DataTableExportFormat) =>\n buildCrudExportUrl(`sales/${resource}`, { ...currentParams, exportScope: 'full', all: 'true' }, format),\n },\n }), [currentParams, resource])\n\n const mapApiDocument = React.useCallback(\n (item: Record<string, unknown>): SalesDocumentRow => {\n const doc = item as ApiDocument\n const id = typeof doc.id === 'string' ? doc.id : ''\n const number = kind === 'order'\n ? doc.orderNumber ?? (item as any)?.order_number ?? id\n : doc.quoteNumber ?? (item as any)?.quote_number ?? id\n const customerSnapshot = (doc.customerSnapshot ?? null) as CustomerSnapshot | null\n const customerName = resolveCustomerName(customerSnapshot, doc.customerEntityId ?? null)\n const customerEmail = resolveCustomerEmail(customerSnapshot)\n const totalNet = toNumber(doc.grandTotalNetAmount)\n const totalGross = toNumber(doc.grandTotalGrossAmount)\n const placedAt = doc.placedAt ?? null\n const validUntil = doc.validUntil ?? null\n const createdAt = doc.createdAt ?? null\n const date = placedAt ?? validUntil ?? createdAt ?? null\n return {\n id,\n number,\n status: doc.status ?? null,\n customerName,\n customerEmail,\n channelId: doc.channelId ?? null,\n lineItemCount: doc.lineItemCount ?? null,\n totalNet,\n totalGross,\n currency: doc.currencyCode ?? null,\n date,\n }\n },\n [kind]\n )\n\n const loadDocuments = React.useCallback(async () => {\n setLoading(true)\n setCacheStatus(null)\n try {\n const call = await apiCall<DocumentsResponse>(`/api/sales/${resource}?${queryParams}`)\n if (!call.ok) {\n flash(t('sales.documents.list.errors.load', 'Failed to load documents.'), 'error')\n setRows([])\n setTotal(0)\n setTotalPages(1)\n return\n }\n const payload = call.result ?? {}\n const items = Array.isArray(payload.items) ? payload.items : []\n setRows(items.map((item) => mapApiDocument(item)))\n const count = typeof payload.total === 'number' ? payload.total : items.length\n setTotal(count)\n const pages = typeof payload.totalPages === 'number'\n ? payload.totalPages\n : Math.max(1, Math.ceil(count / PAGE_SIZE))\n setTotalPages(pages)\n setCacheStatus(call.cacheStatus ?? null)\n } catch (err) {\n console.error('sales.documents.list', err)\n flash(t('sales.documents.list.errors.load', 'Failed to load documents.'), 'error')\n } finally {\n setLoading(false)\n }\n }, [mapApiDocument, queryParams, resource, t])\n\n React.useEffect(() => {\n void loadDocuments()\n }, [loadDocuments, reloadToken, scopeVersion])\n\n const handleFiltersApply = React.useCallback((values: FilterValues) => {\n setFilterValues(values)\n setPage(1)\n }, [])\n\n const handleFiltersClear = React.useCallback(() => {\n setFilterValues({})\n setPage(1)\n }, [])\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(\n async (row: SalesDocumentRow) => {\n const confirmMessage =\n kind === 'order'\n ? t(\n 'sales.documents.list.table.deleteOrderConfirm',\n 'Delete this sales order? Related shipments, payments, addresses, and items will be removed.'\n )\n : t(\n 'sales.documents.list.table.deleteQuoteConfirm',\n 'Delete this sales quote? Related addresses, comments, and items will be removed.'\n )\n if (typeof window !== 'undefined' && !window.confirm(confirmMessage)) return\n try {\n const result = await deleteCrud(`sales/${resource}`, row.id, {\n errorMessage: t('sales.documents.list.table.deleteError', 'Failed to delete document.'),\n })\n if (result.ok) {\n flash(\n kind === 'order'\n ? t('sales.documents.list.table.orderDeleted', 'Sales order deleted.')\n : t('sales.documents.list.table.quoteDeleted', 'Sales quote deleted.'),\n 'success'\n )\n handleRefresh()\n }\n } catch (err) {\n console.error('sales.documents.delete', err)\n flash(t('sales.documents.list.table.deleteError', 'Failed to delete document.'), 'error')\n }\n },\n [handleRefresh, kind, resource, t]\n )\n\n const handleRowClick = React.useCallback((row: SalesDocumentRow) => {\n router.push(`/backend/sales/${resource}/${row.id}?kind=${kind}`)\n }, [kind, resource, router])\n\n const columns = React.useMemo<ColumnDef<SalesDocumentRow>[]>(() => [\n {\n id: 'number',\n accessorKey: 'number',\n header: kind === 'order'\n ? t('sales.documents.list.table.order', 'Order')\n : t('sales.documents.list.table.quote', 'Quote'),\n cell: ({ row }) => (\n <div className=\"flex flex-col\">\n <span className=\"font-semibold\">{row.original.number}</span>\n {row.original.status ? (\n <DictionaryValue\n value={row.original.status}\n map={statusMap}\n fallback={<span className=\"text-xs text-muted-foreground\">{row.original.status}</span>}\n className=\"text-xs text-muted-foreground font-medium\"\n iconWrapperClassName=\"inline-flex h-5 w-5 items-center justify-center rounded bg-muted text-muted-foreground\"\n iconClassName=\"h-3.5 w-3.5\"\n colorClassName=\"h-3 w-3 rounded-full border border-border/70\"\n />\n ) : null}\n </div>\n ),\n meta: { sticky: true },\n },\n {\n accessorKey: 'customerName',\n header: t('sales.documents.list.table.customer', 'Customer'),\n cell: ({ row }) => (\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium\">\n {row.original.customerName ?? t('sales.documents.list.table.noCustomer', 'No customer')}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {row.original.customerEmail ?? t('sales.documents.list.table.noEmail', 'No email')}\n </span>\n </div>\n ),\n enableSorting: false,\n },\n {\n accessorKey: 'channelId',\n header: t('sales.documents.list.table.channel', 'Channel'),\n cell: ({ row }) => {\n const channelId = row.original.channelId\n if (!channelId) return <span className=\"text-xs text-muted-foreground\">{t('sales.documents.list.table.unassigned', 'Unassigned')}</span>\n const channel = channelOptions.find((opt) => opt.value === channelId)\n return (\n <span className=\"text-sm\">{channel?.label ?? channelId}</span>\n )\n },\n enableSorting: false,\n },\n {\n id: 'lineItemCount',\n accessorKey: 'lineItemCount',\n header: t('sales.documents.list.table.items', 'Items'),\n cell: ({ row }) => (\n <span className=\"text-sm font-semibold\">{typeof row.original.lineItemCount === 'number' ? row.original.lineItemCount : '\u2014'}</span>\n ),\n },\n {\n id: 'grandTotalNetAmount',\n accessorKey: 'totalNet',\n header: t('sales.documents.list.table.totalNet', 'Total (net)'),\n cell: ({ row }) => (\n <span className=\"text-sm\">{formatCurrency(row.original.totalNet ?? null, row.original.currency)}</span>\n ),\n },\n {\n id: 'grandTotalGrossAmount',\n accessorKey: 'totalGross',\n header: t('sales.documents.list.table.totalGross', 'Total (gross)'),\n cell: ({ row }) => (\n <span className=\"text-sm\">{formatCurrency(row.original.totalGross ?? null, row.original.currency)}</span>\n ),\n },\n {\n id: 'createdAt',\n accessorKey: 'date',\n header: t('sales.documents.list.table.date', 'Date'),\n cell: ({ row }) =>\n row.original.date\n ? <span className=\"text-xs text-muted-foreground\">{new Date(row.original.date).toLocaleString()}</span>\n : <span className=\"text-xs text-muted-foreground\">\u2014</span>,\n },\n ], [channelOptions, kind, statusMap, t])\n\n const emptyLabel = kind === 'order'\n ? t('sales.documents.list.table.emptyOrders', 'No orders yet.')\n : t('sales.documents.list.table.emptyQuotes', 'No quotes yet.')\n\n return (\n <Page>\n <PageBody>\n <DataTable<SalesDocumentRow>\n title={(\n <div className=\"flex flex-col\">\n <span>{title}</span>\n <span className=\"text-sm font-normal text-muted-foreground\">{subtitle}</span>\n </div>\n )}\n actions={(\n <Button asChild>\n <Link href={`/backend/sales/documents/create?kind=${kind}`}>\n {t('sales.documents.create.title', 'Create sales document')}\n </Link>\n </Button>\n )}\n columns={columns}\n data={rows}\n sorting={sorting}\n onSortingChange={setSorting}\n isLoading={isLoading}\n searchValue={search}\n onSearchChange={handleSearchChange}\n searchPlaceholder={\n kind === 'order'\n ? t('sales.documents.list.search.orders', 'Search orders\u2026')\n : t('sales.documents.list.search.quotes', 'Search quotes\u2026')\n }\n filters={filters}\n filterValues={filterValues}\n onFiltersApply={handleFiltersApply}\n onFiltersClear={handleFiltersClear}\n entityId={entityId}\n exporter={exportConfig}\n pagination={{\n page,\n pageSize: PAGE_SIZE,\n total,\n totalPages,\n onPageChange: setPage,\n cacheStatus,\n }}\n refreshButton={{\n label: t('sales.documents.list.table.refresh', 'Refresh'),\n onRefresh: handleRefresh,\n isRefreshing: isLoading,\n }}\n rowActions={(row) => (\n <RowActions\n items={[\n {\n id: 'open',\n label: t('sales.documents.list.table.open', 'Open'),\n href: `/backend/sales/${resource}/${row.id}?kind=${kind}`,\n },\n {\n id: 'delete',\n label:\n kind === 'order'\n ? t('sales.documents.list.table.deleteOrder', 'Delete order')\n : t('sales.documents.list.table.deleteQuote', 'Delete quote'),\n onSelect: () => handleDelete(row),\n },\n ]}\n />\n )}\n onRowClick={handleRowClick}\n emptyState={\n <div className=\"py-10 text-center text-sm text-muted-foreground\">\n {emptyLabel}\n </div>\n }\n />\n </PageBody>\n </Page>\n )\n}\n\nexport default SalesDocumentsTable\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 { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { DataTable, type DataTableExportFormat } from '@open-mercato/ui/backend/DataTable'\nimport type { FilterDef, FilterValues } from '@open-mercato/ui/backend/FilterBar'\nimport { RowActions } from '@open-mercato/ui/backend/RowActions'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { buildCrudExportUrl, deleteCrud } from '@open-mercato/ui/backend/utils/crud'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { E } from '#generated/entities.ids.generated'\nimport {\n DictionaryValue,\n type DictionaryMap,\n createDictionaryMap,\n normalizeDictionaryEntries,\n} from '@open-mercato/core/modules/dictionaries/components/dictionaryAppearance'\n\ntype SalesDocumentKind = 'order' | 'quote'\n\ntype FilterOption = { value: string; label: string }\n\ntype CustomerSnapshot = {\n customer?: {\n displayName?: string | null\n primaryEmail?: string | null\n } | null\n contact?: {\n firstName?: string | null\n lastName?: string | null\n preferredName?: string | null\n } | null\n}\n\ntype ApiDocument = {\n id: string\n orderNumber?: string | null\n quoteNumber?: string | null\n status?: string | null\n customerEntityId?: string | null\n customerSnapshot?: Record<string, unknown> | null\n channelId?: string | null\n lineItemCount?: number | null\n grandTotalNetAmount?: number | null\n grandTotalGrossAmount?: number | null\n currencyCode?: string | null\n placedAt?: string | null\n validUntil?: string | null\n validFrom?: string | null\n createdAt?: string | null\n updatedAt?: string | null\n}\n\ntype DocumentsResponse = {\n items?: Array<Record<string, unknown>>\n total?: number\n totalPages?: number\n}\n\ntype SalesDocumentRow = {\n id: string\n number: string\n status?: string | null\n customerName?: string | null\n customerEmail?: string | null\n channelId?: string | null\n lineItemCount?: number | null\n totalNet?: number | null\n totalGross?: number | null\n currency?: string | null\n date?: string | null\n}\n\nconst PAGE_SIZE = 20\n\nfunction resolveCustomerName(snapshot: CustomerSnapshot | null | undefined, fallback?: string | null) {\n if (!snapshot) return fallback ?? null\n const base = snapshot.customer?.displayName ?? null\n if (base) return base\n const contact = snapshot.contact\n if (contact) {\n const parts = [contact.preferredName, contact.firstName, contact.lastName].filter(\n (part) => part && part.trim().length\n ) as string[]\n if (parts.length) return parts.join(' ')\n }\n return fallback ?? null\n}\n\nfunction resolveCustomerEmail(snapshot: CustomerSnapshot | null | undefined) {\n if (!snapshot) return null\n if (snapshot.customer?.primaryEmail) return snapshot.customer.primaryEmail\n return null\n}\n\nfunction toNumber(value: unknown): number | null {\n if (typeof value === 'number') return Number.isNaN(value) ? null : value\n if (typeof value === 'string' && value.trim().length) {\n const parsed = Number(value)\n return Number.isNaN(parsed) ? null : parsed\n }\n return null\n}\n\nfunction formatCurrency(amount: number | null | undefined, currency: string | null | undefined, fallback = '\u2014') {\n if (amount == null || Number.isNaN(amount)) return fallback\n try {\n if (currency && currency.trim().length) {\n const formatter = new Intl.NumberFormat(undefined, { style: 'currency', currency })\n return formatter.format(amount)\n }\n return new Intl.NumberFormat(undefined, { style: 'decimal', maximumFractionDigits: 2 }).format(amount)\n } catch {\n return String(amount)\n }\n}\n\nfunction mergeOptions(existing: FilterOption[], next: FilterOption[]): FilterOption[] {\n const map = new Map<string, FilterOption>()\n existing.forEach((opt) => map.set(opt.value, opt))\n next.forEach((opt) => map.set(opt.value, opt))\n return Array.from(map.values()).sort((a, b) => a.label.localeCompare(b.label))\n}\n\nfunction normalizeNumberInput(value: unknown): number | null {\n if (typeof value === 'number') return Number.isNaN(value) ? null : value\n if (typeof value === 'string' && value.trim().length) {\n const parsed = Number(value)\n return Number.isNaN(parsed) ? null : parsed\n }\n return null\n}\n\nexport function SalesDocumentsTable({ kind }: { kind: SalesDocumentKind }) {\n const t = useT()\n const router = useRouter()\n const scopeVersion = useOrganizationScopeVersion()\n const [rows, setRows] = React.useState<SalesDocumentRow[]>([])\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: 'createdAt', desc: true }])\n const [search, setSearch] = React.useState('')\n const [filterValues, setFilterValues] = React.useState<FilterValues>({})\n const [isLoading, setLoading] = React.useState(false)\n const [cacheStatus, setCacheStatus] = React.useState<'hit' | 'miss' | null>(null)\n const [reloadToken, setReloadToken] = React.useState(0)\n const [channelOptions, setChannelOptions] = React.useState<FilterOption[]>([])\n const [tagOptions, setTagOptions] = React.useState<FilterOption[]>([])\n const [customerOptions, setCustomerOptions] = React.useState<FilterOption[]>([])\n const [statusMap, setStatusMap] = React.useState<DictionaryMap>({})\n\n const resource = kind === 'order' ? 'orders' : 'quotes'\n const entityId = kind === 'order' ? E.sales.sales_order : E.sales.sales_quote\n const title = kind === 'order'\n ? t('sales.documents.list.ordersTitle', 'Sales orders')\n : t('sales.documents.list.quotesTitle', 'Sales quotes')\n const subtitle = t(\n 'sales.documents.list.subtitle',\n 'Review documents with customer context, totals, and channels.'\n )\n\n const fetchChannelOptions = React.useCallback(async (query?: string): Promise<FilterOption[]> => {\n const params = new URLSearchParams({ page: '1', pageSize: '50' })\n if (query && query.trim()) params.set('search', query.trim())\n try {\n const call = await apiCall<{ items?: unknown[] }>(`/api/sales/channels?${params.toString()}`)\n if (!call.ok) return []\n const items = Array.isArray(call.result?.items) ? call.result!.items : []\n return items\n .map((item: any): FilterOption | null => {\n const id = typeof item?.id === 'string' ? item.id : null\n const name = typeof item?.name === 'string' ? item.name : null\n if (!id || !name) return null\n return { value: id, label: name }\n })\n .filter((opt): opt is FilterOption => opt !== null)\n } catch {\n return []\n }\n }, [])\n\n const fetchTagOptions = React.useCallback(async (query?: string): Promise<FilterOption[]> => {\n const params = new URLSearchParams({ page: '1', pageSize: '50' })\n if (query && query.trim()) params.set('search', query.trim())\n try {\n const call = await apiCall<{ items?: unknown[] }>(`/api/sales/tags?${params.toString()}`)\n if (!call.ok) return []\n const items = Array.isArray(call.result?.items) ? call.result!.items : []\n return items\n .map((item: any): FilterOption | null => {\n const id = typeof item?.id === 'string' ? item.id : null\n const label = typeof item?.label === 'string' ? item.label : null\n if (!id || !label) return null\n return { value: id, label }\n })\n .filter((opt): opt is FilterOption => opt !== null)\n } catch {\n return []\n }\n }, [])\n\n const fetchCustomerOptions = React.useCallback(async (query?: string): Promise<FilterOption[]> => {\n const params = new URLSearchParams({ page: '1', pageSize: '20' })\n if (query && query.trim().length) params.set('search', query.trim())\n try {\n const [people, companies] = await Promise.all([\n apiCall<{ items?: unknown[] }>(`/api/customers/people?${params.toString()}`),\n apiCall<{ items?: unknown[] }>(`/api/customers/companies?${params.toString()}`),\n ])\n const peopleItems = Array.isArray(people.result?.items) ? people.result?.items ?? [] : []\n const companyItems = Array.isArray(companies.result?.items) ? companies.result?.items ?? [] : []\n const parseOption = (item: any, kind: 'person' | 'company'): FilterOption | null => {\n const id = typeof item?.id === 'string' ? item.id : null\n if (!id) return null\n const name =\n typeof item?.display_name === 'string' && item.display_name.trim().length\n ? item.display_name\n : typeof item?.name === 'string' && item.name.trim().length\n ? item.name\n : id\n const email =\n typeof item?.primary_email === 'string' && item.primary_email.trim().length\n ? item.primary_email.trim()\n : null\n const label = email ? `${name} (${email})` : name\n return { value: id, label: kind === 'company' ? label : label }\n }\n const options = [...peopleItems.map((i) => parseOption(i, 'person')), ...companyItems.map((i) => parseOption(i, 'company'))]\n .filter((opt): opt is FilterOption => !!opt)\n return options\n } catch {\n return []\n }\n }, [])\n\n const loadStatusMap = React.useCallback(async () => {\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100' })\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/order-statuses?${params.toString()}`,\n undefined,\n { fallback: { items: [] } }\n )\n const entries = normalizeDictionaryEntries(response.result?.items ?? [])\n setStatusMap(createDictionaryMap(entries))\n } catch (err) {\n console.error('sales.documents.statuses.load', err)\n setStatusMap({})\n }\n }, [])\n\n const loadChannelOptions = React.useCallback(\n async (query?: string) => {\n const opts = await fetchChannelOptions(query)\n if (opts.length) setChannelOptions((prev) => mergeOptions(prev, opts))\n return opts\n },\n [fetchChannelOptions]\n )\n\n const loadTagOptions = React.useCallback(\n async (query?: string) => {\n const opts = await fetchTagOptions(query)\n if (opts.length) setTagOptions((prev) => mergeOptions(prev, opts))\n return opts\n },\n [fetchTagOptions]\n )\n\n const loadCustomerOptions = React.useCallback(\n async (query?: string) => {\n const opts = await fetchCustomerOptions(query)\n if (opts.length) setCustomerOptions((prev) => mergeOptions(prev, opts))\n return opts\n },\n [fetchCustomerOptions]\n )\n\n React.useEffect(() => {\n loadChannelOptions().catch(() => {})\n loadTagOptions().catch(() => {})\n loadCustomerOptions().catch(() => {})\n loadStatusMap().catch(() => setStatusMap({}))\n }, [loadChannelOptions, loadCustomerOptions, loadStatusMap, loadTagOptions, scopeVersion])\n\n const filters = React.useMemo<FilterDef[]>(() => [\n {\n id: 'channelId',\n label: t('sales.documents.list.filters.channel', 'Channel'),\n type: 'select',\n options: channelOptions,\n loadOptions: loadChannelOptions,\n },\n {\n id: 'date',\n label: t('sales.documents.list.filters.date', 'Date'),\n type: 'dateRange',\n },\n {\n id: 'lineItemCountMin',\n label: t('sales.documents.list.filters.itemsMin', 'Min items'),\n type: 'text',\n },\n {\n id: 'lineItemCountMax',\n label: t('sales.documents.list.filters.itemsMax', 'Max items'),\n type: 'text',\n },\n {\n id: 'totalNetMin',\n label: t('sales.documents.list.filters.totalNetMin', 'Min total (net)'),\n type: 'text',\n },\n {\n id: 'totalNetMax',\n label: t('sales.documents.list.filters.totalNetMax', 'Max total (net)'),\n type: 'text',\n },\n {\n id: 'totalGrossMin',\n label: t('sales.documents.list.filters.totalGrossMin', 'Min total (gross)'),\n type: 'text',\n },\n {\n id: 'totalGrossMax',\n label: t('sales.documents.list.filters.totalGrossMax', 'Max total (gross)'),\n type: 'text',\n },\n {\n id: 'customerId',\n label: t('sales.documents.list.filters.customer', 'Customer'),\n type: 'tags',\n options: customerOptions,\n loadOptions: loadCustomerOptions,\n placeholder: t('sales.documents.list.filters.customerPlaceholder', 'Search customers'),\n formatValue: (val: string) => {\n const match = customerOptions.find((opt) => opt.value === val)\n return match?.label ?? val\n },\n },\n {\n id: 'tagIds',\n label: t('sales.documents.list.filters.tags', 'Tags'),\n type: 'tags',\n options: tagOptions,\n loadOptions: loadTagOptions,\n },\n ], [channelOptions, loadChannelOptions, loadTagOptions, tagOptions, t])\n\n const queryParams = React.useMemo(() => {\n const params = new URLSearchParams()\n params.set('page', String(page))\n params.set('pageSize', String(PAGE_SIZE))\n if (search.trim()) params.set('search', search.trim())\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 const channelId = typeof filterValues.channelId === 'string' ? filterValues.channelId : ''\n if (channelId) params.set('channelId', channelId)\n const customerIds = Array.isArray(filterValues.customerId)\n ? filterValues.customerId\n .map((value) => (typeof value === 'string' ? value.trim() : String(value || '').trim()))\n .filter((value) => value.length > 0)\n : []\n if (customerIds.length > 0) {\n params.set('customerId', customerIds[0])\n }\n const date = filterValues.date\n if (date && typeof date === 'object') {\n if (date.from) params.set('dateFrom', date.from)\n if (date.to) params.set('dateTo', date.to)\n }\n const numberFilters: Array<[keyof FilterValues, string]> = [\n ['lineItemCountMin', 'lineItemCountMin'],\n ['lineItemCountMax', 'lineItemCountMax'],\n ['totalNetMin', 'totalNetMin'],\n ['totalNetMax', 'totalNetMax'],\n ['totalGrossMin', 'totalGrossMin'],\n ['totalGrossMax', 'totalGrossMax'],\n ]\n numberFilters.forEach(([key, queryKey]) => {\n const value = normalizeNumberInput((filterValues as any)[key])\n if (value != null) params.set(queryKey, String(value))\n })\n const tagIds = Array.isArray(filterValues.tagIds)\n ? filterValues.tagIds.map((value) => (typeof value === 'string' ? value.trim() : String(value || '').trim())).filter((v) => v.length > 0)\n : []\n if (tagIds.length > 0) {\n params.set('tagIds', tagIds.join(','))\n }\n Object.entries(filterValues).forEach(([key, value]) => {\n if (!key.startsWith('cf_') || value == null) return\n if (Array.isArray(value)) {\n const normalized = value\n .map((item) => {\n if (item == null) return ''\n if (typeof item === 'string') return item.trim()\n return String(item).trim()\n })\n .filter((item) => item.length > 0)\n if (normalized.length) params.set(key, normalized.join(','))\n } else if (typeof value === 'object') {\n return\n } else if (value !== '') {\n const stringValue = typeof value === 'string' ? value.trim() : String(value)\n if (stringValue) params.set(key, stringValue)\n }\n })\n return params.toString()\n }, [filterValues, page, search, sorting])\n\n const currentParams = React.useMemo(() => Object.fromEntries(new URLSearchParams(queryParams)), [queryParams])\n\n const exportConfig = React.useMemo(() => ({\n view: {\n getUrl: (format: DataTableExportFormat) =>\n buildCrudExportUrl(`sales/${resource}`, { ...currentParams, exportScope: 'view' }, format),\n },\n full: {\n getUrl: (format: DataTableExportFormat) =>\n buildCrudExportUrl(`sales/${resource}`, { ...currentParams, exportScope: 'full', all: 'true' }, format),\n },\n }), [currentParams, resource])\n\n const mapApiDocument = React.useCallback(\n (item: Record<string, unknown>): SalesDocumentRow => {\n const doc = item as ApiDocument\n const id = typeof doc.id === 'string' ? doc.id : ''\n const number = kind === 'order'\n ? doc.orderNumber ?? (item as any)?.order_number ?? id\n : doc.quoteNumber ?? (item as any)?.quote_number ?? id\n const customerSnapshot = (doc.customerSnapshot ?? null) as CustomerSnapshot | null\n const customerName = resolveCustomerName(customerSnapshot, doc.customerEntityId ?? null)\n const customerEmail = resolveCustomerEmail(customerSnapshot)\n const totalNet = toNumber(doc.grandTotalNetAmount)\n const totalGross = toNumber(doc.grandTotalGrossAmount)\n const placedAt = doc.placedAt ?? null\n const validUntil = doc.validUntil ?? null\n const createdAt = doc.createdAt ?? null\n const date = placedAt ?? validUntil ?? createdAt ?? null\n return {\n id,\n number,\n status: doc.status ?? null,\n customerName,\n customerEmail,\n channelId: doc.channelId ?? null,\n lineItemCount: doc.lineItemCount ?? null,\n totalNet,\n totalGross,\n currency: doc.currencyCode ?? null,\n date,\n }\n },\n [kind]\n )\n\n const loadDocuments = React.useCallback(async () => {\n setLoading(true)\n setCacheStatus(null)\n try {\n const call = await apiCall<DocumentsResponse>(`/api/sales/${resource}?${queryParams}`)\n if (!call.ok) {\n flash(t('sales.documents.list.errors.load', 'Failed to load documents.'), 'error')\n setRows([])\n setTotal(0)\n setTotalPages(1)\n return\n }\n const payload = call.result ?? {}\n const items = Array.isArray(payload.items) ? payload.items : []\n setRows(items.map((item) => mapApiDocument(item)))\n const count = typeof payload.total === 'number' ? payload.total : items.length\n setTotal(count)\n const pages = typeof payload.totalPages === 'number'\n ? payload.totalPages\n : Math.max(1, Math.ceil(count / PAGE_SIZE))\n setTotalPages(pages)\n setCacheStatus(call.cacheStatus ?? null)\n } catch (err) {\n console.error('sales.documents.list', err)\n flash(t('sales.documents.list.errors.load', 'Failed to load documents.'), 'error')\n } finally {\n setLoading(false)\n }\n }, [mapApiDocument, queryParams, resource, t])\n\n React.useEffect(() => {\n void loadDocuments()\n }, [loadDocuments, reloadToken, scopeVersion])\n\n const handleFiltersApply = React.useCallback((values: FilterValues) => {\n setFilterValues(values)\n setPage(1)\n }, [])\n\n const handleFiltersClear = React.useCallback(() => {\n setFilterValues({})\n setPage(1)\n }, [])\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(\n async (row: SalesDocumentRow) => {\n const confirmMessage =\n kind === 'order'\n ? t(\n 'sales.documents.list.table.deleteOrderConfirm',\n 'Delete this sales order? Related shipments, payments, addresses, and items will be removed.'\n )\n : t(\n 'sales.documents.list.table.deleteQuoteConfirm',\n 'Delete this sales quote? Related addresses, comments, and items will be removed.'\n )\n if (typeof window !== 'undefined' && !window.confirm(confirmMessage)) return\n try {\n const result = await deleteCrud(`sales/${resource}`, row.id, {\n errorMessage: t('sales.documents.list.table.deleteError', 'Failed to delete document.'),\n })\n if (result.ok) {\n flash(\n kind === 'order'\n ? t('sales.documents.list.table.orderDeleted', 'Sales order deleted.')\n : t('sales.documents.list.table.quoteDeleted', 'Sales quote deleted.'),\n 'success'\n )\n handleRefresh()\n }\n } catch (err) {\n console.error('sales.documents.delete', err)\n flash(t('sales.documents.list.table.deleteError', 'Failed to delete document.'), 'error')\n }\n },\n [handleRefresh, kind, resource, t]\n )\n\n const handleRowClick = React.useCallback((row: SalesDocumentRow) => {\n router.push(`/backend/sales/${resource}/${row.id}?kind=${kind}`)\n }, [kind, resource, router])\n\n const columns = React.useMemo<ColumnDef<SalesDocumentRow>[]>(() => [\n {\n id: 'number',\n accessorKey: 'number',\n header: kind === 'order'\n ? t('sales.documents.list.table.order', 'Order')\n : t('sales.documents.list.table.quote', 'Quote'),\n cell: ({ row }) => (\n <div className=\"flex flex-col\">\n <span className=\"font-semibold\">{row.original.number}</span>\n {row.original.status ? (\n <DictionaryValue\n value={row.original.status}\n map={statusMap}\n fallback={<span className=\"text-xs text-muted-foreground\">{row.original.status}</span>}\n className=\"text-xs text-muted-foreground font-medium\"\n iconWrapperClassName=\"inline-flex h-5 w-5 items-center justify-center rounded bg-muted text-muted-foreground\"\n iconClassName=\"h-3.5 w-3.5\"\n colorClassName=\"h-3 w-3 rounded-full border border-border/70\"\n />\n ) : null}\n </div>\n ),\n meta: { sticky: true },\n },\n {\n accessorKey: 'customerName',\n header: t('sales.documents.list.table.customer', 'Customer'),\n cell: ({ row }) => (\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium\">\n {row.original.customerName ?? t('sales.documents.list.table.noCustomer', 'No customer')}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {row.original.customerEmail ?? t('sales.documents.list.table.noEmail', 'No email')}\n </span>\n </div>\n ),\n enableSorting: false,\n },\n {\n accessorKey: 'channelId',\n header: t('sales.documents.list.table.channel', 'Channel'),\n cell: ({ row }) => {\n const channelId = row.original.channelId\n if (!channelId) return <span className=\"text-xs text-muted-foreground\">{t('sales.documents.list.table.unassigned', 'Unassigned')}</span>\n const channel = channelOptions.find((opt) => opt.value === channelId)\n return (\n <span className=\"text-sm\">{channel?.label ?? channelId}</span>\n )\n },\n enableSorting: false,\n },\n {\n id: 'lineItemCount',\n accessorKey: 'lineItemCount',\n header: t('sales.documents.list.table.items', 'Items'),\n cell: ({ row }) => (\n <span className=\"text-sm font-semibold\">{typeof row.original.lineItemCount === 'number' ? row.original.lineItemCount : '\u2014'}</span>\n ),\n },\n {\n id: 'grandTotalNetAmount',\n accessorKey: 'totalNet',\n header: t('sales.documents.list.table.totalNet', 'Total (net)'),\n cell: ({ row }) => (\n <span className=\"text-sm\">{formatCurrency(row.original.totalNet ?? null, row.original.currency)}</span>\n ),\n },\n {\n id: 'grandTotalGrossAmount',\n accessorKey: 'totalGross',\n header: t('sales.documents.list.table.totalGross', 'Total (gross)'),\n cell: ({ row }) => (\n <span className=\"text-sm\">{formatCurrency(row.original.totalGross ?? null, row.original.currency)}</span>\n ),\n },\n {\n id: 'createdAt',\n accessorKey: 'date',\n header: t('sales.documents.list.table.date', 'Date'),\n cell: ({ row }) =>\n row.original.date\n ? <span className=\"text-xs text-muted-foreground\">{new Date(row.original.date).toLocaleString()}</span>\n : <span className=\"text-xs text-muted-foreground\">\u2014</span>,\n },\n ], [channelOptions, kind, statusMap, t])\n\n const emptyLabel = kind === 'order'\n ? t('sales.documents.list.table.emptyOrders', 'No orders yet.')\n : t('sales.documents.list.table.emptyQuotes', 'No quotes yet.')\n\n return (\n <Page>\n <PageBody>\n <DataTable<SalesDocumentRow>\n title={(\n <div className=\"flex flex-col\">\n <span>{title}</span>\n <span className=\"text-sm font-normal text-muted-foreground\">{subtitle}</span>\n </div>\n )}\n actions={(\n <Button asChild>\n <Link href={`/backend/sales/documents/create?kind=${kind}`}>\n {t('sales.documents.create.title', 'Create sales document')}\n </Link>\n </Button>\n )}\n columns={columns}\n data={rows}\n sorting={sorting}\n onSortingChange={setSorting}\n isLoading={isLoading}\n searchValue={search}\n onSearchChange={handleSearchChange}\n searchPlaceholder={\n kind === 'order'\n ? t('sales.documents.list.search.orders', 'Search orders\u2026')\n : t('sales.documents.list.search.quotes', 'Search quotes\u2026')\n }\n filters={filters}\n filterValues={filterValues}\n onFiltersApply={handleFiltersApply}\n onFiltersClear={handleFiltersClear}\n entityId={entityId}\n exporter={exportConfig}\n pagination={{\n page,\n pageSize: PAGE_SIZE,\n total,\n totalPages,\n onPageChange: setPage,\n cacheStatus,\n }}\n refreshButton={{\n label: t('sales.documents.list.table.refresh', 'Refresh'),\n onRefresh: handleRefresh,\n isRefreshing: isLoading,\n }}\n rowActions={(row) => (\n <RowActions\n items={[\n {\n label: t('sales.documents.list.table.open', 'Open'),\n href: `/backend/sales/${resource}/${row.id}?kind=${kind}`,\n },\n {\n label:\n kind === 'order'\n ? t('sales.documents.list.table.deleteOrder', 'Delete order')\n : t('sales.documents.list.table.deleteQuote', 'Delete quote'),\n onSelect: () => handleDelete(row),\n },\n ]}\n />\n )}\n onRowClick={handleRowClick}\n emptyState={\n <div className=\"py-10 text-center text-sm text-muted-foreground\">\n {emptyLabel}\n </div>\n }\n />\n </PageBody>\n </Page>\n )\n}\n\nexport default SalesDocumentsTable\n"],
5
+ "mappings": ";AAqjBQ,SACE,KADF;AAnjBR,YAAY,WAAW;AACvB,OAAO,UAAU;AACjB,SAAS,iBAAiB;AAE1B,SAAS,MAAM,gBAAgB;AAC/B,SAAS,iBAA6C;AAEtD,SAAS,kBAAkB;AAC3B,SAAS,cAAc;AACvB,SAAS,eAAe;AACxB,SAAS,oBAAoB,kBAAkB;AAC/C,SAAS,aAAa;AACtB,SAAS,mCAAmC;AAC5C,SAAS,YAAY;AACrB,SAAS,SAAS;AAClB;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,OACK;AAyDP,MAAM,YAAY;AAElB,SAAS,oBAAoB,UAA+C,UAA0B;AACpG,MAAI,CAAC,SAAU,QAAO,YAAY;AAClC,QAAM,OAAO,SAAS,UAAU,eAAe;AAC/C,MAAI,KAAM,QAAO;AACjB,QAAM,UAAU,SAAS;AACzB,MAAI,SAAS;AACX,UAAM,QAAQ,CAAC,QAAQ,eAAe,QAAQ,WAAW,QAAQ,QAAQ,EAAE;AAAA,MACzE,CAAC,SAAS,QAAQ,KAAK,KAAK,EAAE;AAAA,IAChC;AACA,QAAI,MAAM,OAAQ,QAAO,MAAM,KAAK,GAAG;AAAA,EACzC;AACA,SAAO,YAAY;AACrB;AAEA,SAAS,qBAAqB,UAA+C;AAC3E,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,SAAS,UAAU,aAAc,QAAO,SAAS,SAAS;AAC9D,SAAO;AACT;AAEA,SAAS,SAAS,OAA+B;AAC/C,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,MAAM,KAAK,IAAI,OAAO;AACnE,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,QAAQ;AACpD,UAAM,SAAS,OAAO,KAAK;AAC3B,WAAO,OAAO,MAAM,MAAM,IAAI,OAAO;AAAA,EACvC;AACA,SAAO;AACT;AAEA,SAAS,eAAe,QAAmC,UAAqC,WAAW,UAAK;AAC9G,MAAI,UAAU,QAAQ,OAAO,MAAM,MAAM,EAAG,QAAO;AACnD,MAAI;AACF,QAAI,YAAY,SAAS,KAAK,EAAE,QAAQ;AACtC,YAAM,YAAY,IAAI,KAAK,aAAa,QAAW,EAAE,OAAO,YAAY,SAAS,CAAC;AAClF,aAAO,UAAU,OAAO,MAAM;AAAA,IAChC;AACA,WAAO,IAAI,KAAK,aAAa,QAAW,EAAE,OAAO,WAAW,uBAAuB,EAAE,CAAC,EAAE,OAAO,MAAM;AAAA,EACvG,QAAQ;AACN,WAAO,OAAO,MAAM;AAAA,EACtB;AACF;AAEA,SAAS,aAAa,UAA0B,MAAsC;AACpF,QAAM,MAAM,oBAAI,IAA0B;AAC1C,WAAS,QAAQ,CAAC,QAAQ,IAAI,IAAI,IAAI,OAAO,GAAG,CAAC;AACjD,OAAK,QAAQ,CAAC,QAAQ,IAAI,IAAI,IAAI,OAAO,GAAG,CAAC;AAC7C,SAAO,MAAM,KAAK,IAAI,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,cAAc,EAAE,KAAK,CAAC;AAC/E;AAEA,SAAS,qBAAqB,OAA+B;AAC3D,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,MAAM,KAAK,IAAI,OAAO;AACnE,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,QAAQ;AACpD,UAAM,SAAS,OAAO,KAAK;AAC3B,WAAO,OAAO,MAAM,MAAM,IAAI,OAAO;AAAA,EACvC;AACA,SAAO;AACT;AAEO,SAAS,oBAAoB,EAAE,KAAK,GAAgC;AACzE,QAAM,IAAI,KAAK;AACf,QAAM,SAAS,UAAU;AACzB,QAAM,eAAe,4BAA4B;AACjD,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAA6B,CAAC,CAAC;AAC7D,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAAS,CAAC;AACxC,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAS,CAAC;AAC1C,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAS,CAAC;AACpD,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAAuB,CAAC,EAAE,IAAI,aAAa,MAAM,KAAK,CAAC,CAAC;AAC5F,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAS,EAAE;AAC7C,QAAM,CAAC,cAAc,eAAe,IAAI,MAAM,SAAuB,CAAC,CAAC;AACvE,QAAM,CAAC,WAAW,UAAU,IAAI,MAAM,SAAS,KAAK;AACpD,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,SAAgC,IAAI;AAChF,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,SAAS,CAAC;AACtD,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,MAAM,SAAyB,CAAC,CAAC;AAC7E,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAyB,CAAC,CAAC;AACrE,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,MAAM,SAAyB,CAAC,CAAC;AAC/E,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAwB,CAAC,CAAC;AAElE,QAAM,WAAW,SAAS,UAAU,WAAW;AAC/C,QAAM,WAAW,SAAS,UAAU,EAAE,MAAM,cAAc,EAAE,MAAM;AAClE,QAAM,QAAQ,SAAS,UACnB,EAAE,oCAAoC,cAAc,IACpD,EAAE,oCAAoC,cAAc;AACxD,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,EACF;AAEA,QAAM,sBAAsB,MAAM,YAAY,OAAO,UAA4C;AAC/F,UAAM,SAAS,IAAI,gBAAgB,EAAE,MAAM,KAAK,UAAU,KAAK,CAAC;AAChE,QAAI,SAAS,MAAM,KAAK,EAAG,QAAO,IAAI,UAAU,MAAM,KAAK,CAAC;AAC5D,QAAI;AACF,YAAM,OAAO,MAAM,QAA+B,uBAAuB,OAAO,SAAS,CAAC,EAAE;AAC5F,UAAI,CAAC,KAAK,GAAI,QAAO,CAAC;AACtB,YAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,IAAI,KAAK,OAAQ,QAAQ,CAAC;AACxE,aAAO,MACJ,IAAI,CAAC,SAAmC;AACvC,cAAM,KAAK,OAAO,MAAM,OAAO,WAAW,KAAK,KAAK;AACpD,cAAM,OAAO,OAAO,MAAM,SAAS,WAAW,KAAK,OAAO;AAC1D,YAAI,CAAC,MAAM,CAAC,KAAM,QAAO;AACzB,eAAO,EAAE,OAAO,IAAI,OAAO,KAAK;AAAA,MAClC,CAAC,EACA,OAAO,CAAC,QAA6B,QAAQ,IAAI;AAAA,IACtD,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,kBAAkB,MAAM,YAAY,OAAO,UAA4C;AAC3F,UAAM,SAAS,IAAI,gBAAgB,EAAE,MAAM,KAAK,UAAU,KAAK,CAAC;AAChE,QAAI,SAAS,MAAM,KAAK,EAAG,QAAO,IAAI,UAAU,MAAM,KAAK,CAAC;AAC5D,QAAI;AACF,YAAM,OAAO,MAAM,QAA+B,mBAAmB,OAAO,SAAS,CAAC,EAAE;AACxF,UAAI,CAAC,KAAK,GAAI,QAAO,CAAC;AACtB,YAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,IAAI,KAAK,OAAQ,QAAQ,CAAC;AACxE,aAAO,MACJ,IAAI,CAAC,SAAmC;AACvC,cAAM,KAAK,OAAO,MAAM,OAAO,WAAW,KAAK,KAAK;AACpD,cAAM,QAAQ,OAAO,MAAM,UAAU,WAAW,KAAK,QAAQ;AAC7D,YAAI,CAAC,MAAM,CAAC,MAAO,QAAO;AAC1B,eAAO,EAAE,OAAO,IAAI,MAAM;AAAA,MAC5B,CAAC,EACA,OAAO,CAAC,QAA6B,QAAQ,IAAI;AAAA,IACtD,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,uBAAuB,MAAM,YAAY,OAAO,UAA4C;AAChG,UAAM,SAAS,IAAI,gBAAgB,EAAE,MAAM,KAAK,UAAU,KAAK,CAAC;AAChE,QAAI,SAAS,MAAM,KAAK,EAAE,OAAQ,QAAO,IAAI,UAAU,MAAM,KAAK,CAAC;AACnE,QAAI;AACF,YAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC5C,QAA+B,yBAAyB,OAAO,SAAS,CAAC,EAAE;AAAA,QAC3E,QAA+B,4BAA4B,OAAO,SAAS,CAAC,EAAE;AAAA,MAChF,CAAC;AACD,YAAM,cAAc,MAAM,QAAQ,OAAO,QAAQ,KAAK,IAAI,OAAO,QAAQ,SAAS,CAAC,IAAI,CAAC;AACxF,YAAM,eAAe,MAAM,QAAQ,UAAU,QAAQ,KAAK,IAAI,UAAU,QAAQ,SAAS,CAAC,IAAI,CAAC;AAC/F,YAAM,cAAc,CAAC,MAAWA,UAAoD;AAClF,cAAM,KAAK,OAAO,MAAM,OAAO,WAAW,KAAK,KAAK;AACpD,YAAI,CAAC,GAAI,QAAO;AAChB,cAAM,OACJ,OAAO,MAAM,iBAAiB,YAAY,KAAK,aAAa,KAAK,EAAE,SAC/D,KAAK,eACL,OAAO,MAAM,SAAS,YAAY,KAAK,KAAK,KAAK,EAAE,SACjD,KAAK,OACL;AACR,cAAM,QACJ,OAAO,MAAM,kBAAkB,YAAY,KAAK,cAAc,KAAK,EAAE,SACjE,KAAK,cAAc,KAAK,IACxB;AACN,cAAM,QAAQ,QAAQ,GAAG,IAAI,KAAK,KAAK,MAAM;AAC7C,eAAO,EAAE,OAAO,IAAI,OAAOA,UAAS,YAAY,QAAQ,MAAM;AAAA,MAChE;AACA,YAAM,UAAU,CAAC,GAAG,YAAY,IAAI,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,GAAG,aAAa,IAAI,CAAC,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,EACxH,OAAO,CAAC,QAA6B,CAAC,CAAC,GAAG;AAC7C,aAAO;AAAA,IACT,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgB,MAAM,YAAY,YAAY;AAClD,QAAI;AACF,YAAM,SAAS,IAAI,gBAAgB,EAAE,MAAM,KAAK,UAAU,MAAM,CAAC;AACjE,YAAM,WAAW,MAAM;AAAA,QACrB,6BAA6B,OAAO,SAAS,CAAC;AAAA,QAC9C;AAAA,QACA,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE;AAAA,MAC5B;AACA,YAAM,UAAU,2BAA2B,SAAS,QAAQ,SAAS,CAAC,CAAC;AACvE,mBAAa,oBAAoB,OAAO,CAAC;AAAA,IAC3C,SAAS,KAAK;AACZ,cAAQ,MAAM,iCAAiC,GAAG;AAClD,mBAAa,CAAC,CAAC;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAqB,MAAM;AAAA,IAC/B,OAAO,UAAmB;AACxB,YAAM,OAAO,MAAM,oBAAoB,KAAK;AAC5C,UAAI,KAAK,OAAQ,mBAAkB,CAAC,SAAS,aAAa,MAAM,IAAI,CAAC;AACrE,aAAO;AAAA,IACT;AAAA,IACA,CAAC,mBAAmB;AAAA,EACtB;AAEA,QAAM,iBAAiB,MAAM;AAAA,IAC3B,OAAO,UAAmB;AACxB,YAAM,OAAO,MAAM,gBAAgB,KAAK;AACxC,UAAI,KAAK,OAAQ,eAAc,CAAC,SAAS,aAAa,MAAM,IAAI,CAAC;AACjE,aAAO;AAAA,IACT;AAAA,IACA,CAAC,eAAe;AAAA,EAClB;AAEA,QAAM,sBAAsB,MAAM;AAAA,IAChC,OAAO,UAAmB;AACxB,YAAM,OAAO,MAAM,qBAAqB,KAAK;AAC7C,UAAI,KAAK,OAAQ,oBAAmB,CAAC,SAAS,aAAa,MAAM,IAAI,CAAC;AACtE,aAAO;AAAA,IACT;AAAA,IACA,CAAC,oBAAoB;AAAA,EACvB;AAEA,QAAM,UAAU,MAAM;AACpB,uBAAmB,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACnC,mBAAe,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAC/B,wBAAoB,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACpC,kBAAc,EAAE,MAAM,MAAM,aAAa,CAAC,CAAC,CAAC;AAAA,EAC9C,GAAG,CAAC,oBAAoB,qBAAqB,eAAe,gBAAgB,YAAY,CAAC;AAEzF,QAAM,UAAU,MAAM,QAAqB,MAAM;AAAA,IAC/C;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,wCAAwC,SAAS;AAAA,MAC1D,MAAM;AAAA,MACN,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,qCAAqC,MAAM;AAAA,MACpD,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,yCAAyC,WAAW;AAAA,MAC7D,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,yCAAyC,WAAW;AAAA,MAC7D,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,4CAA4C,iBAAiB;AAAA,MACtE,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,4CAA4C,iBAAiB;AAAA,MACtE,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,8CAA8C,mBAAmB;AAAA,MAC1E,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,8CAA8C,mBAAmB;AAAA,MAC1E,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,yCAAyC,UAAU;AAAA,MAC5D,MAAM;AAAA,MACN,SAAS;AAAA,MACT,aAAa;AAAA,MACb,aAAa,EAAE,oDAAoD,kBAAkB;AAAA,MACrF,aAAa,CAAC,QAAgB;AAC5B,cAAM,QAAQ,gBAAgB,KAAK,CAAC,QAAQ,IAAI,UAAU,GAAG;AAC7D,eAAO,OAAO,SAAS;AAAA,MACzB;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,qCAAqC,MAAM;AAAA,MACpD,MAAM;AAAA,MACN,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,EACF,GAAG,CAAC,gBAAgB,oBAAoB,gBAAgB,YAAY,CAAC,CAAC;AAEtE,QAAM,cAAc,MAAM,QAAQ,MAAM;AACtC,UAAM,SAAS,IAAI,gBAAgB;AACnC,WAAO,IAAI,QAAQ,OAAO,IAAI,CAAC;AAC/B,WAAO,IAAI,YAAY,OAAO,SAAS,CAAC;AACxC,QAAI,OAAO,KAAK,EAAG,QAAO,IAAI,UAAU,OAAO,KAAK,CAAC;AACrD,UAAM,OAAO,QAAQ,CAAC;AACtB,QAAI,MAAM,IAAI;AACZ,aAAO,IAAI,aAAa,KAAK,EAAE;AAC/B,aAAO,IAAI,WAAW,KAAK,OAAO,SAAS,KAAK;AAAA,IAClD;AACA,UAAM,YAAY,OAAO,aAAa,cAAc,WAAW,aAAa,YAAY;AACxF,QAAI,UAAW,QAAO,IAAI,aAAa,SAAS;AAChD,UAAM,cAAc,MAAM,QAAQ,aAAa,UAAU,IACrD,aAAa,WACV,IAAI,CAAC,UAAW,OAAO,UAAU,WAAW,MAAM,KAAK,IAAI,OAAO,SAAS,EAAE,EAAE,KAAK,CAAE,EACtF,OAAO,CAAC,UAAU,MAAM,SAAS,CAAC,IACrC,CAAC;AACL,QAAI,YAAY,SAAS,GAAG;AAC1B,aAAO,IAAI,cAAc,YAAY,CAAC,CAAC;AAAA,IACzC;AACA,UAAM,OAAO,aAAa;AAC1B,QAAI,QAAQ,OAAO,SAAS,UAAU;AACpC,UAAI,KAAK,KAAM,QAAO,IAAI,YAAY,KAAK,IAAI;AAC/C,UAAI,KAAK,GAAI,QAAO,IAAI,UAAU,KAAK,EAAE;AAAA,IAC3C;AACA,UAAM,gBAAqD;AAAA,MACzD,CAAC,oBAAoB,kBAAkB;AAAA,MACvC,CAAC,oBAAoB,kBAAkB;AAAA,MACvC,CAAC,eAAe,aAAa;AAAA,MAC7B,CAAC,eAAe,aAAa;AAAA,MAC7B,CAAC,iBAAiB,eAAe;AAAA,MACjC,CAAC,iBAAiB,eAAe;AAAA,IACnC;AACA,kBAAc,QAAQ,CAAC,CAAC,KAAK,QAAQ,MAAM;AACzC,YAAM,QAAQ,qBAAsB,aAAqB,GAAG,CAAC;AAC7D,UAAI,SAAS,KAAM,QAAO,IAAI,UAAU,OAAO,KAAK,CAAC;AAAA,IACvD,CAAC;AACD,UAAM,SAAS,MAAM,QAAQ,aAAa,MAAM,IAC5C,aAAa,OAAO,IAAI,CAAC,UAAW,OAAO,UAAU,WAAW,MAAM,KAAK,IAAI,OAAO,SAAS,EAAE,EAAE,KAAK,CAAE,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,IACtI,CAAC;AACL,QAAI,OAAO,SAAS,GAAG;AACrB,aAAO,IAAI,UAAU,OAAO,KAAK,GAAG,CAAC;AAAA,IACvC;AACA,WAAO,QAAQ,YAAY,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACrD,UAAI,CAAC,IAAI,WAAW,KAAK,KAAK,SAAS,KAAM;AAC7C,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,cAAM,aAAa,MAChB,IAAI,CAAC,SAAS;AACb,cAAI,QAAQ,KAAM,QAAO;AACzB,cAAI,OAAO,SAAS,SAAU,QAAO,KAAK,KAAK;AAC/C,iBAAO,OAAO,IAAI,EAAE,KAAK;AAAA,QAC3B,CAAC,EACA,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AACnC,YAAI,WAAW,OAAQ,QAAO,IAAI,KAAK,WAAW,KAAK,GAAG,CAAC;AAAA,MAC7D,WAAW,OAAO,UAAU,UAAU;AACpC;AAAA,MACF,WAAW,UAAU,IAAI;AACvB,cAAM,cAAc,OAAO,UAAU,WAAW,MAAM,KAAK,IAAI,OAAO,KAAK;AAC3E,YAAI,YAAa,QAAO,IAAI,KAAK,WAAW;AAAA,MAC9C;AAAA,IACF,CAAC;AACD,WAAO,OAAO,SAAS;AAAA,EACzB,GAAG,CAAC,cAAc,MAAM,QAAQ,OAAO,CAAC;AAExC,QAAM,gBAAgB,MAAM,QAAQ,MAAM,OAAO,YAAY,IAAI,gBAAgB,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC;AAE7G,QAAM,eAAe,MAAM,QAAQ,OAAO;AAAA,IACxC,MAAM;AAAA,MACJ,QAAQ,CAAC,WACP,mBAAmB,SAAS,QAAQ,IAAI,EAAE,GAAG,eAAe,aAAa,OAAO,GAAG,MAAM;AAAA,IAC7F;AAAA,IACA,MAAM;AAAA,MACJ,QAAQ,CAAC,WACP,mBAAmB,SAAS,QAAQ,IAAI,EAAE,GAAG,eAAe,aAAa,QAAQ,KAAK,OAAO,GAAG,MAAM;AAAA,IAC1G;AAAA,EACF,IAAI,CAAC,eAAe,QAAQ,CAAC;AAE7B,QAAM,iBAAiB,MAAM;AAAA,IAC3B,CAAC,SAAoD;AACnD,YAAM,MAAM;AACZ,YAAM,KAAK,OAAO,IAAI,OAAO,WAAW,IAAI,KAAK;AACjD,YAAM,SAAS,SAAS,UACpB,IAAI,eAAgB,MAAc,gBAAgB,KAClD,IAAI,eAAgB,MAAc,gBAAgB;AACtD,YAAM,mBAAoB,IAAI,oBAAoB;AAClD,YAAM,eAAe,oBAAoB,kBAAkB,IAAI,oBAAoB,IAAI;AACvF,YAAM,gBAAgB,qBAAqB,gBAAgB;AAC3D,YAAM,WAAW,SAAS,IAAI,mBAAmB;AACjD,YAAM,aAAa,SAAS,IAAI,qBAAqB;AACrD,YAAM,WAAW,IAAI,YAAY;AACjC,YAAM,aAAa,IAAI,cAAc;AACrC,YAAM,YAAY,IAAI,aAAa;AACnC,YAAM,OAAO,YAAY,cAAc,aAAa;AACpD,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,QAAQ,IAAI,UAAU;AAAA,QACtB;AAAA,QACA;AAAA,QACA,WAAW,IAAI,aAAa;AAAA,QAC5B,eAAe,IAAI,iBAAiB;AAAA,QACpC;AAAA,QACA;AAAA,QACA,UAAU,IAAI,gBAAgB;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,IAAI;AAAA,EACP;AAEA,QAAM,gBAAgB,MAAM,YAAY,YAAY;AAClD,eAAW,IAAI;AACf,mBAAe,IAAI;AACnB,QAAI;AACF,YAAM,OAAO,MAAM,QAA2B,cAAc,QAAQ,IAAI,WAAW,EAAE;AACrF,UAAI,CAAC,KAAK,IAAI;AACZ,cAAM,EAAE,oCAAoC,2BAA2B,GAAG,OAAO;AACjF,gBAAQ,CAAC,CAAC;AACV,iBAAS,CAAC;AACV,sBAAc,CAAC;AACf;AAAA,MACF;AACA,YAAM,UAAU,KAAK,UAAU,CAAC;AAChC,YAAM,QAAQ,MAAM,QAAQ,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC;AAC9D,cAAQ,MAAM,IAAI,CAAC,SAAS,eAAe,IAAI,CAAC,CAAC;AACjD,YAAM,QAAQ,OAAO,QAAQ,UAAU,WAAW,QAAQ,QAAQ,MAAM;AACxE,eAAS,KAAK;AACd,YAAM,QAAQ,OAAO,QAAQ,eAAe,WACxC,QAAQ,aACR,KAAK,IAAI,GAAG,KAAK,KAAK,QAAQ,SAAS,CAAC;AAC5C,oBAAc,KAAK;AACnB,qBAAe,KAAK,eAAe,IAAI;AAAA,IACzC,SAAS,KAAK;AACZ,cAAQ,MAAM,wBAAwB,GAAG;AACzC,YAAM,EAAE,oCAAoC,2BAA2B,GAAG,OAAO;AAAA,IACnF,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,gBAAgB,aAAa,UAAU,CAAC,CAAC;AAE7C,QAAM,UAAU,MAAM;AACpB,SAAK,cAAc;AAAA,EACrB,GAAG,CAAC,eAAe,aAAa,YAAY,CAAC;AAE7C,QAAM,qBAAqB,MAAM,YAAY,CAAC,WAAyB;AACrE,oBAAgB,MAAM;AACtB,YAAQ,CAAC;AAAA,EACX,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAqB,MAAM,YAAY,MAAM;AACjD,oBAAgB,CAAC,CAAC;AAClB,YAAQ,CAAC;AAAA,EACX,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAqB,MAAM,YAAY,CAAC,UAAkB;AAC9D,cAAU,KAAK;AACf,YAAQ,CAAC;AAAA,EACX,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgB,MAAM,YAAY,MAAM;AAC5C,mBAAe,CAAC,UAAU,QAAQ,CAAC;AAAA,EACrC,GAAG,CAAC,CAAC;AAEL,QAAM,eAAe,MAAM;AAAA,IACzB,OAAO,QAA0B;AAC/B,YAAM,iBACJ,SAAS,UACL;AAAA,QACE;AAAA,QACA;AAAA,MACF,IACA;AAAA,QACE;AAAA,QACA;AAAA,MACF;AACN,UAAI,OAAO,WAAW,eAAe,CAAC,OAAO,QAAQ,cAAc,EAAG;AACtE,UAAI;AACF,cAAM,SAAS,MAAM,WAAW,SAAS,QAAQ,IAAI,IAAI,IAAI;AAAA,UAC3D,cAAc,EAAE,0CAA0C,4BAA4B;AAAA,QACxF,CAAC;AACD,YAAI,OAAO,IAAI;AACb;AAAA,YACE,SAAS,UACL,EAAE,2CAA2C,sBAAsB,IACnE,EAAE,2CAA2C,sBAAsB;AAAA,YACvE;AAAA,UACF;AACA,wBAAc;AAAA,QAChB;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ,MAAM,0BAA0B,GAAG;AAC3C,cAAM,EAAE,0CAA0C,4BAA4B,GAAG,OAAO;AAAA,MAC1F;AAAA,IACF;AAAA,IACA,CAAC,eAAe,MAAM,UAAU,CAAC;AAAA,EACnC;AAEA,QAAM,iBAAiB,MAAM,YAAY,CAAC,QAA0B;AAClE,WAAO,KAAK,kBAAkB,QAAQ,IAAI,IAAI,EAAE,SAAS,IAAI,EAAE;AAAA,EACjE,GAAG,CAAC,MAAM,UAAU,MAAM,CAAC;AAE3B,QAAM,UAAU,MAAM,QAAuC,MAAM;AAAA,IACjE;AAAA,MACE,IAAI;AAAA,MACJ,aAAa;AAAA,MACb,QAAQ,SAAS,UACb,EAAE,oCAAoC,OAAO,IAC7C,EAAE,oCAAoC,OAAO;AAAA,MACjD,MAAM,CAAC,EAAE,IAAI,MACX,qBAAC,SAAI,WAAU,iBACb;AAAA,4BAAC,UAAK,WAAU,iBAAiB,cAAI,SAAS,QAAO;AAAA,QACpD,IAAI,SAAS,SACZ;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,IAAI,SAAS;AAAA,YACpB,KAAK;AAAA,YACL,UAAU,oBAAC,UAAK,WAAU,iCAAiC,cAAI,SAAS,QAAO;AAAA,YAC/E,WAAU;AAAA,YACV,sBAAqB;AAAA,YACrB,eAAc;AAAA,YACd,gBAAe;AAAA;AAAA,QACjB,IACE;AAAA,SACN;AAAA,MAEF,MAAM,EAAE,QAAQ,KAAK;AAAA,IACvB;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,QAAQ,EAAE,uCAAuC,UAAU;AAAA,MAC3D,MAAM,CAAC,EAAE,IAAI,MACX,qBAAC,SAAI,WAAU,iBACb;AAAA,4BAAC,UAAK,WAAU,uBACb,cAAI,SAAS,gBAAgB,EAAE,yCAAyC,aAAa,GACxF;AAAA,QACA,oBAAC,UAAK,WAAU,iCACb,cAAI,SAAS,iBAAiB,EAAE,sCAAsC,UAAU,GACnF;AAAA,SACF;AAAA,MAEF,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,QAAQ,EAAE,sCAAsC,SAAS;AAAA,MACzD,MAAM,CAAC,EAAE,IAAI,MAAM;AACjB,cAAM,YAAY,IAAI,SAAS;AAC/B,YAAI,CAAC,UAAW,QAAO,oBAAC,UAAK,WAAU,iCAAiC,YAAE,yCAAyC,YAAY,GAAE;AACjI,cAAM,UAAU,eAAe,KAAK,CAAC,QAAQ,IAAI,UAAU,SAAS;AACpE,eACE,oBAAC,UAAK,WAAU,WAAW,mBAAS,SAAS,WAAU;AAAA,MAE3D;AAAA,MACA,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,aAAa;AAAA,MACb,QAAQ,EAAE,oCAAoC,OAAO;AAAA,MACrD,MAAM,CAAC,EAAE,IAAI,MACX,oBAAC,UAAK,WAAU,yBAAyB,iBAAO,IAAI,SAAS,kBAAkB,WAAW,IAAI,SAAS,gBAAgB,UAAI;AAAA,IAE/H;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,aAAa;AAAA,MACb,QAAQ,EAAE,uCAAuC,aAAa;AAAA,MAC9D,MAAM,CAAC,EAAE,IAAI,MACX,oBAAC,UAAK,WAAU,WAAW,yBAAe,IAAI,SAAS,YAAY,MAAM,IAAI,SAAS,QAAQ,GAAE;AAAA,IAEpG;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,aAAa;AAAA,MACb,QAAQ,EAAE,yCAAyC,eAAe;AAAA,MAClE,MAAM,CAAC,EAAE,IAAI,MACX,oBAAC,UAAK,WAAU,WAAW,yBAAe,IAAI,SAAS,cAAc,MAAM,IAAI,SAAS,QAAQ,GAAE;AAAA,IAEtG;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,aAAa;AAAA,MACb,QAAQ,EAAE,mCAAmC,MAAM;AAAA,MACnD,MAAM,CAAC,EAAE,IAAI,MACX,IAAI,SAAS,OACT,oBAAC,UAAK,WAAU,iCAAiC,cAAI,KAAK,IAAI,SAAS,IAAI,EAAE,eAAe,GAAE,IAC9F,oBAAC,UAAK,WAAU,iCAAgC,oBAAC;AAAA,IACzD;AAAA,EACF,GAAG,CAAC,gBAAgB,MAAM,WAAW,CAAC,CAAC;AAEvC,QAAM,aAAa,SAAS,UACxB,EAAE,0CAA0C,gBAAgB,IAC5D,EAAE,0CAA0C,gBAAgB;AAEhE,SACE,oBAAC,QACC,8BAAC,YACC;AAAA,IAAC;AAAA;AAAA,MACC,OACE,qBAAC,SAAI,WAAU,iBACb;AAAA,4BAAC,UAAM,iBAAM;AAAA,QACb,oBAAC,UAAK,WAAU,6CAA6C,oBAAS;AAAA,SACxE;AAAA,MAEF,SACE,oBAAC,UAAO,SAAO,MACb,8BAAC,QAAK,MAAM,wCAAwC,IAAI,IACrD,YAAE,gCAAgC,uBAAuB,GAC5D,GACF;AAAA,MAEF;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,MACA,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,mBACE,SAAS,UACL,EAAE,sCAAsC,qBAAgB,IACxD,EAAE,sCAAsC,qBAAgB;AAAA,MAE9D;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB;AAAA,MACA,UAAU;AAAA,MACV,YAAY;AAAA,QACV;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA,cAAc;AAAA,QACd;AAAA,MACF;AAAA,MACA,eAAe;AAAA,QACb,OAAO,EAAE,sCAAsC,SAAS;AAAA,QACxD,WAAW;AAAA,QACX,cAAc;AAAA,MAChB;AAAA,MACA,YAAY,CAAC,QACX;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL;AAAA,cACE,OAAO,EAAE,mCAAmC,MAAM;AAAA,cAClD,MAAM,kBAAkB,QAAQ,IAAI,IAAI,EAAE,SAAS,IAAI;AAAA,YACzD;AAAA,YACA;AAAA,cACE,OACE,SAAS,UACL,EAAE,0CAA0C,cAAc,IAC1D,EAAE,0CAA0C,cAAc;AAAA,cAChE,UAAU,MAAM,aAAa,GAAG;AAAA,YAClC;AAAA,UACF;AAAA;AAAA,MACF;AAAA,MAEF,YAAY;AAAA,MACZ,YACE,oBAAC,SAAI,WAAU,mDACZ,sBACH;AAAA;AAAA,EAEJ,GACF,GACF;AAEJ;AAEA,IAAO,8BAAQ;",
6
6
  "names": ["kind"]
7
7
  }
@@ -341,7 +341,7 @@ function StaffTeamMembersPage() {
341
341
  { id: "edit", label: labels.actions.edit, onSelect: () => {
342
342
  router.push(`/backend/staff/team-members/${row.id}`);
343
343
  } },
344
- { id: "delete", label: labels.actions.delete, destructive: true, onSelect: () => {
344
+ { label: labels.actions.delete, destructive: true, onSelect: () => {
345
345
  void handleDelete(row);
346
346
  } }
347
347
  ]
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/modules/staff/backend/staff/team-members/page.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { usePathname, useRouter, useSearchParams } from 'next/navigation'\nimport type { ColumnDef, SortingFn, SortingState } from '@tanstack/react-table'\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 { BooleanIcon } from '@open-mercato/ui/backend/ValueIcons'\nimport { readApiResultOrThrow, apiCall } 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 type { FilterDef, FilterValues } from '@open-mercato/ui/backend/FilterBar'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Pencil } from 'lucide-react'\n\nconst PAGE_SIZE = 50\n\ntype TeamMemberRow = {\n kind: 'team' | 'member'\n id: string\n teamId: string | null\n teamName: string | null\n roleLabel: string | null\n displayName: string\n description: string | null\n userEmail: string | null\n roleNames: string[]\n tags: string[]\n isActive: boolean\n updatedAt: string | null\n}\n\ntype TeamMembersResponse = {\n items?: Array<Record<string, unknown>>\n total?: number\n totalPages?: number\n}\n\ntype TeamsResponse = {\n items?: Array<{ id?: string; name?: string }>\n}\n\ntype TeamRolesResponse = {\n items?: Array<{ id?: string; name?: string; team?: { name?: string } | null }>\n}\n\nexport default function StaffTeamMembersPage() {\n const t = useT()\n const router = useRouter()\n const pathname = usePathname()\n const scopeVersion = useOrganizationScopeVersion()\n const searchParams = useSearchParams()\n const [rows, setRows] = React.useState<TeamMemberRow[]>([])\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: 'displayName', desc: false }])\n const [search, setSearch] = React.useState('')\n const [isLoading, setIsLoading] = React.useState(true)\n const [reloadToken, setReloadToken] = React.useState(0)\n const [filterValues, setFilterValues] = React.useState<FilterValues>({})\n const [teamFilterOptions, setTeamFilterOptions] = React.useState<Array<{ value: string; label: string }>>([])\n const [roleFilterOptions, setRoleFilterOptions] = React.useState<Array<{ value: string; label: string }>>([])\n const teamFilterParam = searchParams?.get('teamId')\n const roleFilterParam = searchParams?.get('roleId')\n const resolvedTeamId = typeof filterValues.teamId === 'string' && filterValues.teamId.length\n ? filterValues.teamId\n : teamFilterParam\n\n React.useEffect(() => {\n setPage(1)\n }, [teamFilterParam, roleFilterParam])\n\n React.useEffect(() => {\n if (!teamFilterParam) return\n setFilterValues((prev) => {\n if (prev.teamId === teamFilterParam) return prev\n if (typeof prev.teamId === 'string' && prev.teamId.length > 0) return prev\n return { ...prev, teamId: teamFilterParam }\n })\n }, [teamFilterParam])\n\n React.useEffect(() => {\n if (!roleFilterParam) return\n setFilterValues((prev) => {\n if (prev.roleId === roleFilterParam) return prev\n if (typeof prev.roleId === 'string' && prev.roleId.length > 0) return prev\n return { ...prev, roleId: roleFilterParam }\n })\n }, [roleFilterParam])\n\n const labels = React.useMemo(() => ({\n title: t('staff.teamMembers.page.title', 'Team members'),\n description: t('staff.teamMembers.page.description', 'Manage employees and their team assignments.'),\n table: {\n name: t('staff.teamMembers.table.name', 'Name'),\n user: t('staff.teamMembers.table.user', 'User'),\n roles: t('staff.teamMembers.table.roles', 'Roles'),\n tags: t('staff.teamMembers.table.tags', 'Tags'),\n active: t('staff.teamMembers.table.active', 'Active'),\n updatedAt: t('staff.teamMembers.table.updatedAt', 'Updated'),\n empty: t('staff.teamMembers.table.empty', 'No team members yet.'),\n search: t('staff.teamMembers.table.search', 'Search team members...'),\n },\n groups: {\n unassignedTeam: t('staff.teamMembers.group.unassignedTeam', 'Unassigned team'),\n unassignedRole: t('staff.teamMembers.group.unassignedRole', 'Unassigned role'),\n multipleRoles: t('staff.teamMembers.group.multipleRoles', 'Multiple roles'),\n },\n filters: {\n team: t('staff.teamMembers.filters.team', 'Team'),\n role: t('staff.teamMembers.filters.role', 'Role'),\n },\n actions: {\n add: t('staff.teamMembers.actions.add', 'Add team member'),\n edit: t('staff.teamMembers.actions.edit', 'Edit'),\n delete: t('staff.teamMembers.actions.delete', 'Delete'),\n deleteConfirm: t('staff.teamMembers.actions.deleteConfirm', 'Delete team member \"{{name}}\"?'),\n refresh: t('staff.teamMembers.actions.refresh', 'Refresh'),\n editTeam: t('staff.teams.actions.edit', 'Edit'),\n },\n messages: {\n deleted: t('staff.teamMembers.messages.deleted', 'Team member deleted.'),\n },\n errors: {\n load: t('staff.teamMembers.errors.load', 'Failed to load team members.'),\n delete: t('staff.teamMembers.errors.delete', 'Failed to delete team member.'),\n },\n }), [t])\n\n const groupedSortingFn = React.useCallback((field: GroupedSortField): SortingFn<TeamMemberRow> => {\n return (rowA, rowB) => compareGroupedRows(field, labels.groups, rowA.original, rowB.original)\n }, [labels.groups])\n\n const columns = React.useMemo<ColumnDef<TeamMemberRow>[]>(() => [\n {\n accessorKey: 'displayName',\n header: labels.table.name,\n meta: { priority: 1, sticky: true },\n sortingFn: groupedSortingFn('displayName'),\n cell: ({ row }) => (\n row.original.kind === 'team'\n ? (\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2\">\n {row.original.teamId ? <TeamsIcon className=\"h-4 w-4 text-muted-foreground\" /> : null}\n <span className=\"font-semibold\">{row.original.displayName}</span>\n </div>\n {row.original.teamId ? (\n <Button\n asChild\n size=\"icon\"\n variant=\"ghost\"\n className=\"h-7 w-7\"\n title={labels.actions.editTeam}\n aria-label={labels.actions.editTeam}\n >\n <Link href={`/backend/staff/teams/${encodeURIComponent(row.original.teamId)}/edit`}>\n <Pencil className=\"h-4 w-4\" />\n </Link>\n </Button>\n ) : null}\n </div>\n )\n : (\n <div className=\"flex flex-col\">\n <span className=\"font-medium pl-6\">{row.original.displayName}</span>\n {row.original.description ? (\n <span className=\"text-xs text-muted-foreground line-clamp-2 pl-6\">{row.original.description}</span>\n ) : null}\n </div>\n )\n ),\n },\n {\n accessorKey: 'userEmail',\n header: labels.table.user,\n meta: { priority: 2 },\n sortingFn: groupedSortingFn('userEmail'),\n cell: ({ row }) => row.original.kind === 'member' && row.original.userEmail\n ? <span className=\"text-sm\">{row.original.userEmail}</span>\n : <span className=\"text-xs text-muted-foreground\">-</span>,\n },\n {\n accessorKey: 'roleNames',\n header: labels.table.roles,\n meta: { priority: 3 },\n sortingFn: groupedSortingFn('roleNames'),\n cell: ({ row }) => row.original.kind === 'member'\n ? renderLabelPills(row.original.roleNames)\n : <span className=\"text-xs text-muted-foreground\">-</span>,\n },\n {\n accessorKey: 'tags',\n header: labels.table.tags,\n meta: { priority: 4 },\n sortingFn: groupedSortingFn('tags'),\n cell: ({ row }) => row.original.kind === 'member'\n ? renderLabelPills(row.original.tags)\n : <span className=\"text-xs text-muted-foreground\">-</span>,\n },\n {\n accessorKey: 'isActive',\n header: labels.table.active,\n meta: { priority: 5 },\n sortingFn: groupedSortingFn('isActive'),\n cell: ({ row }) => row.original.kind === 'member'\n ? <BooleanIcon value={row.original.isActive} />\n : <span className=\"text-xs text-muted-foreground\">-</span>,\n },\n {\n accessorKey: 'updatedAt',\n header: labels.table.updatedAt,\n meta: { priority: 6 },\n sortingFn: groupedSortingFn('updatedAt'),\n cell: ({ row }) => row.original.kind === 'member' && 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 ], [groupedSortingFn, labels.table.active, labels.table.name, labels.table.roles, labels.table.tags, labels.table.updatedAt, labels.table.user])\n\n const loadTeamMembers = 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 if (resolvedTeamId) params.set('teamId', String(resolvedTeamId))\n if (filterValues.roleId) params.set('roleId', String(filterValues.roleId))\n const payload = await readApiResultOrThrow<TeamMembersResponse>(\n `/api/staff/team-members?${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 const mappedItems = items.map(mapApiTeamMember)\n const roleFilterId = typeof filterValues.roleId === 'string' ? filterValues.roleId : null\n const filteredItems = roleFilterId\n ? mappedItems.filter((member) => member.roleIds.includes(roleFilterId))\n : mappedItems\n const roleFilterApplied = roleFilterId != null && filteredItems.length !== mappedItems.length\n setRows(buildTeamMemberRows(filteredItems, labels.groups))\n const resolvedTotal = roleFilterApplied\n ? filteredItems.length\n : typeof payload.total === 'number'\n ? payload.total\n : items.length\n setTotal(resolvedTotal)\n setTotalPages(roleFilterApplied\n ? 1\n : typeof payload.totalPages === 'number'\n ? payload.totalPages\n : Math.max(1, Math.ceil(items.length / PAGE_SIZE)))\n } catch (error) {\n console.error('staff.team-members.list', error)\n flash(labels.errors.load, 'error')\n } finally {\n setIsLoading(false)\n }\n }, [filterValues.roleId, labels.errors.load, labels.groups, page, resolvedTeamId, search, sorting])\n\n React.useEffect(() => {\n void loadTeamMembers()\n }, [loadTeamMembers, scopeVersion, reloadToken])\n\n React.useEffect(() => {\n let cancelled = false\n async function loadFilters() {\n try {\n const teamParams = new URLSearchParams({ page: '1', pageSize: '100' })\n const roleParams = new URLSearchParams({ page: '1', pageSize: '100' })\n const [teamsCall, rolesCall] = await Promise.all([\n apiCall<TeamsResponse>(`/api/staff/teams?${teamParams.toString()}`),\n apiCall<TeamRolesResponse>(`/api/staff/team-roles?${roleParams.toString()}`),\n ])\n const teamItems = Array.isArray(teamsCall.result?.items) ? teamsCall.result.items : []\n const roleItems = Array.isArray(rolesCall.result?.items) ? rolesCall.result.items : []\n const teams = teamItems\n .map((team) => {\n const id = typeof team.id === 'string' ? team.id : null\n const name = typeof team.name === 'string' ? team.name : null\n if (!id || !name) return null\n return { value: id, label: name }\n })\n .filter((entry): entry is { value: string; label: string } => entry !== null)\n const roles = roleItems\n .map((role) => {\n const id = typeof role.id === 'string' ? role.id : null\n const name = typeof role.name === 'string' ? role.name : null\n const teamName = role.team && typeof role.team === 'object' && typeof role.team.name === 'string'\n ? role.team.name\n : labels.groups.unassignedTeam\n if (!id || !name) return null\n return { value: id, label: `${teamName} - ${name}` }\n })\n .filter((entry): entry is { value: string; label: string } => entry !== null)\n if (!cancelled) {\n setTeamFilterOptions(teams)\n setRoleFilterOptions(roles)\n }\n } catch {\n if (!cancelled) {\n setTeamFilterOptions([])\n setRoleFilterOptions([])\n }\n }\n }\n loadFilters()\n return () => { cancelled = true }\n }, [scopeVersion])\n\n const filters = React.useMemo<FilterDef[]>(() => [\n {\n id: 'teamId',\n label: labels.filters.team,\n type: 'select',\n options: teamFilterOptions,\n placeholder: labels.filters.team,\n },\n {\n id: 'roleId',\n label: labels.filters.role,\n type: 'select',\n options: roleFilterOptions,\n placeholder: labels.filters.role,\n },\n ], [labels.filters.role, labels.filters.team, roleFilterOptions, teamFilterOptions])\n\n const handleSearchChange = React.useCallback((value: string) => {\n setSearch(value)\n setPage(1)\n }, [pathname, router, searchParams])\n\n const handleFiltersApply = React.useCallback((values: FilterValues) => {\n setFilterValues(values)\n setPage(1)\n\n const params = new URLSearchParams(searchParams?.toString())\n const hasTeamId = typeof values.teamId === 'string' && values.teamId.length > 0\n if (!hasTeamId && params.has('teamId')) {\n params.delete('teamId')\n }\n const hasRoleId = typeof values.roleId === 'string' && values.roleId.length > 0\n if (!hasRoleId && params.has('roleId')) {\n params.delete('roleId')\n }\n const query = params.toString()\n router.replace(query ? `${pathname}?${query}` : pathname)\n }, [pathname, router, searchParams])\n\n const handleFiltersClear = React.useCallback(() => {\n setFilterValues({})\n setPage(1)\n\n const params = new URLSearchParams(searchParams?.toString())\n if (params.has('teamId')) {\n params.delete('teamId')\n }\n if (params.has('roleId')) {\n params.delete('roleId')\n }\n const query = params.toString()\n router.replace(query ? `${pathname}?${query}` : pathname)\n }, [])\n\n const handleRefresh = React.useCallback(() => {\n setReloadToken((token) => token + 1)\n }, [])\n\n const handleDelete = React.useCallback(async (entry: TeamMemberRow) => {\n if (entry.kind !== 'member') return\n const message = labels.actions.deleteConfirm.replace('{{name}}', entry.displayName)\n if (typeof window !== 'undefined' && !window.confirm(message)) return\n try {\n await deleteCrud('staff/team-members', entry.id, { errorMessage: labels.errors.delete })\n flash(labels.messages.deleted, 'success')\n handleRefresh()\n } catch (error) {\n console.error('staff.team-members.delete', error)\n flash(labels.errors.delete, 'error')\n }\n }, [handleRefresh, labels.actions.deleteConfirm, labels.errors.delete, labels.messages.deleted])\n\n return (\n <Page>\n <PageBody>\n <DataTable<TeamMemberRow>\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 filters={filters}\n filterValues={filterValues}\n onFiltersApply={handleFiltersApply}\n onFiltersClear={handleFiltersClear}\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/staff/team-members/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) => row.kind === 'member' ? (\n <RowActions\n items={[\n { id: 'edit', label: labels.actions.edit, onSelect: () => { router.push(`/backend/staff/team-members/${row.id}`) } },\n { id: 'delete', label: labels.actions.delete, destructive: true, onSelect: () => { void handleDelete(row) } },\n ]}\n />\n ) : null}\n />\n </PageBody>\n </Page>\n )\n}\n\ntype TeamMemberApiRow = {\n id: string\n displayName: string\n description: string | null\n userEmail: string | null\n roleNames: string[]\n roleIds: string[]\n tags: string[]\n isActive: boolean\n updatedAt: string | null\n teamId: string | null\n teamName: string | null\n}\n\ntype GroupedSortField = 'displayName' | 'userEmail' | 'roleNames' | 'tags' | 'isActive' | 'updatedAt'\n\nfunction mapApiTeamMember(item: Record<string, unknown>): TeamMemberApiRow {\n const id = typeof item.id === 'string' ? item.id : ''\n const displayName = typeof item.displayName === 'string'\n ? item.displayName\n : typeof item.display_name === 'string'\n ? item.display_name\n : id\n const description = typeof item.description === 'string' && item.description.trim().length\n ? item.description.trim()\n : null\n const user = item.user && typeof item.user === 'object' ? item.user as { email?: unknown } : null\n const userEmail = user && typeof user.email === 'string' && user.email.length ? user.email : null\n const roleNames = Array.isArray(item.roleNames) ? item.roleNames.filter((value): value is string => typeof value === 'string') : []\n const roleIds = Array.isArray(item.roleIds)\n ? item.roleIds.filter((value): value is string => typeof value === 'string')\n : Array.isArray(item.role_ids)\n ? item.role_ids.filter((value): value is string => typeof value === 'string')\n : []\n const tags = Array.isArray(item.tags) ? item.tags.filter((value): value is string => typeof value === 'string') : []\n const updatedAt = typeof item.updatedAt === 'string'\n ? item.updatedAt\n : typeof item.updated_at === 'string'\n ? item.updated_at\n : null\n const isActive = typeof item.isActive === 'boolean'\n ? item.isActive\n : typeof item.is_active === 'boolean'\n ? item.is_active\n : true\n const teamId = typeof item.teamId === 'string'\n ? item.teamId\n : typeof item.team_id === 'string'\n ? item.team_id\n : null\n const team = item.team && typeof item.team === 'object' ? item.team as { name?: unknown } : null\n const teamName = typeof team?.name === 'string' ? team.name : null\n return {\n id,\n displayName,\n description,\n userEmail,\n roleNames,\n roleIds,\n tags,\n isActive,\n updatedAt,\n teamId,\n teamName,\n }\n}\n\nfunction compareGroupedRows(\n field: GroupedSortField,\n labels: { unassignedTeam: string },\n left: TeamMemberRow,\n right: TeamMemberRow,\n): number {\n const leftTeam = (left.teamName ?? labels.unassignedTeam).toLocaleLowerCase()\n const rightTeam = (right.teamName ?? labels.unassignedTeam).toLocaleLowerCase()\n const teamComparison = leftTeam.localeCompare(rightTeam)\n if (teamComparison !== 0) return teamComparison\n if (left.kind !== right.kind) return left.kind === 'team' ? -1 : 1\n if (left.kind === 'team' && right.kind === 'team') return 0\n switch (field) {\n case 'displayName':\n return left.displayName.localeCompare(right.displayName)\n case 'userEmail':\n return (left.userEmail ?? '').localeCompare(right.userEmail ?? '')\n case 'roleNames':\n return left.roleNames.join(', ').localeCompare(right.roleNames.join(', '))\n case 'tags':\n return left.tags.join(', ').localeCompare(right.tags.join(', '))\n case 'isActive':\n return Number(left.isActive) - Number(right.isActive)\n case 'updatedAt':\n return compareDateStrings(left.updatedAt, right.updatedAt)\n }\n}\n\nfunction compareDateStrings(left: string | null, right: string | null): number {\n if (!left && !right) return 0\n if (!left) return -1\n if (!right) return 1\n const leftTime = Date.parse(left)\n const rightTime = Date.parse(right)\n if (Number.isNaN(leftTime) || Number.isNaN(rightTime)) {\n return left.localeCompare(right)\n }\n return leftTime - rightTime\n}\n\nfunction buildTeamMemberRows(\n items: TeamMemberApiRow[],\n labels: { unassignedTeam: string; unassignedRole: string; multipleRoles: string },\n): TeamMemberRow[] {\n const teamGroups = new Map<string, { teamId: string | null; name: string; members: TeamMemberApiRow[] }>()\n for (const member of items) {\n const key = member.teamId ?? 'unassigned'\n const name = member.teamName ?? labels.unassignedTeam\n const group = teamGroups.get(key) ?? { teamId: member.teamId ?? null, name, members: [] }\n group.members.push(member)\n teamGroups.set(key, group)\n }\n const sortedTeams = Array.from(teamGroups.values()).sort((a, b) => a.name.localeCompare(b.name))\n const rows: TeamMemberRow[] = []\n for (const team of sortedTeams) {\n rows.push({\n kind: 'team',\n id: `team:${team.teamId ?? 'unassigned'}`,\n teamId: team.teamId,\n teamName: team.name,\n roleLabel: null,\n displayName: team.name,\n description: null,\n userEmail: null,\n roleNames: [],\n tags: [],\n isActive: true,\n updatedAt: null,\n })\n const sortedMembers = [...team.members].sort((a, b) => a.displayName.localeCompare(b.displayName))\n for (const member of sortedMembers) {\n rows.push({\n kind: 'member',\n id: member.id,\n teamId: member.teamId,\n teamName: member.teamName,\n roleLabel: member.roleNames.length\n ? member.roleNames.join(', ')\n : labels.unassignedRole,\n displayName: member.displayName,\n description: member.description,\n userEmail: member.userEmail,\n roleNames: member.roleNames,\n tags: member.tags,\n isActive: member.isActive,\n updatedAt: member.updatedAt,\n })\n }\n }\n return rows\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\nfunction renderLabelPills(values: string[]): React.ReactNode {\n if (!values.length) return <span className=\"text-xs text-muted-foreground\">-</span>\n return (\n <div className=\"flex flex-wrap gap-2\">\n {values.map((value) => (\n <span key={value} className=\"inline-flex items-center rounded-full border px-3 py-1 text-xs font-medium\">\n {value}\n </span>\n ))}\n </div>\n )\n}\n\nfunction TeamsIcon({ className }: { className?: string }) {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n aria-hidden=\"true\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"3\" />\n <circle cx=\"16\" cy=\"8\" r=\"3\" />\n <path d=\"M3 20c0-3 3-5 5-5\" />\n <path d=\"M21 20c0-3-3-5-5-5\" />\n </svg>\n )\n}\n"],
5
- "mappings": ";AAoJc,SACyB,KADzB;AAlJd,YAAY,WAAW;AACvB,OAAO,UAAU;AACjB,SAAS,aAAa,WAAW,uBAAuB;AAExD,SAAS,MAAM,gBAAgB;AAC/B,SAAS,iBAAiB;AAC1B,SAAS,kBAAkB;AAC3B,SAAS,cAAc;AACvB,SAAS,mBAAmB;AAC5B,SAAS,sBAAsB,eAAe;AAC9C,SAAS,kBAAkB;AAC3B,SAAS,aAAa;AAEtB,SAAS,mCAAmC;AAC5C,SAAS,YAAY;AACrB,SAAS,cAAc;AAEvB,MAAM,YAAY;AA+BH,SAAR,uBAAwC;AAC7C,QAAM,IAAI,KAAK;AACf,QAAM,SAAS,UAAU;AACzB,QAAM,WAAW,YAAY;AAC7B,QAAM,eAAe,4BAA4B;AACjD,QAAM,eAAe,gBAAgB;AACrC,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAA0B,CAAC,CAAC;AAC1D,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAAS,CAAC;AACxC,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAS,CAAC;AAC1C,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAS,CAAC;AACpD,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAAuB,CAAC,EAAE,IAAI,eAAe,MAAM,MAAM,CAAC,CAAC;AAC/F,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAS,EAAE;AAC7C,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAS,IAAI;AACrD,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,SAAS,CAAC;AACtD,QAAM,CAAC,cAAc,eAAe,IAAI,MAAM,SAAuB,CAAC,CAAC;AACvE,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,MAAM,SAAkD,CAAC,CAAC;AAC5G,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,MAAM,SAAkD,CAAC,CAAC;AAC5G,QAAM,kBAAkB,cAAc,IAAI,QAAQ;AAClD,QAAM,kBAAkB,cAAc,IAAI,QAAQ;AAClD,QAAM,iBAAiB,OAAO,aAAa,WAAW,YAAY,aAAa,OAAO,SAClF,aAAa,SACb;AAEJ,QAAM,UAAU,MAAM;AACpB,YAAQ,CAAC;AAAA,EACX,GAAG,CAAC,iBAAiB,eAAe,CAAC;AAErC,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,gBAAiB;AACtB,oBAAgB,CAAC,SAAS;AACxB,UAAI,KAAK,WAAW,gBAAiB,QAAO;AAC5C,UAAI,OAAO,KAAK,WAAW,YAAY,KAAK,OAAO,SAAS,EAAG,QAAO;AACtE,aAAO,EAAE,GAAG,MAAM,QAAQ,gBAAgB;AAAA,IAC5C,CAAC;AAAA,EACH,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,gBAAiB;AACtB,oBAAgB,CAAC,SAAS;AACxB,UAAI,KAAK,WAAW,gBAAiB,QAAO;AAC5C,UAAI,OAAO,KAAK,WAAW,YAAY,KAAK,OAAO,SAAS,EAAG,QAAO;AACtE,aAAO,EAAE,GAAG,MAAM,QAAQ,gBAAgB;AAAA,IAC5C,CAAC;AAAA,EACH,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,SAAS,MAAM,QAAQ,OAAO;AAAA,IAClC,OAAO,EAAE,gCAAgC,cAAc;AAAA,IACvD,aAAa,EAAE,sCAAsC,8CAA8C;AAAA,IACnG,OAAO;AAAA,MACL,MAAM,EAAE,gCAAgC,MAAM;AAAA,MAC9C,MAAM,EAAE,gCAAgC,MAAM;AAAA,MAC9C,OAAO,EAAE,iCAAiC,OAAO;AAAA,MACjD,MAAM,EAAE,gCAAgC,MAAM;AAAA,MAC9C,QAAQ,EAAE,kCAAkC,QAAQ;AAAA,MACpD,WAAW,EAAE,qCAAqC,SAAS;AAAA,MAC3D,OAAO,EAAE,iCAAiC,sBAAsB;AAAA,MAChE,QAAQ,EAAE,kCAAkC,wBAAwB;AAAA,IACtE;AAAA,IACA,QAAQ;AAAA,MACN,gBAAgB,EAAE,0CAA0C,iBAAiB;AAAA,MAC7E,gBAAgB,EAAE,0CAA0C,iBAAiB;AAAA,MAC7E,eAAe,EAAE,yCAAyC,gBAAgB;AAAA,IAC5E;AAAA,IACA,SAAS;AAAA,MACP,MAAM,EAAE,kCAAkC,MAAM;AAAA,MAChD,MAAM,EAAE,kCAAkC,MAAM;AAAA,IAClD;AAAA,IACA,SAAS;AAAA,MACP,KAAK,EAAE,iCAAiC,iBAAiB;AAAA,MACzD,MAAM,EAAE,kCAAkC,MAAM;AAAA,MAChD,QAAQ,EAAE,oCAAoC,QAAQ;AAAA,MACtD,eAAe,EAAE,2CAA2C,gCAAgC;AAAA,MAC5F,SAAS,EAAE,qCAAqC,SAAS;AAAA,MACzD,UAAU,EAAE,4BAA4B,MAAM;AAAA,IAChD;AAAA,IACA,UAAU;AAAA,MACR,SAAS,EAAE,sCAAsC,sBAAsB;AAAA,IACzE;AAAA,IACA,QAAQ;AAAA,MACN,MAAM,EAAE,iCAAiC,8BAA8B;AAAA,MACvE,QAAQ,EAAE,mCAAmC,+BAA+B;AAAA,IAC9E;AAAA,EACF,IAAI,CAAC,CAAC,CAAC;AAEP,QAAM,mBAAmB,MAAM,YAAY,CAAC,UAAsD;AAChG,WAAO,CAAC,MAAM,SAAS,mBAAmB,OAAO,OAAO,QAAQ,KAAK,UAAU,KAAK,QAAQ;AAAA,EAC9F,GAAG,CAAC,OAAO,MAAM,CAAC;AAElB,QAAM,UAAU,MAAM,QAAoC,MAAM;AAAA,IAC9D;AAAA,MACE,aAAa;AAAA,MACb,QAAQ,OAAO,MAAM;AAAA,MACrB,MAAM,EAAE,UAAU,GAAG,QAAQ,KAAK;AAAA,MAClC,WAAW,iBAAiB,aAAa;AAAA,MACzC,MAAM,CAAC,EAAE,IAAI,MACX,IAAI,SAAS,SAAS,SAElB,qBAAC,SAAI,WAAU,2CACb;AAAA,6BAAC,SAAI,WAAU,2BACZ;AAAA,cAAI,SAAS,SAAS,oBAAC,aAAU,WAAU,iCAAgC,IAAK;AAAA,UACjF,oBAAC,UAAK,WAAU,iBAAiB,cAAI,SAAS,aAAY;AAAA,WAC5D;AAAA,QACC,IAAI,SAAS,SACZ;AAAA,UAAC;AAAA;AAAA,YACC,SAAO;AAAA,YACP,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,WAAU;AAAA,YACV,OAAO,OAAO,QAAQ;AAAA,YACtB,cAAY,OAAO,QAAQ;AAAA,YAE3B,8BAAC,QAAK,MAAM,wBAAwB,mBAAmB,IAAI,SAAS,MAAM,CAAC,SACzE,8BAAC,UAAO,WAAU,WAAU,GAC9B;AAAA;AAAA,QACF,IACE;AAAA,SACN,IAGA,qBAAC,SAAI,WAAU,iBACb;AAAA,4BAAC,UAAK,WAAU,oBAAoB,cAAI,SAAS,aAAY;AAAA,QAC5D,IAAI,SAAS,cACZ,oBAAC,UAAK,WAAU,mDAAmD,cAAI,SAAS,aAAY,IAC1F;AAAA,SACN;AAAA,IAGR;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,QAAQ,OAAO,MAAM;AAAA,MACrB,MAAM,EAAE,UAAU,EAAE;AAAA,MACpB,WAAW,iBAAiB,WAAW;AAAA,MACvC,MAAM,CAAC,EAAE,IAAI,MAAM,IAAI,SAAS,SAAS,YAAY,IAAI,SAAS,YAC9D,oBAAC,UAAK,WAAU,WAAW,cAAI,SAAS,WAAU,IAClD,oBAAC,UAAK,WAAU,iCAAgC,eAAC;AAAA,IACvD;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,QAAQ,OAAO,MAAM;AAAA,MACrB,MAAM,EAAE,UAAU,EAAE;AAAA,MACpB,WAAW,iBAAiB,WAAW;AAAA,MACvC,MAAM,CAAC,EAAE,IAAI,MAAM,IAAI,SAAS,SAAS,WACrC,iBAAiB,IAAI,SAAS,SAAS,IACvC,oBAAC,UAAK,WAAU,iCAAgC,eAAC;AAAA,IACvD;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,QAAQ,OAAO,MAAM;AAAA,MACrB,MAAM,EAAE,UAAU,EAAE;AAAA,MACpB,WAAW,iBAAiB,MAAM;AAAA,MAClC,MAAM,CAAC,EAAE,IAAI,MAAM,IAAI,SAAS,SAAS,WACrC,iBAAiB,IAAI,SAAS,IAAI,IAClC,oBAAC,UAAK,WAAU,iCAAgC,eAAC;AAAA,IACvD;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,QAAQ,OAAO,MAAM;AAAA,MACrB,MAAM,EAAE,UAAU,EAAE;AAAA,MACpB,WAAW,iBAAiB,UAAU;AAAA,MACtC,MAAM,CAAC,EAAE,IAAI,MAAM,IAAI,SAAS,SAAS,WACrC,oBAAC,eAAY,OAAO,IAAI,SAAS,UAAU,IAC3C,oBAAC,UAAK,WAAU,iCAAgC,eAAC;AAAA,IACvD;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,QAAQ,OAAO,MAAM;AAAA,MACrB,MAAM,EAAE,UAAU,EAAE;AAAA,MACpB,WAAW,iBAAiB,WAAW;AAAA,MACvC,MAAM,CAAC,EAAE,IAAI,MAAM,IAAI,SAAS,SAAS,YAAY,IAAI,SAAS,YAC9D,oBAAC,UAAK,WAAU,iCAAiC,yBAAe,IAAI,SAAS,SAAS,GAAE,IACxF,oBAAC,UAAK,WAAU,iCAAgC,eAAC;AAAA,IACvD;AAAA,EACF,GAAG,CAAC,kBAAkB,OAAO,MAAM,QAAQ,OAAO,MAAM,MAAM,OAAO,MAAM,OAAO,OAAO,MAAM,MAAM,OAAO,MAAM,WAAW,OAAO,MAAM,IAAI,CAAC;AAE/I,QAAM,kBAAkB,MAAM,YAAY,YAAY;AACpD,iBAAa,IAAI;AACjB,QAAI;AACF,YAAM,SAAS,IAAI,gBAAgB;AAAA,QACjC,MAAM,OAAO,IAAI;AAAA,QACjB,UAAU,OAAO,SAAS;AAAA,MAC5B,CAAC;AACD,YAAM,OAAO,QAAQ,CAAC;AACtB,UAAI,MAAM,IAAI;AACZ,eAAO,IAAI,aAAa,KAAK,EAAE;AAC/B,eAAO,IAAI,WAAW,KAAK,OAAO,SAAS,KAAK;AAAA,MAClD;AACA,UAAI,OAAO,KAAK,EAAG,QAAO,IAAI,UAAU,OAAO,KAAK,CAAC;AACrD,UAAI,eAAgB,QAAO,IAAI,UAAU,OAAO,cAAc,CAAC;AAC/D,UAAI,aAAa,OAAQ,QAAO,IAAI,UAAU,OAAO,aAAa,MAAM,CAAC;AACzE,YAAM,UAAU,MAAM;AAAA,QACpB,2BAA2B,OAAO,SAAS,CAAC;AAAA,QAC5C;AAAA,QACA,EAAE,cAAc,OAAO,OAAO,MAAM,UAAU,EAAE,OAAO,CAAC,GAAG,OAAO,GAAG,YAAY,EAAE,EAAE;AAAA,MACvF;AACA,YAAM,QAAQ,MAAM,QAAQ,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC;AAC9D,YAAM,cAAc,MAAM,IAAI,gBAAgB;AAC9C,YAAM,eAAe,OAAO,aAAa,WAAW,WAAW,aAAa,SAAS;AACrF,YAAM,gBAAgB,eAClB,YAAY,OAAO,CAAC,WAAW,OAAO,QAAQ,SAAS,YAAY,CAAC,IACpE;AACJ,YAAM,oBAAoB,gBAAgB,QAAQ,cAAc,WAAW,YAAY;AACvF,cAAQ,oBAAoB,eAAe,OAAO,MAAM,CAAC;AACzD,YAAM,gBAAgB,oBAClB,cAAc,SACd,OAAO,QAAQ,UAAU,WACvB,QAAQ,QACR,MAAM;AACZ,eAAS,aAAa;AACtB,oBAAc,oBACV,IACA,OAAO,QAAQ,eAAe,WAC5B,QAAQ,aACR,KAAK,IAAI,GAAG,KAAK,KAAK,MAAM,SAAS,SAAS,CAAC,CAAC;AAAA,IACxD,SAAS,OAAO;AACd,cAAQ,MAAM,2BAA2B,KAAK;AAC9C,YAAM,OAAO,OAAO,MAAM,OAAO;AAAA,IACnC,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,aAAa,QAAQ,OAAO,OAAO,MAAM,OAAO,QAAQ,MAAM,gBAAgB,QAAQ,OAAO,CAAC;AAElG,QAAM,UAAU,MAAM;AACpB,SAAK,gBAAgB;AAAA,EACvB,GAAG,CAAC,iBAAiB,cAAc,WAAW,CAAC;AAE/C,QAAM,UAAU,MAAM;AACpB,QAAI,YAAY;AAChB,mBAAe,cAAc;AAC3B,UAAI;AACF,cAAM,aAAa,IAAI,gBAAgB,EAAE,MAAM,KAAK,UAAU,MAAM,CAAC;AACrE,cAAM,aAAa,IAAI,gBAAgB,EAAE,MAAM,KAAK,UAAU,MAAM,CAAC;AACrE,cAAM,CAAC,WAAW,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,UAC/C,QAAuB,oBAAoB,WAAW,SAAS,CAAC,EAAE;AAAA,UAClE,QAA2B,yBAAyB,WAAW,SAAS,CAAC,EAAE;AAAA,QAC7E,CAAC;AACD,cAAM,YAAY,MAAM,QAAQ,UAAU,QAAQ,KAAK,IAAI,UAAU,OAAO,QAAQ,CAAC;AACrF,cAAM,YAAY,MAAM,QAAQ,UAAU,QAAQ,KAAK,IAAI,UAAU,OAAO,QAAQ,CAAC;AACrF,cAAM,QAAQ,UACX,IAAI,CAAC,SAAS;AACb,gBAAM,KAAK,OAAO,KAAK,OAAO,WAAW,KAAK,KAAK;AACnD,gBAAM,OAAO,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;AACzD,cAAI,CAAC,MAAM,CAAC,KAAM,QAAO;AACzB,iBAAO,EAAE,OAAO,IAAI,OAAO,KAAK;AAAA,QAClC,CAAC,EACA,OAAO,CAAC,UAAqD,UAAU,IAAI;AAC9E,cAAM,QAAQ,UACX,IAAI,CAAC,SAAS;AACb,gBAAM,KAAK,OAAO,KAAK,OAAO,WAAW,KAAK,KAAK;AACnD,gBAAM,OAAO,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;AACzD,gBAAM,WAAW,KAAK,QAAQ,OAAO,KAAK,SAAS,YAAY,OAAO,KAAK,KAAK,SAAS,WACrF,KAAK,KAAK,OACV,OAAO,OAAO;AAClB,cAAI,CAAC,MAAM,CAAC,KAAM,QAAO;AACzB,iBAAO,EAAE,OAAO,IAAI,OAAO,GAAG,QAAQ,MAAM,IAAI,GAAG;AAAA,QACrD,CAAC,EACA,OAAO,CAAC,UAAqD,UAAU,IAAI;AAC9E,YAAI,CAAC,WAAW;AACd,+BAAqB,KAAK;AAC1B,+BAAqB,KAAK;AAAA,QAC5B;AAAA,MACF,QAAQ;AACN,YAAI,CAAC,WAAW;AACd,+BAAqB,CAAC,CAAC;AACvB,+BAAqB,CAAC,CAAC;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AACA,gBAAY;AACZ,WAAO,MAAM;AAAE,kBAAY;AAAA,IAAK;AAAA,EAClC,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,UAAU,MAAM,QAAqB,MAAM;AAAA,IAC/C;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,OAAO,QAAQ;AAAA,MACtB,MAAM;AAAA,MACN,SAAS;AAAA,MACT,aAAa,OAAO,QAAQ;AAAA,IAC9B;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,OAAO,QAAQ;AAAA,MACtB,MAAM;AAAA,MACN,SAAS;AAAA,MACT,aAAa,OAAO,QAAQ;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,OAAO,QAAQ,MAAM,OAAO,QAAQ,MAAM,mBAAmB,iBAAiB,CAAC;AAEnF,QAAM,qBAAqB,MAAM,YAAY,CAAC,UAAkB;AAC9D,cAAU,KAAK;AACf,YAAQ,CAAC;AAAA,EACX,GAAG,CAAC,UAAU,QAAQ,YAAY,CAAC;AAEnC,QAAM,qBAAqB,MAAM,YAAY,CAAC,WAAyB;AACrE,oBAAgB,MAAM;AACtB,YAAQ,CAAC;AAET,UAAM,SAAS,IAAI,gBAAgB,cAAc,SAAS,CAAC;AAC3D,UAAM,YAAY,OAAO,OAAO,WAAW,YAAY,OAAO,OAAO,SAAS;AAC9E,QAAI,CAAC,aAAa,OAAO,IAAI,QAAQ,GAAG;AACtC,aAAO,OAAO,QAAQ;AAAA,IACxB;AACA,UAAM,YAAY,OAAO,OAAO,WAAW,YAAY,OAAO,OAAO,SAAS;AAC9E,QAAI,CAAC,aAAa,OAAO,IAAI,QAAQ,GAAG;AACtC,aAAO,OAAO,QAAQ;AAAA,IACxB;AACA,UAAM,QAAQ,OAAO,SAAS;AAC9B,WAAO,QAAQ,QAAQ,GAAG,QAAQ,IAAI,KAAK,KAAK,QAAQ;AAAA,EAC1D,GAAG,CAAC,UAAU,QAAQ,YAAY,CAAC;AAEnC,QAAM,qBAAqB,MAAM,YAAY,MAAM;AACjD,oBAAgB,CAAC,CAAC;AAClB,YAAQ,CAAC;AAET,UAAM,SAAS,IAAI,gBAAgB,cAAc,SAAS,CAAC;AAC3D,QAAI,OAAO,IAAI,QAAQ,GAAG;AACxB,aAAO,OAAO,QAAQ;AAAA,IACxB;AACA,QAAI,OAAO,IAAI,QAAQ,GAAG;AACxB,aAAO,OAAO,QAAQ;AAAA,IACxB;AACA,UAAM,QAAQ,OAAO,SAAS;AAC9B,WAAO,QAAQ,QAAQ,GAAG,QAAQ,IAAI,KAAK,KAAK,QAAQ;AAAA,EAC1D,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgB,MAAM,YAAY,MAAM;AAC5C,mBAAe,CAAC,UAAU,QAAQ,CAAC;AAAA,EACrC,GAAG,CAAC,CAAC;AAEL,QAAM,eAAe,MAAM,YAAY,OAAO,UAAyB;AACrE,QAAI,MAAM,SAAS,SAAU;AAC7B,UAAM,UAAU,OAAO,QAAQ,cAAc,QAAQ,YAAY,MAAM,WAAW;AAClF,QAAI,OAAO,WAAW,eAAe,CAAC,OAAO,QAAQ,OAAO,EAAG;AAC/D,QAAI;AACF,YAAM,WAAW,sBAAsB,MAAM,IAAI,EAAE,cAAc,OAAO,OAAO,OAAO,CAAC;AACvF,YAAM,OAAO,SAAS,SAAS,SAAS;AACxC,oBAAc;AAAA,IAChB,SAAS,OAAO;AACd,cAAQ,MAAM,6BAA6B,KAAK;AAChD,YAAM,OAAO,OAAO,QAAQ,OAAO;AAAA,IACrC;AAAA,EACF,GAAG,CAAC,eAAe,OAAO,QAAQ,eAAe,OAAO,OAAO,QAAQ,OAAO,SAAS,OAAO,CAAC;AAE/F,SACE,oBAAC,QACC,8BAAC,YACC;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,OAAO;AAAA,MACd,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,mBAAmB,OAAO,MAAM;AAAA,MAChC;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,YAAY,oBAAC,OAAE,WAAU,kDAAkD,iBAAO,MAAM,OAAM;AAAA,MAC9F,SACE,oBAAC,UAAO,SAAO,MAAC,MAAK,MACnB,8BAAC,QAAK,MAAK,sCACR,iBAAO,QAAQ,KAClB,GACF;AAAA,MAEF,eAAe;AAAA,QACb,OAAO,OAAO,QAAQ;AAAA,QACtB,WAAW;AAAA,QACX,cAAc;AAAA,MAChB;AAAA,MACA,UAAQ;AAAA,MACR;AAAA,MACA,iBAAiB;AAAA,MACjB,YAAY;AAAA,QACV;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA,cAAc;AAAA,MAChB;AAAA,MACA,YAAY,CAAC,QAAQ,IAAI,SAAS,WAChC;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,EAAE,IAAI,QAAQ,OAAO,OAAO,QAAQ,MAAM,UAAU,MAAM;AAAE,qBAAO,KAAK,+BAA+B,IAAI,EAAE,EAAE;AAAA,YAAE,EAAE;AAAA,YACnH,EAAE,IAAI,UAAU,OAAO,OAAO,QAAQ,QAAQ,aAAa,MAAM,UAAU,MAAM;AAAE,mBAAK,aAAa,GAAG;AAAA,YAAE,EAAE;AAAA,UAC9G;AAAA;AAAA,MACF,IACE;AAAA;AAAA,EACN,GACF,GACF;AAEJ;AAkBA,SAAS,iBAAiB,MAAiD;AACzE,QAAM,KAAK,OAAO,KAAK,OAAO,WAAW,KAAK,KAAK;AACnD,QAAM,cAAc,OAAO,KAAK,gBAAgB,WAC5C,KAAK,cACL,OAAO,KAAK,iBAAiB,WAC3B,KAAK,eACL;AACN,QAAM,cAAc,OAAO,KAAK,gBAAgB,YAAY,KAAK,YAAY,KAAK,EAAE,SAChF,KAAK,YAAY,KAAK,IACtB;AACJ,QAAM,OAAO,KAAK,QAAQ,OAAO,KAAK,SAAS,WAAW,KAAK,OAA8B;AAC7F,QAAM,YAAY,QAAQ,OAAO,KAAK,UAAU,YAAY,KAAK,MAAM,SAAS,KAAK,QAAQ;AAC7F,QAAM,YAAY,MAAM,QAAQ,KAAK,SAAS,IAAI,KAAK,UAAU,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,IAAI,CAAC;AAClI,QAAM,UAAU,MAAM,QAAQ,KAAK,OAAO,IACtC,KAAK,QAAQ,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,IACzE,MAAM,QAAQ,KAAK,QAAQ,IACzB,KAAK,SAAS,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,IAC1E,CAAC;AACP,QAAM,OAAO,MAAM,QAAQ,KAAK,IAAI,IAAI,KAAK,KAAK,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,IAAI,CAAC;AACnH,QAAM,YAAY,OAAO,KAAK,cAAc,WACxC,KAAK,YACL,OAAO,KAAK,eAAe,WACzB,KAAK,aACL;AACN,QAAM,WAAW,OAAO,KAAK,aAAa,YACtC,KAAK,WACL,OAAO,KAAK,cAAc,YACxB,KAAK,YACL;AACN,QAAM,SAAS,OAAO,KAAK,WAAW,WAClC,KAAK,SACL,OAAO,KAAK,YAAY,WACtB,KAAK,UACL;AACN,QAAM,OAAO,KAAK,QAAQ,OAAO,KAAK,SAAS,WAAW,KAAK,OAA6B;AAC5F,QAAM,WAAW,OAAO,MAAM,SAAS,WAAW,KAAK,OAAO;AAC9D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,mBACP,OACA,QACA,MACA,OACQ;AACR,QAAM,YAAY,KAAK,YAAY,OAAO,gBAAgB,kBAAkB;AAC5E,QAAM,aAAa,MAAM,YAAY,OAAO,gBAAgB,kBAAkB;AAC9E,QAAM,iBAAiB,SAAS,cAAc,SAAS;AACvD,MAAI,mBAAmB,EAAG,QAAO;AACjC,MAAI,KAAK,SAAS,MAAM,KAAM,QAAO,KAAK,SAAS,SAAS,KAAK;AACjE,MAAI,KAAK,SAAS,UAAU,MAAM,SAAS,OAAQ,QAAO;AAC1D,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO,KAAK,YAAY,cAAc,MAAM,WAAW;AAAA,IACzD,KAAK;AACH,cAAQ,KAAK,aAAa,IAAI,cAAc,MAAM,aAAa,EAAE;AAAA,IACnE,KAAK;AACH,aAAO,KAAK,UAAU,KAAK,IAAI,EAAE,cAAc,MAAM,UAAU,KAAK,IAAI,CAAC;AAAA,IAC3E,KAAK;AACH,aAAO,KAAK,KAAK,KAAK,IAAI,EAAE,cAAc,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,IACjE,KAAK;AACH,aAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,MAAM,QAAQ;AAAA,IACtD,KAAK;AACH,aAAO,mBAAmB,KAAK,WAAW,MAAM,SAAS;AAAA,EAC7D;AACF;AAEA,SAAS,mBAAmB,MAAqB,OAA8B;AAC7E,MAAI,CAAC,QAAQ,CAAC,MAAO,QAAO;AAC5B,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,WAAW,KAAK,MAAM,IAAI;AAChC,QAAM,YAAY,KAAK,MAAM,KAAK;AAClC,MAAI,OAAO,MAAM,QAAQ,KAAK,OAAO,MAAM,SAAS,GAAG;AACrD,WAAO,KAAK,cAAc,KAAK;AAAA,EACjC;AACA,SAAO,WAAW;AACpB;AAEA,SAAS,oBACP,OACA,QACiB;AACjB,QAAM,aAAa,oBAAI,IAAkF;AACzG,aAAW,UAAU,OAAO;AAC1B,UAAM,MAAM,OAAO,UAAU;AAC7B,UAAM,OAAO,OAAO,YAAY,OAAO;AACvC,UAAM,QAAQ,WAAW,IAAI,GAAG,KAAK,EAAE,QAAQ,OAAO,UAAU,MAAM,MAAM,SAAS,CAAC,EAAE;AACxF,UAAM,QAAQ,KAAK,MAAM;AACzB,eAAW,IAAI,KAAK,KAAK;AAAA,EAC3B;AACA,QAAM,cAAc,MAAM,KAAK,WAAW,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAC/F,QAAM,OAAwB,CAAC;AAC/B,aAAW,QAAQ,aAAa;AAC9B,SAAK,KAAK;AAAA,MACR,MAAM;AAAA,MACN,IAAI,QAAQ,KAAK,UAAU,YAAY;AAAA,MACvC,QAAQ,KAAK;AAAA,MACb,UAAU,KAAK;AAAA,MACf,WAAW;AAAA,MACX,aAAa,KAAK;AAAA,MAClB,aAAa;AAAA,MACb,WAAW;AAAA,MACX,WAAW,CAAC;AAAA,MACZ,MAAM,CAAC;AAAA,MACP,UAAU;AAAA,MACV,WAAW;AAAA,IACb,CAAC;AACD,UAAM,gBAAgB,CAAC,GAAG,KAAK,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,cAAc,EAAE,WAAW,CAAC;AACjG,eAAW,UAAU,eAAe;AAClC,WAAK,KAAK;AAAA,QACR,MAAM;AAAA,QACN,IAAI,OAAO;AAAA,QACX,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,QACjB,WAAW,OAAO,UAAU,SACxB,OAAO,UAAU,KAAK,IAAI,IAC1B,OAAO;AAAA,QACX,aAAa,OAAO;AAAA,QACpB,aAAa,OAAO;AAAA,QACpB,WAAW,OAAO;AAAA,QAClB,WAAW,OAAO;AAAA,QAClB,MAAM,OAAO;AAAA,QACb,UAAU,OAAO;AAAA,QACjB,WAAW,OAAO;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,eAAe,OAAuB;AAC7C,QAAM,SAAS,IAAI,KAAK,KAAK;AAC7B,MAAI,OAAO,MAAM,OAAO,QAAQ,CAAC,EAAG,QAAO;AAC3C,SAAO,OAAO,eAAe;AAC/B;AAEA,SAAS,iBAAiB,QAAmC;AAC3D,MAAI,CAAC,OAAO,OAAQ,QAAO,oBAAC,UAAK,WAAU,iCAAgC,eAAC;AAC5E,SACE,oBAAC,SAAI,WAAU,wBACZ,iBAAO,IAAI,CAAC,UACX,oBAAC,UAAiB,WAAU,8EACzB,mBADQ,KAEX,CACD,GACH;AAEJ;AAEA,SAAS,UAAU,EAAE,UAAU,GAA2B;AACxD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ;AAAA,MACA,eAAY;AAAA,MAEZ;AAAA,4BAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI;AAAA,QAC5B,oBAAC,YAAO,IAAG,MAAK,IAAG,KAAI,GAAE,KAAI;AAAA,QAC7B,oBAAC,UAAK,GAAE,qBAAoB;AAAA,QAC5B,oBAAC,UAAK,GAAE,sBAAqB;AAAA;AAAA;AAAA,EAC/B;AAEJ;",
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { usePathname, useRouter, useSearchParams } from 'next/navigation'\nimport type { ColumnDef, SortingFn, SortingState } from '@tanstack/react-table'\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 { BooleanIcon } from '@open-mercato/ui/backend/ValueIcons'\nimport { readApiResultOrThrow, apiCall } 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 type { FilterDef, FilterValues } from '@open-mercato/ui/backend/FilterBar'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Pencil } from 'lucide-react'\n\nconst PAGE_SIZE = 50\n\ntype TeamMemberRow = {\n kind: 'team' | 'member'\n id: string\n teamId: string | null\n teamName: string | null\n roleLabel: string | null\n displayName: string\n description: string | null\n userEmail: string | null\n roleNames: string[]\n tags: string[]\n isActive: boolean\n updatedAt: string | null\n}\n\ntype TeamMembersResponse = {\n items?: Array<Record<string, unknown>>\n total?: number\n totalPages?: number\n}\n\ntype TeamsResponse = {\n items?: Array<{ id?: string; name?: string }>\n}\n\ntype TeamRolesResponse = {\n items?: Array<{ id?: string; name?: string; team?: { name?: string } | null }>\n}\n\nexport default function StaffTeamMembersPage() {\n const t = useT()\n const router = useRouter()\n const pathname = usePathname()\n const scopeVersion = useOrganizationScopeVersion()\n const searchParams = useSearchParams()\n const [rows, setRows] = React.useState<TeamMemberRow[]>([])\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: 'displayName', desc: false }])\n const [search, setSearch] = React.useState('')\n const [isLoading, setIsLoading] = React.useState(true)\n const [reloadToken, setReloadToken] = React.useState(0)\n const [filterValues, setFilterValues] = React.useState<FilterValues>({})\n const [teamFilterOptions, setTeamFilterOptions] = React.useState<Array<{ value: string; label: string }>>([])\n const [roleFilterOptions, setRoleFilterOptions] = React.useState<Array<{ value: string; label: string }>>([])\n const teamFilterParam = searchParams?.get('teamId')\n const roleFilterParam = searchParams?.get('roleId')\n const resolvedTeamId = typeof filterValues.teamId === 'string' && filterValues.teamId.length\n ? filterValues.teamId\n : teamFilterParam\n\n React.useEffect(() => {\n setPage(1)\n }, [teamFilterParam, roleFilterParam])\n\n React.useEffect(() => {\n if (!teamFilterParam) return\n setFilterValues((prev) => {\n if (prev.teamId === teamFilterParam) return prev\n if (typeof prev.teamId === 'string' && prev.teamId.length > 0) return prev\n return { ...prev, teamId: teamFilterParam }\n })\n }, [teamFilterParam])\n\n React.useEffect(() => {\n if (!roleFilterParam) return\n setFilterValues((prev) => {\n if (prev.roleId === roleFilterParam) return prev\n if (typeof prev.roleId === 'string' && prev.roleId.length > 0) return prev\n return { ...prev, roleId: roleFilterParam }\n })\n }, [roleFilterParam])\n\n const labels = React.useMemo(() => ({\n title: t('staff.teamMembers.page.title', 'Team members'),\n description: t('staff.teamMembers.page.description', 'Manage employees and their team assignments.'),\n table: {\n name: t('staff.teamMembers.table.name', 'Name'),\n user: t('staff.teamMembers.table.user', 'User'),\n roles: t('staff.teamMembers.table.roles', 'Roles'),\n tags: t('staff.teamMembers.table.tags', 'Tags'),\n active: t('staff.teamMembers.table.active', 'Active'),\n updatedAt: t('staff.teamMembers.table.updatedAt', 'Updated'),\n empty: t('staff.teamMembers.table.empty', 'No team members yet.'),\n search: t('staff.teamMembers.table.search', 'Search team members...'),\n },\n groups: {\n unassignedTeam: t('staff.teamMembers.group.unassignedTeam', 'Unassigned team'),\n unassignedRole: t('staff.teamMembers.group.unassignedRole', 'Unassigned role'),\n multipleRoles: t('staff.teamMembers.group.multipleRoles', 'Multiple roles'),\n },\n filters: {\n team: t('staff.teamMembers.filters.team', 'Team'),\n role: t('staff.teamMembers.filters.role', 'Role'),\n },\n actions: {\n add: t('staff.teamMembers.actions.add', 'Add team member'),\n edit: t('staff.teamMembers.actions.edit', 'Edit'),\n delete: t('staff.teamMembers.actions.delete', 'Delete'),\n deleteConfirm: t('staff.teamMembers.actions.deleteConfirm', 'Delete team member \"{{name}}\"?'),\n refresh: t('staff.teamMembers.actions.refresh', 'Refresh'),\n editTeam: t('staff.teams.actions.edit', 'Edit'),\n },\n messages: {\n deleted: t('staff.teamMembers.messages.deleted', 'Team member deleted.'),\n },\n errors: {\n load: t('staff.teamMembers.errors.load', 'Failed to load team members.'),\n delete: t('staff.teamMembers.errors.delete', 'Failed to delete team member.'),\n },\n }), [t])\n\n const groupedSortingFn = React.useCallback((field: GroupedSortField): SortingFn<TeamMemberRow> => {\n return (rowA, rowB) => compareGroupedRows(field, labels.groups, rowA.original, rowB.original)\n }, [labels.groups])\n\n const columns = React.useMemo<ColumnDef<TeamMemberRow>[]>(() => [\n {\n accessorKey: 'displayName',\n header: labels.table.name,\n meta: { priority: 1, sticky: true },\n sortingFn: groupedSortingFn('displayName'),\n cell: ({ row }) => (\n row.original.kind === 'team'\n ? (\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2\">\n {row.original.teamId ? <TeamsIcon className=\"h-4 w-4 text-muted-foreground\" /> : null}\n <span className=\"font-semibold\">{row.original.displayName}</span>\n </div>\n {row.original.teamId ? (\n <Button\n asChild\n size=\"icon\"\n variant=\"ghost\"\n className=\"h-7 w-7\"\n title={labels.actions.editTeam}\n aria-label={labels.actions.editTeam}\n >\n <Link href={`/backend/staff/teams/${encodeURIComponent(row.original.teamId)}/edit`}>\n <Pencil className=\"h-4 w-4\" />\n </Link>\n </Button>\n ) : null}\n </div>\n )\n : (\n <div className=\"flex flex-col\">\n <span className=\"font-medium pl-6\">{row.original.displayName}</span>\n {row.original.description ? (\n <span className=\"text-xs text-muted-foreground line-clamp-2 pl-6\">{row.original.description}</span>\n ) : null}\n </div>\n )\n ),\n },\n {\n accessorKey: 'userEmail',\n header: labels.table.user,\n meta: { priority: 2 },\n sortingFn: groupedSortingFn('userEmail'),\n cell: ({ row }) => row.original.kind === 'member' && row.original.userEmail\n ? <span className=\"text-sm\">{row.original.userEmail}</span>\n : <span className=\"text-xs text-muted-foreground\">-</span>,\n },\n {\n accessorKey: 'roleNames',\n header: labels.table.roles,\n meta: { priority: 3 },\n sortingFn: groupedSortingFn('roleNames'),\n cell: ({ row }) => row.original.kind === 'member'\n ? renderLabelPills(row.original.roleNames)\n : <span className=\"text-xs text-muted-foreground\">-</span>,\n },\n {\n accessorKey: 'tags',\n header: labels.table.tags,\n meta: { priority: 4 },\n sortingFn: groupedSortingFn('tags'),\n cell: ({ row }) => row.original.kind === 'member'\n ? renderLabelPills(row.original.tags)\n : <span className=\"text-xs text-muted-foreground\">-</span>,\n },\n {\n accessorKey: 'isActive',\n header: labels.table.active,\n meta: { priority: 5 },\n sortingFn: groupedSortingFn('isActive'),\n cell: ({ row }) => row.original.kind === 'member'\n ? <BooleanIcon value={row.original.isActive} />\n : <span className=\"text-xs text-muted-foreground\">-</span>,\n },\n {\n accessorKey: 'updatedAt',\n header: labels.table.updatedAt,\n meta: { priority: 6 },\n sortingFn: groupedSortingFn('updatedAt'),\n cell: ({ row }) => row.original.kind === 'member' && 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 ], [groupedSortingFn, labels.table.active, labels.table.name, labels.table.roles, labels.table.tags, labels.table.updatedAt, labels.table.user])\n\n const loadTeamMembers = 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 if (resolvedTeamId) params.set('teamId', String(resolvedTeamId))\n if (filterValues.roleId) params.set('roleId', String(filterValues.roleId))\n const payload = await readApiResultOrThrow<TeamMembersResponse>(\n `/api/staff/team-members?${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 const mappedItems = items.map(mapApiTeamMember)\n const roleFilterId = typeof filterValues.roleId === 'string' ? filterValues.roleId : null\n const filteredItems = roleFilterId\n ? mappedItems.filter((member) => member.roleIds.includes(roleFilterId))\n : mappedItems\n const roleFilterApplied = roleFilterId != null && filteredItems.length !== mappedItems.length\n setRows(buildTeamMemberRows(filteredItems, labels.groups))\n const resolvedTotal = roleFilterApplied\n ? filteredItems.length\n : typeof payload.total === 'number'\n ? payload.total\n : items.length\n setTotal(resolvedTotal)\n setTotalPages(roleFilterApplied\n ? 1\n : typeof payload.totalPages === 'number'\n ? payload.totalPages\n : Math.max(1, Math.ceil(items.length / PAGE_SIZE)))\n } catch (error) {\n console.error('staff.team-members.list', error)\n flash(labels.errors.load, 'error')\n } finally {\n setIsLoading(false)\n }\n }, [filterValues.roleId, labels.errors.load, labels.groups, page, resolvedTeamId, search, sorting])\n\n React.useEffect(() => {\n void loadTeamMembers()\n }, [loadTeamMembers, scopeVersion, reloadToken])\n\n React.useEffect(() => {\n let cancelled = false\n async function loadFilters() {\n try {\n const teamParams = new URLSearchParams({ page: '1', pageSize: '100' })\n const roleParams = new URLSearchParams({ page: '1', pageSize: '100' })\n const [teamsCall, rolesCall] = await Promise.all([\n apiCall<TeamsResponse>(`/api/staff/teams?${teamParams.toString()}`),\n apiCall<TeamRolesResponse>(`/api/staff/team-roles?${roleParams.toString()}`),\n ])\n const teamItems = Array.isArray(teamsCall.result?.items) ? teamsCall.result.items : []\n const roleItems = Array.isArray(rolesCall.result?.items) ? rolesCall.result.items : []\n const teams = teamItems\n .map((team) => {\n const id = typeof team.id === 'string' ? team.id : null\n const name = typeof team.name === 'string' ? team.name : null\n if (!id || !name) return null\n return { value: id, label: name }\n })\n .filter((entry): entry is { value: string; label: string } => entry !== null)\n const roles = roleItems\n .map((role) => {\n const id = typeof role.id === 'string' ? role.id : null\n const name = typeof role.name === 'string' ? role.name : null\n const teamName = role.team && typeof role.team === 'object' && typeof role.team.name === 'string'\n ? role.team.name\n : labels.groups.unassignedTeam\n if (!id || !name) return null\n return { value: id, label: `${teamName} - ${name}` }\n })\n .filter((entry): entry is { value: string; label: string } => entry !== null)\n if (!cancelled) {\n setTeamFilterOptions(teams)\n setRoleFilterOptions(roles)\n }\n } catch {\n if (!cancelled) {\n setTeamFilterOptions([])\n setRoleFilterOptions([])\n }\n }\n }\n loadFilters()\n return () => { cancelled = true }\n }, [scopeVersion])\n\n const filters = React.useMemo<FilterDef[]>(() => [\n {\n id: 'teamId',\n label: labels.filters.team,\n type: 'select',\n options: teamFilterOptions,\n placeholder: labels.filters.team,\n },\n {\n id: 'roleId',\n label: labels.filters.role,\n type: 'select',\n options: roleFilterOptions,\n placeholder: labels.filters.role,\n },\n ], [labels.filters.role, labels.filters.team, roleFilterOptions, teamFilterOptions])\n\n const handleSearchChange = React.useCallback((value: string) => {\n setSearch(value)\n setPage(1)\n }, [pathname, router, searchParams])\n\n const handleFiltersApply = React.useCallback((values: FilterValues) => {\n setFilterValues(values)\n setPage(1)\n\n const params = new URLSearchParams(searchParams?.toString())\n const hasTeamId = typeof values.teamId === 'string' && values.teamId.length > 0\n if (!hasTeamId && params.has('teamId')) {\n params.delete('teamId')\n }\n const hasRoleId = typeof values.roleId === 'string' && values.roleId.length > 0\n if (!hasRoleId && params.has('roleId')) {\n params.delete('roleId')\n }\n const query = params.toString()\n router.replace(query ? `${pathname}?${query}` : pathname)\n }, [pathname, router, searchParams])\n\n const handleFiltersClear = React.useCallback(() => {\n setFilterValues({})\n setPage(1)\n\n const params = new URLSearchParams(searchParams?.toString())\n if (params.has('teamId')) {\n params.delete('teamId')\n }\n if (params.has('roleId')) {\n params.delete('roleId')\n }\n const query = params.toString()\n router.replace(query ? `${pathname}?${query}` : pathname)\n }, [])\n\n const handleRefresh = React.useCallback(() => {\n setReloadToken((token) => token + 1)\n }, [])\n\n const handleDelete = React.useCallback(async (entry: TeamMemberRow) => {\n if (entry.kind !== 'member') return\n const message = labels.actions.deleteConfirm.replace('{{name}}', entry.displayName)\n if (typeof window !== 'undefined' && !window.confirm(message)) return\n try {\n await deleteCrud('staff/team-members', entry.id, { errorMessage: labels.errors.delete })\n flash(labels.messages.deleted, 'success')\n handleRefresh()\n } catch (error) {\n console.error('staff.team-members.delete', error)\n flash(labels.errors.delete, 'error')\n }\n }, [handleRefresh, labels.actions.deleteConfirm, labels.errors.delete, labels.messages.deleted])\n\n return (\n <Page>\n <PageBody>\n <DataTable<TeamMemberRow>\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 filters={filters}\n filterValues={filterValues}\n onFiltersApply={handleFiltersApply}\n onFiltersClear={handleFiltersClear}\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/staff/team-members/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) => row.kind === 'member' ? (\n <RowActions\n items={[\n { id: 'edit', label: labels.actions.edit, onSelect: () => { router.push(`/backend/staff/team-members/${row.id}`) } },\n { label: labels.actions.delete, destructive: true, onSelect: () => { void handleDelete(row) } },\n ]}\n />\n ) : null}\n />\n </PageBody>\n </Page>\n )\n}\n\ntype TeamMemberApiRow = {\n id: string\n displayName: string\n description: string | null\n userEmail: string | null\n roleNames: string[]\n roleIds: string[]\n tags: string[]\n isActive: boolean\n updatedAt: string | null\n teamId: string | null\n teamName: string | null\n}\n\ntype GroupedSortField = 'displayName' | 'userEmail' | 'roleNames' | 'tags' | 'isActive' | 'updatedAt'\n\nfunction mapApiTeamMember(item: Record<string, unknown>): TeamMemberApiRow {\n const id = typeof item.id === 'string' ? item.id : ''\n const displayName = typeof item.displayName === 'string'\n ? item.displayName\n : typeof item.display_name === 'string'\n ? item.display_name\n : id\n const description = typeof item.description === 'string' && item.description.trim().length\n ? item.description.trim()\n : null\n const user = item.user && typeof item.user === 'object' ? item.user as { email?: unknown } : null\n const userEmail = user && typeof user.email === 'string' && user.email.length ? user.email : null\n const roleNames = Array.isArray(item.roleNames) ? item.roleNames.filter((value): value is string => typeof value === 'string') : []\n const roleIds = Array.isArray(item.roleIds)\n ? item.roleIds.filter((value): value is string => typeof value === 'string')\n : Array.isArray(item.role_ids)\n ? item.role_ids.filter((value): value is string => typeof value === 'string')\n : []\n const tags = Array.isArray(item.tags) ? item.tags.filter((value): value is string => typeof value === 'string') : []\n const updatedAt = typeof item.updatedAt === 'string'\n ? item.updatedAt\n : typeof item.updated_at === 'string'\n ? item.updated_at\n : null\n const isActive = typeof item.isActive === 'boolean'\n ? item.isActive\n : typeof item.is_active === 'boolean'\n ? item.is_active\n : true\n const teamId = typeof item.teamId === 'string'\n ? item.teamId\n : typeof item.team_id === 'string'\n ? item.team_id\n : null\n const team = item.team && typeof item.team === 'object' ? item.team as { name?: unknown } : null\n const teamName = typeof team?.name === 'string' ? team.name : null\n return {\n id,\n displayName,\n description,\n userEmail,\n roleNames,\n roleIds,\n tags,\n isActive,\n updatedAt,\n teamId,\n teamName,\n }\n}\n\nfunction compareGroupedRows(\n field: GroupedSortField,\n labels: { unassignedTeam: string },\n left: TeamMemberRow,\n right: TeamMemberRow,\n): number {\n const leftTeam = (left.teamName ?? labels.unassignedTeam).toLocaleLowerCase()\n const rightTeam = (right.teamName ?? labels.unassignedTeam).toLocaleLowerCase()\n const teamComparison = leftTeam.localeCompare(rightTeam)\n if (teamComparison !== 0) return teamComparison\n if (left.kind !== right.kind) return left.kind === 'team' ? -1 : 1\n if (left.kind === 'team' && right.kind === 'team') return 0\n switch (field) {\n case 'displayName':\n return left.displayName.localeCompare(right.displayName)\n case 'userEmail':\n return (left.userEmail ?? '').localeCompare(right.userEmail ?? '')\n case 'roleNames':\n return left.roleNames.join(', ').localeCompare(right.roleNames.join(', '))\n case 'tags':\n return left.tags.join(', ').localeCompare(right.tags.join(', '))\n case 'isActive':\n return Number(left.isActive) - Number(right.isActive)\n case 'updatedAt':\n return compareDateStrings(left.updatedAt, right.updatedAt)\n }\n}\n\nfunction compareDateStrings(left: string | null, right: string | null): number {\n if (!left && !right) return 0\n if (!left) return -1\n if (!right) return 1\n const leftTime = Date.parse(left)\n const rightTime = Date.parse(right)\n if (Number.isNaN(leftTime) || Number.isNaN(rightTime)) {\n return left.localeCompare(right)\n }\n return leftTime - rightTime\n}\n\nfunction buildTeamMemberRows(\n items: TeamMemberApiRow[],\n labels: { unassignedTeam: string; unassignedRole: string; multipleRoles: string },\n): TeamMemberRow[] {\n const teamGroups = new Map<string, { teamId: string | null; name: string; members: TeamMemberApiRow[] }>()\n for (const member of items) {\n const key = member.teamId ?? 'unassigned'\n const name = member.teamName ?? labels.unassignedTeam\n const group = teamGroups.get(key) ?? { teamId: member.teamId ?? null, name, members: [] }\n group.members.push(member)\n teamGroups.set(key, group)\n }\n const sortedTeams = Array.from(teamGroups.values()).sort((a, b) => a.name.localeCompare(b.name))\n const rows: TeamMemberRow[] = []\n for (const team of sortedTeams) {\n rows.push({\n kind: 'team',\n id: `team:${team.teamId ?? 'unassigned'}`,\n teamId: team.teamId,\n teamName: team.name,\n roleLabel: null,\n displayName: team.name,\n description: null,\n userEmail: null,\n roleNames: [],\n tags: [],\n isActive: true,\n updatedAt: null,\n })\n const sortedMembers = [...team.members].sort((a, b) => a.displayName.localeCompare(b.displayName))\n for (const member of sortedMembers) {\n rows.push({\n kind: 'member',\n id: member.id,\n teamId: member.teamId,\n teamName: member.teamName,\n roleLabel: member.roleNames.length\n ? member.roleNames.join(', ')\n : labels.unassignedRole,\n displayName: member.displayName,\n description: member.description,\n userEmail: member.userEmail,\n roleNames: member.roleNames,\n tags: member.tags,\n isActive: member.isActive,\n updatedAt: member.updatedAt,\n })\n }\n }\n return rows\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\nfunction renderLabelPills(values: string[]): React.ReactNode {\n if (!values.length) return <span className=\"text-xs text-muted-foreground\">-</span>\n return (\n <div className=\"flex flex-wrap gap-2\">\n {values.map((value) => (\n <span key={value} className=\"inline-flex items-center rounded-full border px-3 py-1 text-xs font-medium\">\n {value}\n </span>\n ))}\n </div>\n )\n}\n\nfunction TeamsIcon({ className }: { className?: string }) {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n aria-hidden=\"true\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"3\" />\n <circle cx=\"16\" cy=\"8\" r=\"3\" />\n <path d=\"M3 20c0-3 3-5 5-5\" />\n <path d=\"M21 20c0-3-3-5-5-5\" />\n </svg>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -272,10 +272,10 @@ function StaffTeamRolesPage() {
272
272
  RowActions,
273
273
  {
274
274
  items: [
275
- { id: "edit", label: labels.actions.edit, onSelect: () => {
275
+ { label: labels.actions.edit, onSelect: () => {
276
276
  router.push(`/backend/staff/team-roles/${row.id}/edit`);
277
277
  } },
278
- { id: "delete", label: labels.actions.delete, destructive: true, onSelect: () => {
278
+ { label: labels.actions.delete, destructive: true, onSelect: () => {
279
279
  void handleDelete(row);
280
280
  } }
281
281
  ]