moonhead 1.0.0

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 (631) hide show
  1. package/README.md +32 -0
  2. package/dist/components/layout/app-header.d.ts +1 -0
  3. package/dist/components/layout/app-header.js +1 -0
  4. package/dist/components/layout/app-sidebar.d.ts +9 -0
  5. package/dist/components/layout/app-sidebar.js +1 -0
  6. package/dist/components/layout/brand-logo.d.ts +2 -0
  7. package/dist/components/layout/brand-logo.js +1 -0
  8. package/dist/components/layout/user-menu.d.ts +6 -0
  9. package/dist/components/layout/user-menu.js +1 -0
  10. package/dist/components/ui/action-form.d.ts +10 -0
  11. package/dist/components/ui/action-form.js +1 -0
  12. package/dist/components/ui/alert-dialog.d.ts +14 -0
  13. package/dist/components/ui/alert-dialog.js +1 -0
  14. package/dist/components/ui/alert.d.ts +12 -0
  15. package/dist/components/ui/alert.js +1 -0
  16. package/dist/components/ui/avatar.d.ts +12 -0
  17. package/dist/components/ui/avatar.js +1 -0
  18. package/dist/components/ui/badge.d.ts +2 -0
  19. package/dist/components/ui/badge.js +1 -0
  20. package/dist/components/ui/button.d.ts +12 -0
  21. package/dist/components/ui/button.js +1 -0
  22. package/dist/components/ui/card.d.ts +2 -0
  23. package/dist/components/ui/card.js +1 -0
  24. package/dist/components/ui/checkbox.d.ts +5 -0
  25. package/dist/components/ui/checkbox.js +1 -0
  26. package/dist/components/ui/combobox.d.ts +18 -0
  27. package/dist/components/ui/combobox.js +1 -0
  28. package/dist/components/ui/copy-button.d.ts +8 -0
  29. package/dist/components/ui/copy-button.js +1 -0
  30. package/dist/components/ui/country-select.d.ts +12 -0
  31. package/dist/components/ui/country-select.js +1 -0
  32. package/dist/components/ui/data-table.d.ts +11 -0
  33. package/dist/components/ui/data-table.js +1 -0
  34. package/dist/components/ui/date-range-picker.d.ts +25 -0
  35. package/dist/components/ui/date-range-picker.js +1 -0
  36. package/dist/components/ui/dialog.d.ts +19 -0
  37. package/dist/components/ui/dialog.js +1 -0
  38. package/dist/components/ui/drawer.d.ts +24 -0
  39. package/dist/components/ui/drawer.js +1 -0
  40. package/dist/components/ui/dropdown-menu.d.ts +17 -0
  41. package/dist/components/ui/dropdown-menu.js +1 -0
  42. package/dist/components/ui/field.d.ts +7 -0
  43. package/dist/components/ui/field.js +1 -0
  44. package/dist/components/ui/fieldset.d.ts +4 -0
  45. package/dist/components/ui/fieldset.js +1 -0
  46. package/dist/components/ui/form-field.d.ts +17 -0
  47. package/dist/components/ui/form-field.js +1 -0
  48. package/dist/components/ui/form.d.ts +3 -0
  49. package/dist/components/ui/form.js +1 -0
  50. package/dist/components/ui/icon-tile.d.ts +5 -0
  51. package/dist/components/ui/icon-tile.js +1 -0
  52. package/dist/components/ui/identity.d.ts +6 -0
  53. package/dist/components/ui/identity.js +1 -0
  54. package/dist/components/ui/input.d.ts +4 -0
  55. package/dist/components/ui/input.js +1 -0
  56. package/dist/components/ui/number-input.d.ts +19 -0
  57. package/dist/components/ui/number-input.js +1 -0
  58. package/dist/components/ui/otp-field.d.ts +6 -0
  59. package/dist/components/ui/otp-field.js +1 -0
  60. package/dist/components/ui/page-toolbar.d.ts +9 -0
  61. package/dist/components/ui/page-toolbar.js +1 -0
  62. package/dist/components/ui/password-input.d.ts +7 -0
  63. package/dist/components/ui/password-input.js +1 -0
  64. package/dist/components/ui/radio-group.d.ts +5 -0
  65. package/dist/components/ui/radio-group.js +1 -0
  66. package/dist/components/ui/search-input.d.ts +4 -0
  67. package/dist/components/ui/search-input.js +1 -0
  68. package/dist/components/ui/section-card.d.ts +7 -0
  69. package/dist/components/ui/section-card.js +1 -0
  70. package/dist/components/ui/select-field.d.ts +19 -0
  71. package/dist/components/ui/select-field.js +1 -0
  72. package/dist/components/ui/select.d.ts +17 -0
  73. package/dist/components/ui/select.js +1 -0
  74. package/dist/components/ui/sidebar.d.ts +27 -0
  75. package/dist/components/ui/sidebar.js +1 -0
  76. package/dist/components/ui/slider.d.ts +10 -0
  77. package/dist/components/ui/slider.js +1 -0
  78. package/dist/components/ui/sort-button.d.ts +5 -0
  79. package/dist/components/ui/sort-button.js +1 -0
  80. package/dist/components/ui/spinner.d.ts +4 -0
  81. package/dist/components/ui/spinner.js +1 -0
  82. package/dist/components/ui/status-badge.d.ts +11 -0
  83. package/dist/components/ui/status-badge.js +1 -0
  84. package/dist/components/ui/switch-field.d.ts +18 -0
  85. package/dist/components/ui/switch-field.js +1 -0
  86. package/dist/components/ui/switch.d.ts +3 -0
  87. package/dist/components/ui/switch.js +1 -0
  88. package/dist/components/ui/table-pagination.d.ts +9 -0
  89. package/dist/components/ui/table-pagination.js +1 -0
  90. package/dist/components/ui/table.d.ts +18 -0
  91. package/dist/components/ui/table.js +1 -0
  92. package/dist/components/ui/tabs.d.ts +8 -0
  93. package/dist/components/ui/tabs.js +1 -0
  94. package/dist/components/ui/tag-input.d.ts +9 -0
  95. package/dist/components/ui/tag-input.js +1 -0
  96. package/dist/components/ui/text-link.d.ts +10 -0
  97. package/dist/components/ui/text-link.js +1 -0
  98. package/dist/components/ui/textarea.d.ts +2 -0
  99. package/dist/components/ui/textarea.js +1 -0
  100. package/dist/components/ui/toast.d.ts +1 -0
  101. package/dist/components/ui/toast.js +1 -0
  102. package/dist/components/ui/tree.d.ts +32 -0
  103. package/dist/components/ui/tree.js +1 -0
  104. package/dist/db/client.d.ts +8 -0
  105. package/dist/db/client.js +1 -0
  106. package/dist/db/index.d.ts +3 -0
  107. package/dist/db/index.js +1 -0
  108. package/dist/db/logger.d.ts +2 -0
  109. package/dist/db/logger.js +1 -0
  110. package/dist/db/migrations/20260628182304_wonderful_groot/migration.sql +289 -0
  111. package/dist/db/migrations/20260628182304_wonderful_groot/snapshot.json +3750 -0
  112. package/dist/db/migrations/20260630082829_wet_robin_chapel/migration.sql +2 -0
  113. package/dist/db/migrations/20260630082829_wet_robin_chapel/snapshot.json +3791 -0
  114. package/dist/db/migrations/20260702132335_wooden_iron_monger/migration.sql +48 -0
  115. package/dist/db/migrations/20260702132335_wooden_iron_monger/snapshot.json +4407 -0
  116. package/dist/db/migrations/20260702142948_vengeful_rhino/migration.sql +1 -0
  117. package/dist/db/migrations/20260702142948_vengeful_rhino/snapshot.json +4420 -0
  118. package/dist/db/migrations/20260702185813_curved_pyro/migration.sql +16 -0
  119. package/dist/db/migrations/20260702185813_curved_pyro/snapshot.json +4646 -0
  120. package/dist/db/migrations/20260702192041_shiny_franklin_storm/migration.sql +16 -0
  121. package/dist/db/migrations/20260702192041_shiny_franklin_storm/snapshot.json +4872 -0
  122. package/dist/db/migrations/20260704101548_bizarre_namorita/migration.sql +1 -0
  123. package/dist/db/migrations/20260704101548_bizarre_namorita/snapshot.json +4885 -0
  124. package/dist/db/migrations/20260704105911_sleepy_juggernaut/migration.sql +1 -0
  125. package/dist/db/migrations/20260704105911_sleepy_juggernaut/snapshot.json +4898 -0
  126. package/dist/db/migrations/20260704115959_lean_sandman/migration.sql +1 -0
  127. package/dist/db/migrations/20260704115959_lean_sandman/snapshot.json +4885 -0
  128. package/dist/db/migrations/20260707231532_daffy_captain_stacy/migration.sql +10 -0
  129. package/dist/db/migrations/20260707231532_daffy_captain_stacy/snapshot.json +4919 -0
  130. package/dist/db/migrations/20260708190355_spooky_jimmy_woo/migration.sql +3 -0
  131. package/dist/db/migrations/20260708190355_spooky_jimmy_woo/snapshot.json +4970 -0
  132. package/dist/db/migrations/20260711145212_drop_legacy_earning_status/migration.sql +7 -0
  133. package/dist/db/migrations/20260711145212_drop_legacy_earning_status/snapshot.json +4968 -0
  134. package/dist/db/migrations/20260712161249_dashboard_stat_indexes/migration.sql +3 -0
  135. package/dist/db/migrations/20260712161249_dashboard_stat_indexes/snapshot.json +5038 -0
  136. package/dist/db/migrations/20260713013911_add_payout_paid_at/migration.sql +2 -0
  137. package/dist/db/migrations/20260713013911_add_payout_paid_at/snapshot.json +5072 -0
  138. package/dist/db/schema/analytics-outbox.d.ts +145 -0
  139. package/dist/db/schema/analytics-outbox.js +1 -0
  140. package/dist/db/schema/audit-logs.d.ts +204 -0
  141. package/dist/db/schema/audit-logs.js +1 -0
  142. package/dist/db/schema/campaigns.d.ts +180 -0
  143. package/dist/db/schema/campaigns.js +1 -0
  144. package/dist/db/schema/casinos.d.ts +129 -0
  145. package/dist/db/schema/casinos.js +1 -0
  146. package/dist/db/schema/commission-rule-groups.d.ts +84 -0
  147. package/dist/db/schema/commission-rule-groups.js +1 -0
  148. package/dist/db/schema/commission-rules.d.ts +145 -0
  149. package/dist/db/schema/commission-rules.js +1 -0
  150. package/dist/db/schema/commissions.d.ts +242 -0
  151. package/dist/db/schema/commissions.js +1 -0
  152. package/dist/db/schema/conversions.d.ts +302 -0
  153. package/dist/db/schema/conversions.js +1 -0
  154. package/dist/db/schema/deals.d.ts +180 -0
  155. package/dist/db/schema/deals.js +1 -0
  156. package/dist/db/schema/earnings.d.ts +262 -0
  157. package/dist/db/schema/earnings.js +1 -0
  158. package/dist/db/schema/groups.d.ts +214 -0
  159. package/dist/db/schema/groups.js +1 -0
  160. package/dist/db/schema/index.d.ts +18 -0
  161. package/dist/db/schema/index.js +1 -0
  162. package/dist/db/schema/payouts.d.ts +182 -0
  163. package/dist/db/schema/payouts.js +1 -0
  164. package/dist/db/schema/platform-settings.d.ts +84 -0
  165. package/dist/db/schema/platform-settings.js +1 -0
  166. package/dist/db/schema/player-activity.d.ts +159 -0
  167. package/dist/db/schema/player-activity.js +1 -0
  168. package/dist/db/schema/revshare-carryover.d.ts +129 -0
  169. package/dist/db/schema/revshare-carryover.js +1 -0
  170. package/dist/db/schema/sessions.d.ts +213 -0
  171. package/dist/db/schema/sessions.js +1 -0
  172. package/dist/db/schema/table.d.ts +1 -0
  173. package/dist/db/schema/table.js +1 -0
  174. package/dist/db/schema/users.d.ts +609 -0
  175. package/dist/db/schema/users.js +1 -0
  176. package/dist/db/schema/verification-tokens.d.ts +106 -0
  177. package/dist/db/schema/verification-tokens.js +1 -0
  178. package/dist/db/types/branded.d.ts +3 -0
  179. package/dist/db/types/branded.js +0 -0
  180. package/dist/db/types/commission-rules.d.ts +70 -0
  181. package/dist/db/types/commission-rules.js +1 -0
  182. package/dist/db/types/index.d.ts +2 -0
  183. package/dist/db/types/index.js +1 -0
  184. package/dist/emails/admin/support-message.d.ts +39 -0
  185. package/dist/emails/admin/support-message.js +5 -0
  186. package/dist/emails/affiliate/activated.d.ts +33 -0
  187. package/dist/emails/affiliate/activated.js +1 -0
  188. package/dist/emails/affiliate/deal-notice.d.ts +35 -0
  189. package/dist/emails/affiliate/deal-notice.js +1 -0
  190. package/dist/emails/affiliate/invite.d.ts +35 -0
  191. package/dist/emails/affiliate/invite.js +1 -0
  192. package/dist/emails/affiliate/signup-verify.d.ts +35 -0
  193. package/dist/emails/affiliate/signup-verify.js +1 -0
  194. package/dist/emails/auth/password-reset.d.ts +37 -0
  195. package/dist/emails/auth/password-reset.js +1 -0
  196. package/dist/emails/layout.d.ts +10 -0
  197. package/dist/emails/layout.js +1 -0
  198. package/dist/emails/manager/affiliate-activated.d.ts +33 -0
  199. package/dist/emails/manager/affiliate-activated.js +1 -0
  200. package/dist/emails/manager/bulk-affiliates-activated.d.ts +33 -0
  201. package/dist/emails/manager/bulk-affiliates-activated.js +1 -0
  202. package/dist/emails/manager/invite.d.ts +35 -0
  203. package/dist/emails/manager/invite.js +1 -0
  204. package/dist/emails/manager/pending-approval.d.ts +33 -0
  205. package/dist/emails/manager/pending-approval.js +1 -0
  206. package/dist/emails/preview-env.d.ts +2 -0
  207. package/dist/emails/preview-env.js +1 -0
  208. package/dist/features/affiliates/actions.d.ts +60 -0
  209. package/dist/features/affiliates/actions.js +1 -0
  210. package/dist/features/affiliates/activation-email.d.ts +8 -0
  211. package/dist/features/affiliates/activation-email.js +1 -0
  212. package/dist/features/affiliates/bulk-approve.d.ts +2 -0
  213. package/dist/features/affiliates/bulk-approve.js +1 -0
  214. package/dist/features/affiliates/components/affiliate-actions-menu.d.ts +6 -0
  215. package/dist/features/affiliates/components/affiliate-actions-menu.js +1 -0
  216. package/dist/features/affiliates/components/affiliate-create-button.d.ts +1 -0
  217. package/dist/features/affiliates/components/affiliate-create-button.js +1 -0
  218. package/dist/features/affiliates/components/affiliate-detail-tabs.d.ts +6 -0
  219. package/dist/features/affiliates/components/affiliate-detail-tabs.js +1 -0
  220. package/dist/features/affiliates/components/affiliate-dialog.d.ts +11 -0
  221. package/dist/features/affiliates/components/affiliate-dialog.js +1 -0
  222. package/dist/features/affiliates/components/affiliate-profile-fields.d.ts +6 -0
  223. package/dist/features/affiliates/components/affiliate-profile-fields.js +1 -0
  224. package/dist/features/affiliates/components/affiliate-status-badge.d.ts +4 -0
  225. package/dist/features/affiliates/components/affiliate-status-badge.js +1 -0
  226. package/dist/features/affiliates/components/affiliate-status-tabs.d.ts +4 -0
  227. package/dist/features/affiliates/components/affiliate-status-tabs.js +1 -0
  228. package/dist/features/affiliates/components/affiliates-table.d.ts +10 -0
  229. package/dist/features/affiliates/components/affiliates-table.js +1 -0
  230. package/dist/features/affiliates/components/assign-parent-dialog.d.ts +5 -0
  231. package/dist/features/affiliates/components/assign-parent-dialog.js +1 -0
  232. package/dist/features/affiliates/components/detach-affiliate-confirm.d.ts +5 -0
  233. package/dist/features/affiliates/components/detach-affiliate-confirm.js +1 -0
  234. package/dist/features/affiliates/components/reject-affiliate-confirm.d.ts +5 -0
  235. package/dist/features/affiliates/components/reject-affiliate-confirm.js +1 -0
  236. package/dist/features/affiliates/components/sub-affiliate-invite-button.d.ts +3 -0
  237. package/dist/features/affiliates/components/sub-affiliate-invite-button.js +1 -0
  238. package/dist/features/affiliates/invite.d.ts +6 -0
  239. package/dist/features/affiliates/invite.js +1 -0
  240. package/dist/features/affiliates/list-params.d.ts +27 -0
  241. package/dist/features/affiliates/list-params.js +1 -0
  242. package/dist/features/affiliates/pending-notification.d.ts +18 -0
  243. package/dist/features/affiliates/pending-notification.js +1 -0
  244. package/dist/features/affiliates/sub-invite.d.ts +7 -0
  245. package/dist/features/affiliates/sub-invite.js +1 -0
  246. package/dist/features/audit/action-labels.d.ts +15 -0
  247. package/dist/features/audit/action-labels.js +1 -0
  248. package/dist/features/audit/components/audit-log-table.d.ts +5 -0
  249. package/dist/features/audit/components/audit-log-table.js +1 -0
  250. package/dist/features/audit/list-params.d.ts +2 -0
  251. package/dist/features/audit/list-params.js +1 -0
  252. package/dist/features/audit/read.d.ts +27 -0
  253. package/dist/features/audit/read.js +1 -0
  254. package/dist/features/auth/actions.d.ts +33 -0
  255. package/dist/features/auth/actions.js +1 -0
  256. package/dist/features/auth/authorization.d.ts +14 -0
  257. package/dist/features/auth/authorization.js +1 -0
  258. package/dist/features/auth/components/accept-invite-form.d.ts +3 -0
  259. package/dist/features/auth/components/accept-invite-form.js +1 -0
  260. package/dist/features/auth/components/forgot-password-form.d.ts +1 -0
  261. package/dist/features/auth/components/forgot-password-form.js +1 -0
  262. package/dist/features/auth/components/permissions-form.d.ts +5 -0
  263. package/dist/features/auth/components/permissions-form.js +1 -0
  264. package/dist/features/auth/components/reset-password-form.d.ts +3 -0
  265. package/dist/features/auth/components/reset-password-form.js +1 -0
  266. package/dist/features/auth/components/signin-form.d.ts +5 -0
  267. package/dist/features/auth/components/signin-form.js +1 -0
  268. package/dist/features/auth/components/signup-form.d.ts +1 -0
  269. package/dist/features/auth/components/signup-form.js +1 -0
  270. package/dist/features/auth/components/verify-email-form.d.ts +3 -0
  271. package/dist/features/auth/components/verify-email-form.js +1 -0
  272. package/dist/features/auth/password-reset.d.ts +6 -0
  273. package/dist/features/auth/password-reset.js +1 -0
  274. package/dist/features/auth/permissions.d.ts +49 -0
  275. package/dist/features/auth/permissions.js +1 -0
  276. package/dist/features/auth/require.d.ts +3 -0
  277. package/dist/features/auth/require.js +1 -0
  278. package/dist/features/auth/signup-email.d.ts +6 -0
  279. package/dist/features/auth/signup-email.js +1 -0
  280. package/dist/features/campaigns/actions.d.ts +53 -0
  281. package/dist/features/campaigns/actions.js +1 -0
  282. package/dist/features/campaigns/components/campaign-dialog.d.ts +7 -0
  283. package/dist/features/campaigns/components/campaign-dialog.js +1 -0
  284. package/dist/features/campaigns/components/campaign-row-actions.d.ts +8 -0
  285. package/dist/features/campaigns/components/campaign-row-actions.js +1 -0
  286. package/dist/features/campaigns/components/campaign-status-badge.d.ts +6 -0
  287. package/dist/features/campaigns/components/campaign-status-badge.js +1 -0
  288. package/dist/features/campaigns/components/campaign-status-tabs.d.ts +1 -0
  289. package/dist/features/campaigns/components/campaign-status-tabs.js +1 -0
  290. package/dist/features/campaigns/components/campaigns-table.d.ts +7 -0
  291. package/dist/features/campaigns/components/campaigns-table.js +1 -0
  292. package/dist/features/campaigns/components/create-campaign-button.d.ts +5 -0
  293. package/dist/features/campaigns/components/create-campaign-button.js +1 -0
  294. package/dist/features/campaigns/components/sub-id-builder.d.ts +4 -0
  295. package/dist/features/campaigns/components/sub-id-builder.js +1 -0
  296. package/dist/features/campaigns/components/tracking-link-box.d.ts +3 -0
  297. package/dist/features/campaigns/components/tracking-link-box.js +1 -0
  298. package/dist/features/campaigns/components/tracking-link-cell.d.ts +4 -0
  299. package/dist/features/campaigns/components/tracking-link-cell.js +1 -0
  300. package/dist/features/campaigns/components/tracking-link-dialog.d.ts +6 -0
  301. package/dist/features/campaigns/components/tracking-link-dialog.js +1 -0
  302. package/dist/features/campaigns/list-params.d.ts +14 -0
  303. package/dist/features/campaigns/list-params.js +1 -0
  304. package/dist/features/campaigns/tracking-url.d.ts +8 -0
  305. package/dist/features/campaigns/tracking-url.js +1 -0
  306. package/dist/features/casinos/actions.d.ts +39 -0
  307. package/dist/features/casinos/actions.js +1 -0
  308. package/dist/features/casinos/components/casino-create-button.d.ts +1 -0
  309. package/dist/features/casinos/components/casino-create-button.js +1 -0
  310. package/dist/features/casinos/components/casino-dialog.d.ts +11 -0
  311. package/dist/features/casinos/components/casino-dialog.js +1 -0
  312. package/dist/features/casinos/components/casino-form-fields.d.ts +7 -0
  313. package/dist/features/casinos/components/casino-form-fields.js +1 -0
  314. package/dist/features/casinos/components/casino-status-tabs.d.ts +1 -0
  315. package/dist/features/casinos/components/casino-status-tabs.js +1 -0
  316. package/dist/features/casinos/components/casinos-table.d.ts +6 -0
  317. package/dist/features/casinos/components/casinos-table.js +1 -0
  318. package/dist/features/casinos/components/delete-casino-confirm.d.ts +5 -0
  319. package/dist/features/casinos/components/delete-casino-confirm.js +1 -0
  320. package/dist/features/casinos/list-params.d.ts +14 -0
  321. package/dist/features/casinos/list-params.js +1 -0
  322. package/dist/features/commissions/actions.d.ts +76 -0
  323. package/dist/features/commissions/actions.js +1 -0
  324. package/dist/features/commissions/components/casino-bindings-field.d.ts +10 -0
  325. package/dist/features/commissions/components/casino-bindings-field.js +1 -0
  326. package/dist/features/commissions/components/commission-create-button.d.ts +1 -0
  327. package/dist/features/commissions/components/commission-create-button.js +1 -0
  328. package/dist/features/commissions/components/commission-detail-dialog.d.ts +5 -0
  329. package/dist/features/commissions/components/commission-detail-dialog.js +1 -0
  330. package/dist/features/commissions/components/commission-editor.d.ts +8 -0
  331. package/dist/features/commissions/components/commission-editor.js +1 -0
  332. package/dist/features/commissions/components/commission-read-view.d.ts +5 -0
  333. package/dist/features/commissions/components/commission-read-view.js +1 -0
  334. package/dist/features/commissions/components/commission-status-badge.d.ts +4 -0
  335. package/dist/features/commissions/components/commission-status-badge.js +1 -0
  336. package/dist/features/commissions/components/commission-status-tabs.d.ts +1 -0
  337. package/dist/features/commissions/components/commission-status-tabs.js +1 -0
  338. package/dist/features/commissions/components/commissions-table.d.ts +14 -0
  339. package/dist/features/commissions/components/commissions-table.js +1 -0
  340. package/dist/features/commissions/components/delete-commission-confirm.d.ts +5 -0
  341. package/dist/features/commissions/components/delete-commission-confirm.js +1 -0
  342. package/dist/features/commissions/components/duplicate-commission-dialog.d.ts +6 -0
  343. package/dist/features/commissions/components/duplicate-commission-dialog.js +1 -0
  344. package/dist/features/commissions/components/rule-editor/conditions-block.d.ts +9 -0
  345. package/dist/features/commissions/components/rule-editor/conditions-block.js +1 -0
  346. package/dist/features/commissions/components/rule-editor/modifiers-block.d.ts +9 -0
  347. package/dist/features/commissions/components/rule-editor/modifiers-block.js +1 -0
  348. package/dist/features/commissions/components/rule-editor/qualifiers-block.d.ts +9 -0
  349. package/dist/features/commissions/components/rule-editor/qualifiers-block.js +1 -0
  350. package/dist/features/commissions/components/rule-editor/reducer.d.ts +102 -0
  351. package/dist/features/commissions/components/rule-editor/reducer.js +1 -0
  352. package/dist/features/commissions/components/rule-editor/rewards-block.d.ts +9 -0
  353. package/dist/features/commissions/components/rule-editor/rewards-block.js +1 -0
  354. package/dist/features/commissions/components/rule-editor/rule-card.d.ts +10 -0
  355. package/dist/features/commissions/components/rule-editor/rule-card.js +1 -0
  356. package/dist/features/commissions/components/rule-editor/rule-editor.d.ts +7 -0
  357. package/dist/features/commissions/components/rule-editor/rule-editor.js +1 -0
  358. package/dist/features/commissions/components/rule-editor/rule-group-card.d.ts +9 -0
  359. package/dist/features/commissions/components/rule-editor/rule-group-card.js +1 -0
  360. package/dist/features/commissions/components/rule-editor/state.d.ts +21 -0
  361. package/dist/features/commissions/components/rule-editor/state.js +1 -0
  362. package/dist/features/commissions/components/rule-groups-read-view.d.ts +4 -0
  363. package/dist/features/commissions/components/rule-groups-read-view.js +1 -0
  364. package/dist/features/commissions/list-params.d.ts +14 -0
  365. package/dist/features/commissions/list-params.js +1 -0
  366. package/dist/features/commissions/rule-validation.d.ts +173 -0
  367. package/dist/features/commissions/rule-validation.js +1 -0
  368. package/dist/features/dashboard/affiliate-queries.d.ts +14 -0
  369. package/dist/features/dashboard/affiliate-queries.js +1 -0
  370. package/dist/features/dashboard/clickhouse.d.ts +3 -0
  371. package/dist/features/dashboard/clickhouse.js +2 -0
  372. package/dist/features/dashboard/components/affiliate-charts.d.ts +5 -0
  373. package/dist/features/dashboard/components/affiliate-charts.js +1 -0
  374. package/dist/features/dashboard/components/affiliate-stats.d.ts +5 -0
  375. package/dist/features/dashboard/components/affiliate-stats.js +1 -0
  376. package/dist/features/dashboard/components/charts/funnel-chart.d.ts +11 -0
  377. package/dist/features/dashboard/components/charts/funnel-chart.js +1 -0
  378. package/dist/features/dashboard/components/charts/rank-bar-chart.d.ts +10 -0
  379. package/dist/features/dashboard/components/charts/rank-bar-chart.js +1 -0
  380. package/dist/features/dashboard/components/charts/time-series-chart.d.ts +12 -0
  381. package/dist/features/dashboard/components/charts/time-series-chart.js +1 -0
  382. package/dist/features/dashboard/components/charts-grid.d.ts +8 -0
  383. package/dist/features/dashboard/components/charts-grid.js +1 -0
  384. package/dist/features/dashboard/components/dashboard-charts.d.ts +4 -0
  385. package/dist/features/dashboard/components/dashboard-charts.js +1 -0
  386. package/dist/features/dashboard/components/dashboard-period-tabs.d.ts +1 -0
  387. package/dist/features/dashboard/components/dashboard-period-tabs.js +1 -0
  388. package/dist/features/dashboard/components/money-stat-card.d.ts +6 -0
  389. package/dist/features/dashboard/components/money-stat-card.js +1 -0
  390. package/dist/features/dashboard/components/stat-card.d.ts +6 -0
  391. package/dist/features/dashboard/components/stat-card.js +1 -0
  392. package/dist/features/dashboard/components/top-affiliates.d.ts +4 -0
  393. package/dist/features/dashboard/components/top-affiliates.js +1 -0
  394. package/dist/features/dashboard/list-params.d.ts +24 -0
  395. package/dist/features/dashboard/list-params.js +1 -0
  396. package/dist/features/dashboard/queries.d.ts +63 -0
  397. package/dist/features/dashboard/queries.js +1 -0
  398. package/dist/features/dashboard/series.d.ts +32 -0
  399. package/dist/features/dashboard/series.js +1 -0
  400. package/dist/features/deals/actions.d.ts +60 -0
  401. package/dist/features/deals/actions.js +1 -0
  402. package/dist/features/deals/components/affiliate-deals.d.ts +10 -0
  403. package/dist/features/deals/components/affiliate-deals.js +1 -0
  404. package/dist/features/deals/components/assign-deal-button.d.ts +9 -0
  405. package/dist/features/deals/components/assign-deal-button.js +1 -0
  406. package/dist/features/deals/components/deal-dialog.d.ts +19 -0
  407. package/dist/features/deals/components/deal-dialog.js +1 -0
  408. package/dist/features/deals/components/deal-row-actions.d.ts +6 -0
  409. package/dist/features/deals/components/deal-row-actions.js +1 -0
  410. package/dist/features/deals/components/deal-status-badge.d.ts +10 -0
  411. package/dist/features/deals/components/deal-status-badge.js +1 -0
  412. package/dist/features/deals/components/deal-status-tabs.d.ts +1 -0
  413. package/dist/features/deals/components/deal-status-tabs.js +1 -0
  414. package/dist/features/deals/components/delegate-deal-button.d.ts +8 -0
  415. package/dist/features/deals/components/delegate-deal-button.js +1 -0
  416. package/dist/features/deals/deal-assigned-email.d.ts +11 -0
  417. package/dist/features/deals/deal-assigned-email.js +1 -0
  418. package/dist/features/deals/deal-delegated-email.d.ts +13 -0
  419. package/dist/features/deals/deal-delegated-email.js +1 -0
  420. package/dist/features/deals/list-params.d.ts +14 -0
  421. package/dist/features/deals/list-params.js +1 -0
  422. package/dist/features/earnings/components/earnings-balances.d.ts +4 -0
  423. package/dist/features/earnings/components/earnings-balances.js +1 -0
  424. package/dist/features/earnings/components/earnings-ledger.d.ts +5 -0
  425. package/dist/features/earnings/components/earnings-ledger.js +1 -0
  426. package/dist/features/earnings/components/earnings-status-badge.d.ts +4 -0
  427. package/dist/features/earnings/components/earnings-status-badge.js +1 -0
  428. package/dist/features/earnings/components/earnings-status-tabs.d.ts +1 -0
  429. package/dist/features/earnings/components/earnings-status-tabs.js +1 -0
  430. package/dist/features/earnings/components/sub-affiliate-earnings.d.ts +4 -0
  431. package/dist/features/earnings/components/sub-affiliate-earnings.js +1 -0
  432. package/dist/features/earnings/list-params.d.ts +14 -0
  433. package/dist/features/earnings/list-params.js +1 -0
  434. package/dist/features/earnings/queries.d.ts +30 -0
  435. package/dist/features/earnings/queries.js +1 -0
  436. package/dist/features/groups/actions.d.ts +36 -0
  437. package/dist/features/groups/actions.js +1 -0
  438. package/dist/features/groups/components/delete-group-confirm.d.ts +5 -0
  439. package/dist/features/groups/components/delete-group-confirm.js +1 -0
  440. package/dist/features/groups/components/group-create-button.d.ts +1 -0
  441. package/dist/features/groups/components/group-create-button.js +1 -0
  442. package/dist/features/groups/components/group-dialog.d.ts +11 -0
  443. package/dist/features/groups/components/group-dialog.js +1 -0
  444. package/dist/features/groups/components/group-form-fields.d.ts +10 -0
  445. package/dist/features/groups/components/group-form-fields.js +1 -0
  446. package/dist/features/groups/components/group-status-tabs.d.ts +1 -0
  447. package/dist/features/groups/components/group-status-tabs.js +1 -0
  448. package/dist/features/groups/components/groups-table.d.ts +9 -0
  449. package/dist/features/groups/components/groups-table.js +1 -0
  450. package/dist/features/groups/list-params.d.ts +14 -0
  451. package/dist/features/groups/list-params.js +1 -0
  452. package/dist/features/managers/actions.d.ts +43 -0
  453. package/dist/features/managers/actions.js +1 -0
  454. package/dist/features/managers/components/manager-create-button.d.ts +1 -0
  455. package/dist/features/managers/components/manager-create-button.js +1 -0
  456. package/dist/features/managers/components/manager-dialog.d.ts +11 -0
  457. package/dist/features/managers/components/manager-dialog.js +1 -0
  458. package/dist/features/managers/components/manager-permissions-dialog.d.ts +7 -0
  459. package/dist/features/managers/components/manager-permissions-dialog.js +1 -0
  460. package/dist/features/managers/components/manager-profile-fields.d.ts +7 -0
  461. package/dist/features/managers/components/manager-profile-fields.js +1 -0
  462. package/dist/features/managers/components/manager-status-tabs.d.ts +1 -0
  463. package/dist/features/managers/components/manager-status-tabs.js +1 -0
  464. package/dist/features/managers/components/managers-table.d.ts +8 -0
  465. package/dist/features/managers/components/managers-table.js +1 -0
  466. package/dist/features/managers/invite.d.ts +6 -0
  467. package/dist/features/managers/invite.js +1 -0
  468. package/dist/features/managers/list-params.d.ts +14 -0
  469. package/dist/features/managers/list-params.js +1 -0
  470. package/dist/features/payouts/actions.d.ts +12 -0
  471. package/dist/features/payouts/actions.js +1 -0
  472. package/dist/features/payouts/balance.d.ts +2 -0
  473. package/dist/features/payouts/balance.js +1 -0
  474. package/dist/features/payouts/components/my-payouts-table.d.ts +5 -0
  475. package/dist/features/payouts/components/my-payouts-table.js +1 -0
  476. package/dist/features/payouts/components/payout-row-actions.d.ts +5 -0
  477. package/dist/features/payouts/components/payout-row-actions.js +1 -0
  478. package/dist/features/payouts/components/payout-status-badge.d.ts +4 -0
  479. package/dist/features/payouts/components/payout-status-badge.js +1 -0
  480. package/dist/features/payouts/components/payout-status-tabs.d.ts +1 -0
  481. package/dist/features/payouts/components/payout-status-tabs.js +1 -0
  482. package/dist/features/payouts/components/payouts-table.d.ts +6 -0
  483. package/dist/features/payouts/components/payouts-table.js +1 -0
  484. package/dist/features/payouts/components/request-payout-dialog.d.ts +4 -0
  485. package/dist/features/payouts/components/request-payout-dialog.js +1 -0
  486. package/dist/features/payouts/constants.d.ts +2 -0
  487. package/dist/features/payouts/constants.js +1 -0
  488. package/dist/features/payouts/list-params.d.ts +14 -0
  489. package/dist/features/payouts/list-params.js +1 -0
  490. package/dist/features/payouts/my-queries.d.ts +14 -0
  491. package/dist/features/payouts/my-queries.js +1 -0
  492. package/dist/features/payouts/queries.d.ts +14 -0
  493. package/dist/features/payouts/queries.js +1 -0
  494. package/dist/features/postbacks/actions.d.ts +27 -0
  495. package/dist/features/postbacks/actions.js +1 -0
  496. package/dist/features/postbacks/components/integration-dialog.d.ts +6 -0
  497. package/dist/features/postbacks/components/integration-dialog.js +1 -0
  498. package/dist/features/postbacks/components/postback-editor.d.ts +5 -0
  499. package/dist/features/postbacks/components/postback-editor.js +1 -0
  500. package/dist/features/postbacks/components/postbacks-table.d.ts +4 -0
  501. package/dist/features/postbacks/components/postbacks-table.js +1 -0
  502. package/dist/features/settings/actions.d.ts +2 -0
  503. package/dist/features/settings/actions.js +1 -0
  504. package/dist/features/settings/components/affiliate-approval-setting.d.ts +3 -0
  505. package/dist/features/settings/components/affiliate-approval-setting.js +1 -0
  506. package/dist/features/settings/components/manager-totp-setting.d.ts +3 -0
  507. package/dist/features/settings/components/manager-totp-setting.js +1 -0
  508. package/dist/features/support/actions.d.ts +12 -0
  509. package/dist/features/support/actions.js +1 -0
  510. package/dist/features/support/components/support-page.d.ts +4 -0
  511. package/dist/features/support/components/support-page.js +1 -0
  512. package/dist/features/support/email.d.ts +13 -0
  513. package/dist/features/support/email.js +1 -0
  514. package/dist/features/users/actions.d.ts +4 -0
  515. package/dist/features/users/actions.js +1 -0
  516. package/dist/features/users/components/password-section.d.ts +1 -0
  517. package/dist/features/users/components/password-section.js +1 -0
  518. package/dist/features/users/components/preferences-section.d.ts +4 -0
  519. package/dist/features/users/components/preferences-section.js +1 -0
  520. package/dist/features/users/components/settings-tabs.d.ts +1 -0
  521. package/dist/features/users/components/settings-tabs.js +1 -0
  522. package/dist/features/users/components/totp-section.d.ts +4 -0
  523. package/dist/features/users/components/totp-section.js +1 -0
  524. package/dist/features/users/list-params.d.ts +12 -0
  525. package/dist/features/users/list-params.js +1 -0
  526. package/dist/features/users/totp.d.ts +7 -0
  527. package/dist/features/users/totp.js +1 -0
  528. package/dist/i18n/config.d.ts +5 -0
  529. package/dist/i18n/config.js +1 -0
  530. package/dist/i18n/get-locale.d.ts +3 -0
  531. package/dist/i18n/get-locale.js +1 -0
  532. package/dist/i18n/locale.d.ts +2 -0
  533. package/dist/i18n/locale.js +1 -0
  534. package/dist/lib/actions/parse-form.d.ts +3 -0
  535. package/dist/lib/actions/parse-form.js +1 -0
  536. package/dist/lib/actions/state.d.ts +22 -0
  537. package/dist/lib/actions/state.js +0 -0
  538. package/dist/lib/audit/actions.d.ts +9 -0
  539. package/dist/lib/audit/actions.js +1 -0
  540. package/dist/lib/audit/record.d.ts +4 -0
  541. package/dist/lib/audit/record.js +1 -0
  542. package/dist/lib/auth/action.d.ts +45 -0
  543. package/dist/lib/auth/action.js +1 -0
  544. package/dist/lib/auth/config.d.ts +24 -0
  545. package/dist/lib/auth/config.js +1 -0
  546. package/dist/lib/auth/jwt.d.ts +17 -0
  547. package/dist/lib/auth/jwt.js +1 -0
  548. package/dist/lib/auth/password-options.d.ts +6 -0
  549. package/dist/lib/auth/password-options.js +1 -0
  550. package/dist/lib/auth/password.d.ts +3 -0
  551. package/dist/lib/auth/password.js +1 -0
  552. package/dist/lib/auth/session.d.ts +26 -0
  553. package/dist/lib/auth/session.js +1 -0
  554. package/dist/lib/auth/tokens.d.ts +43 -0
  555. package/dist/lib/auth/tokens.js +1 -0
  556. package/dist/lib/auth/totp-challenge.d.ts +4 -0
  557. package/dist/lib/auth/totp-challenge.js +1 -0
  558. package/dist/lib/auth/totp.d.ts +7 -0
  559. package/dist/lib/auth/totp.js +1 -0
  560. package/dist/lib/auth/verification-tokens.d.ts +19 -0
  561. package/dist/lib/auth/verification-tokens.js +1 -0
  562. package/dist/lib/cn.d.ts +2 -0
  563. package/dist/lib/cn.js +1 -0
  564. package/dist/lib/countries.d.ts +18 -0
  565. package/dist/lib/countries.js +1 -0
  566. package/dist/lib/currencies.d.ts +6 -0
  567. package/dist/lib/currencies.js +1 -0
  568. package/dist/lib/data/countries-by-continent.json +257 -0
  569. package/dist/lib/db/errors.d.ts +4 -0
  570. package/dist/lib/db/errors.js +1 -0
  571. package/dist/lib/email/client.d.ts +6 -0
  572. package/dist/lib/email/client.js +1 -0
  573. package/dist/lib/email/env.d.ts +12 -0
  574. package/dist/lib/email/env.js +1 -0
  575. package/dist/lib/email/format.d.ts +5 -0
  576. package/dist/lib/email/format.js +1 -0
  577. package/dist/lib/email/locale.d.ts +3 -0
  578. package/dist/lib/email/locale.js +1 -0
  579. package/dist/lib/email/send.d.ts +12 -0
  580. package/dist/lib/email/send.js +1 -0
  581. package/dist/lib/env.d.ts +20 -0
  582. package/dist/lib/env.js +1 -0
  583. package/dist/lib/errors/codes.d.ts +72 -0
  584. package/dist/lib/errors/codes.js +1 -0
  585. package/dist/lib/errors/server.d.ts +10 -0
  586. package/dist/lib/errors/server.js +1 -0
  587. package/dist/lib/format.d.ts +3 -0
  588. package/dist/lib/format.js +1 -0
  589. package/dist/lib/hooks/use-deferred-dialog.d.ts +11 -0
  590. package/dist/lib/hooks/use-deferred-dialog.js +1 -0
  591. package/dist/lib/hooks/use-form-reset.d.ts +2 -0
  592. package/dist/lib/hooks/use-form-reset.js +1 -0
  593. package/dist/lib/hooks/use-form-toast.d.ts +2 -0
  594. package/dist/lib/hooks/use-form-toast.js +1 -0
  595. package/dist/lib/i18n/format-datetime.d.ts +1 -0
  596. package/dist/lib/i18n/format-datetime.js +1 -0
  597. package/dist/lib/i18n/relative-time.d.ts +1 -0
  598. package/dist/lib/i18n/relative-time.js +1 -0
  599. package/dist/lib/list-params.d.ts +51 -0
  600. package/dist/lib/list-params.js +1 -0
  601. package/dist/lib/money.d.ts +2 -0
  602. package/dist/lib/money.js +1 -0
  603. package/dist/lib/platform-settings.d.ts +5 -0
  604. package/dist/lib/platform-settings.js +1 -0
  605. package/dist/lib/preferences/actions.d.ts +1 -0
  606. package/dist/lib/preferences/actions.js +1 -0
  607. package/dist/lib/preferences/index.d.ts +15 -0
  608. package/dist/lib/preferences/index.js +1 -0
  609. package/dist/lib/preferences/read.d.ts +2 -0
  610. package/dist/lib/preferences/read.js +1 -0
  611. package/dist/lib/slug.d.ts +1 -0
  612. package/dist/lib/slug.js +1 -0
  613. package/dist/lib/toast.d.ts +13 -0
  614. package/dist/lib/toast.js +1 -0
  615. package/dist/lib/tracking-cache.d.ts +2 -0
  616. package/dist/lib/tracking-cache.js +1 -0
  617. package/dist/lib/users.d.ts +12 -0
  618. package/dist/lib/users.js +1 -0
  619. package/dist/lib/validation/zod.d.ts +30 -0
  620. package/dist/lib/validation/zod.js +1 -0
  621. package/dist/messages/de/emails.json +136 -0
  622. package/dist/messages/de/index.json +1104 -0
  623. package/dist/messages/en/emails.json +136 -0
  624. package/dist/messages/en/index.json +1104 -0
  625. package/dist/theme/config.d.ts +8 -0
  626. package/dist/theme/config.js +1 -0
  627. package/dist/theme/get-theme.d.ts +3 -0
  628. package/dist/theme/get-theme.js +1 -0
  629. package/dist/theme/theme.d.ts +2 -0
  630. package/dist/theme/theme.js +1 -0
  631. package/package.json +131 -0
@@ -0,0 +1 @@
1
+ "use client";import{jsx as e,jsxs as r}from"react/jsx-runtime";import{DEAL_STATUS as S}from"../../../db/schema/index.js";import{IconReceipt as g}from"@tabler/icons-react";import{useFormatter as A,useTranslations as y}from"next-intl";import{useCallback as C,useMemo as b,useRef as v}from"react";import{DataTable as N}from"../../../components/ui/data-table.js";import{Identity as T}from"../../../components/ui/identity.js";import{SortButton as D}from"../../../components/ui/sort-button.js";import{TablePagination as I}from"../../../components/ui/table-pagination.js";import{TextButton as R}from"../../../components/ui/text-link.js";import{getCommissionForDealView as P}from"../../commissions/actions.js";import{CommissionDetailDialog as z}from"../../commissions/components/commission-detail-dialog.js";import{DealRowActions as B}from"./deal-row-actions.js";import{DealStatusBadge as E}from"./deal-status-badge.js";import{DelegateDealButton as k}from"./delegate-deal-button.js";import{useDeferredDialog as O}from"../../../lib/hooks/use-deferred-dialog.js";import{PAGE_SIZE_OPTIONS as W}from"../../../lib/list-params.js";function $({result:s,canManage:n,canDelegate:l=!1,delegateMode:u="self",subAffiliateOptions:a=[]}){const i=y("Deals"),c=A(),m=v(null),d=O(()=>m.current?P(m.current):Promise.resolve(null)),f=d.trigger,p=C(o=>{m.current=o,f()},[f]),h=b(()=>{const o=t=>t?c.dateTime(t,{day:"numeric",month:"short",year:"numeric"}):i("openEnded");return[{id:"commission",header:()=>i("columnCommission"),cell:({row:t})=>e(T,{visual:e("div",{className:"flex size-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground",children:e(g,{size:18,"aria-hidden":!0})}),primary:e(R,{onClick:()=>p(t.original.commission.id),children:t.original.commission.title??i("untitledCommission")})})},{id:"status",header:()=>i("columnStatus"),cell:({row:t})=>e(E,{status:t.original.status,commissionStatus:t.original.commission.status})},{id:"startsAt",header:()=>e(D,{column:"startsAt",children:i("columnStartsAt")}),cell:({row:t})=>e("span",{className:"text-sm text-muted-foreground tabular-nums",children:o(t.original.startsAt)})},{id:"endsAt",header:()=>e(D,{column:"endsAt",children:i("columnEndsAt")}),cell:({row:t})=>e("span",{className:"text-sm text-muted-foreground tabular-nums",children:o(t.original.endsAt)})},...n||l&&a.length>0?[{id:"actions",header:()=>e("span",{className:"sr-only",children:i("rowActions")}),cell:({row:t})=>{const x=l&&a.length>0&&t.original.commission.allowSubAffiliates&&t.original.parentDealId===null&&t.original.status===S.active;return r("div",{className:"flex items-center justify-end gap-2",children:[x?e(k,{parentDealId:t.original.id,mode:u,maxPercent:t.original.commission.subAffiliateMaxPercent,subAffiliateOptions:a}):null,n?e(B,{dealId:t.original.id,status:t.original.status,commissionStatus:t.original.commission.status}):null]})},meta:{pin:"right",className:"text-right"}}]:[]]},[i,c,n,l,u,a,p]);return r("div",{className:"flex min-h-0 flex-1 flex-col gap-4",children:[e(N,{data:s.rows,columns:h,getRowId:o=>o.id,empty:r("div",{className:"flex flex-col items-center gap-3 py-4",children:[e("div",{className:"flex size-10 items-center justify-center rounded-full bg-muted text-muted-foreground",children:e(g,{size:18,"aria-hidden":!0})}),e("span",{children:i("emptyState")})]}),pagination:e(I,{page:s.page,pageSize:s.pageSize,totalPages:s.totalPages,pageSizeOptions:W})}),e(z,{controller:d})]})}export{$ as AffiliateDeals};
@@ -0,0 +1,9 @@
1
+ type CommissionOption = {
2
+ id: string;
3
+ title: string | null;
4
+ };
5
+ export declare function AssignDealButton({ affiliateId, commissionOptions, }: {
6
+ affiliateId: string;
7
+ commissionOptions: ReadonlyArray<CommissionOption>;
8
+ }): import("react").JSX.Element;
9
+ export {};
@@ -0,0 +1 @@
1
+ "use client";import{Fragment as u,jsx as i,jsxs as s}from"react/jsx-runtime";import{IconPlus as r}from"@tabler/icons-react";import{useTranslations as m}from"next-intl";import{useState as l}from"react";import{Button as p}from"../../../components/ui/button.js";import{DealDialog as f}from"./deal-dialog.js";function C({affiliateId:t,commissionOptions:e}){const n=m("Deals"),[a,o]=l(!1);return s(u,{children:[s(p,{type:"button",variant:"primary",size:"sm",onClick:()=>o(!0),"aria-label":n("assign"),children:[i(r,{size:14,"aria-hidden":!0}),i("span",{className:"hidden sm:inline",children:n("assign")})]}),i(f,{mode:"assign",affiliateId:t,commissionOptions:e,open:a,onOpenChange:o})]})}export{C as AssignDealButton};
@@ -0,0 +1,19 @@
1
+ import { type DealEditData } from "../actions.js";
2
+ import type { DeferredDialogController } from "../../../lib/hooks/use-deferred-dialog.js";
3
+ type CommissionOption = {
4
+ id: string;
5
+ title: string | null;
6
+ };
7
+ export type DealDialogProps = {
8
+ mode: "assign";
9
+ affiliateId: string;
10
+ commissionOptions: ReadonlyArray<CommissionOption>;
11
+ open: boolean;
12
+ onOpenChange: (open: boolean) => void;
13
+ } | {
14
+ mode: "edit";
15
+ dealId: string;
16
+ controller: DeferredDialogController<DealEditData | null>;
17
+ };
18
+ export declare function DealDialog(props: DealDialogProps): import("react").JSX.Element;
19
+ export {};
@@ -0,0 +1 @@
1
+ "use client";import{jsx as e,jsxs as n}from"react/jsx-runtime";import{useTranslations as d}from"next-intl";import{use as P,useActionState as b,useState as T}from"react";import{ActionForm as S}from"../../../components/ui/action-form.js";import{Button as D}from"../../../components/ui/button.js";import{DateRangePicker as y}from"../../../components/ui/date-range-picker.js";import{Dialog as F,DialogBody as p,DialogClose as A,DialogContent as x,DialogDescription as N,DialogFooter as v,DialogHeader as I,DialogTitle as h}from"../../../components/ui/dialog.js";import{FormField as O}from"../../../components/ui/form-field.js";import{Select as B,SelectContent as L,SelectItem as k,SelectTrigger as E,SelectValue as H}from"../../../components/ui/select.js";import{assignDealAction as R,updateDealAction as w}from"../actions.js";function W(t){const a=d("Deals"),s=d("Common");return t.mode==="edit"?e(F,{open:t.controller.open,onOpenChange:t.controller.setOpen,disablePointerDismissal:!0,children:n(x,{closeLabel:s("close"),children:[n(I,{children:[e(h,{children:a("editDialogTitle")}),e(N,{children:a("editDialogDesc")})]}),t.controller.promise?e($,{dealId:t.dealId,dataPromise:t.controller.promise,onSuccess:()=>t.controller.setOpen(!1)}):null]})}):e(F,{open:t.open,onOpenChange:t.onOpenChange,disablePointerDismissal:!0,children:n(x,{closeLabel:s("close"),children:[n(I,{children:[e(h,{children:a("assignDialogTitle")}),e(N,{children:a("assignDialogDesc")})]}),e(z,{affiliateId:t.affiliateId,commissionOptions:t.commissionOptions,onSuccess:()=>t.onOpenChange(!1)})]})})}function z({affiliateId:t,commissionOptions:a,onSuccess:s}){const o=d("Deals"),u=d("Common"),[l,g]=T(""),[f,m,c]=b(async(i,r)=>{const C=await R(t,i,r);return C?.ok&&(s(),g("")),C},void 0);return n(S,{action:m,actionState:f,className:"contents",errorClassName:"mx-6 mt-4",children:[e(p,{children:n("div",{className:"flex flex-col gap-4",children:[e(O,{name:"commissionId",label:o("commissionLabel"),children:n(B,{name:"commissionId",value:l,onValueChange:i=>g(i),children:[e(E,{className:"w-full",children:e(H,{placeholder:o("commissionPlaceholder"),children:i=>i?a.find(r=>r.id===i)?.title??i:null})}),e(L,{children:a.length===0?e("div",{className:"px-2 py-1.5 text-xs text-muted-foreground",children:o("noPublishedCommissions")}):a.map(i=>e(k,{value:i.id,children:i.title??o("untitledCommission")},i.id))})]})}),e(y,{startName:"startsAt",endName:"endsAt",label:o("dateRangeLabel"),description:o("endsAtHint"),defaultStart:V()})]})}),n(v,{children:[e(A,{render:e(D,{type:"button",variant:"secondary",size:"sm",disabled:c}),children:u("cancel")}),e(D,{type:"submit",size:"sm",disabled:c||!l,children:o(c?"assigning":"assign")})]})]})}function V(){const t=new Date,a=t.getFullYear(),s=String(t.getMonth()+1).padStart(2,"0"),o=String(t.getDate()).padStart(2,"0");return`${a}-${s}-${o}`}function $({dealId:t,dataPromise:a,onSuccess:s}){const o=d("Deals"),u=d("Common"),l=P(a),[g,f,m]=b(async(c,i)=>{const r=await w(t,c,i);return r?.ok&&s(),r},void 0);return l?n(S,{action:f,actionState:g,className:"contents",errorClassName:"mx-6 mt-4",children:[e(p,{children:n("div",{className:"flex flex-col gap-4",children:[e(O,{name:"commission",label:o("commissionLabel"),children:e("div",{className:"flex h-10 items-center rounded-md border border-border bg-muted px-3 text-sm text-foreground",children:e("span",{className:"truncate",children:l.commissionTitle??o("untitledCommission")})})}),e(y,{startName:"startsAt",endName:"endsAt",label:o("dateRangeLabel"),description:o("endsAtHint"),defaultStart:l.startsAt,defaultEnd:l.endsAt})]})}),n(v,{children:[e(A,{render:e(D,{type:"button",variant:"secondary",size:"sm",disabled:m}),children:u("cancel")}),e(D,{type:"submit",size:"sm",disabled:m,children:o(m?"saving":"save")})]})]}):e(p,{children:e("p",{className:"text-sm text-muted-foreground",children:o("editNotFound")})})}export{W as DealDialog};
@@ -0,0 +1,6 @@
1
+ import { type CommissionStatus, type DealStatus } from "../../../db/schema/index.js";
2
+ export declare function DealRowActions({ dealId, status, commissionStatus, }: {
3
+ dealId: string;
4
+ status: DealStatus;
5
+ commissionStatus: CommissionStatus;
6
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{Fragment as E,jsx as e,jsxs as o}from"react/jsx-runtime";import{COMMISSION_STATUS as f,DEAL_STATUS as g}from"../../../db/schema/index.js";import{IconDots as D,IconLock as v,IconLockOpen as S,IconPencil as w}from"@tabler/icons-react";import{useTranslations as M}from"next-intl";import{useTransition as b}from"react";import{DropdownMenu as A,DropdownMenuContent as I,DropdownMenuItem as c,DropdownMenuSeparator as T,DropdownMenuTrigger as h}from"../../../components/ui/dropdown-menu.js";import{Spinner as C}from"../../../components/ui/spinner.js";import{deactivateDealAction as x,getDealEditData as y,reactivateDealAction as z}from"../actions.js";import{DealDialog as L}from"./deal-dialog.js";import{useDeferredDialog as k}from"../../../lib/hooks/use-deferred-dialog.js";import{toastActionResult as N}from"../../../lib/toast.js";function J({dealId:n,status:d,commissionStatus:u}){const t=M("Deals"),r=k(()=>y(n)),[a,l]=b(),i=d===g.active,s=r.isLoading,m=u===f.published,p=()=>{l(async()=>{N(await(i?x:z)(n))})};return o("div",{className:"flex justify-end",children:[o(A,{children:[e(h,{"aria-label":t("rowActions"),disabled:a||s,className:"inline-flex size-7 cursor-pointer items-center justify-center rounded-md text-muted-foreground outline-none hover:bg-accent hover:text-accent-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-card data-popup-open:bg-accent data-popup-open:text-accent-foreground",children:a||s?e(C,{}):e(D,{size:16,"aria-hidden":!0})}),o(I,{align:"end",children:[m&&o(E,{children:[o(c,{onClick:r.trigger,disabled:s,children:[e(w,{size:14,"aria-hidden":!0,className:"text-muted-foreground"}),t("edit")]}),e(T,{})]}),o(c,{variant:i?"destructive":"default",onClick:p,disabled:a,children:[i?e(v,{size:14,"aria-hidden":!0}):e(S,{size:14,"aria-hidden":!0}),t(i?"deactivate":"reactivate")]})]})]}),e(L,{mode:"edit",dealId:n,controller:r})]})}export{J as DealRowActions};
@@ -0,0 +1,10 @@
1
+ import { type CommissionStatus, type DealStatus } from "../../../db/schema/index.js";
2
+ /**
3
+ * Renders the deal's effective status. A deal is treated as inactive when the
4
+ * underlying commission is no longer published, regardless of the deal's own
5
+ * status — the cascade is computed for display and never persisted.
6
+ */
7
+ export declare function DealStatusBadge({ status, commissionStatus, }: {
8
+ status: DealStatus;
9
+ commissionStatus: CommissionStatus;
10
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as a}from"react/jsx-runtime";import{COMMISSION_STATUS as o,DEAL_STATUS as n}from"../../../db/schema/index.js";import{useTranslations as u}from"next-intl";import{StatusBadge as s}from"../../../components/ui/status-badge.js";function c({status:e,commissionStatus:i}){const t=u("Deals.Status");return i!==o.published?a(s,{tone:"warning",children:t("commissionInactive")}):e===n.active?a(s,{tone:"success",children:t("active")}):a(s,{tone:"danger",children:t("deactivated")})}export{c as DealStatusBadge};
@@ -0,0 +1 @@
1
+ export declare function DealStatusTabs(): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as s,jsxs as d}from"react/jsx-runtime";import{useTranslations as i}from"next-intl";import{useQueryStates as T}from"nuqs";import{useTransition as u}from"react";import{Tabs as l,TabsIndicator as m,TabsList as p,TabsTab as b}from"../../../components/ui/tabs.js";import{DEAL_STATUSES as f,dealStatusParser as S}from"../list-params.js";import{listSearchParsers as c}from"../../../lib/list-params.js";function h(){const t=i("Deals.Tabs"),[e,r]=u(),[{status:n},o]=T({status:S,page:c.page},{shallow:!1,clearOnDefault:!0,startTransition:r});return s(l,{value:n,onValueChange:a=>o({status:a,page:null}),"data-pending":e?"":void 0,children:d(p,{children:[f.map(a=>s(b,{value:a,children:t(a)},a)),s(m,{})]})})}export{h as DealStatusTabs};
@@ -0,0 +1,8 @@
1
+ import { type SubAffiliateOption } from "../actions.js";
2
+ export type DelegateMode = "self" | "manager";
3
+ export declare function DelegateDealButton({ parentDealId, mode, maxPercent, subAffiliateOptions, }: {
4
+ parentDealId: string;
5
+ mode: DelegateMode;
6
+ maxPercent: string | null;
7
+ subAffiliateOptions: ReadonlyArray<SubAffiliateOption>;
8
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{Fragment as Q,jsx as e,jsxs as a}from"react/jsx-runtime";import{IconShare as P}from"@tabler/icons-react";import{useTranslations as d}from"next-intl";import{useActionState as L,useCallback as O,useMemo as T,useState as D}from"react";import{ActionForm as w}from"../../../components/ui/action-form.js";import{Button as x}from"../../../components/ui/button.js";import{Combobox as B}from"../../../components/ui/combobox.js";import{Dialog as M,DialogBody as z,DialogClose as k,DialogContent as R,DialogDescription as H,DialogFooter as $,DialogHeader as q,DialogTitle as V}from"../../../components/ui/dialog.js";import{FormField as y}from"../../../components/ui/form-field.js";import{Slider as E}from"../../../components/ui/slider.js";import{delegateDealForAffiliateAction as G,delegateDealToSubAffiliateAction as J}from"../actions.js";function oe({parentDealId:r,mode:u,maxPercent:f,subAffiliateOptions:m}){const l=d("Deals"),t=d("Common"),[c,i]=D(!1);return a(Q,{children:[a(x,{type:"button",variant:"secondary",size:"sm",onClick:()=>i(!0),"aria-label":l("delegate"),children:[e(P,{size:14,"aria-hidden":!0}),e("span",{className:"hidden sm:inline",children:l("delegate")})]}),e(M,{open:c,onOpenChange:i,disablePointerDismissal:!0,children:a(R,{closeLabel:t("close"),children:[a(q,{children:[e(V,{children:l("delegateDialogTitle")}),e(H,{children:l("delegateDialogDesc")})]}),e(K,{parentDealId:r,mode:u,maxPercent:f,subAffiliateOptions:m,onSuccess:()=>i(!1)})]})})]})}function K({parentDealId:r,mode:u,maxPercent:f,subAffiliateOptions:m,onSuccess:l}){const t=d("Deals"),c=d("Common"),[i,A]=D(null),C=f??"0",F=Number(C),g=T(()=>m.map(o=>({value:o.id,label:`${o.firstName} ${o.lastName}`,description:o.email})),[m]),N=O(o=>{const n=o.toLowerCase();return Promise.resolve(n?g.filter(s=>s.label.toLowerCase().includes(n)||(s.description??"").toLowerCase().includes(n)):g)},[g]),[p,h]=D(0),S=Math.round(p/100*F*100)/100,[v,I,b]=L(async(o,n)=>{const s=u==="manager"?await G(r,o,n):await J(r,o,n);return s?.ok&&(l(),A(null),h(0)),s},void 0);return a(w,{action:I,actionState:v,className:"contents",errorClassName:"mx-6 mt-4",children:[e(z,{children:a("div",{className:"flex flex-col gap-4",children:[e(y,{name:"subAffiliateId",label:t("subAffiliateLabel"),nativeLabel:!1,children:e(B,{name:"subAffiliateId",value:i,onChange:A,onSearch:N,placeholder:t("subAffiliatePlaceholder"),searchPlaceholder:t("subAffiliateSearchPlaceholder"),emptyText:t("noSubAffiliates"),loadingText:c("loading")})}),a(y,{name:"share",label:t("shareLabel"),children:[a("div",{className:"flex items-center gap-4 pt-1",children:[e(E,{min:0,max:100,step:1,value:p,onValueChange:h,className:"flex-1"}),a("span",{className:"w-14 text-right text-sm font-medium tabular-nums text-foreground",children:[p,"%"]})]}),e("p",{className:"mt-1.5 text-xs text-muted-foreground",children:t("delegateResult",{actual:S,max:C})})]})]})}),a($,{children:[e(k,{render:e(x,{type:"button",variant:"secondary",size:"sm",disabled:b}),children:c("cancel")}),e(x,{type:"submit",size:"sm",disabled:b||!i||S<=0,children:t(b?"delegating":"delegate")})]})]})}export{oe as DelegateDealButton};
@@ -0,0 +1,11 @@
1
+ import "server-only";
2
+ import type { Locale } from "../../i18n/config.js";
3
+ export declare function sendDealAssignedEmail(args: {
4
+ userId: string;
5
+ email: string;
6
+ firstName: string;
7
+ commissionTitle: string | null;
8
+ startsAt: Date;
9
+ endsAt: Date | null;
10
+ locale?: Locale;
11
+ }): Promise<void>;
@@ -0,0 +1 @@
1
+ import"server-only";import{getFormatter as f,getTranslations as n}from"next-intl/server";import{DealNoticeEmail as p}from"../../emails/affiliate/deal-notice.js";import{resolveUserLocale as g}from"../../lib/email/locale.js";import{sendEmail as u}from"../../lib/email/send.js";import{env as m}from"../../lib/env.js";async function E(t){const o=t.locale??await g(t.userId),[r,e,s]=await Promise.all([n({locale:o,namespace:"Emails.Common"}),n({locale:o,namespace:"Emails.DealAssigned"}),f({locale:o})]),l=new URL("/deals",m.APP_URL).toString(),i=m.BRAND_NAME,a=d=>s.dateTime(d,{day:"numeric",month:"long",year:"numeric"}),c=t.endsAt?e("periodRange",{from:a(t.startsAt),until:a(t.endsAt)}):e("periodFrom",{from:a(t.startsAt)});await u({to:t.email,subject:e("subject",{brandName:i}),react:p({dealsUrl:l,lang:o,strings:{preview:e("preview",{brandName:i}),heading:e("heading"),greeting:e("greetingNamed",{name:t.firstName}),body:e("body",{brandName:i}),detail:e("detail",{commission:t.commissionTitle??e("untitled"),period:c}),cta:e("cta"),fallback:e("fallback"),brandName:i,footerNote:r("footerNote")}})})}export{E as sendDealAssignedEmail};
@@ -0,0 +1,13 @@
1
+ import "server-only";
2
+ import type { Locale } from "../../i18n/config.js";
3
+ export declare function sendDealDelegatedEmail(args: {
4
+ userId: string;
5
+ email: string;
6
+ firstName: string;
7
+ parentName: string;
8
+ commissionTitle: string | null;
9
+ percent: number;
10
+ startsAt: Date;
11
+ endsAt: Date | null;
12
+ locale?: Locale;
13
+ }): Promise<void>;
@@ -0,0 +1 @@
1
+ import"server-only";import{getFormatter as p,getTranslations as i}from"next-intl/server";import{DealNoticeEmail as f}from"../../emails/affiliate/deal-notice.js";import{resolveUserLocale as N}from"../../lib/email/locale.js";import{sendEmail as u}from"../../lib/email/send.js";import{env as m}from"../../lib/env.js";async function E(e){const a=e.locale??await N(e.userId),[r,t,l]=await Promise.all([i({locale:a,namespace:"Emails.Common"}),i({locale:a,namespace:"Emails.DealDelegated"}),p({locale:a})]),s=new URL("/deals",m.APP_URL).toString(),o=m.BRAND_NAME,n=d=>l.dateTime(d,{day:"numeric",month:"long",year:"numeric"}),c=e.endsAt?t("periodRange",{from:n(e.startsAt),until:n(e.endsAt)}):t("periodFrom",{from:n(e.startsAt)});await u({to:e.email,subject:t("subject",{brandName:o,parentName:e.parentName}),react:f({dealsUrl:s,lang:a,strings:{preview:t("preview",{brandName:o,parentName:e.parentName}),heading:t("heading"),greeting:t("greetingNamed",{name:e.firstName}),body:t("body",{brandName:o,parentName:e.parentName}),detail:t("detail",{commission:e.commissionTitle??t("untitled"),percent:e.percent,period:c}),cta:t("cta"),fallback:t("fallback"),brandName:o,footerNote:r("footerNote")}})})}export{E as sendDealDelegatedEmail};
@@ -0,0 +1,14 @@
1
+ export declare const DEAL_SORT_KEYS: readonly ["createdAt", "startsAt", "endsAt"];
2
+ export type DealSortKey = (typeof DEAL_SORT_KEYS)[number];
3
+ export declare const DEAL_STATUSES: readonly ["all", "active", "deactivated"];
4
+ export type DealStatusFilter = (typeof DEAL_STATUSES)[number];
5
+ export declare const dealStatusParser: Omit<import("nuqs/server").SingleParserBuilder<"active" | "deactivated" | "all">, "parseServerSide"> & {
6
+ readonly defaultValue: NonNullable<"active" | "deactivated" | "all">;
7
+ parseServerSide(value: string | string[] | undefined): NonNullable<"active" | "deactivated" | "all">;
8
+ };
9
+ export declare const loadDealStatus: import("nuqs/server").LoaderFunction<{
10
+ status: Omit<import("nuqs/server").SingleParserBuilder<"active" | "deactivated" | "all">, "parseServerSide"> & {
11
+ readonly defaultValue: NonNullable<"active" | "deactivated" | "all">;
12
+ parseServerSide(value: string | string[] | undefined): NonNullable<"active" | "deactivated" | "all">;
13
+ };
14
+ }>;
@@ -0,0 +1 @@
1
+ import{createLoader as t,parseAsStringLiteral as e}from"nuqs/server";const s=["createdAt","startsAt","endsAt"],a=["all","active","deactivated"],r=e(a).withDefault("active"),S=t({status:r});export{s as DEAL_SORT_KEYS,a as DEAL_STATUSES,r as dealStatusParser,S as loadDealStatus};
@@ -0,0 +1,4 @@
1
+ import type { EarningsBalance } from "../queries.js";
2
+ export declare function EarningsBalances({ balances, }: {
3
+ balances: EarningsBalance[];
4
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as t,jsxs as a}from"react/jsx-runtime";import{useFormatter as l,useTranslations as m}from"next-intl";import{Card as o}from"../../../components/ui/card.js";import{formatMoney as c}from"../../../lib/format.js";function x({balances:s}){const r=m("Earnings"),u=l(),n=(e,d)=>c(u,e,d);return s.length===0?t(o,{className:"text-sm text-muted-foreground",children:r("noBalances")}):t("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3",children:s.map(e=>a(o,{className:"flex flex-col gap-4",children:[t("span",{className:"text-xs font-medium uppercase tracking-wide text-muted-foreground",children:e.currency}),a("div",{children:[t("div",{className:"text-2xl font-semibold tabular-nums text-foreground",children:n(e.available,e.currency)}),t("div",{className:"text-xs text-muted-foreground",children:r("available")})]}),a("dl",{className:"flex flex-col gap-1 text-sm",children:[Number(e.pending)>0&&t(i,{label:r("pending"),value:n(e.pending,e.currency)}),Number(e.inPayout)>0&&t(i,{label:r("inPayout"),value:n(e.inPayout,e.currency)}),Number(e.paidOut)>0&&t(i,{label:r("paidOut"),value:n(e.paidOut,e.currency)})]})]},e.currency))})}function i({label:s,value:r}){return a("div",{className:"flex items-center justify-between",children:[t("dt",{className:"text-muted-foreground",children:s}),t("dd",{className:"tabular-nums text-foreground",children:r})]})}export{x as EarningsBalances};
@@ -0,0 +1,5 @@
1
+ import type { EarningsLedgerRow } from "../queries.js";
2
+ import { type ListResult } from "../../../lib/list-params.js";
3
+ export declare function EarningsLedger({ result, }: {
4
+ result: ListResult<EarningsLedgerRow>;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as t,jsxs as v}from"react/jsx-runtime";import{IconCoin as s}from"@tabler/icons-react";import{useFormatter as d,useTranslations as m}from"next-intl";import{useMemo as c}from"react";import{DataTable as g}from"../../../components/ui/data-table.js";import{Identity as f}from"../../../components/ui/identity.js";import{SortButton as l}from"../../../components/ui/sort-button.js";import{TablePagination as p}from"../../../components/ui/table-pagination.js";import{EarningStatusBadge as y}from"./earnings-status-badge.js";import{formatMoney as h}from"../../../lib/format.js";import{PAGE_SIZE_OPTIONS as S}from"../../../lib/list-params.js";function P({result:a}){const n=m("Earnings"),r=m("Earnings.event"),o=d(),u=c(()=>[{id:"source",header:()=>n("columnCasino"),cell:({row:e})=>{const i=[e.original.event?r(e.original.event):null,e.original.kind==="sub_affiliate_share"?n("subShare"):null].filter(Boolean);return t(f,{visual:t("div",{className:"flex size-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground",children:t(s,{size:18,"aria-hidden":!0})}),primary:e.original.casinoName??"\u2014",secondary:i.length>0?i.join(" \xB7 "):void 0})}},{id:"earnedAt",header:()=>t(l,{column:"earnedAt",children:n("columnDate")}),cell:({row:e})=>t("span",{className:"text-sm text-muted-foreground tabular-nums",children:o.dateTime(e.original.earnedAt,{day:"numeric",month:"short",year:"numeric"})})},{id:"amount",header:()=>t(l,{column:"amount",children:n("columnAmount")}),cell:({row:e})=>t("span",{className:"text-sm font-medium text-foreground tabular-nums",children:h(o,e.original.amount,e.original.currency)})},{id:"status",header:()=>n("columnStatus"),cell:({row:e})=>t(y,{status:e.original.status})}],[n,r,o]);return t(g,{data:a.rows,columns:u,getRowId:e=>e.id,empty:v("div",{className:"flex flex-col items-center gap-3 py-4",children:[t("div",{className:"flex size-10 items-center justify-center rounded-full bg-muted text-muted-foreground",children:t(s,{size:18,"aria-hidden":!0})}),t("span",{children:n("emptyState")})]}),pagination:t(p,{page:a.page,pageSize:a.pageSize,totalPages:a.totalPages,pageSizeOptions:S})})}export{P as EarningsLedger};
@@ -0,0 +1,4 @@
1
+ import type { EarningStatus } from "../../../db/schema/index.js";
2
+ export declare function EarningStatusBadge({ status }: {
3
+ status: EarningStatus;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as s}from"react/jsx-runtime";import{useTranslations as e}from"next-intl";import{StatusBadge as a}from"../../../components/ui/status-badge.js";const r={pending:"warning",confirmed:"success",reversed:"danger"};function g({status:n}){const t=e("Earnings.Status");return s(a,{tone:r[n],children:t(n)})}export{g as EarningStatusBadge};
@@ -0,0 +1 @@
1
+ export declare function EarningStatusTabs(): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as s,jsxs as c}from"react/jsx-runtime";import{useTranslations as i}from"next-intl";import{useQueryStates as T}from"nuqs";import{useTransition as u}from"react";import{Tabs as m,TabsIndicator as p,TabsList as b,TabsTab as f}from"../../../components/ui/tabs.js";import{EARNING_STATUS_FILTERS as l,earningStatusParser as S}from"../list-params.js";import{listSearchParsers as g}from"../../../lib/list-params.js";function P(){const t=i("Earnings.Tabs"),[r,n]=u(),[{status:e},o]=T({status:S,page:g.page},{shallow:!1,clearOnDefault:!0,startTransition:n});return s(m,{value:e,onValueChange:a=>o({status:a,page:null}),"data-pending":r?"":void 0,children:c(b,{children:[l.map(a=>s(f,{value:a,children:t(a)},a)),s(p,{})]})})}export{P as EarningStatusTabs};
@@ -0,0 +1,4 @@
1
+ import type { SubAffiliateEarning } from "../queries.js";
2
+ export declare function SubAffiliateEarnings({ rows, }: {
3
+ rows: SubAffiliateEarning[];
4
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as e,jsxs as r}from"react/jsx-runtime";import{useFormatter as i,useTranslations as u}from"next-intl";import{Table as m,TableBody as T,TableCell as n,TableHead as t,TableHeader as f,TableRow as o}from"../../../components/ui/table.js";import{formatMoney as d}from"../../../lib/format.js";function y({rows:b}){const l=u("Earnings"),s=i();return r(m,{children:[e(f,{children:r(o,{children:[e(t,{children:l("subEarningsColumnSub")}),e(t,{className:"text-right",children:l("subEarningsColumnEarned")})]})}),e(T,{children:b.map(a=>r(o,{children:[e(n,{className:"text-foreground",children:a.subName}),e(n,{className:"text-right tabular-nums text-foreground",children:d(s,a.earned,a.currency)})]},`${a.subId}-${a.currency}`))})]})}export{y as SubAffiliateEarnings};
@@ -0,0 +1,14 @@
1
+ export declare const EARNING_SORT_KEYS: readonly ["earnedAt", "amount"];
2
+ export type EarningSortKey = (typeof EARNING_SORT_KEYS)[number];
3
+ export declare const EARNING_STATUS_FILTERS: readonly ["all", "available", "pending", "reversed"];
4
+ export type EarningStatusFilter = (typeof EARNING_STATUS_FILTERS)[number];
5
+ export declare const earningStatusParser: Omit<import("nuqs/server").SingleParserBuilder<"pending" | "reversed" | "all" | "available">, "parseServerSide"> & {
6
+ readonly defaultValue: NonNullable<"pending" | "reversed" | "all" | "available">;
7
+ parseServerSide(value: string | string[] | undefined): NonNullable<"pending" | "reversed" | "all" | "available">;
8
+ };
9
+ export declare const loadEarningStatus: import("nuqs/server").LoaderFunction<{
10
+ status: Omit<import("nuqs/server").SingleParserBuilder<"pending" | "reversed" | "all" | "available">, "parseServerSide"> & {
11
+ readonly defaultValue: NonNullable<"pending" | "reversed" | "all" | "available">;
12
+ parseServerSide(value: string | string[] | undefined): NonNullable<"pending" | "reversed" | "all" | "available">;
13
+ };
14
+ }>;
@@ -0,0 +1 @@
1
+ import{createLoader as t,parseAsStringLiteral as e}from"nuqs/server";const o=["earnedAt","amount"],r=["all","available","pending","reversed"],a=e(r).withDefault("all"),s=t({status:a});export{o as EARNING_SORT_KEYS,r as EARNING_STATUS_FILTERS,a as earningStatusParser,s as loadEarningStatus};
@@ -0,0 +1,30 @@
1
+ import "server-only";
2
+ import { type ConversionEvent, type EarningKind, type EarningStatus } from "../../db/schema/index.js";
3
+ import type { EarningSortKey, EarningStatusFilter } from "./list-params.js";
4
+ import { type ListParams, type ListResult } from "../../lib/list-params.js";
5
+ export type EarningsBalance = {
6
+ currency: string;
7
+ available: string;
8
+ pending: string;
9
+ inPayout: string;
10
+ paidOut: string;
11
+ };
12
+ export type EarningsLedgerRow = {
13
+ id: string;
14
+ earnedAt: Date;
15
+ kind: EarningKind;
16
+ event: ConversionEvent | null;
17
+ casinoName: string | null;
18
+ amount: string;
19
+ currency: string;
20
+ status: EarningStatus;
21
+ };
22
+ export declare function getMyEarningsSummary(userId: string): Promise<EarningsBalance[]>;
23
+ export type SubAffiliateEarning = {
24
+ subId: string;
25
+ subName: string;
26
+ currency: string;
27
+ earned: string;
28
+ };
29
+ export declare function getMySubAffiliateEarnings(userId: string): Promise<SubAffiliateEarning[]>;
30
+ export declare function listMyLedger(userId: string, params: ListParams<EarningSortKey>, statusFilter: EarningStatusFilter): Promise<ListResult<EarningsLedgerRow>>;
@@ -0,0 +1 @@
1
+ import"server-only";import{db as m}from"../../db/index.js";import{casinos as p,conversions as l,displayName as v,EARNING_KIND as A,EARNING_STATUS as f,earningsLedger as t,PAYOUT_REQUEST_STATUS as E,payoutRequests as c,users as g}from"../../db/schema/index.js";import{and as w,asc as S,count as N,desc as L,eq as o,inArray as P,isNotNull as R,ne as h,sql as b}from"drizzle-orm";import{paginate as T}from"../../lib/list-params.js";import{formatCentsAmount as y,toCents as I}from"../../lib/money.js";const O={available:"confirmed",pending:"pending",reversed:"reversed"};async function M(a){const u=await m.select({currency:t.currency,status:t.status,total:b`sum(${t.amount})`}).from(t).where(o(t.userId,a)).groupBy(t.currency,t.status),r=await m.select({currency:c.currency,status:c.status,total:b`sum(${c.amount})`}).from(c).where(o(c.userId,a)).groupBy(c.currency,c.status),i=new Map,d=n=>{let e=i.get(n);return e||(e={confirmed:0,pending:0,inPayout:0,paidOut:0},i.set(n,e)),e};for(const n of u){const e=d(n.currency),s=I(n.total??0);n.status===f.confirmed?e.confirmed+=s:n.status===f.pending&&(e.pending+=s)}for(const n of r){const e=d(n.currency),s=I(n.total??0);n.status===E.requested||n.status===E.approved?e.inPayout+=s:n.status===E.paid&&(e.paidOut+=s)}return Array.from(i.entries()).map(([n,e])=>({currency:n,available:y(e.confirmed-e.inPayout-e.paidOut),pending:y(e.pending),inPayout:y(e.inPayout),paidOut:y(e.paidOut)})).sort((n,e)=>n.currency.localeCompare(e.currency))}async function q(a){const r=(await m.select({subId:t.sourceAffiliateId,currency:t.currency,total:b`sum(${t.amount})`}).from(t).where(w(o(t.userId,a),o(t.kind,A.sub_affiliate_share),h(t.status,f.reversed),R(t.sourceAffiliateId))).groupBy(t.sourceAffiliateId,t.currency)).filter(e=>e.subId!==null);if(r.length===0)return[];const i=[...new Set(r.map(e=>e.subId))],d=await m.select({id:g.id,firstName:g.firstName,lastName:g.lastName}).from(g).where(P(g.id,i)),n=new Map(d.map(e=>[e.id,v(e)]));return r.map(e=>({subId:e.subId,subName:n.get(e.subId)??e.subId,currency:e.currency,earned:e.total??"0"})).sort((e,s)=>e.subName.localeCompare(s.subName)||e.currency.localeCompare(s.currency))}function B(a,u){const r=a==="amount"?t.amount:t.earnedAt;return[u==="asc"?S(r):L(r),S(t.id)]}async function Q(a,u,r){const i=r==="all"?o(t.userId,a):w(o(t.userId,a),o(t.status,O[r])),[d,n]=B(u.sort,u.dir);return T(u,{count:async()=>{const[e]=await m.select({value:N()}).from(t).where(i);return e?.value??0},fetch:({offset:e,limit:s})=>m.select({id:t.id,earnedAt:t.earnedAt,kind:t.kind,amount:t.amount,currency:t.currency,status:t.status,event:l.event,casinoName:p.name}).from(t).leftJoin(l,o(l.id,t.conversionId)).leftJoin(p,o(p.id,l.casinoId)).where(i).orderBy(d,n).offset(e).limit(s)})}export{M as getMyEarningsSummary,q as getMySubAffiliateEarnings,Q as listMyLedger};
@@ -0,0 +1,36 @@
1
+ import { type Group } from "../../db/schema/index.js";
2
+ import { type StoredPermission } from "../auth/permissions.js";
3
+ import type { GroupStatusFilter } from "./list-params.js";
4
+ import type { FormState } from "../../lib/actions/state.js";
5
+ import { type ListResult } from "../../lib/list-params.js";
6
+ export type GroupFormState = FormState<{
7
+ id: string;
8
+ }>;
9
+ export declare function listOwnGroupMemberships(): Promise<string[]>;
10
+ export type GroupRow = Group & {
11
+ memberCount: number;
12
+ };
13
+ export declare const listGroups: (params: import("../../lib/list-params.js").PageInput & {
14
+ q: string;
15
+ sort: "createdAt" | "name";
16
+ dir: import("../../lib/list-params.js").SortDir;
17
+ } & {
18
+ status: GroupStatusFilter;
19
+ }) => Promise<ListResult<GroupRow>>;
20
+ export type GroupEditData = {
21
+ name: string;
22
+ description: string | null;
23
+ permissions: StoredPermission[];
24
+ };
25
+ export declare const getGroupEditData: (groupId: string) => Promise<GroupEditData | null>;
26
+ export declare const createGroupAction: (args_0: FormState<{
27
+ id: string;
28
+ }>, args_1: FormData) => Promise<FormState<{
29
+ id: string;
30
+ }>>;
31
+ export declare const updateGroupAction: (args_0: string, args_1: FormState<{
32
+ id: string;
33
+ }>, args_2: FormData) => Promise<FormState<{
34
+ id: string;
35
+ }>>;
36
+ export declare const deleteGroupAction: (args_0: string, args_1: FormState<void>, args_2: FormData) => Promise<FormState<void>>;
@@ -0,0 +1 @@
1
+ "use server";import{db as i}from"../../db/index.js";import{groupPermissions as w,groups as e,userGroups as n}from"../../db/schema/index.js";import{and as G,asc as R,count as S,desc as D,eq as a,ilike as P,inArray as E,ne as Q,or as q}from"drizzle-orm";import{z as x}from"zod";import{requireSession as B}from"../auth/authorization.js";import{normalizePermissions as y,storedPermissionSchema as M}from"../auth/permissions.js";import{parseForm as F}from"../../lib/actions/parse-form.js";import{authFormAction as _,authQuery as I}from"../../lib/auth/action.js";import{appError as g}from"../../lib/errors/codes.js";import{success as b}from"../../lib/errors/server.js";import{paginate as T}from"../../lib/list-params.js";import{arrayField as j,DESCRIPTION_MAX as K,NAME_MAX as N,optionalTrimmed as k,V as A}from"../../lib/validation/zod.js";const L=x.object({name:x.string().trim().min(1,A.groupNameRequired).max(N),description:k(K),permissions:j(M)}).superRefine((o,r)=>{y(o.permissions).length===0&&r.addIssue({code:"custom",path:["permissions"],message:A.fieldRequired})});function z(o,r){const t=e[o];return[r==="asc"?R(t):D(t),R(e.id)]}function O(o){if(!o)return;const r=`%${o}%`;return q(P(e.name,r),P(e.description,r))}async function oe(){const{user:o}=await B();return(await i.select({groupId:n.groupId}).from(n).where(a(n.userId,o.id))).map(t=>t.groupId)}function ie(o){}const se=I("groups:read",async(o,r)=>{const t=O(r.q),m=(r.status,void 0),[s,p]=z(r.sort,r.dir),c=G(t,m);return T(r,{count:async()=>{const[u]=await i.select({total:S()}).from(e).where(c);return u?.total??0},fetch:async({offset:u,limit:f})=>{const d=await i.select().from(e).where(c).orderBy(s,p).limit(f).offset(u),h=d.map(l=>l.id);if(h.length===0)return[];const C=await i.select({groupId:n.groupId,cnt:S()}).from(n).where(E(n.groupId,h)).groupBy(n.groupId),v=new Map(C.map(l=>[l.groupId,l.cnt]));return d.map(l=>({...l,memberCount:v.get(l.id)??0}))}})}),ne=I("groups:read",async(o,r)=>{const[[t],m]=await Promise.all([i.select({name:e.name,description:e.description}).from(e).where(a(e.id,r)).limit(1),i.select({permission:w.permission}).from(w).where(a(w.groupId,r))]);return t?{name:t.name,description:t.description,permissions:y(m.map(s=>s.permission))}:null}),ae=_({permission:"groups:manage",revalidate:["/groups"]},async({audit:o},r)=>{const t=await F(r,L),m=y(t.permissions),[s]=await i.select({id:e.id}).from(e).where(a(e.name,t.name)).limit(1);if(s)throw g("group_name_exists",{field:"name"});const p=await i.transaction(async c=>{const[u]=await c.insert(e).values({name:t.name,description:t.description??null}).returning();return await c.insert(w).values(m.map(f=>({groupId:u.id,permission:f}))),u});return await o({action:"group.create",target:{type:"group",id:p.id,label:p.name}}),b({id:p.id},"Toasts.groupCreated")}),me=_({permission:"groups:manage",revalidate:["/groups"]},async({user:o,audit:r},t,m)=>{const s=await F(m,L),p=y(s.permissions),[c,u,f]=await Promise.all([i.select({id:e.id}).from(e).where(a(e.id,t)).limit(1),i.select({id:e.id}).from(e).where(G(a(e.name,s.name),Q(e.id,t))).limit(1),i.select({userId:n.userId}).from(n).where(G(a(n.groupId,t),a(n.userId,o.id))).limit(1)]);if(!c[0])throw g("group_not_found",{toast:!0});if(u[0])throw g("group_name_exists",{field:"name"});if(f[0])throw g("cannot_edit_own_group",{toast:!0});return await i.transaction(async d=>{await d.update(e).set({name:s.name,description:s.description??null}).where(a(e.id,t)),await d.delete(w).where(a(w.groupId,t)),await d.insert(w).values(p.map(h=>({groupId:t,permission:h}))),await r({action:"group.update",target:{type:"group",id:t,label:s.name}},d)}),b({id:t},"Toasts.groupUpdated")}),pe=_({permission:"groups:manage",requireAdmin:!0,revalidate:["/groups"]},async({audit:o},r,t)=>{const[[m],[s]]=await Promise.all([i.select({id:e.id,name:e.name}).from(e).where(a(e.id,r)).limit(1),i.select({c:S()}).from(n).where(a(n.groupId,r))]);if(!m)throw g("group_not_found",{toast:!0});if(s&&s.c>0)throw g("group_has_members",{toast:!0});return await i.transaction(async p=>{await p.delete(e).where(a(e.id,r)),await o({action:"group.delete",target:{type:"group",id:r,label:m.name}},p)}),b("Toasts.groupDeleted")});export{ae as createGroupAction,pe as deleteGroupAction,ne as getGroupEditData,se as listGroups,oe as listOwnGroupMemberships,me as updateGroupAction};
@@ -0,0 +1,5 @@
1
+ export declare function DeleteGroupConfirm({ groupId, open, onOpenChange, }: {
2
+ groupId: string;
3
+ open: boolean;
4
+ onOpenChange: (open: boolean) => void;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as o,jsxs as s}from"react/jsx-runtime";import{useTranslations as l}from"next-intl";import{useActionState as u,useEffect as D}from"react";import{ActionForm as d}from"../../../components/ui/action-form.js";import{AlertDialog as g,AlertDialogClose as A,AlertDialogContent as b,AlertDialogDescription as C,AlertDialogFooter as v,AlertDialogTitle as F}from"../../../components/ui/alert-dialog.js";import{Button as a}from"../../../components/ui/button.js";import{deleteGroupAction as y}from"../actions.js";function k({groupId:m,open:c,onOpenChange:t}){const e=l("Groups"),r=l("Common"),p=y.bind(null,m),[i,f,n]=u(p,void 0);return D(()=>{i?.ok&&t(!1)},[i,t]),o(g,{open:c,onOpenChange:t,children:s(b,{children:[o(F,{children:e("deleteConfirm")}),o(C,{children:e("deleteDescription")}),o(d,{action:f,actionState:i,className:"flex flex-col gap-3",children:s(v,{children:[o(A,{render:o(a,{type:"button",variant:"secondary",size:"sm",disabled:n,children:r("cancel")})}),o(a,{type:"submit",variant:"destructive",size:"sm",disabled:n,children:n?e("deleting"):r("confirmDelete")})]})})]})})}export{k as DeleteGroupConfirm};
@@ -0,0 +1 @@
1
+ export declare function GroupCreateButton(): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{Fragment as p,jsx as r,jsxs as i}from"react/jsx-runtime";import{IconPlus as t}from"@tabler/icons-react";import{useTranslations as n}from"next-intl";import{Button as a}from"../../../components/ui/button.js";import{Spinner as l}from"../../../components/ui/spinner.js";import{GroupDialog as s}from"./group-dialog.js";import{useDeferredDialog as m}from"../../../lib/hooks/use-deferred-dialog.js";function B(){const e=n("Groups"),o=m(()=>Promise.resolve(null));return i(p,{children:[i(a,{variant:"primary",size:"sm",type:"button",onClick:o.trigger,disabled:o.isLoading,"aria-label":e("createTitle"),children:[o.isLoading?r(l,{}):r(t,{size:16,"aria-hidden":!0}),r("span",{className:"hidden sm:inline",children:e("createTitle")})]}),r(s,{mode:"create",controller:o})]})}export{B as GroupCreateButton};
@@ -0,0 +1,11 @@
1
+ import { type GroupEditData } from "../actions.js";
2
+ import type { DeferredDialogController } from "../../../lib/hooks/use-deferred-dialog.js";
3
+ export type GroupDialogProps = {
4
+ mode: "create";
5
+ controller: DeferredDialogController<null>;
6
+ } | {
7
+ mode: "edit";
8
+ groupId: string;
9
+ controller: DeferredDialogController<GroupEditData>;
10
+ };
11
+ export declare function GroupDialog(props: GroupDialogProps): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as e,jsxs as m}from"react/jsx-runtime";import{useTranslations as c}from"next-intl";import{use as G,useActionState as d}from"react";import{ActionForm as C}from"../../../components/ui/action-form.js";import{Button as g}from"../../../components/ui/button.js";import{Dialog as F,DialogBody as b,DialogClose as S,DialogContent as y,DialogDescription as P,DialogFooter as A,DialogHeader as O,DialogTitle as v}from"../../../components/ui/dialog.js";import{createGroupAction as E,updateGroupAction as I}from"../actions.js";import{GroupFormFields as T}from"./group-form-fields.js";function j(o){const t=c("Groups"),r=c("Common");return e(F,{open:o.controller.open,onOpenChange:o.controller.setOpen,disablePointerDismissal:!0,children:m(y,{closeLabel:r("close"),children:[m(O,{children:[e(v,{children:o.mode==="create"?t("createDialogTitle"):t("editDialogTitle")}),e(P,{children:o.mode==="create"?t("createDialogDesc"):t("editDialogDesc")})]}),o.mode==="create"?e(k,{onSuccess:()=>o.controller.setOpen(!1)}):o.controller.promise&&e(B,{groupId:o.groupId,dataPromise:o.controller.promise,onSuccess:()=>o.controller.setOpen(!1)},o.groupId)]})})}function k({onSuccess:o}){const t=c("Common"),[r,i,n]=d(async(a,s)=>{const l=await E(a,s);return l?.ok&&o(),l},void 0);return e(D,{action:i,state:r,isPending:n,submitLabel:t(n?"creating":"create"),resetOnSuccess:!0})}function B({groupId:o,dataPromise:t,onSuccess:r}){const i=G(t),n=c("Groups"),[a,s,l]=d(async(p,f)=>{const u=await I(o,p,f);return u?.ok&&r(),u},void 0);return e(D,{action:s,state:a,isPending:l,submitLabel:n(l?"saving":"save"),defaults:i})}function D({action:o,state:t,isPending:r,submitLabel:i,resetOnSuccess:n=!1,defaults:a}){const s=c("Common");return m(C,{action:o,actionState:t,resetOnSuccess:n,className:"contents",errorClassName:"mx-6 mt-4",children:[e(b,{children:e(T,{defaults:a})}),m(A,{children:[e(S,{render:e(g,{type:"button",variant:"secondary",size:"sm"}),children:s("cancel")}),e(g,{type:"submit",size:"sm",disabled:r,children:i})]})]})}export{j as GroupDialog};
@@ -0,0 +1,10 @@
1
+ import type { StoredPermission } from "../../auth/permissions.js";
2
+ type Defaults = {
3
+ name?: string;
4
+ description?: string | null;
5
+ permissions?: readonly StoredPermission[];
6
+ };
7
+ export declare function GroupFormFields({ defaults }: {
8
+ defaults?: Defaults;
9
+ }): import("react").JSX.Element;
10
+ export {};
@@ -0,0 +1 @@
1
+ "use client";import{jsx as e,jsxs as d}from"react/jsx-runtime";import{useTranslations as m}from"next-intl";import{FormField as o,FormFieldset as s}from"../../../components/ui/form-field.js";import{Input as t}from"../../../components/ui/input.js";import{Textarea as n}from"../../../components/ui/textarea.js";import{PermissionsForm as a}from"../../auth/components/permissions-form.js";import{DESCRIPTION_MAX as l,NAME_MAX as p}from"../../../lib/validation/zod.js";function b({defaults:r={}}){const i=m("Groups");return d("div",{className:"flex flex-col gap-5",children:[e(o,{name:"name",label:i("nameLabel"),children:e(t,{name:"name",type:"text","aria-required":"true",maxLength:p,defaultValue:r.name??"",autoComplete:"off"})}),e(o,{name:"description",label:i("descriptionLabel"),children:e(n,{name:"description",maxLength:l,defaultValue:r.description??""})}),e(s,{name:"permissions",legend:i("permissionsLabel"),children:e(a,{defaultValues:r.permissions})})]})}export{b as GroupFormFields};
@@ -0,0 +1 @@
1
+ export declare function GroupStatusTabs(): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as a,jsxs as g}from"react/jsx-runtime";import{useTranslations as i}from"next-intl";import{useQueryStates as u}from"nuqs";import{useTransition as T}from"react";import{Tabs as p,TabsIndicator as m,TabsList as b,TabsTab as f}from"../../../components/ui/tabs.js";import{GROUP_STATUSES as l,groupStatusParser as S}from"../list-params.js";import{listSearchParsers as c}from"../../../lib/list-params.js";function O(){const t=i("Groups.Tabs"),[r,e]=T(),[{status:o},n]=u({status:S,page:c.page},{shallow:!1,clearOnDefault:!0,startTransition:e});return a(p,{value:o,onValueChange:s=>n({status:s,page:null}),"data-pending":r?"":void 0,children:g(b,{children:[l.map(s=>a(f,{value:s,children:t(s)},s)),a(m,{})]})})}export{O as GroupStatusTabs};
@@ -0,0 +1,9 @@
1
+ import { type GroupRow } from "../actions.js";
2
+ import { type ListResult } from "../../../lib/list-params.js";
3
+ export declare function GroupsTable({ result, canManage, canDelete, myGroupIds, now, }: {
4
+ result: ListResult<GroupRow>;
5
+ canManage: boolean;
6
+ canDelete: boolean;
7
+ myGroupIds: ReadonlySet<string>;
8
+ now: Date;
9
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as e,jsxs as i}from"react/jsx-runtime";import{IconDots as b,IconFolder as h,IconFolderOff as x,IconPencil as y,IconTrash as w,IconUsers as v}from"@tabler/icons-react";import{useLocale as I,useTranslations as p}from"next-intl";import{useMemo as G,useState as N}from"react";import{DataTable as z}from"../../../components/ui/data-table.js";import{DropdownMenu as S,DropdownMenuContent as C,DropdownMenuItem as f,DropdownMenuTrigger as M}from"../../../components/ui/dropdown-menu.js";import{Identity as R}from"../../../components/ui/identity.js";import{SortButton as g}from"../../../components/ui/sort-button.js";import{Spinner as T}from"../../../components/ui/spinner.js";import{TablePagination as A}from"../../../components/ui/table-pagination.js";import{getGroupEditData as O}from"../actions.js";import{DeleteGroupConfirm as P}from"./delete-group-confirm.js";import{GroupDialog as L}from"./group-dialog.js";import{useDeferredDialog as j}from"../../../lib/hooks/use-deferred-dialog.js";import{useFormatDateTime as k}from"../../../lib/i18n/format-datetime.js";import{formatRelative as E}from"../../../lib/i18n/relative-time.js";import{PAGE_SIZE_OPTIONS as _}from"../../../lib/list-params.js";function ne({result:o,canManage:u,canDelete:l,myGroupIds:a,now:r}){const t=p("Groups"),s=I(),d=k(),D=G(()=>{const c=[{id:"name",header:()=>e(g,{column:"name",children:t("columnName")}),cell:({row:n})=>e(R,{visual:e("div",{className:"flex size-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground",children:e(h,{size:18,"aria-hidden":!0})}),primary:n.original.name,secondary:n.original.description})},{id:"members",header:()=>t("columnMembers"),cell:({row:n})=>{const m=n.original.memberCount;return i("span",{className:"inline-flex items-center gap-1.5 text-sm tabular-nums",children:[e(v,{size:14,"aria-hidden":!0,className:"text-muted-foreground"}),m===0?e("span",{className:"text-muted-foreground",children:"-"}):m]})}},{id:"createdAt",header:()=>e(g,{column:"createdAt",children:t("columnCreated")}),cell:({row:n})=>{const m=n.original.createdAt;return e("span",{className:"text-sm text-muted-foreground tabular-nums",title:d(m),children:E(s,m,r)})}}];return u?[...c,{id:"actions",header:()=>e("span",{className:"sr-only",children:t("columnActions")}),cell:({row:n})=>e(B,{group:n.original,myGroupIds:a,canDelete:l}),meta:{pin:"right",className:"text-right"}}]:c},[t,s,d,u,l,a,r]);return e(z,{data:o.rows,columns:D,getRowId:c=>c.id,empty:i("div",{className:"flex flex-col items-center gap-3 py-4",children:[e("div",{className:"flex size-10 items-center justify-center rounded-full bg-muted text-muted-foreground",children:e(x,{size:18,"aria-hidden":!0})}),e("span",{children:t("empty")})]}),pagination:e(A,{page:o.page,pageSize:o.pageSize,totalPages:o.totalPages,pageSizeOptions:_})})}function B({group:o,myGroupIds:u,canDelete:l}){const a=p("Groups"),r=j(async()=>{const d=await O(o.id);if(!d)throw new Error("group_not_found");return d}),[t,s]=N(!1);return u.has(o.id)?null:i("div",{className:"flex justify-end",children:[i(S,{children:[e(M,{"aria-label":a("rowActions"),disabled:r.isLoading,className:"inline-flex size-7 cursor-pointer items-center justify-center rounded-md text-muted-foreground outline-none hover:bg-accent hover:text-accent-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-card data-popup-open:bg-accent data-popup-open:text-accent-foreground",children:r.isLoading?e(T,{}):e(b,{size:16,"aria-hidden":!0})}),i(C,{children:[i(f,{onClick:r.trigger,children:[e(y,{size:14,"aria-hidden":!0,className:"text-muted-foreground"}),a("edit")]}),l&&i(f,{variant:"destructive",onClick:()=>s(!0),children:[e(w,{size:14,"aria-hidden":!0}),a("delete")]})]})]}),e(L,{mode:"edit",groupId:o.id,controller:r}),e(P,{groupId:o.id,open:t,onOpenChange:s})]})}export{ne as GroupsTable};
@@ -0,0 +1,14 @@
1
+ export declare const GROUP_SORT_KEYS: readonly ["name", "createdAt"];
2
+ export type GroupSortKey = (typeof GROUP_SORT_KEYS)[number];
3
+ export declare const GROUP_STATUSES: readonly ["all"];
4
+ export type GroupStatusFilter = (typeof GROUP_STATUSES)[number];
5
+ export declare const groupStatusParser: Omit<import("nuqs/server").SingleParserBuilder<"all">, "parseServerSide"> & {
6
+ readonly defaultValue: "all";
7
+ parseServerSide(value: string | string[] | undefined): "all";
8
+ };
9
+ export declare const loadGroupStatus: import("nuqs/server").LoaderFunction<{
10
+ status: Omit<import("nuqs/server").SingleParserBuilder<"all">, "parseServerSide"> & {
11
+ readonly defaultValue: "all";
12
+ parseServerSide(value: string | string[] | undefined): "all";
13
+ };
14
+ }>;
@@ -0,0 +1 @@
1
+ import{createLoader as t,parseAsStringLiteral as e}from"nuqs/server";const p=["name","createdAt"],r=["all"],o=e(r).withDefault("all"),s=t({status:o});export{p as GROUP_SORT_KEYS,r as GROUP_STATUSES,o as groupStatusParser,s as loadGroupStatus};
@@ -0,0 +1,43 @@
1
+ import { type PublicUser } from "../../db/schema/index.js";
2
+ import { type StoredPermission } from "../auth/permissions.js";
3
+ import type { ManagerStatusFilter } from "./list-params.js";
4
+ import type { FormState } from "../../lib/actions/state.js";
5
+ import { type ListResult } from "../../lib/list-params.js";
6
+ export type CreateManagerState = FormState<{
7
+ id: string;
8
+ }>;
9
+ export type UpdateManagerProfileState = FormState;
10
+ export type ManagerGroupOption = {
11
+ id: string;
12
+ name: string;
13
+ };
14
+ export declare const listAssignableManagerGroups: () => Promise<ManagerGroupOption[]>;
15
+ export type ManagerRow = PublicUser & {
16
+ groupName: string | null;
17
+ directPermissionCount: number;
18
+ };
19
+ export declare const listManagers: (params: import("../../lib/list-params.js").PageInput & {
20
+ q: string;
21
+ sort: "createdAt" | "email" | "firstName" | "lastName";
22
+ dir: import("../../lib/list-params.js").SortDir;
23
+ } & {
24
+ status: ManagerStatusFilter;
25
+ }) => Promise<ListResult<ManagerRow>>;
26
+ export declare const createManagerAction: (args_0: FormState<{
27
+ id: string;
28
+ }>, args_1: FormData) => Promise<FormState<{
29
+ id: string;
30
+ }>>;
31
+ export declare const resendManagerInviteAction: (args_0: string) => Promise<import("../../lib/actions/state.js").ActionResult<void>>;
32
+ export type UpdateManagerPermissionsState = FormState;
33
+ export type ManagerEditData = {
34
+ email: string;
35
+ firstName: string;
36
+ lastName: string;
37
+ groupId: string | null;
38
+ assignableGroups: ManagerGroupOption[];
39
+ };
40
+ export declare const getManagerEditData: (managerId: string) => Promise<ManagerEditData>;
41
+ export declare const getManagerPermissions: (managerId: string) => Promise<StoredPermission[]>;
42
+ export declare const updateManagerProfileAction: (args_0: string, args_1: FormState<void>, args_2: FormData) => Promise<FormState<void>>;
43
+ export declare const updateManagerPermissionsAction: (args_0: string, args_1: FormState<void>, args_2: FormData) => Promise<FormState<void>>;
@@ -0,0 +1 @@
1
+ "use server";import{db as m}from"../../db/index.js";import{groups as u,publicUserColumns as Q,SIGNUP_SOURCE as z,USER_ROLE as y,USER_STATUS as N,userGroups as n,userPermissions as h,users as a}from"../../db/schema/index.js";import{and as _,asc as U,count as b,eq as l,inArray as A,isNull as J}from"drizzle-orm";import{revalidatePath as K}from"next/cache";import{z as W}from"zod";import{hasPermission as R,normalizePermissions as x,storedPermissionSchema as V,WILDCARD_PERMISSION as $}from"../auth/permissions.js";import{sendManagerInvite as C}from"./invite.js";import{parseForm as S}from"../../lib/actions/parse-form.js";import{authAction as H,authFormAction as v,authQuery as P}from"../../lib/auth/action.js";import{isUniqueViolation as G}from"../../lib/db/errors.js";import{appError as f}from"../../lib/errors/codes.js";import{success as I}from"../../lib/errors/server.js";import{paginate as X}from"../../lib/list-params.js";import{orderByUser as Y,requireUserOfRole as k,userSearchFilter as Z}from"../../lib/users.js";import{arrayField as ee,optionalUuid as F,UserProfileSchema as E}from"../../lib/validation/zod.js";const re=E.extend({groupId:F}),te=E.extend({groupId:F});function O(s){return R(s,"groups:manage")}async function ae(s){return m.select({id:u.id,name:u.name}).from(n).innerJoin(u,l(n.groupId,u.id)).where(l(n.userId,s)).orderBy(U(u.name))}async function B(s,r){return O(s)?m.select({id:u.id,name:u.name}).from(u).orderBy(U(u.name)):ae(r)}async function se(s,r,t){if(O(s)){const[o]=await m.select({id:u.id}).from(u).where(l(u.id,t)).limit(1);return o?.id??null}const e=await m.select({groupId:n.groupId}).from(n).where(l(n.userId,r));return e.length===0?null:e.length===1?e[0].groupId:e.find(o=>o.groupId===t)?.groupId??null}async function L(s,r,t){if(t===void 0)return{ok:!0,groupId:null};const e=await se(s,r,t);return e?{ok:!0,groupId:e}:{ok:!1}}const Ne=P("managers:manage",async({user:s,carrier:r})=>B(r,s.id));function ie(s){switch(s){case"all":return;case"pending":return _(l(a.status,N.active),J(a.inviteAcceptedAt));case"deactivated":return l(a.status,N.blocked)}}const Se=P("managers:read",async(s,r)=>{const t=Z(r.q),e=ie(r.status),[o,d]=Y(r.sort,r.dir),c=_(l(a.role,y.manager),t,e);return X(r,{count:async()=>{const[i]=await m.select({total:b()}).from(a).where(c);return i?.total??0},fetch:async({offset:i,limit:w})=>{const p=await m.select(Q).from(a).where(c).orderBy(o,d).limit(w).offset(i),M=p.map(g=>g.id);if(M.length===0)return[];const[T,j]=await Promise.all([m.select({userId:n.userId,name:u.name}).from(n).innerJoin(u,l(u.id,n.groupId)).where(A(n.userId,M)),m.select({userId:h.userId,cnt:b()}).from(h).where(A(h.userId,M)).groupBy(h.userId)]),D=new Map(T.map(g=>[g.userId,g.name])),q=new Map(j.map(g=>[g.userId,g.cnt]));return p.map(g=>({...g,groupName:D.get(g.id)??null,directPermissionCount:q.get(g.id)??0}))}})}),ve=v({permission:"managers:manage",revalidate:["/managers"]},async({user:s,carrier:r,audit:t},e)=>{const o=await S(e,re),d=await L(r,s.id,o.groupId);if(!d.ok)throw f("forbidden",{toast:!0});const c=d.groupId,i=await m.transaction(async w=>{const[p]=await w.insert(a).values({email:o.email,firstName:o.firstName,lastName:o.lastName,role:y.manager,signupSource:z.admin_invite,inviteAcceptedAt:null}).returning({id:a.id,email:a.email,firstName:a.firstName});return c&&await w.insert(n).values({userId:p.id,groupId:c}),p}).catch(w=>{if(G(w))return null;throw w});if(!i)throw f("email_already_exists",{field:"email"});await t({action:"manager.create",subjectId:i.id,target:{type:"user",id:i.id,label:i.email}});try{return await C({userId:i.id,email:i.email,firstName:i.firstName}),I({id:i.id},"Toasts.managerInvited")}catch{return I({id:i.id},"Toasts.managerInvitedEmailFailed")}}),_e=H({permission:"managers:manage",revalidate:["/managers"]},async(s,r)=>{const[t]=await m.select({id:a.id,email:a.email,firstName:a.firstName,role:a.role,status:a.status,inviteAcceptedAt:a.inviteAcceptedAt}).from(a).where(l(a.id,r)).limit(1);if(!t||t.role!==y.manager)throw f("user_not_found",{toast:!0});if(t.inviteAcceptedAt!==null)throw f("invite_already_accepted",{toast:!0});if(t.status!==N.active)throw f("user_blocked",{toast:!0});return await C({userId:t.id,email:t.email,firstName:t.firstName}),I("Toasts.managerInviteResent")}),ne=W.object({permissions:ee(V)}),Ue=P("managers:read",async({user:s,carrier:r},t)=>{const[[e],[o],d]=await Promise.all([m.select({email:a.email,firstName:a.firstName,lastName:a.lastName,role:a.role}).from(a).where(l(a.id,t)).limit(1),m.select({groupId:n.groupId}).from(n).where(l(n.userId,t)).limit(1),B(r,s.id)]);if(!e||e.role!==y.manager)throw f("user_not_found",{toast:!0});return{email:e.email,firstName:e.firstName,lastName:e.lastName,groupId:o?.groupId??null,assignableGroups:d}}),be=P("managers:read",async(s,r)=>{const t=await m.select({permission:h.permission}).from(h).where(l(h.userId,r));return x(t.map(e=>e.permission))}),Ae=v({permission:"managers:manage",revalidate:["/managers"]},async({user:s,carrier:r,audit:t},e,o)=>{if(e===s.id)throw f("cannot_target_self",{toast:!0});const d=await S(o,te);await k(e,y.manager);const c=await L(r,s.id,d.groupId);if(!c.ok)throw f("forbidden",{toast:!0});const i=c.groupId;if(!(await m.transaction(async p=>(await p.update(a).set({email:d.email,firstName:d.firstName,lastName:d.lastName}).where(l(a.id,e)),await p.delete(n).where(l(n.userId,e)),i&&await p.insert(n).values({userId:e,groupId:i}),{ok:!0})).catch(p=>{if(G(p))return{ok:!1};throw p})).ok)throw f("email_already_exists",{field:"email"});return await t({action:"manager.update",subjectId:e,target:{type:"user",id:e,label:d.email},metadata:{changed:["email","firstName","lastName","groupId"]}}),I("Toasts.managerUpdated")}),Re=v({permission:"managers:manage",revalidate:["/managers"]},async({user:s,carrier:r,audit:t},e,o)=>{if(e===s.id)throw f("cannot_target_self",{toast:!0});const d=await S(o,ne);await k(e,y.manager);const c=x(d.permissions);if(!c.every(i=>r.role===y.platform_admin||i!==$&&R(r,i)))throw f("forbidden",{toast:!0});return await m.transaction(async i=>{await i.delete(h).where(l(h.userId,e)),c.length>0&&await i.insert(h).values(c.map(w=>({userId:e,permission:w}))),await t({action:"manager.permissions.update",subjectId:e,target:{type:"user",id:e},metadata:{permissions:c}},i)}),K(`/managers/${e}/edit`),I("Toasts.managerPermissionsUpdated")});export{ve as createManagerAction,Ue as getManagerEditData,be as getManagerPermissions,Ne as listAssignableManagerGroups,Se as listManagers,_e as resendManagerInviteAction,Re as updateManagerPermissionsAction,Ae as updateManagerProfileAction};
@@ -0,0 +1 @@
1
+ export declare function ManagerCreateButton(): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{Fragment as g,jsx as e,jsxs as o}from"react/jsx-runtime";import{IconPlus as a}from"@tabler/icons-react";import{useTranslations as t}from"next-intl";import{Button as n}from"../../../components/ui/button.js";import{Spinner as s}from"../../../components/ui/spinner.js";import{listAssignableManagerGroups as l}from"../actions.js";import{ManagerDialog as m}from"./manager-dialog.js";import{useDeferredDialog as p}from"../../../lib/hooks/use-deferred-dialog.js";function D(){const i=t("Managers"),r=p(()=>l());return o(g,{children:[o(n,{variant:"primary",size:"sm",type:"button",onClick:r.trigger,disabled:r.isLoading,"aria-label":i("createTitle"),children:[r.isLoading?e(s,{}):e(a,{size:16,"aria-hidden":!0}),e("span",{className:"hidden sm:inline",children:i("createTitle")})]}),e(m,{mode:"create",controller:r})]})}export{D as ManagerCreateButton};
@@ -0,0 +1,11 @@
1
+ import { type ManagerEditData, type ManagerGroupOption } from "../actions.js";
2
+ import type { DeferredDialogController } from "../../../lib/hooks/use-deferred-dialog.js";
3
+ export type ManagerDialogProps = {
4
+ mode: "create";
5
+ controller: DeferredDialogController<ManagerGroupOption[]>;
6
+ } | {
7
+ mode: "edit";
8
+ managerId: string;
9
+ controller: DeferredDialogController<ManagerEditData>;
10
+ };
11
+ export declare function ManagerDialog(props: ManagerDialogProps): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as o,jsxs as m}from"react/jsx-runtime";import{useTranslations as c}from"next-intl";import{use as D,useActionState as f}from"react";import{ActionForm as C}from"../../../components/ui/action-form.js";import{Button as p}from"../../../components/ui/button.js";import{Dialog as P,DialogBody as y,DialogClose as S,DialogContent as b,DialogDescription as F,DialogFooter as O,DialogHeader as A,DialogTitle as v}from"../../../components/ui/dialog.js";import{createManagerAction as E,updateManagerProfileAction as G}from"../actions.js";import{ManagerProfileFields as T}from"./manager-profile-fields.js";function H(e){const a=c("Managers"),t=c("Common");return o(P,{open:e.controller.open,onOpenChange:e.controller.setOpen,disablePointerDismissal:!0,children:m(b,{closeLabel:t("close"),children:[m(A,{children:[o(v,{children:e.mode==="create"?a("createDialogTitle"):a("editDialogTitle")}),o(F,{children:e.mode==="create"?a("createDialogDesc"):a("editDialogDesc")})]}),e.mode==="create"?e.controller.promise&&o(k,{dataPromise:e.controller.promise,onSuccess:()=>e.controller.setOpen(!1)}):e.controller.promise&&o(B,{managerId:e.managerId,dataPromise:e.controller.promise,onSuccess:()=>e.controller.setOpen(!1)},e.controller.renderKey)]})})}function k({dataPromise:e,onSuccess:a}){const t=D(e),r=c("Common"),[n,l,i]=f(async(s,d)=>{const g=await E(s,d);return g?.ok&&a(),g},void 0);return o(M,{action:l,state:n,isPending:i,submitLabel:r(i?"creating":"create"),resetOnSuccess:!0,groups:t})}function B({managerId:e,dataPromise:a,onSuccess:t}){const r=D(a),n=c("Managers"),[l,i,s]=f(async(d,g)=>{const u=await G(e,d,g);return u?.ok&&t(),u},void 0);return o(M,{action:i,state:l,isPending:s,submitLabel:n(s?"saving":"save"),groups:r.assignableGroups,defaults:r})}function M({action:e,state:a,isPending:t,submitLabel:r,resetOnSuccess:n=!1,groups:l,defaults:i}){const s=c("Common");return m(C,{action:e,actionState:a,resetOnSuccess:n,className:"contents",errorClassName:"mx-6 mt-4",children:[o(y,{children:o(T,{groups:l,defaults:i})}),m(O,{children:[o(S,{render:o(p,{type:"button",variant:"secondary",size:"sm"}),children:s("cancel")}),o(p,{type:"submit",size:"sm",disabled:t,children:r})]})]})}export{H as ManagerDialog};
@@ -0,0 +1,7 @@
1
+ import type { StoredPermission } from "../../auth/permissions.js";
2
+ import type { DeferredDialogController } from "../../../lib/hooks/use-deferred-dialog.js";
3
+ export declare function ManagerPermissionsDialog({ managerId, managerLabel, controller, }: {
4
+ managerId: string;
5
+ managerLabel: string;
6
+ controller: DeferredDialogController<StoredPermission[]>;
7
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as o,jsxs as t}from"react/jsx-runtime";import{useTranslations as r}from"next-intl";import{use as u,useActionState as f}from"react";import{ActionForm as P}from"../../../components/ui/action-form.js";import{Button as C,buttonVariants as y}from"../../../components/ui/button.js";import{Dialog as F,DialogBody as S,DialogClose as b,DialogContent as M,DialogDescription as A,DialogFooter as B,DialogHeader as v,DialogTitle as N}from"../../../components/ui/dialog.js";import{FormFieldset as T}from"../../../components/ui/form-field.js";import{PermissionsForm as h}from"../../auth/components/permissions-form.js";import{updateManagerPermissionsAction as k}from"../actions.js";import{cn as I}from"../../../lib/cn.js";function q({managerId:n,managerLabel:a,controller:e}){const i=r("Managers"),s=r("Common");return o(F,{open:e.open,onOpenChange:e.setOpen,disablePointerDismissal:!0,children:t(M,{className:"max-w-lg",closeLabel:s("close"),children:[t(v,{children:[o(N,{children:i("permissionsDialogTitle",{name:a})}),o(A,{children:i("permissionsDialogDesc")})]}),e.promise&&o(O,{managerId:n,permsPromise:e.promise,onSuccess:()=>e.setOpen(!1)},e.renderKey)]})})}function O({managerId:n,permsPromise:a,onSuccess:e}){const i=u(a),s=r("Managers"),g=r("Common"),[p,d,m]=f(async(c,D)=>{const l=await k(n,c,D);return l?.ok&&e(),l},void 0);return t(P,{action:d,actionState:p,className:"contents",errorClassName:"mx-6 mt-4",children:[o(S,{children:o(T,{name:"permissions",legend:s("editPermissions"),children:o(h,{defaultValues:i})})}),t(B,{children:[o(b,{className:I(y({variant:"secondary",size:"sm"})),children:g("cancel")}),o(C,{type:"submit",size:"sm",disabled:m,children:s(m?"saving":"save")})]})]})}export{q as ManagerPermissionsDialog};
@@ -0,0 +1,7 @@
1
+ import type { ManagerEditData, ManagerGroupOption } from "../actions.js";
2
+ type Defaults = Partial<Pick<ManagerEditData, "email" | "firstName" | "lastName" | "groupId">>;
3
+ export declare function ManagerProfileFields({ groups, defaults, }: {
4
+ groups: readonly ManagerGroupOption[];
5
+ defaults?: Defaults;
6
+ }): import("react").JSX.Element;
7
+ export {};
@@ -0,0 +1 @@
1
+ "use client";import{jsx as e,jsxs as r}from"react/jsx-runtime";import{useTranslations as c}from"next-intl";import{useState as F}from"react";import{Field as n,FieldLabel as d}from"../../../components/ui/field.js";import{FormField as m,FormFieldset as N}from"../../../components/ui/form-field.js";import{Input as l}from"../../../components/ui/input.js";import{RadioGroup as I,RadioGroupItem as p}from"../../../components/ui/radio-group.js";import{useFormReset as G}from"../../../lib/hooks/use-form-reset.js";function D({groups:u,defaults:t={}}){const a=c(),i=t.groupId??"",[f,s]=F(i),g=G(()=>s(i));return r("div",{className:"flex flex-col gap-4",children:[e(m,{name:"email",label:a("Common.email"),children:e(l,{name:"email",type:"email","aria-required":"true",autoComplete:"off",defaultValue:t.email??""})}),r("div",{className:"grid gap-4 sm:grid-cols-2",children:[e(m,{name:"firstName",label:a("Common.firstName"),children:e(l,{name:"firstName",type:"text","aria-required":"true",autoComplete:"off",defaultValue:t.firstName??""})}),e(m,{name:"lastName",label:a("Common.lastName"),children:e(l,{name:"lastName",type:"text","aria-required":"true",autoComplete:"off",defaultValue:t.lastName??""})})]}),e(N,{name:"groupId",legend:a("Managers.groupsLabel"),description:a("Managers.groupsHelp"),children:r(I,{ref:g,name:"groupId",value:f,onValueChange:o=>s(o),className:"pt-1",children:[r(n,{className:"flex-row items-center gap-2",children:[e(p,{value:""}),e(d,{className:"font-normal text-muted-foreground",children:a("Managers.noGroup")})]}),u.map(o=>r(n,{className:"flex-row items-center gap-2",children:[e(p,{value:o.id}),e(d,{className:"font-normal",children:o.name})]},o.id))]})})]})}export{D as ManagerProfileFields};