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.
- package/README.md +32 -0
- package/dist/components/layout/app-header.d.ts +1 -0
- package/dist/components/layout/app-header.js +1 -0
- package/dist/components/layout/app-sidebar.d.ts +9 -0
- package/dist/components/layout/app-sidebar.js +1 -0
- package/dist/components/layout/brand-logo.d.ts +2 -0
- package/dist/components/layout/brand-logo.js +1 -0
- package/dist/components/layout/user-menu.d.ts +6 -0
- package/dist/components/layout/user-menu.js +1 -0
- package/dist/components/ui/action-form.d.ts +10 -0
- package/dist/components/ui/action-form.js +1 -0
- package/dist/components/ui/alert-dialog.d.ts +14 -0
- package/dist/components/ui/alert-dialog.js +1 -0
- package/dist/components/ui/alert.d.ts +12 -0
- package/dist/components/ui/alert.js +1 -0
- package/dist/components/ui/avatar.d.ts +12 -0
- package/dist/components/ui/avatar.js +1 -0
- package/dist/components/ui/badge.d.ts +2 -0
- package/dist/components/ui/badge.js +1 -0
- package/dist/components/ui/button.d.ts +12 -0
- package/dist/components/ui/button.js +1 -0
- package/dist/components/ui/card.d.ts +2 -0
- package/dist/components/ui/card.js +1 -0
- package/dist/components/ui/checkbox.d.ts +5 -0
- package/dist/components/ui/checkbox.js +1 -0
- package/dist/components/ui/combobox.d.ts +18 -0
- package/dist/components/ui/combobox.js +1 -0
- package/dist/components/ui/copy-button.d.ts +8 -0
- package/dist/components/ui/copy-button.js +1 -0
- package/dist/components/ui/country-select.d.ts +12 -0
- package/dist/components/ui/country-select.js +1 -0
- package/dist/components/ui/data-table.d.ts +11 -0
- package/dist/components/ui/data-table.js +1 -0
- package/dist/components/ui/date-range-picker.d.ts +25 -0
- package/dist/components/ui/date-range-picker.js +1 -0
- package/dist/components/ui/dialog.d.ts +19 -0
- package/dist/components/ui/dialog.js +1 -0
- package/dist/components/ui/drawer.d.ts +24 -0
- package/dist/components/ui/drawer.js +1 -0
- package/dist/components/ui/dropdown-menu.d.ts +17 -0
- package/dist/components/ui/dropdown-menu.js +1 -0
- package/dist/components/ui/field.d.ts +7 -0
- package/dist/components/ui/field.js +1 -0
- package/dist/components/ui/fieldset.d.ts +4 -0
- package/dist/components/ui/fieldset.js +1 -0
- package/dist/components/ui/form-field.d.ts +17 -0
- package/dist/components/ui/form-field.js +1 -0
- package/dist/components/ui/form.d.ts +3 -0
- package/dist/components/ui/form.js +1 -0
- package/dist/components/ui/icon-tile.d.ts +5 -0
- package/dist/components/ui/icon-tile.js +1 -0
- package/dist/components/ui/identity.d.ts +6 -0
- package/dist/components/ui/identity.js +1 -0
- package/dist/components/ui/input.d.ts +4 -0
- package/dist/components/ui/input.js +1 -0
- package/dist/components/ui/number-input.d.ts +19 -0
- package/dist/components/ui/number-input.js +1 -0
- package/dist/components/ui/otp-field.d.ts +6 -0
- package/dist/components/ui/otp-field.js +1 -0
- package/dist/components/ui/page-toolbar.d.ts +9 -0
- package/dist/components/ui/page-toolbar.js +1 -0
- package/dist/components/ui/password-input.d.ts +7 -0
- package/dist/components/ui/password-input.js +1 -0
- package/dist/components/ui/radio-group.d.ts +5 -0
- package/dist/components/ui/radio-group.js +1 -0
- package/dist/components/ui/search-input.d.ts +4 -0
- package/dist/components/ui/search-input.js +1 -0
- package/dist/components/ui/section-card.d.ts +7 -0
- package/dist/components/ui/section-card.js +1 -0
- package/dist/components/ui/select-field.d.ts +19 -0
- package/dist/components/ui/select-field.js +1 -0
- package/dist/components/ui/select.d.ts +17 -0
- package/dist/components/ui/select.js +1 -0
- package/dist/components/ui/sidebar.d.ts +27 -0
- package/dist/components/ui/sidebar.js +1 -0
- package/dist/components/ui/slider.d.ts +10 -0
- package/dist/components/ui/slider.js +1 -0
- package/dist/components/ui/sort-button.d.ts +5 -0
- package/dist/components/ui/sort-button.js +1 -0
- package/dist/components/ui/spinner.d.ts +4 -0
- package/dist/components/ui/spinner.js +1 -0
- package/dist/components/ui/status-badge.d.ts +11 -0
- package/dist/components/ui/status-badge.js +1 -0
- package/dist/components/ui/switch-field.d.ts +18 -0
- package/dist/components/ui/switch-field.js +1 -0
- package/dist/components/ui/switch.d.ts +3 -0
- package/dist/components/ui/switch.js +1 -0
- package/dist/components/ui/table-pagination.d.ts +9 -0
- package/dist/components/ui/table-pagination.js +1 -0
- package/dist/components/ui/table.d.ts +18 -0
- package/dist/components/ui/table.js +1 -0
- package/dist/components/ui/tabs.d.ts +8 -0
- package/dist/components/ui/tabs.js +1 -0
- package/dist/components/ui/tag-input.d.ts +9 -0
- package/dist/components/ui/tag-input.js +1 -0
- package/dist/components/ui/text-link.d.ts +10 -0
- package/dist/components/ui/text-link.js +1 -0
- package/dist/components/ui/textarea.d.ts +2 -0
- package/dist/components/ui/textarea.js +1 -0
- package/dist/components/ui/toast.d.ts +1 -0
- package/dist/components/ui/toast.js +1 -0
- package/dist/components/ui/tree.d.ts +32 -0
- package/dist/components/ui/tree.js +1 -0
- package/dist/db/client.d.ts +8 -0
- package/dist/db/client.js +1 -0
- package/dist/db/index.d.ts +3 -0
- package/dist/db/index.js +1 -0
- package/dist/db/logger.d.ts +2 -0
- package/dist/db/logger.js +1 -0
- package/dist/db/migrations/20260628182304_wonderful_groot/migration.sql +289 -0
- package/dist/db/migrations/20260628182304_wonderful_groot/snapshot.json +3750 -0
- package/dist/db/migrations/20260630082829_wet_robin_chapel/migration.sql +2 -0
- package/dist/db/migrations/20260630082829_wet_robin_chapel/snapshot.json +3791 -0
- package/dist/db/migrations/20260702132335_wooden_iron_monger/migration.sql +48 -0
- package/dist/db/migrations/20260702132335_wooden_iron_monger/snapshot.json +4407 -0
- package/dist/db/migrations/20260702142948_vengeful_rhino/migration.sql +1 -0
- package/dist/db/migrations/20260702142948_vengeful_rhino/snapshot.json +4420 -0
- package/dist/db/migrations/20260702185813_curved_pyro/migration.sql +16 -0
- package/dist/db/migrations/20260702185813_curved_pyro/snapshot.json +4646 -0
- package/dist/db/migrations/20260702192041_shiny_franklin_storm/migration.sql +16 -0
- package/dist/db/migrations/20260702192041_shiny_franklin_storm/snapshot.json +4872 -0
- package/dist/db/migrations/20260704101548_bizarre_namorita/migration.sql +1 -0
- package/dist/db/migrations/20260704101548_bizarre_namorita/snapshot.json +4885 -0
- package/dist/db/migrations/20260704105911_sleepy_juggernaut/migration.sql +1 -0
- package/dist/db/migrations/20260704105911_sleepy_juggernaut/snapshot.json +4898 -0
- package/dist/db/migrations/20260704115959_lean_sandman/migration.sql +1 -0
- package/dist/db/migrations/20260704115959_lean_sandman/snapshot.json +4885 -0
- package/dist/db/migrations/20260707231532_daffy_captain_stacy/migration.sql +10 -0
- package/dist/db/migrations/20260707231532_daffy_captain_stacy/snapshot.json +4919 -0
- package/dist/db/migrations/20260708190355_spooky_jimmy_woo/migration.sql +3 -0
- package/dist/db/migrations/20260708190355_spooky_jimmy_woo/snapshot.json +4970 -0
- package/dist/db/migrations/20260711145212_drop_legacy_earning_status/migration.sql +7 -0
- package/dist/db/migrations/20260711145212_drop_legacy_earning_status/snapshot.json +4968 -0
- package/dist/db/migrations/20260712161249_dashboard_stat_indexes/migration.sql +3 -0
- package/dist/db/migrations/20260712161249_dashboard_stat_indexes/snapshot.json +5038 -0
- package/dist/db/migrations/20260713013911_add_payout_paid_at/migration.sql +2 -0
- package/dist/db/migrations/20260713013911_add_payout_paid_at/snapshot.json +5072 -0
- package/dist/db/schema/analytics-outbox.d.ts +145 -0
- package/dist/db/schema/analytics-outbox.js +1 -0
- package/dist/db/schema/audit-logs.d.ts +204 -0
- package/dist/db/schema/audit-logs.js +1 -0
- package/dist/db/schema/campaigns.d.ts +180 -0
- package/dist/db/schema/campaigns.js +1 -0
- package/dist/db/schema/casinos.d.ts +129 -0
- package/dist/db/schema/casinos.js +1 -0
- package/dist/db/schema/commission-rule-groups.d.ts +84 -0
- package/dist/db/schema/commission-rule-groups.js +1 -0
- package/dist/db/schema/commission-rules.d.ts +145 -0
- package/dist/db/schema/commission-rules.js +1 -0
- package/dist/db/schema/commissions.d.ts +242 -0
- package/dist/db/schema/commissions.js +1 -0
- package/dist/db/schema/conversions.d.ts +302 -0
- package/dist/db/schema/conversions.js +1 -0
- package/dist/db/schema/deals.d.ts +180 -0
- package/dist/db/schema/deals.js +1 -0
- package/dist/db/schema/earnings.d.ts +262 -0
- package/dist/db/schema/earnings.js +1 -0
- package/dist/db/schema/groups.d.ts +214 -0
- package/dist/db/schema/groups.js +1 -0
- package/dist/db/schema/index.d.ts +18 -0
- package/dist/db/schema/index.js +1 -0
- package/dist/db/schema/payouts.d.ts +182 -0
- package/dist/db/schema/payouts.js +1 -0
- package/dist/db/schema/platform-settings.d.ts +84 -0
- package/dist/db/schema/platform-settings.js +1 -0
- package/dist/db/schema/player-activity.d.ts +159 -0
- package/dist/db/schema/player-activity.js +1 -0
- package/dist/db/schema/revshare-carryover.d.ts +129 -0
- package/dist/db/schema/revshare-carryover.js +1 -0
- package/dist/db/schema/sessions.d.ts +213 -0
- package/dist/db/schema/sessions.js +1 -0
- package/dist/db/schema/table.d.ts +1 -0
- package/dist/db/schema/table.js +1 -0
- package/dist/db/schema/users.d.ts +609 -0
- package/dist/db/schema/users.js +1 -0
- package/dist/db/schema/verification-tokens.d.ts +106 -0
- package/dist/db/schema/verification-tokens.js +1 -0
- package/dist/db/types/branded.d.ts +3 -0
- package/dist/db/types/branded.js +0 -0
- package/dist/db/types/commission-rules.d.ts +70 -0
- package/dist/db/types/commission-rules.js +1 -0
- package/dist/db/types/index.d.ts +2 -0
- package/dist/db/types/index.js +1 -0
- package/dist/emails/admin/support-message.d.ts +39 -0
- package/dist/emails/admin/support-message.js +5 -0
- package/dist/emails/affiliate/activated.d.ts +33 -0
- package/dist/emails/affiliate/activated.js +1 -0
- package/dist/emails/affiliate/deal-notice.d.ts +35 -0
- package/dist/emails/affiliate/deal-notice.js +1 -0
- package/dist/emails/affiliate/invite.d.ts +35 -0
- package/dist/emails/affiliate/invite.js +1 -0
- package/dist/emails/affiliate/signup-verify.d.ts +35 -0
- package/dist/emails/affiliate/signup-verify.js +1 -0
- package/dist/emails/auth/password-reset.d.ts +37 -0
- package/dist/emails/auth/password-reset.js +1 -0
- package/dist/emails/layout.d.ts +10 -0
- package/dist/emails/layout.js +1 -0
- package/dist/emails/manager/affiliate-activated.d.ts +33 -0
- package/dist/emails/manager/affiliate-activated.js +1 -0
- package/dist/emails/manager/bulk-affiliates-activated.d.ts +33 -0
- package/dist/emails/manager/bulk-affiliates-activated.js +1 -0
- package/dist/emails/manager/invite.d.ts +35 -0
- package/dist/emails/manager/invite.js +1 -0
- package/dist/emails/manager/pending-approval.d.ts +33 -0
- package/dist/emails/manager/pending-approval.js +1 -0
- package/dist/emails/preview-env.d.ts +2 -0
- package/dist/emails/preview-env.js +1 -0
- package/dist/features/affiliates/actions.d.ts +60 -0
- package/dist/features/affiliates/actions.js +1 -0
- package/dist/features/affiliates/activation-email.d.ts +8 -0
- package/dist/features/affiliates/activation-email.js +1 -0
- package/dist/features/affiliates/bulk-approve.d.ts +2 -0
- package/dist/features/affiliates/bulk-approve.js +1 -0
- package/dist/features/affiliates/components/affiliate-actions-menu.d.ts +6 -0
- package/dist/features/affiliates/components/affiliate-actions-menu.js +1 -0
- package/dist/features/affiliates/components/affiliate-create-button.d.ts +1 -0
- package/dist/features/affiliates/components/affiliate-create-button.js +1 -0
- package/dist/features/affiliates/components/affiliate-detail-tabs.d.ts +6 -0
- package/dist/features/affiliates/components/affiliate-detail-tabs.js +1 -0
- package/dist/features/affiliates/components/affiliate-dialog.d.ts +11 -0
- package/dist/features/affiliates/components/affiliate-dialog.js +1 -0
- package/dist/features/affiliates/components/affiliate-profile-fields.d.ts +6 -0
- package/dist/features/affiliates/components/affiliate-profile-fields.js +1 -0
- package/dist/features/affiliates/components/affiliate-status-badge.d.ts +4 -0
- package/dist/features/affiliates/components/affiliate-status-badge.js +1 -0
- package/dist/features/affiliates/components/affiliate-status-tabs.d.ts +4 -0
- package/dist/features/affiliates/components/affiliate-status-tabs.js +1 -0
- package/dist/features/affiliates/components/affiliates-table.d.ts +10 -0
- package/dist/features/affiliates/components/affiliates-table.js +1 -0
- package/dist/features/affiliates/components/assign-parent-dialog.d.ts +5 -0
- package/dist/features/affiliates/components/assign-parent-dialog.js +1 -0
- package/dist/features/affiliates/components/detach-affiliate-confirm.d.ts +5 -0
- package/dist/features/affiliates/components/detach-affiliate-confirm.js +1 -0
- package/dist/features/affiliates/components/reject-affiliate-confirm.d.ts +5 -0
- package/dist/features/affiliates/components/reject-affiliate-confirm.js +1 -0
- package/dist/features/affiliates/components/sub-affiliate-invite-button.d.ts +3 -0
- package/dist/features/affiliates/components/sub-affiliate-invite-button.js +1 -0
- package/dist/features/affiliates/invite.d.ts +6 -0
- package/dist/features/affiliates/invite.js +1 -0
- package/dist/features/affiliates/list-params.d.ts +27 -0
- package/dist/features/affiliates/list-params.js +1 -0
- package/dist/features/affiliates/pending-notification.d.ts +18 -0
- package/dist/features/affiliates/pending-notification.js +1 -0
- package/dist/features/affiliates/sub-invite.d.ts +7 -0
- package/dist/features/affiliates/sub-invite.js +1 -0
- package/dist/features/audit/action-labels.d.ts +15 -0
- package/dist/features/audit/action-labels.js +1 -0
- package/dist/features/audit/components/audit-log-table.d.ts +5 -0
- package/dist/features/audit/components/audit-log-table.js +1 -0
- package/dist/features/audit/list-params.d.ts +2 -0
- package/dist/features/audit/list-params.js +1 -0
- package/dist/features/audit/read.d.ts +27 -0
- package/dist/features/audit/read.js +1 -0
- package/dist/features/auth/actions.d.ts +33 -0
- package/dist/features/auth/actions.js +1 -0
- package/dist/features/auth/authorization.d.ts +14 -0
- package/dist/features/auth/authorization.js +1 -0
- package/dist/features/auth/components/accept-invite-form.d.ts +3 -0
- package/dist/features/auth/components/accept-invite-form.js +1 -0
- package/dist/features/auth/components/forgot-password-form.d.ts +1 -0
- package/dist/features/auth/components/forgot-password-form.js +1 -0
- package/dist/features/auth/components/permissions-form.d.ts +5 -0
- package/dist/features/auth/components/permissions-form.js +1 -0
- package/dist/features/auth/components/reset-password-form.d.ts +3 -0
- package/dist/features/auth/components/reset-password-form.js +1 -0
- package/dist/features/auth/components/signin-form.d.ts +5 -0
- package/dist/features/auth/components/signin-form.js +1 -0
- package/dist/features/auth/components/signup-form.d.ts +1 -0
- package/dist/features/auth/components/signup-form.js +1 -0
- package/dist/features/auth/components/verify-email-form.d.ts +3 -0
- package/dist/features/auth/components/verify-email-form.js +1 -0
- package/dist/features/auth/password-reset.d.ts +6 -0
- package/dist/features/auth/password-reset.js +1 -0
- package/dist/features/auth/permissions.d.ts +49 -0
- package/dist/features/auth/permissions.js +1 -0
- package/dist/features/auth/require.d.ts +3 -0
- package/dist/features/auth/require.js +1 -0
- package/dist/features/auth/signup-email.d.ts +6 -0
- package/dist/features/auth/signup-email.js +1 -0
- package/dist/features/campaigns/actions.d.ts +53 -0
- package/dist/features/campaigns/actions.js +1 -0
- package/dist/features/campaigns/components/campaign-dialog.d.ts +7 -0
- package/dist/features/campaigns/components/campaign-dialog.js +1 -0
- package/dist/features/campaigns/components/campaign-row-actions.d.ts +8 -0
- package/dist/features/campaigns/components/campaign-row-actions.js +1 -0
- package/dist/features/campaigns/components/campaign-status-badge.d.ts +6 -0
- package/dist/features/campaigns/components/campaign-status-badge.js +1 -0
- package/dist/features/campaigns/components/campaign-status-tabs.d.ts +1 -0
- package/dist/features/campaigns/components/campaign-status-tabs.js +1 -0
- package/dist/features/campaigns/components/campaigns-table.d.ts +7 -0
- package/dist/features/campaigns/components/campaigns-table.js +1 -0
- package/dist/features/campaigns/components/create-campaign-button.d.ts +5 -0
- package/dist/features/campaigns/components/create-campaign-button.js +1 -0
- package/dist/features/campaigns/components/sub-id-builder.d.ts +4 -0
- package/dist/features/campaigns/components/sub-id-builder.js +1 -0
- package/dist/features/campaigns/components/tracking-link-box.d.ts +3 -0
- package/dist/features/campaigns/components/tracking-link-box.js +1 -0
- package/dist/features/campaigns/components/tracking-link-cell.d.ts +4 -0
- package/dist/features/campaigns/components/tracking-link-cell.js +1 -0
- package/dist/features/campaigns/components/tracking-link-dialog.d.ts +6 -0
- package/dist/features/campaigns/components/tracking-link-dialog.js +1 -0
- package/dist/features/campaigns/list-params.d.ts +14 -0
- package/dist/features/campaigns/list-params.js +1 -0
- package/dist/features/campaigns/tracking-url.d.ts +8 -0
- package/dist/features/campaigns/tracking-url.js +1 -0
- package/dist/features/casinos/actions.d.ts +39 -0
- package/dist/features/casinos/actions.js +1 -0
- package/dist/features/casinos/components/casino-create-button.d.ts +1 -0
- package/dist/features/casinos/components/casino-create-button.js +1 -0
- package/dist/features/casinos/components/casino-dialog.d.ts +11 -0
- package/dist/features/casinos/components/casino-dialog.js +1 -0
- package/dist/features/casinos/components/casino-form-fields.d.ts +7 -0
- package/dist/features/casinos/components/casino-form-fields.js +1 -0
- package/dist/features/casinos/components/casino-status-tabs.d.ts +1 -0
- package/dist/features/casinos/components/casino-status-tabs.js +1 -0
- package/dist/features/casinos/components/casinos-table.d.ts +6 -0
- package/dist/features/casinos/components/casinos-table.js +1 -0
- package/dist/features/casinos/components/delete-casino-confirm.d.ts +5 -0
- package/dist/features/casinos/components/delete-casino-confirm.js +1 -0
- package/dist/features/casinos/list-params.d.ts +14 -0
- package/dist/features/casinos/list-params.js +1 -0
- package/dist/features/commissions/actions.d.ts +76 -0
- package/dist/features/commissions/actions.js +1 -0
- package/dist/features/commissions/components/casino-bindings-field.d.ts +10 -0
- package/dist/features/commissions/components/casino-bindings-field.js +1 -0
- package/dist/features/commissions/components/commission-create-button.d.ts +1 -0
- package/dist/features/commissions/components/commission-create-button.js +1 -0
- package/dist/features/commissions/components/commission-detail-dialog.d.ts +5 -0
- package/dist/features/commissions/components/commission-detail-dialog.js +1 -0
- package/dist/features/commissions/components/commission-editor.d.ts +8 -0
- package/dist/features/commissions/components/commission-editor.js +1 -0
- package/dist/features/commissions/components/commission-read-view.d.ts +5 -0
- package/dist/features/commissions/components/commission-read-view.js +1 -0
- package/dist/features/commissions/components/commission-status-badge.d.ts +4 -0
- package/dist/features/commissions/components/commission-status-badge.js +1 -0
- package/dist/features/commissions/components/commission-status-tabs.d.ts +1 -0
- package/dist/features/commissions/components/commission-status-tabs.js +1 -0
- package/dist/features/commissions/components/commissions-table.d.ts +14 -0
- package/dist/features/commissions/components/commissions-table.js +1 -0
- package/dist/features/commissions/components/delete-commission-confirm.d.ts +5 -0
- package/dist/features/commissions/components/delete-commission-confirm.js +1 -0
- package/dist/features/commissions/components/duplicate-commission-dialog.d.ts +6 -0
- package/dist/features/commissions/components/duplicate-commission-dialog.js +1 -0
- package/dist/features/commissions/components/rule-editor/conditions-block.d.ts +9 -0
- package/dist/features/commissions/components/rule-editor/conditions-block.js +1 -0
- package/dist/features/commissions/components/rule-editor/modifiers-block.d.ts +9 -0
- package/dist/features/commissions/components/rule-editor/modifiers-block.js +1 -0
- package/dist/features/commissions/components/rule-editor/qualifiers-block.d.ts +9 -0
- package/dist/features/commissions/components/rule-editor/qualifiers-block.js +1 -0
- package/dist/features/commissions/components/rule-editor/reducer.d.ts +102 -0
- package/dist/features/commissions/components/rule-editor/reducer.js +1 -0
- package/dist/features/commissions/components/rule-editor/rewards-block.d.ts +9 -0
- package/dist/features/commissions/components/rule-editor/rewards-block.js +1 -0
- package/dist/features/commissions/components/rule-editor/rule-card.d.ts +10 -0
- package/dist/features/commissions/components/rule-editor/rule-card.js +1 -0
- package/dist/features/commissions/components/rule-editor/rule-editor.d.ts +7 -0
- package/dist/features/commissions/components/rule-editor/rule-editor.js +1 -0
- package/dist/features/commissions/components/rule-editor/rule-group-card.d.ts +9 -0
- package/dist/features/commissions/components/rule-editor/rule-group-card.js +1 -0
- package/dist/features/commissions/components/rule-editor/state.d.ts +21 -0
- package/dist/features/commissions/components/rule-editor/state.js +1 -0
- package/dist/features/commissions/components/rule-groups-read-view.d.ts +4 -0
- package/dist/features/commissions/components/rule-groups-read-view.js +1 -0
- package/dist/features/commissions/list-params.d.ts +14 -0
- package/dist/features/commissions/list-params.js +1 -0
- package/dist/features/commissions/rule-validation.d.ts +173 -0
- package/dist/features/commissions/rule-validation.js +1 -0
- package/dist/features/dashboard/affiliate-queries.d.ts +14 -0
- package/dist/features/dashboard/affiliate-queries.js +1 -0
- package/dist/features/dashboard/clickhouse.d.ts +3 -0
- package/dist/features/dashboard/clickhouse.js +2 -0
- package/dist/features/dashboard/components/affiliate-charts.d.ts +5 -0
- package/dist/features/dashboard/components/affiliate-charts.js +1 -0
- package/dist/features/dashboard/components/affiliate-stats.d.ts +5 -0
- package/dist/features/dashboard/components/affiliate-stats.js +1 -0
- package/dist/features/dashboard/components/charts/funnel-chart.d.ts +11 -0
- package/dist/features/dashboard/components/charts/funnel-chart.js +1 -0
- package/dist/features/dashboard/components/charts/rank-bar-chart.d.ts +10 -0
- package/dist/features/dashboard/components/charts/rank-bar-chart.js +1 -0
- package/dist/features/dashboard/components/charts/time-series-chart.d.ts +12 -0
- package/dist/features/dashboard/components/charts/time-series-chart.js +1 -0
- package/dist/features/dashboard/components/charts-grid.d.ts +8 -0
- package/dist/features/dashboard/components/charts-grid.js +1 -0
- package/dist/features/dashboard/components/dashboard-charts.d.ts +4 -0
- package/dist/features/dashboard/components/dashboard-charts.js +1 -0
- package/dist/features/dashboard/components/dashboard-period-tabs.d.ts +1 -0
- package/dist/features/dashboard/components/dashboard-period-tabs.js +1 -0
- package/dist/features/dashboard/components/money-stat-card.d.ts +6 -0
- package/dist/features/dashboard/components/money-stat-card.js +1 -0
- package/dist/features/dashboard/components/stat-card.d.ts +6 -0
- package/dist/features/dashboard/components/stat-card.js +1 -0
- package/dist/features/dashboard/components/top-affiliates.d.ts +4 -0
- package/dist/features/dashboard/components/top-affiliates.js +1 -0
- package/dist/features/dashboard/list-params.d.ts +24 -0
- package/dist/features/dashboard/list-params.js +1 -0
- package/dist/features/dashboard/queries.d.ts +63 -0
- package/dist/features/dashboard/queries.js +1 -0
- package/dist/features/dashboard/series.d.ts +32 -0
- package/dist/features/dashboard/series.js +1 -0
- package/dist/features/deals/actions.d.ts +60 -0
- package/dist/features/deals/actions.js +1 -0
- package/dist/features/deals/components/affiliate-deals.d.ts +10 -0
- package/dist/features/deals/components/affiliate-deals.js +1 -0
- package/dist/features/deals/components/assign-deal-button.d.ts +9 -0
- package/dist/features/deals/components/assign-deal-button.js +1 -0
- package/dist/features/deals/components/deal-dialog.d.ts +19 -0
- package/dist/features/deals/components/deal-dialog.js +1 -0
- package/dist/features/deals/components/deal-row-actions.d.ts +6 -0
- package/dist/features/deals/components/deal-row-actions.js +1 -0
- package/dist/features/deals/components/deal-status-badge.d.ts +10 -0
- package/dist/features/deals/components/deal-status-badge.js +1 -0
- package/dist/features/deals/components/deal-status-tabs.d.ts +1 -0
- package/dist/features/deals/components/deal-status-tabs.js +1 -0
- package/dist/features/deals/components/delegate-deal-button.d.ts +8 -0
- package/dist/features/deals/components/delegate-deal-button.js +1 -0
- package/dist/features/deals/deal-assigned-email.d.ts +11 -0
- package/dist/features/deals/deal-assigned-email.js +1 -0
- package/dist/features/deals/deal-delegated-email.d.ts +13 -0
- package/dist/features/deals/deal-delegated-email.js +1 -0
- package/dist/features/deals/list-params.d.ts +14 -0
- package/dist/features/deals/list-params.js +1 -0
- package/dist/features/earnings/components/earnings-balances.d.ts +4 -0
- package/dist/features/earnings/components/earnings-balances.js +1 -0
- package/dist/features/earnings/components/earnings-ledger.d.ts +5 -0
- package/dist/features/earnings/components/earnings-ledger.js +1 -0
- package/dist/features/earnings/components/earnings-status-badge.d.ts +4 -0
- package/dist/features/earnings/components/earnings-status-badge.js +1 -0
- package/dist/features/earnings/components/earnings-status-tabs.d.ts +1 -0
- package/dist/features/earnings/components/earnings-status-tabs.js +1 -0
- package/dist/features/earnings/components/sub-affiliate-earnings.d.ts +4 -0
- package/dist/features/earnings/components/sub-affiliate-earnings.js +1 -0
- package/dist/features/earnings/list-params.d.ts +14 -0
- package/dist/features/earnings/list-params.js +1 -0
- package/dist/features/earnings/queries.d.ts +30 -0
- package/dist/features/earnings/queries.js +1 -0
- package/dist/features/groups/actions.d.ts +36 -0
- package/dist/features/groups/actions.js +1 -0
- package/dist/features/groups/components/delete-group-confirm.d.ts +5 -0
- package/dist/features/groups/components/delete-group-confirm.js +1 -0
- package/dist/features/groups/components/group-create-button.d.ts +1 -0
- package/dist/features/groups/components/group-create-button.js +1 -0
- package/dist/features/groups/components/group-dialog.d.ts +11 -0
- package/dist/features/groups/components/group-dialog.js +1 -0
- package/dist/features/groups/components/group-form-fields.d.ts +10 -0
- package/dist/features/groups/components/group-form-fields.js +1 -0
- package/dist/features/groups/components/group-status-tabs.d.ts +1 -0
- package/dist/features/groups/components/group-status-tabs.js +1 -0
- package/dist/features/groups/components/groups-table.d.ts +9 -0
- package/dist/features/groups/components/groups-table.js +1 -0
- package/dist/features/groups/list-params.d.ts +14 -0
- package/dist/features/groups/list-params.js +1 -0
- package/dist/features/managers/actions.d.ts +43 -0
- package/dist/features/managers/actions.js +1 -0
- package/dist/features/managers/components/manager-create-button.d.ts +1 -0
- package/dist/features/managers/components/manager-create-button.js +1 -0
- package/dist/features/managers/components/manager-dialog.d.ts +11 -0
- package/dist/features/managers/components/manager-dialog.js +1 -0
- package/dist/features/managers/components/manager-permissions-dialog.d.ts +7 -0
- package/dist/features/managers/components/manager-permissions-dialog.js +1 -0
- package/dist/features/managers/components/manager-profile-fields.d.ts +7 -0
- package/dist/features/managers/components/manager-profile-fields.js +1 -0
- package/dist/features/managers/components/manager-status-tabs.d.ts +1 -0
- package/dist/features/managers/components/manager-status-tabs.js +1 -0
- package/dist/features/managers/components/managers-table.d.ts +8 -0
- package/dist/features/managers/components/managers-table.js +1 -0
- package/dist/features/managers/invite.d.ts +6 -0
- package/dist/features/managers/invite.js +1 -0
- package/dist/features/managers/list-params.d.ts +14 -0
- package/dist/features/managers/list-params.js +1 -0
- package/dist/features/payouts/actions.d.ts +12 -0
- package/dist/features/payouts/actions.js +1 -0
- package/dist/features/payouts/balance.d.ts +2 -0
- package/dist/features/payouts/balance.js +1 -0
- package/dist/features/payouts/components/my-payouts-table.d.ts +5 -0
- package/dist/features/payouts/components/my-payouts-table.js +1 -0
- package/dist/features/payouts/components/payout-row-actions.d.ts +5 -0
- package/dist/features/payouts/components/payout-row-actions.js +1 -0
- package/dist/features/payouts/components/payout-status-badge.d.ts +4 -0
- package/dist/features/payouts/components/payout-status-badge.js +1 -0
- package/dist/features/payouts/components/payout-status-tabs.d.ts +1 -0
- package/dist/features/payouts/components/payout-status-tabs.js +1 -0
- package/dist/features/payouts/components/payouts-table.d.ts +6 -0
- package/dist/features/payouts/components/payouts-table.js +1 -0
- package/dist/features/payouts/components/request-payout-dialog.d.ts +4 -0
- package/dist/features/payouts/components/request-payout-dialog.js +1 -0
- package/dist/features/payouts/constants.d.ts +2 -0
- package/dist/features/payouts/constants.js +1 -0
- package/dist/features/payouts/list-params.d.ts +14 -0
- package/dist/features/payouts/list-params.js +1 -0
- package/dist/features/payouts/my-queries.d.ts +14 -0
- package/dist/features/payouts/my-queries.js +1 -0
- package/dist/features/payouts/queries.d.ts +14 -0
- package/dist/features/payouts/queries.js +1 -0
- package/dist/features/postbacks/actions.d.ts +27 -0
- package/dist/features/postbacks/actions.js +1 -0
- package/dist/features/postbacks/components/integration-dialog.d.ts +6 -0
- package/dist/features/postbacks/components/integration-dialog.js +1 -0
- package/dist/features/postbacks/components/postback-editor.d.ts +5 -0
- package/dist/features/postbacks/components/postback-editor.js +1 -0
- package/dist/features/postbacks/components/postbacks-table.d.ts +4 -0
- package/dist/features/postbacks/components/postbacks-table.js +1 -0
- package/dist/features/settings/actions.d.ts +2 -0
- package/dist/features/settings/actions.js +1 -0
- package/dist/features/settings/components/affiliate-approval-setting.d.ts +3 -0
- package/dist/features/settings/components/affiliate-approval-setting.js +1 -0
- package/dist/features/settings/components/manager-totp-setting.d.ts +3 -0
- package/dist/features/settings/components/manager-totp-setting.js +1 -0
- package/dist/features/support/actions.d.ts +12 -0
- package/dist/features/support/actions.js +1 -0
- package/dist/features/support/components/support-page.d.ts +4 -0
- package/dist/features/support/components/support-page.js +1 -0
- package/dist/features/support/email.d.ts +13 -0
- package/dist/features/support/email.js +1 -0
- package/dist/features/users/actions.d.ts +4 -0
- package/dist/features/users/actions.js +1 -0
- package/dist/features/users/components/password-section.d.ts +1 -0
- package/dist/features/users/components/password-section.js +1 -0
- package/dist/features/users/components/preferences-section.d.ts +4 -0
- package/dist/features/users/components/preferences-section.js +1 -0
- package/dist/features/users/components/settings-tabs.d.ts +1 -0
- package/dist/features/users/components/settings-tabs.js +1 -0
- package/dist/features/users/components/totp-section.d.ts +4 -0
- package/dist/features/users/components/totp-section.js +1 -0
- package/dist/features/users/list-params.d.ts +12 -0
- package/dist/features/users/list-params.js +1 -0
- package/dist/features/users/totp.d.ts +7 -0
- package/dist/features/users/totp.js +1 -0
- package/dist/i18n/config.d.ts +5 -0
- package/dist/i18n/config.js +1 -0
- package/dist/i18n/get-locale.d.ts +3 -0
- package/dist/i18n/get-locale.js +1 -0
- package/dist/i18n/locale.d.ts +2 -0
- package/dist/i18n/locale.js +1 -0
- package/dist/lib/actions/parse-form.d.ts +3 -0
- package/dist/lib/actions/parse-form.js +1 -0
- package/dist/lib/actions/state.d.ts +22 -0
- package/dist/lib/actions/state.js +0 -0
- package/dist/lib/audit/actions.d.ts +9 -0
- package/dist/lib/audit/actions.js +1 -0
- package/dist/lib/audit/record.d.ts +4 -0
- package/dist/lib/audit/record.js +1 -0
- package/dist/lib/auth/action.d.ts +45 -0
- package/dist/lib/auth/action.js +1 -0
- package/dist/lib/auth/config.d.ts +24 -0
- package/dist/lib/auth/config.js +1 -0
- package/dist/lib/auth/jwt.d.ts +17 -0
- package/dist/lib/auth/jwt.js +1 -0
- package/dist/lib/auth/password-options.d.ts +6 -0
- package/dist/lib/auth/password-options.js +1 -0
- package/dist/lib/auth/password.d.ts +3 -0
- package/dist/lib/auth/password.js +1 -0
- package/dist/lib/auth/session.d.ts +26 -0
- package/dist/lib/auth/session.js +1 -0
- package/dist/lib/auth/tokens.d.ts +43 -0
- package/dist/lib/auth/tokens.js +1 -0
- package/dist/lib/auth/totp-challenge.d.ts +4 -0
- package/dist/lib/auth/totp-challenge.js +1 -0
- package/dist/lib/auth/totp.d.ts +7 -0
- package/dist/lib/auth/totp.js +1 -0
- package/dist/lib/auth/verification-tokens.d.ts +19 -0
- package/dist/lib/auth/verification-tokens.js +1 -0
- package/dist/lib/cn.d.ts +2 -0
- package/dist/lib/cn.js +1 -0
- package/dist/lib/countries.d.ts +18 -0
- package/dist/lib/countries.js +1 -0
- package/dist/lib/currencies.d.ts +6 -0
- package/dist/lib/currencies.js +1 -0
- package/dist/lib/data/countries-by-continent.json +257 -0
- package/dist/lib/db/errors.d.ts +4 -0
- package/dist/lib/db/errors.js +1 -0
- package/dist/lib/email/client.d.ts +6 -0
- package/dist/lib/email/client.js +1 -0
- package/dist/lib/email/env.d.ts +12 -0
- package/dist/lib/email/env.js +1 -0
- package/dist/lib/email/format.d.ts +5 -0
- package/dist/lib/email/format.js +1 -0
- package/dist/lib/email/locale.d.ts +3 -0
- package/dist/lib/email/locale.js +1 -0
- package/dist/lib/email/send.d.ts +12 -0
- package/dist/lib/email/send.js +1 -0
- package/dist/lib/env.d.ts +20 -0
- package/dist/lib/env.js +1 -0
- package/dist/lib/errors/codes.d.ts +72 -0
- package/dist/lib/errors/codes.js +1 -0
- package/dist/lib/errors/server.d.ts +10 -0
- package/dist/lib/errors/server.js +1 -0
- package/dist/lib/format.d.ts +3 -0
- package/dist/lib/format.js +1 -0
- package/dist/lib/hooks/use-deferred-dialog.d.ts +11 -0
- package/dist/lib/hooks/use-deferred-dialog.js +1 -0
- package/dist/lib/hooks/use-form-reset.d.ts +2 -0
- package/dist/lib/hooks/use-form-reset.js +1 -0
- package/dist/lib/hooks/use-form-toast.d.ts +2 -0
- package/dist/lib/hooks/use-form-toast.js +1 -0
- package/dist/lib/i18n/format-datetime.d.ts +1 -0
- package/dist/lib/i18n/format-datetime.js +1 -0
- package/dist/lib/i18n/relative-time.d.ts +1 -0
- package/dist/lib/i18n/relative-time.js +1 -0
- package/dist/lib/list-params.d.ts +51 -0
- package/dist/lib/list-params.js +1 -0
- package/dist/lib/money.d.ts +2 -0
- package/dist/lib/money.js +1 -0
- package/dist/lib/platform-settings.d.ts +5 -0
- package/dist/lib/platform-settings.js +1 -0
- package/dist/lib/preferences/actions.d.ts +1 -0
- package/dist/lib/preferences/actions.js +1 -0
- package/dist/lib/preferences/index.d.ts +15 -0
- package/dist/lib/preferences/index.js +1 -0
- package/dist/lib/preferences/read.d.ts +2 -0
- package/dist/lib/preferences/read.js +1 -0
- package/dist/lib/slug.d.ts +1 -0
- package/dist/lib/slug.js +1 -0
- package/dist/lib/toast.d.ts +13 -0
- package/dist/lib/toast.js +1 -0
- package/dist/lib/tracking-cache.d.ts +2 -0
- package/dist/lib/tracking-cache.js +1 -0
- package/dist/lib/users.d.ts +12 -0
- package/dist/lib/users.js +1 -0
- package/dist/lib/validation/zod.d.ts +30 -0
- package/dist/lib/validation/zod.js +1 -0
- package/dist/messages/de/emails.json +136 -0
- package/dist/messages/de/index.json +1104 -0
- package/dist/messages/en/emails.json +136 -0
- package/dist/messages/en/index.json +1104 -0
- package/dist/theme/config.d.ts +8 -0
- package/dist/theme/config.js +1 -0
- package/dist/theme/get-theme.d.ts +3 -0
- package/dist/theme/get-theme.js +1 -0
- package/dist/theme/theme.d.ts +2 -0
- package/dist/theme/theme.js +1 -0
- package/package.json +131 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { type Commission, type CommissionRule, type CommissionRuleGroup } from "../../db/schema/index.js";
|
|
2
|
+
import type { CommissionStatusFilter } from "./list-params.js";
|
|
3
|
+
import type { FormState } from "../../lib/actions/state.js";
|
|
4
|
+
import { type ListResult } from "../../lib/list-params.js";
|
|
5
|
+
export type CommissionFormState = FormState<{
|
|
6
|
+
id: string;
|
|
7
|
+
}>;
|
|
8
|
+
export declare const listCommissions: (params: import("../../lib/list-params.js").PageInput & {
|
|
9
|
+
q: string;
|
|
10
|
+
sort: "createdAt" | "title";
|
|
11
|
+
dir: import("../../lib/list-params.js").SortDir;
|
|
12
|
+
} & {
|
|
13
|
+
status: CommissionStatusFilter;
|
|
14
|
+
}) => Promise<ListResult<{
|
|
15
|
+
id: string;
|
|
16
|
+
createdAt: Date;
|
|
17
|
+
status: "draft" | "published" | "deactivated";
|
|
18
|
+
updatedAt: Date;
|
|
19
|
+
title: string | null;
|
|
20
|
+
strategy: "custom" | "rev_share" | "cpa" | "hybrid";
|
|
21
|
+
tags: string[];
|
|
22
|
+
currency: string;
|
|
23
|
+
carryoverLimit: string | null;
|
|
24
|
+
allowSubAffiliates: boolean;
|
|
25
|
+
subAffiliateMaxPercent: string | null;
|
|
26
|
+
}>>;
|
|
27
|
+
export declare const listCasinoBindingsForCommissions: (commissionIds: readonly string[]) => Promise<{
|
|
28
|
+
commissionId: string;
|
|
29
|
+
casinoId: string;
|
|
30
|
+
casinoName: string;
|
|
31
|
+
}[]>;
|
|
32
|
+
export declare const listActiveCasinosForCommission: () => Promise<{
|
|
33
|
+
id: string;
|
|
34
|
+
name: string;
|
|
35
|
+
}[]>;
|
|
36
|
+
export type CommissionWithCasinos = Commission & {
|
|
37
|
+
casinoBindings: Array<{
|
|
38
|
+
casinoId: string;
|
|
39
|
+
name: string;
|
|
40
|
+
}>;
|
|
41
|
+
};
|
|
42
|
+
export type CommissionRuleWithoutGroupId = Omit<CommissionRule, "ruleGroupId">;
|
|
43
|
+
export type CommissionRuleGroupWithRules = Omit<CommissionRuleGroup, "commissionId"> & {
|
|
44
|
+
rules: CommissionRuleWithoutGroupId[];
|
|
45
|
+
};
|
|
46
|
+
export type CommissionWithRules = CommissionWithCasinos & {
|
|
47
|
+
ruleGroups: CommissionRuleGroupWithRules[];
|
|
48
|
+
};
|
|
49
|
+
export declare const getCommissionById: (commissionId: string) => Promise<CommissionWithRules | null>;
|
|
50
|
+
export type CommissionDealView = ({
|
|
51
|
+
kind: "full";
|
|
52
|
+
} & CommissionWithRules) | ({
|
|
53
|
+
kind: "sub";
|
|
54
|
+
subSharePercent: string;
|
|
55
|
+
} & CommissionWithRules);
|
|
56
|
+
/**
|
|
57
|
+
* Returns a commission for read-only display from the deals context.
|
|
58
|
+
* Managers and direct affiliates see the full commission; a sub-affiliate only
|
|
59
|
+
* ever sees their own share, never the parent's rates or the sub-affiliate cap.
|
|
60
|
+
* Allowed if the caller has `commissions:read` OR holds a deal for it.
|
|
61
|
+
*/
|
|
62
|
+
export declare function getCommissionForDealView(commissionId: string): Promise<CommissionDealView | null>;
|
|
63
|
+
export declare const createDraftCommissionAction: () => Promise<import("../../lib/actions/state.js").ActionResult<void>>;
|
|
64
|
+
export declare const updateCommissionAction: (args_0: string, args_1: FormState<{
|
|
65
|
+
id: string;
|
|
66
|
+
}>, args_2: FormData) => Promise<FormState<{
|
|
67
|
+
id: string;
|
|
68
|
+
}>>;
|
|
69
|
+
export declare const deactivateCommissionAction: (args_0: string) => Promise<import("../../lib/actions/state.js").ActionResult<void>>;
|
|
70
|
+
export declare const reactivateCommissionAction: (args_0: string) => Promise<import("../../lib/actions/state.js").ActionResult<void>>;
|
|
71
|
+
export declare const duplicateCommissionAction: (args_0: string, args_1: FormState<{
|
|
72
|
+
id: string;
|
|
73
|
+
}>, args_2: FormData) => Promise<FormState<{
|
|
74
|
+
id: string;
|
|
75
|
+
}>>;
|
|
76
|
+
export declare const deleteCommissionAction: (args_0: string, args_1: FormState<void>, args_2: FormData) => Promise<FormState<void>>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use server";import{randomUUID as O}from"node:crypto";import{db as c}from"../../db/index.js";import{COMMISSION_STATUS as l,COMMISSION_STRATEGY as A,casinos as f,commissionCasinos as d,commissionRuleGroups as b,commissionRules as S,commissions as s,deals as I}from"../../db/schema/index.js";import{and as R,asc as g,count as E,desc as U,eq as n,ilike as Q,inArray as D}from"drizzle-orm";import{revalidatePath as P}from"next/cache";import{redirect as B}from"next/navigation";import{z as u}from"zod";import{requireSession as V}from"../auth/authorization.js";import{hasPermission as $}from"../auth/permissions.js";import{RuleGroupsInputSchema as j,ruleGroupsHaveIncompleteConditions as H,ruleGroupsHaveNoReward as J,ruleGroupsHavePercentPerPlayerGate as K}from"./rule-validation.js";import{parseForm as T}from"../../lib/actions/parse-form.js";import{authAction as L,authFormAction as M,authQuery as _}from"../../lib/auth/action.js";import{DEFAULT_CURRENCY as Y,isSupportedCurrency as z}from"../../lib/currencies.js";import{appError as y}from"../../lib/errors/codes.js";import{success as v}from"../../lib/errors/server.js";import{paginate as X}from"../../lib/list-params.js";import{arrayField as Z,NAME_MAX as W,V as h}from"../../lib/validation/zod.js";function ee(e){const i=e.flatMap(o=>o.rules.flatMap(a=>a.rewards)),r=i.some(o=>o.type==="fixed"),t=i.some(o=>o.type==="percentage");return r&&t?A.hybrid:t?A.rev_share:r?A.cpa:A.rev_share}const x=e=>e===""||e===void 0?null:e,ie=u.object({title:u.preprocess(x,u.string().trim().min(1).max(W).nullable()),currency:u.preprocess(x,u.string().nullable().refine(e=>e===null||z(e),{message:h.unsupportedCurrency})),casinoIds:Z(u.uuid()),tags:u.preprocess(e=>{if(typeof e!="string")return[];const i=new Set;for(const r of e.split(",")){const t=r.trim();t&&i.add(t)}return Array.from(i)},u.array(u.string().max(W))),carryover:u.preprocess(e=>e==="true"||e==="on"||e===!0,u.boolean()),allowSubAffiliates:u.preprocess(e=>e==="true"||e==="on"||e===!0,u.boolean()),subAffiliateMaxPercent:u.preprocess(x,u.coerce.number().min(0).max(100).nullable()),carryoverLimit:u.preprocess(x,u.coerce.number().min(0).nullable()),ruleGroups:u.string().transform((e,i)=>{if(e.trim()==="")return[];try{return JSON.parse(e)}catch{return i.addIssue({code:"custom",message:"Invalid ruleGroups payload"}),u.NEVER}}).pipe(j).optional(),intent:u.enum(["save","publish"]).default("save")}).superRefine((e,i)=>{e.carryover&&e.carryoverLimit===null&&i.addIssue({code:"custom",path:["carryoverLimit"],message:h.fieldRequired}),e.intent==="publish"&&((e.title===null||e.title.trim()==="")&&i.addIssue({code:"custom",path:["title"],message:h.fieldRequired}),e.currency===null&&i.addIssue({code:"custom",path:["currency"],message:h.fieldRequired}),e.casinoIds.length===0&&i.addIssue({code:"custom",path:["casinoIds"],message:h.fieldRequired}),e.allowSubAffiliates&&e.subAffiliateMaxPercent===null&&i.addIssue({code:"custom",path:["subAffiliateMaxPercent"],message:h.fieldRequired}),e.ruleGroups!==void 0&&H(e.ruleGroups)&&i.addIssue({code:"custom",path:["ruleGroups"],message:h.incompleteRules}),e.ruleGroups!==void 0&&J(e.ruleGroups)&&i.addIssue({code:"custom",path:["ruleGroups"],message:h.noReward}),e.ruleGroups!==void 0&&K(e.ruleGroups)&&i.addIssue({code:"custom",path:["ruleGroups"],message:h.percentPerPlayerGate}))}),te=u.object({title:u.string().trim().min(1,h.nameRequired).max(W)});function se(e,i){const r=s[e];return[i==="asc"?g(r):U(r),g(s.id)]}function re(e){if(e)return Q(s.title,`%${e}%`)}function oe(e){switch(e){case"all":return;case"draft":return n(s.status,l.draft);case"published":return n(s.status,l.published);case"deactivated":return n(s.status,l.deactivated)}}const Ie=_("commissions:read",async(e,i)=>{const r=re(i.q),t=oe(i.status),[o,a]=se(i.sort,i.dir),m=R(r,t);return X(i,{count:async()=>{const[p]=await c.select({total:E()}).from(s).where(m);return p?.total??0},fetch:({offset:p,limit:C})=>c.select().from(s).where(m).orderBy(o,a).limit(C).offset(p)})}),ve=_("commissions:read",async(e,i)=>i.length===0?[]:c.select({commissionId:d.commissionId,casinoId:d.casinoId,casinoName:f.name}).from(d).innerJoin(f,n(f.id,d.casinoId)).where(D(d.commissionId,i))),Ae=_("commissions:read",async e=>c.select({id:f.id,name:f.name}).from(f).where(n(f.isActive,!0)).orderBy(g(f.name))),Pe=_("commissions:read",async(e,i)=>F(i));async function _e(e){const{user:i,carrier:r}=await V();if(!$(r,"commissions:read")){const o=await c.select({parentDealId:I.parentDealId,subAffiliatePercent:I.subAffiliatePercent}).from(I).where(R(n(I.affiliateId,i.id),n(I.commissionId,e)));if(o.length===0)return null;if(o.every(m=>m.parentDealId!==null)){const m=await F(e);return m?{kind:"sub",subSharePercent:o[0].subAffiliatePercent??"0",...m}:null}}const t=await F(e);return t?{kind:"full",...t}:null}async function ne(e){const[i]=await c.select().from(s).where(n(s.id,e)).limit(1);if(!i)return null;const r=await c.select({casinoId:d.casinoId,name:f.name}).from(d).innerJoin(f,n(f.id,d.casinoId)).where(n(d.commissionId,e)).orderBy(g(f.name));return{...i,casinoBindings:r}}async function q(e){const i=await c.select().from(b).where(n(b.commissionId,e)).orderBy(g(b.priority),g(b.id));if(i.length===0)return[];const r=await c.select().from(S).where(D(S.ruleGroupId,i.map(o=>o.id))).orderBy(g(S.ruleGroupId),g(S.position),g(S.id)),t=new Map;for(const o of r){const{ruleGroupId:a,...m}=o,p=t.get(a)??[];p.push(m),t.set(a,p)}return i.map(({commissionId:o,...a})=>({...a,rules:t.get(a.id)??[]}))}async function F(e){const[i,r]=await Promise.all([ne(e),q(e)]);return i?{...i,ruleGroups:r}:null}async function N(e,i,r){if(r.length===0)return;const t=r.map((a,m)=>({id:O(),priority:a.priority??(m+1)*10,rules:a.rules}));await e.insert(b).values(t.map(a=>({id:a.id,commissionId:i,priority:a.priority})));const o=t.flatMap(a=>a.rules.map((m,p)=>({ruleGroupId:a.id,position:p,qualifiers:m.qualifiers,conditions:m.conditions,modifiers:m.modifiers,rewards:m.rewards})));o.length>0&&await e.insert(S).values(o)}const xe=L({permission:"commissions:manage",revalidate:["/commissions"]},async({audit:e})=>{const[i]=await c.insert(s).values({status:l.draft}).returning({id:s.id});if(!i)throw y("commission_not_found",{toast:!0});await e({action:"commission.create",target:{type:"commission",id:i.id},metadata:{status:l.draft}}),B(`/commissions/${i.id}`)}),Le=M({permission:"commissions:manage",revalidate:["/commissions"]},async({audit:e},i,r)=>{const t=await T(r,ie),o=t.allowSubAffiliates&&t.subAffiliateMaxPercent!==null?t.subAffiliateMaxPercent.toString():null,a=t.carryover&&t.carryoverLimit!==null?t.carryoverLimit.toString():null;return await c.transaction(async m=>{const[p]=await m.update(s).set({title:t.title,...t.ruleGroups!==void 0?{strategy:ee(t.ruleGroups)}:{},tags:t.tags,currency:t.currency??Y,carryoverLimit:a,allowSubAffiliates:t.allowSubAffiliates,subAffiliateMaxPercent:o}).where(R(n(s.id,i),n(s.status,l.draft))).returning({id:s.id});if(!p){const[C]=await m.select({id:s.id}).from(s).where(n(s.id,i)).limit(1);throw C?y("commission_not_draft",{toast:!0}):y("commission_not_found",{toast:!0})}await m.delete(d).where(n(d.commissionId,i)),t.casinoIds.length>0&&await m.insert(d).values(t.casinoIds.map(C=>({commissionId:i,casinoId:C}))),t.ruleGroups!==void 0&&(await m.delete(b).where(n(b.commissionId,i)),await N(m,i,t.ruleGroups)),t.intent==="publish"&&await m.update(s).set({status:l.published}).where(n(s.id,i))}),P(`/commissions/${i}`),t.intent==="publish"&&(await e({action:"commission.publish",target:{type:"commission",id:i,label:t.title??void 0},metadata:{status:l.published}}),P("/commissions"),B("/commissions")),await e({action:"commission.update",target:{type:"commission",id:i,label:t.title??void 0}}),v({id:i},"Toasts.commissionUpdated")}),Me=L({permission:"commissions:manage",revalidate:["/commissions"]},async({audit:e},i)=>{const[r]=await c.update(s).set({status:l.deactivated}).where(R(n(s.id,i),n(s.status,l.published))).returning({id:s.id,title:s.title});if(!r){const[t]=await c.select({id:s.id}).from(s).where(n(s.id,i)).limit(1);throw t?y("commission_not_published",{toast:!0}):y("commission_not_found",{toast:!0})}return P(`/commissions/${i}`),await e({action:"commission.deactivate",target:{type:"commission",id:r.id,label:r.title??void 0},metadata:{status:l.deactivated}}),v("Toasts.commissionDeactivated")}),We=L({permission:"commissions:manage",revalidate:["/commissions"]},async({audit:e},i)=>{const[r]=await c.update(s).set({status:l.published}).where(R(n(s.id,i),n(s.status,l.deactivated))).returning({id:s.id,title:s.title});if(!r){const[t]=await c.select({id:s.id}).from(s).where(n(s.id,i)).limit(1);throw t?y("commission_not_deactivated",{toast:!0}):y("commission_not_found",{toast:!0})}return P(`/commissions/${i}`),await e({action:"commission.reactivate",target:{type:"commission",id:r.id,label:r.title??void 0},metadata:{status:l.published}}),v("Toasts.commissionReactivated")}),Fe=M({permission:"commissions:manage",revalidate:["/commissions"]},async({audit:e},i,r)=>{const t=await T(r,te),[[o],a,m]=await Promise.all([c.select().from(s).where(n(s.id,i)).limit(1),c.select({casinoId:d.casinoId}).from(d).where(n(d.commissionId,i)),q(i)]);if(!o)throw y("commission_not_found",{toast:!0});const p=m.map(G=>({priority:G.priority,rules:G.rules.map(w=>({qualifiers:w.qualifiers,conditions:w.conditions,modifiers:w.modifiers,rewards:w.rewards}))})),C=await c.transaction(async G=>{const[w]=await G.insert(s).values({title:t.title,status:l.draft,strategy:o.strategy,tags:o.tags,currency:o.currency,carryoverLimit:o.carryoverLimit,allowSubAffiliates:o.allowSubAffiliates,subAffiliateMaxPercent:o.subAffiliateMaxPercent}).returning({id:s.id});if(!w)throw y("commission_not_found",{toast:!0});return a.length>0&&await G.insert(d).values(a.map(k=>({commissionId:w.id,casinoId:k.casinoId}))),await N(G,w.id,p),w.id});return await e({action:"commission.duplicate",target:{type:"commission",id:C,label:t.title},metadata:{sourceId:i}}),v({id:C},"Toasts.commissionDuplicated")}),De=M({permission:"commissions:manage",revalidate:["/commissions"]},async({audit:e},i,r)=>(await c.transaction(async t=>{const[o]=await t.delete(s).where(R(n(s.id,i),n(s.status,l.draft))).returning({id:s.id,title:s.title});if(!o){const[a]=await t.select({id:s.id}).from(s).where(n(s.id,i)).limit(1);throw a?y("commission_not_draft",{toast:!0}):y("commission_not_found",{toast:!0})}await e({action:"commission.delete",target:{type:"commission",id:i,label:o.title??void 0}},t)}),v("Toasts.commissionDeleted")));export{xe as createDraftCommissionAction,Me as deactivateCommissionAction,De as deleteCommissionAction,Fe as duplicateCommissionAction,Pe as getCommissionById,_e as getCommissionForDealView,Ae as listActiveCasinosForCommission,ve as listCasinoBindingsForCommissions,Ie as listCommissions,We as reactivateCommissionAction,Le as updateCommissionAction};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function CasinoBindingsField({ casinoIdsName, options, defaultCasinoIds, readOnly, emptyLabel, }: {
|
|
2
|
+
casinoIdsName: string;
|
|
3
|
+
options: ReadonlyArray<{
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
}>;
|
|
7
|
+
defaultCasinoIds: readonly string[];
|
|
8
|
+
readOnly?: boolean;
|
|
9
|
+
emptyLabel: string;
|
|
10
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as r,jsxs as g}from"react/jsx-runtime";import{useState as s}from"react";import{Checkbox as m,CheckboxGroup as b}from"../../../components/ui/checkbox.js";import{Field as u,FieldLabel as p}from"../../../components/ui/field.js";import{cn as c}from"../../../lib/cn.js";function F({casinoIdsName:t,options:o,defaultCasinoIds:a,readOnly:d=!1,emptyLabel:l}){const[n,i]=s(()=>[...a]);return o.length===0?r("p",{className:"rounded-md border border-dashed border-border bg-muted/30 p-4 text-center text-sm text-muted-foreground",children:l}):r(b,{value:n,onValueChange:i,disabled:d,className:"flex flex-col gap-1",children:o.map(e=>g(u,{className:"flex-row items-center gap-2.5 rounded-md border border-border bg-card p-3",children:[r(m,{name:t,value:e.id,disabled:d,"aria-label":e.name}),r(p,{className:c("font-medium text-foreground",!d&&"cursor-pointer"),children:e.name})]},e.id))})}export{F as CasinoBindingsField};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function CommissionCreateButton(): import("react").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as o,jsxs as p}from"react/jsx-runtime";import{IconPlus as r}from"@tabler/icons-react";import{useTranslations as s}from"next-intl";import{useTransition as a}from"react";import{Button as e}from"../../../components/ui/button.js";import{Spinner as m}from"../../../components/ui/spinner.js";import{createDraftCommissionAction as c}from"../actions.js";import{toastActionResult as l}from"../../../lib/toast.js";function B(){const i=s("Commissions"),[t,n]=a();return p(e,{variant:"primary",size:"sm",type:"button",onClick:()=>{n(async()=>{l(await c())})},disabled:t,"aria-label":i("createTitle"),children:[t?o(m,{}):o(r,{size:16,"aria-hidden":!0}),o("span",{className:"hidden sm:inline",children:i(t?"creating":"createTitle")})]})}export{B as CommissionCreateButton};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CommissionDealView } from "../actions.js";
|
|
2
|
+
import type { DeferredDialogController } from "../../../lib/hooks/use-deferred-dialog.js";
|
|
3
|
+
export declare function CommissionDetailDialog({ controller, }: {
|
|
4
|
+
controller: DeferredDialogController<CommissionDealView | null>;
|
|
5
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as o,jsxs as a}from"react/jsx-runtime";import{useTranslations as t}from"next-intl";import{use as m}from"react";import{Button as r}from"../../../components/ui/button.js";import{Dialog as D,DialogBody as l,DialogClose as d,DialogContent as g,DialogDescription as p,DialogFooter as u,DialogHeader as c,DialogTitle as f}from"../../../components/ui/dialog.js";import{CommissionReadView as n}from"./commission-read-view.js";import{CommissionStatusBadge as C}from"./commission-status-badge.js";function V({controller:e}){const s=t("Commissions.Detail"),i=t("Common");return o(D,{open:e.open,onOpenChange:e.setOpen,disablePointerDismissal:!0,children:a(g,{closeLabel:i("close"),className:"max-w-2xl",children:[a(c,{children:[o(f,{children:s("title")}),o(p,{children:s("description")})]}),e.promise?o(y,{dataPromise:e.promise}):null,o(u,{children:o(d,{render:o(r,{type:"button",variant:"secondary",size:"sm"}),children:i("close")})})]})})}function y({dataPromise:e}){const s=t("Commissions.Detail"),i=m(e);return i?a(l,{className:"flex flex-col gap-4",children:[o("div",{children:o(C,{status:i.status})}),i.kind==="sub"?o(n,{commission:i,subShare:i.subSharePercent}):o(n,{commission:i})]}):o(l,{children:o("p",{className:"text-sm text-muted-foreground",children:s("notFound")})})}export{V as CommissionDetailDialog};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type CommissionWithRules } from "../actions.js";
|
|
2
|
+
export declare function CommissionEditor({ commission, casinoOptions, }: {
|
|
3
|
+
commission: CommissionWithRules;
|
|
4
|
+
casinoOptions: ReadonlyArray<{
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
}>;
|
|
8
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as e,jsxs as i}from"react/jsx-runtime";import{IconArrowLeft as H,IconBuildingStore as V,IconCalculator as D,IconChecklist as U,IconLayoutGrid as W}from"@tabler/icons-react";import O from"next/link";import{useTranslations as s}from"next-intl";import{useActionState as _,useState as l}from"react";import{ActionForm as Y}from"../../../components/ui/action-form.js";import{Button as f}from"../../../components/ui/button.js";import{Field as x,FieldError as S}from"../../../components/ui/field.js";import{Fieldset as X,FieldsetLegend as j}from"../../../components/ui/fieldset.js";import{FormField as c}from"../../../components/ui/form-field.js";import{Input as q}from"../../../components/ui/input.js";import{NumberInput as J}from"../../../components/ui/number-input.js";import{SectionCard as p}from"../../../components/ui/section-card.js";import{Select as K,SelectContent as Q,SelectGroup as h,SelectGroupLabel as F,SelectItem as L,SelectTrigger as Z,SelectValue as $}from"../../../components/ui/select.js";import{Slider as ee}from"../../../components/ui/slider.js";import{SwitchField as A}from"../../../components/ui/switch-field.js";import{TagInput as te}from"../../../components/ui/tag-input.js";import{updateCommissionAction as ie}from"../actions.js";import{CasinoBindingsField as ae}from"./casino-bindings-field.js";import{CommissionStatusBadge as re}from"./commission-status-badge.js";import{RuleEditor as oe}from"./rule-editor/rule-editor.js";import{CRYPTO_CURRENCIES as ne,DEFAULT_CURRENCY as se,FIAT_CURRENCIES as le}from"../../../lib/currencies.js";import{useFormatDateTime as me}from"../../../lib/i18n/format-datetime.js";import{NAME_MAX as ce}from"../../../lib/validation/zod.js";function Me({commission:t,casinoOptions:m}){return i("div",{className:"flex w-full flex-col gap-6 pb-4",children:[e(de,{commission:t}),e(ue,{commission:t,casinoOptions:m},t.id)]})}function de({commission:t}){const m=s("Commissions");return i("div",{className:"flex flex-wrap items-center gap-3",children:[i(f,{nativeButton:!1,variant:"secondary",size:"sm",render:e(O,{href:"/commissions"}),children:[e(H,{size:14,"aria-hidden":!0}),m("backToList")]}),e(re,{status:t.status})]})}function ue({commission:t,casinoOptions:m}){const d=s("Commissions"),n=s("Commissions.EditorGeneral"),o=s("Commissions.EditorBrand"),r=s("Commissions.EditorPayout"),N=s("Commissions.EditorMeta"),b=s("Commissions.EditorRules"),I=me(),[g,w]=l(t.currency??se),[E]=l(t.title??""),[C,R]=l(t.allowSubAffiliates),[y,G]=l(()=>t.subAffiliateMaxPercent?Math.round(Number(t.subAffiliateMaxPercent)):30),[v,P]=l(t.carryoverLimit!=null),[k,B]=l(()=>t.carryoverLimit?Number(t.carryoverLimit):0),T=ie.bind(null,t.id),[M,z,u]=_(T,void 0);return i(Y,{action:z,actionState:M,className:"flex flex-col gap-6",children:[i(p,{icon:e(W,{size:18,"aria-hidden":!0}),title:n("title"),description:n("description"),children:[e(c,{name:"title",label:n("titleLabel"),children:e(q,{name:"title",type:"text",maxLength:ce,defaultValue:E,placeholder:n("titlePlaceholder"),autoComplete:"off"})}),e(c,{name:"tags",label:n("tagsLabel"),description:n("tagsHelp"),children:e(te,{name:"tags",defaultValue:t.tags,placeholder:n("tagsPlaceholder"),ariaLabel:n("tagsLabel")})})]}),i(p,{icon:e(V,{size:18,"aria-hidden":!0}),title:o("title"),description:o("description"),children:[i(X,{className:"gap-1.5",children:[e(j,{children:o("casinosLabel")}),e(ae,{casinoIdsName:"casinoIds",options:m,defaultCasinoIds:t.casinoBindings.map(a=>a.casinoId),emptyLabel:o("noActiveCasinos")}),e("p",{className:"text-xs text-muted-foreground",children:o("casinosHelp")})]}),e(x,{name:"casinoIds",children:e(S,{})}),e(A,{name:"allowSubAffiliates",label:o("allowSubAffiliatesLabel"),help:o("allowSubAffiliatesHelp"),checked:C,onCheckedChange:R}),C&&e(c,{name:"subAffiliateMaxPercent",label:o("subAffiliateMaxPercentLabel"),description:o("subAffiliateMaxPercentHelp"),children:i("div",{className:"flex items-center gap-4 pt-1",children:[e(ee,{min:0,max:100,step:1,value:y,onValueChange:G,className:"flex-1"}),i("span",{className:"w-12 text-right text-sm font-medium tabular-nums text-foreground",children:[y,"%"]})]})})]}),i(p,{icon:e(D,{size:18,"aria-hidden":!0}),title:r("title"),description:r("description"),children:[e(c,{name:"currency",label:r("currencyLabel"),description:r("currencyHelp"),children:i(K,{value:g,onValueChange:a=>w(a),children:[e(Z,{className:"w-full",children:e($,{placeholder:r("currencyPlaceholder"),children:a=>a||null})}),i(Q,{children:[i(h,{children:[e(F,{className:"px-2 py-1 text-xs font-medium text-muted-foreground",children:r("currencyFiatGroup")}),le.map(a=>e(L,{value:a,children:a},a))]}),i(h,{children:[e(F,{className:"px-2 py-1 text-xs font-medium text-muted-foreground",children:r("currencyCryptoGroup")}),ne.map(a=>e(L,{value:a,children:a},a))]})]})]})}),e(A,{name:"carryover",label:r("carryoverLabel"),help:r("carryoverHelp"),checked:v,onCheckedChange:P}),v&&e(c,{name:"carryoverLimit",label:r("carryoverLimitLabel"),description:r("carryoverLimitHelp"),children:i("div",{className:"flex items-center gap-2",children:[e(J,{min:0,value:k,onValueChange:B,className:"w-full","aria-label":r("carryoverLimitLabel")}),e("span",{className:"shrink-0 text-sm font-medium text-muted-foreground tabular-nums",children:g})]})})]}),i(p,{icon:e(U,{size:18,"aria-hidden":!0}),title:b("title"),description:b("description"),children:[e(oe,{name:"ruleGroups",initialRuleGroups:t.ruleGroups}),e(x,{name:"ruleGroups",children:e(S,{})})]}),i("div",{className:"sticky bottom-4 z-10 flex flex-wrap items-center justify-between gap-3 rounded-md border border-border bg-card px-4 py-3 shadow-sm",children:[e("span",{className:"text-xs text-muted-foreground",children:N("lastUpdated",{when:I(t.updatedAt)})}),i("div",{className:"flex items-center gap-2",children:[e(f,{type:"submit",name:"intent",value:"save",variant:"secondary",size:"sm",disabled:u,children:d(u?"saving":"save")}),e(f,{type:"submit",name:"intent",value:"publish",variant:"primary",size:"sm",disabled:u,children:d(u?"publishing":"publish")})]})]})]})}export{Me as CommissionEditor};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{Fragment as h,jsx as e,jsxs as i}from"react/jsx-runtime";import{IconBuildingStore as y,IconCalculator as R,IconChecklist as C,IconLayoutGrid as w}from"@tabler/icons-react";import{useTranslations as l}from"next-intl";import{SectionCard as c}from"../../../components/ui/section-card.js";import{RuleGroupsReadView as N}from"./rule-groups-read-view.js";function A({commission:t,subShare:n=null}){const s=l("Commissions.EditorGeneral"),o=l("Commissions.EditorBrand"),d=l("Commissions.EditorPayout"),p=l("Commissions.EditorRules"),f=l("Commissions.Strategy"),x=l("Commissions"),u=l("Common"),g=l("Commissions.Detail");return i("div",{className:"flex flex-col gap-6",children:[i(c,{icon:e(w,{size:18,"aria-hidden":!0}),title:s("title"),description:s("description"),children:[e(a,{label:s("titleLabel"),children:t.title?.trim()?e(r,{children:t.title}):e("span",{className:"text-sm italic text-muted-foreground",children:x("untitledPlaceholder")})}),e(a,{label:s("tagsLabel"),children:t.tags.length>0?e(r,{children:t.tags.join(", ")}):e(m,{})}),e(a,{label:s("strategyLabel"),children:t.strategy?e(r,{children:f(t.strategy)}):e(m,{})})]}),i(c,{icon:e(y,{size:18,"aria-hidden":!0}),title:o("title"),description:o("description"),children:[e(a,{label:o("casinosLabel"),children:t.casinoBindings.length===0?e(m,{}):e("ul",{className:"flex flex-wrap gap-1.5",children:t.casinoBindings.map(b=>e("li",{children:e("span",{className:"inline-flex items-center rounded-full border border-border bg-muted px-2 py-0.5 text-xs text-muted-foreground",children:b.name})},b.casinoId))})}),n!=null?e(a,{label:g("yourShareLabel"),children:i(r,{className:"tabular-nums",children:[Number(n),"%"]})}):i(h,{children:[e(a,{label:o("allowSubAffiliatesLabel"),children:e(r,{children:t.allowSubAffiliates?u("yes"):u("no")})}),t.allowSubAffiliates?e(a,{label:o("subAffiliateMaxPercentLabel"),children:e(r,{children:t.subAffiliateMaxPercent?`${Math.round(Number(t.subAffiliateMaxPercent))}%`:"0%"})}):null]})]}),i(c,{icon:e(R,{size:18,"aria-hidden":!0}),title:d("title"),description:d("description"),children:[e(a,{label:d("currencyLabel"),children:t.currency?e(r,{className:"tabular-nums",children:t.currency}):e(m,{})}),e(a,{label:d("carryoverLabel"),children:e(r,{children:t.carryoverLimit!=null?u("yes"):u("no")})}),t.carryoverLimit!=null&&e(a,{label:d("carryoverLimitLabel"),children:i(r,{className:"tabular-nums",children:[t.carryoverLimit," ",t.currency]})})]}),e(c,{icon:e(C,{size:18,"aria-hidden":!0}),title:p("title"),description:p("description"),children:e(N,{groups:t.ruleGroups})})]})}function a({label:t,children:n}){return i("div",{className:"grid grid-cols-[10rem_1fr] items-start gap-3",children:[e("span",{className:"text-sm text-muted-foreground",children:t}),e("div",{className:"min-w-0",children:n})]})}function r({children:t,className:n}){return e("span",{className:`text-sm text-foreground ${n??""}`,children:t})}function m(){return e("span",{className:"text-sm text-muted-foreground",children:"-"})}export{A as CommissionReadView};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{jsx as e}from"react/jsx-runtime";import{COMMISSION_STATUS as s}from"../../../db/schema/index.js";import{useTranslations as u}from"next-intl";import{StatusBadge as a}from"../../../components/ui/status-badge.js";function m({status:o}){const t=u("Commissions");switch(o){case s.published:return e(a,{tone:"success",children:t("statusPublished")});case s.deactivated:return e(a,{tone:"danger",children:t("statusDeactivated")});case s.draft:return e(a,{tone:"neutral",children:t("statusDraft")})}}export{m as CommissionStatusBadge};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function CommissionStatusTabs(): import("react").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as a,jsxs as d}from"react/jsx-runtime";import{useTranslations as i}from"next-intl";import{useQueryStates as m}from"nuqs";import{useTransition as T}from"react";import{Tabs as u,TabsIndicator as S,TabsList as p,TabsTab as b}from"../../../components/ui/tabs.js";import{COMMISSION_STATUSES as f,commissionStatusParser as l}from"../list-params.js";import{listSearchParsers as c}from"../../../lib/list-params.js";function h(){const t=i("Commissions.Tabs"),[o,r]=T(),[{status:e},n]=m({status:l,page:c.page},{shallow:!1,clearOnDefault:!0,startTransition:r});return a(u,{value:e,onValueChange:s=>n({status:s,page:null}),"data-pending":o?"":void 0,children:d(p,{children:[f.map(s=>a(b,{value:s,children:t(s)},s)),a(S,{})]})})}export{h as CommissionStatusTabs};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type Commission } from "../../../db/schema/index.js";
|
|
2
|
+
import { type ListResult } from "../../../lib/list-params.js";
|
|
3
|
+
export type CommissionRow = Commission & {
|
|
4
|
+
casinoBindings: ReadonlyArray<{
|
|
5
|
+
casinoId: string;
|
|
6
|
+
casinoName: string;
|
|
7
|
+
}>;
|
|
8
|
+
};
|
|
9
|
+
export declare function CommissionsTable({ result, canManage, canDelete, now, }: {
|
|
10
|
+
result: ListResult<CommissionRow>;
|
|
11
|
+
canManage: boolean;
|
|
12
|
+
canDelete: boolean;
|
|
13
|
+
now: Date;
|
|
14
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{Fragment as M,jsx as e,jsxs as i}from"react/jsx-runtime";import{COMMISSION_STATUS as x}from"../../../db/schema/index.js";import{IconCopy as R,IconDots as z,IconLock as k,IconLockOpen as A,IconPencil as O,IconReceipt as w,IconReceiptOff as P,IconTrash as B}from"@tabler/icons-react";import L from"next/link";import{useLocale as j,useTranslations as v}from"next-intl";import{useCallback as $,useMemo as _,useRef as E,useState as I,useTransition as F}from"react";import{DataTable as G}from"../../../components/ui/data-table.js";import{DropdownMenu as U,DropdownMenuContent as V,DropdownMenuItem as C,DropdownMenuSeparator as N,DropdownMenuTrigger as Z}from"../../../components/ui/dropdown-menu.js";import{Identity as q}from"../../../components/ui/identity.js";import{SortButton as T}from"../../../components/ui/sort-button.js";import{TablePagination as H}from"../../../components/ui/table-pagination.js";import{TextButton as J,TextLink as K}from"../../../components/ui/text-link.js";import{deactivateCommissionAction as Q,getCommissionForDealView as W,reactivateCommissionAction as X}from"../actions.js";import{CommissionDetailDialog as Y}from"./commission-detail-dialog.js";import{CommissionStatusBadge as ee}from"./commission-status-badge.js";import{DeleteCommissionConfirm as te}from"./delete-commission-confirm.js";import{DuplicateCommissionDialog as oe}from"./duplicate-commission-dialog.js";import{useDeferredDialog as ne}from"../../../lib/hooks/use-deferred-dialog.js";import{useFormatDateTime as ie}from"../../../lib/i18n/format-datetime.js";import{formatRelative as se}from"../../../lib/i18n/relative-time.js";import{PAGE_SIZE_OPTIONS as ae}from"../../../lib/list-params.js";import{toastActionResult as S}from"../../../lib/toast.js";function Re({result:o,canManage:c,canDelete:D,now:a}){const s=v("Commissions"),d=v("Commissions.Strategy"),h=j(),u=ie(),l=E(null),p=ne(()=>l.current?W(l.current):Promise.resolve(null)),f=p.trigger,m=$(r=>{l.current=r,f()},[f]),g=_(()=>{const r=[{id:"title",header:()=>e(T,{column:"title",children:s("columnTitle")}),cell:({row:n})=>{const t=n.original,b=t.title?.trim()?t.title:e("span",{className:"italic text-muted-foreground",children:s("untitledPlaceholder")});return e(q,{visual:e("div",{className:"flex size-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground",children:t.status===x.published?e(w,{size:18,"aria-hidden":!0}):e(P,{size:18,"aria-hidden":!0})}),primary:t.status===x.draft?e(K,{href:`/commissions/${t.id}`,tone:"plain",children:b}):e(J,{tone:"plain",onClick:()=>m(t.id),children:b}),secondary:t.tags.length>0?e("span",{className:"text-xs text-muted-foreground",children:t.tags.join(", ")}):null})}},{id:"status",header:()=>s("columnStatus"),cell:({row:n})=>e(ee,{status:n.original.status})},{id:"strategy",header:()=>s("columnStrategy"),cell:({row:n})=>{const t=n.original.strategy;return t?e("span",{className:"text-sm",children:d(t)}):e("span",{className:"text-sm text-muted-foreground",children:"-"})}},{id:"casino",header:()=>s("columnCasino"),cell:({row:n})=>{const t=n.original.casinoBindings;if(t.length===0)return e("span",{className:"text-sm text-muted-foreground",children:"-"});const b=t[0],y=t.length-1;return i("span",{className:"inline-flex items-center gap-1.5 text-sm",children:[e("span",{children:b.casinoName}),y>0&&i("span",{className:"rounded bg-muted px-1.5 py-0.5 text-xs text-muted-foreground tabular-nums",children:["+",y]})]})}},{id:"createdAt",header:()=>e(T,{column:"createdAt",children:s("columnCreated")}),cell:({row:n})=>{const t=n.original.createdAt;return e("span",{className:"text-sm text-muted-foreground tabular-nums",title:u(t),children:se(h,t,a)})}}];return c?[...r,{id:"actions",header:()=>e("span",{className:"sr-only",children:s("columnActions")}),cell:({row:n})=>e(re,{commission:n.original,canManage:c,canDelete:D}),meta:{pin:"right",className:"text-right"}}]:r},[s,d,h,u,c,D,a,m]);return i(M,{children:[e(G,{data:o.rows,columns:g,getRowId:r=>r.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(w,{size:18,"aria-hidden":!0})}),e("span",{children:s("empty")})]}),pagination:e(H,{page:o.page,pageSize:o.pageSize,totalPages:o.totalPages,pageSizeOptions:ae})}),e(Y,{controller:p})]})}function re({commission:o,canManage:c,canDelete:D}){const a=v("Commissions"),[s,d]=I(!1),[h,u]=I(!1),[l,p]=F(),f=o.status===x.draft,m=o.status===x.published,g=o.status===x.deactivated,r=()=>{p(async()=>{S(await Q(o.id))})},n=()=>{p(async()=>{S(await X(o.id))})};return i("div",{className:"flex justify-end",children:[i(U,{children:[e(Z,{"aria-label":a("rowActions"),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:e(z,{size:16,"aria-hidden":!0})}),i(V,{children:[f&&i(C,{render:e(L,{href:`/commissions/${o.id}`}),children:[e(O,{size:14,"aria-hidden":!0,className:"text-muted-foreground"}),a("edit")]}),i(C,{onClick:()=>u(!0),children:[e(R,{size:14,"aria-hidden":!0,className:"text-muted-foreground"}),a("duplicate")]}),(m||g)&&e(N,{}),m&&i(C,{variant:"destructive",onClick:r,disabled:l,children:[e(k,{size:14,"aria-hidden":!0}),a("deactivate")]}),g&&i(C,{onClick:n,disabled:l,children:[e(A,{size:14,"aria-hidden":!0,className:"text-muted-foreground"}),a("activate")]}),(f&&c||D)&&i(M,{children:[!m&&!g&&e(N,{}),i(C,{variant:"destructive",onClick:()=>d(!0),children:[e(B,{size:14,"aria-hidden":!0}),a("delete")]})]})]})]}),e(oe,{commissionId:o.id,sourceTitle:o.title??"",open:h,onOpenChange:u},`${o.id}:${o.title??""}`),e(te,{commissionId:o.id,open:s,onOpenChange:d})]})}export{Re as CommissionsTable};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as o,jsxs as m}from"react/jsx-runtime";import{useTranslations as r}from"next-intl";import{useActionState as d,useEffect as p}from"react";import{ActionForm as A}from"../../../components/ui/action-form.js";import{AlertDialog as g,AlertDialogClose as u,AlertDialogContent as C,AlertDialogDescription as b,AlertDialogFooter as v,AlertDialogTitle as F}from"../../../components/ui/alert-dialog.js";import{Button as s}from"../../../components/ui/button.js";import{deleteCommissionAction as y}from"../actions.js";function E({commissionId:a,open:c,onOpenChange:t}){const e=r("Commissions"),l=r("Common"),f=y.bind(null,a),[i,D,n]=d(f,void 0);return p(()=>{i?.ok&&t(!1)},[i,t]),o(g,{open:c,onOpenChange:t,children:m(C,{children:[o(F,{children:e("deleteConfirm")}),o(b,{children:e("deleteDescription")}),o(A,{action:D,actionState:i,className:"flex flex-col gap-3",children:m(v,{children:[o(u,{render:o(s,{type:"button",variant:"secondary",size:"sm",disabled:n,children:l("cancel")})}),o(s,{type:"submit",variant:"destructive",size:"sm",disabled:n,children:n?e("deleting"):l("confirmDelete")})]})})]})})}export{E as DeleteCommissionConfirm};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as o,jsxs as e}from"react/jsx-runtime";import{useRouter as g}from"next/navigation";import{useTranslations as m}from"next-intl";import{useActionState as f,useEffect as C}from"react";import{ActionForm as F}from"../../../components/ui/action-form.js";import{Button as r}from"../../../components/ui/button.js";import{Dialog as b,DialogBody as y,DialogClose as A,DialogContent as T,DialogDescription as B,DialogFooter as S,DialogHeader as x,DialogTitle as L}from"../../../components/ui/dialog.js";import{FormField as N}from"../../../components/ui/form-field.js";import{Input as h}from"../../../components/ui/input.js";import{duplicateCommissionAction as v}from"../actions.js";import{NAME_MAX as z}from"../../../lib/validation/zod.js";function X({commissionId:c,sourceTitle:u,open:p,onOpenChange:a}){const i=m("Commissions"),n=m("Common"),l=g(),d=v.bind(null,c),[t,D,s]=f(d,void 0);return C(()=>{t?.ok&&t.id&&(a(!1),l.push(`/commissions/${t.id}`))},[t,a,l]),o(b,{open:p,onOpenChange:a,disablePointerDismissal:!0,children:e(T,{closeLabel:n("close"),children:[e(x,{children:[o(L,{children:i("duplicateDialogTitle")}),o(B,{children:i("duplicateDialogDesc")})]}),e(F,{action:D,actionState:t,className:"contents",errorClassName:"mx-6 mt-4",children:[o(y,{children:o(N,{name:"title",label:i("duplicateTitleLabel"),children:o(h,{name:"title",type:"text","aria-required":"true",maxLength:z,defaultValue:`${u} (copy)`,autoComplete:"off",autoFocus:!0})})}),e(S,{children:[o(A,{render:o(r,{type:"button",variant:"secondary",size:"sm"}),children:n("cancel")}),o(r,{type:"submit",size:"sm",disabled:s,children:i(s?"duplicating":"duplicateButton")})]})]})]})})}export{X as DuplicateCommissionDialog};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ConditionGroupNode } from "../../../../db/types/index.js";
|
|
2
|
+
import type { Dispatch } from "react";
|
|
3
|
+
import type { EditorAction } from "./reducer.js";
|
|
4
|
+
export declare function ConditionsBlock({ groupId, ruleId, conditions, dispatch, }: {
|
|
5
|
+
groupId: string;
|
|
6
|
+
ruleId: string;
|
|
7
|
+
conditions: ConditionGroupNode;
|
|
8
|
+
dispatch: Dispatch<EditorAction>;
|
|
9
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as t,jsxs as l}from"react/jsx-runtime";import{CONDITION_FIELD_KEYS as E,CONDITION_FIELD_SPECS as p}from"../../../../db/types/index.js";import{IconPlus as x,IconTrash as v}from"@tabler/icons-react";import{useTranslations as u}from"next-intl";import{Badge as b}from"../../../../components/ui/badge.js";import{Button as w}from"../../../../components/ui/button.js";import{CountryMultiSelect as _,CountrySelect as V}from"../../../../components/ui/country-select.js";import{Input as G}from"../../../../components/ui/input.js";import{NumberInput as B}from"../../../../components/ui/number-input.js";import{Select as y,SelectContent as C,SelectItem as m,SelectTrigger as g,SelectValue as N}from"../../../../components/ui/select.js";import{TreeActions as L,TreeBranch as T,TreeChevronSpacer as S,TreeEmptyState as P,TreeIconButton as F,TreeRow as h,TreeSectionHeader as z}from"../../../../components/ui/tree.js";function A(o,n){const e=p[o];return e.valueType==="country"?n==="IN"?[]:"":e.valueType==="number"?0:""}function K(o,n,e){return p[o].valueType==="country"?n==="IN"?Array.isArray(e)?e.filter(a=>typeof a=="string"):typeof e=="string"&&e?[e]:[]:typeof e=="string"?e:Array.isArray(e)&&typeof e[0]=="string"?e[0]:"":e}function oe({groupId:o,ruleId:n,conditions:e,dispatch:s}){const a=u("Commissions.EditorRules.Conditions");return l("div",{className:"flex flex-col gap-1",children:[t(z,{title:a("title"),count:e.children.length}),t(T,{children:t(R,{groupId:o,ruleId:n,node:e,dispatch:s})})]})}function R({groupId:o,ruleId:n,node:e,dispatch:s}){const a=u("Commissions.EditorRules.Conditions");return l("div",{className:"flex flex-col gap-1",children:[l(h,{children:[t(S,{}),l("span",{className:"text-xs text-muted-foreground",children:[a("title"),":"]}),l(y,{value:e.type,onValueChange:()=>s({type:"CONDITION_GROUP_TYPE_TOGGLE",groupId:o,ruleId:n,nodeId:e.id}),children:[t(g,{className:"h-7 w-20",children:t(N,{children:d=>d})}),l(C,{children:[t(m,{value:"AND",children:"AND"}),t(m,{value:"OR",children:"OR"})]})]})]}),e.children.length===0?t(P,{message:a("emptyGroup")}):t(T,{children:e.children.map((d,i)=>d.type==="FIELD"?t(M,{groupId:o,ruleId:n,node:d,index:i,dispatch:s},d.id):t(U,{groupId:o,ruleId:n,node:d,index:i,dispatch:s},d.id))}),l(L,{children:[l(w,{type:"button",variant:"secondary",size:"xs",onClick:()=>s({type:"CONDITION_NODE_ADD",groupId:o,ruleId:n,parentNodeId:e.id,node:H()}),children:[t(x,{size:14,"aria-hidden":!0}),a("addCondition")]}),l(w,{type:"button",variant:"secondary",size:"xs",onClick:()=>s({type:"CONDITION_NODE_ADD",groupId:o,ruleId:n,parentNodeId:e.id,node:{id:crypto.randomUUID(),type:"AND",children:[]}}),children:[t(x,{size:14,"aria-hidden":!0}),a("addGroup")]})]})]})}function U({groupId:o,ruleId:n,node:e,index:s,dispatch:a}){const d=u("Commissions.EditorRules.Conditions");return l("div",{className:"flex flex-col gap-1",children:[l(h,{children:[t(S,{}),l("span",{className:"text-xs font-medium text-foreground",children:["#",s+1]}),t(b,{children:d("badgeGroup")}),l("span",{className:"text-xs text-muted-foreground",children:["(",e.type,", ",e.children.length,")"]}),t("div",{className:"ml-auto",children:t(F,{icon:t(v,{size:14,"aria-hidden":!0}),label:d("removeGroup"),onClick:()=>a({type:"CONDITION_NODE_REMOVE",groupId:o,ruleId:n,nodeId:e.id})})})]}),t(T,{children:t(R,{groupId:o,ruleId:n,node:e,dispatch:a})})]})}function M({groupId:o,ruleId:n,node:e,index:s,dispatch:a}){const d=u("Commissions.EditorRules.Conditions"),i=u("Commissions.EditorRules.Conditions.Fields"),f=p[e.field],I=r=>a({type:"CONDITION_NODE_UPDATE",groupId:o,ruleId:n,nodeId:e.id,patch:r});return l(h,{children:[t(S,{}),l("span",{className:"text-xs font-medium text-foreground",children:["#",s+1]}),t(b,{children:d("badge")}),l(y,{value:e.field,onValueChange:r=>{const c=r,O=p[c],D=O.operators.includes(e.op)?e.op:O.operators[0]??"=";I({field:c,op:D,value:A(c,D)})},children:[t(g,{className:"h-7 w-full min-w-32 sm:w-44",children:t(N,{children:r=>r?i(r):null})}),t(C,{children:E.map(r=>t(m,{value:r,children:i(r)},r))})]}),l(y,{value:e.op,onValueChange:r=>{const c=r;I({op:c,value:K(e.field,c,e.value)})},children:[t(g,{className:"h-7 w-20",children:t(N,{children:r=>r})}),t(C,{children:f.operators.map(r=>t(m,{value:r,children:r},r))})]}),t(Y,{config:f,op:e.op,value:e.value,onChange:r=>I({value:r})}),t("div",{className:"ml-auto",children:t(F,{icon:t(v,{size:14,"aria-hidden":!0}),label:d("removeCondition"),onClick:()=>a({type:"CONDITION_NODE_REMOVE",groupId:o,ruleId:n,nodeId:e.id})})})]})}function Y({config:o,op:n,value:e,onChange:s}){const a=u("Commissions.EditorRules.Conditions"),d=u("Commissions.EditorRules.Conditions.Products");if(o.valueType==="country"){if(n==="IN"){const i=Array.isArray(e)?e.filter(f=>typeof f=="string"):[];return t(_,{value:i,onChange:s,ariaLabel:a("valueLabel"),className:"h-7 w-56"})}return t(V,{value:typeof e=="string"?e:"",onChange:s,ariaLabel:a("valueLabel"),className:"h-7 w-48"})}return o.valueType==="number"?t(B,{min:0,value:typeof e=="number"?e:0,onValueChange:s,className:"h-7 w-28","aria-label":a("valueLabel")}):o.valueType==="enum"?l(y,{value:typeof e=="string"?e:"",onValueChange:i=>s(i??""),children:[t(g,{className:"h-7 w-36",children:t(N,{children:i=>i&&k(i)?d(i):i??null})}),t(C,{children:(o.options??[]).map(i=>t(m,{value:i,children:k(i)?d(i):i},i))})]}):t(G,{type:"text",value:typeof e=="string"?e:"",onChange:i=>s(i.target.value),className:"h-7 w-48","aria-label":a("valueLabel")})}function k(o){return o==="casino"||o==="sportsbook"}function H(){const o=E[0],n=p[o].operators[0]??"=";return{id:crypto.randomUUID(),type:"FIELD",field:o,op:n,value:A(o,n)}}export{oe as ConditionsBlock};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Modifiers } from "../../../../db/types/index.js";
|
|
2
|
+
import type { Dispatch } from "react";
|
|
3
|
+
import type { EditorAction } from "./reducer.js";
|
|
4
|
+
export declare function ModifiersBlock({ groupId, ruleId, modifiers, dispatch, }: {
|
|
5
|
+
groupId: string;
|
|
6
|
+
ruleId: string;
|
|
7
|
+
modifiers: Modifiers;
|
|
8
|
+
dispatch: Dispatch<EditorAction>;
|
|
9
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as o,jsxs as a}from"react/jsx-runtime";import{MODIFIER_KEYS as l}from"../../../../db/types/index.js";import{useTranslations as m}from"next-intl";import{Switch as d}from"../../../../components/ui/switch.js";import{TreeBranch as f,TreeChevronSpacer as p,TreeRow as h,TreeSectionHeader as u}from"../../../../components/ui/tree.js";function v({groupId:c,ruleId:r,modifiers:i,dispatch:s}){const t=m("Commissions.EditorRules.Modifiers"),n=Object.values(i).filter(Boolean).length;return a("div",{className:"flex flex-col gap-1",children:[o(u,{title:t("title"),count:n}),o(f,{children:l.map(e=>a(h,{children:[o(p,{}),o("label",{htmlFor:`modifier-${r}-${e}`,className:"flex-1 text-sm text-foreground",children:t(e)}),o(d,{id:`modifier-${r}-${e}`,checked:!!i[e],onCheckedChange:()=>s({type:"MODIFIER_TOGGLE",groupId:c,ruleId:r,key:e}),"aria-label":t(e)})]},e))})]})}export{v as ModifiersBlock};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Qualifier } from "../../../../db/types/index.js";
|
|
2
|
+
import type { Dispatch } from "react";
|
|
3
|
+
import type { EditorAction } from "./reducer.js";
|
|
4
|
+
export declare function QualifiersBlock({ groupId, ruleId, qualifiers, dispatch, }: {
|
|
5
|
+
groupId: string;
|
|
6
|
+
ruleId: string;
|
|
7
|
+
qualifiers: Qualifier[];
|
|
8
|
+
dispatch: Dispatch<EditorAction>;
|
|
9
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as e,jsxs as r}from"react/jsx-runtime";import{QUALIFIER_TYPES as u}from"../../../../db/types/index.js";import{IconPlus as d,IconTrash as f}from"@tabler/icons-react";import{useTranslations as c}from"next-intl";import{Badge as T}from"../../../../components/ui/badge.js";import{Button as y}from"../../../../components/ui/button.js";import{NumberInput as I}from"../../../../components/ui/number-input.js";import{Select as E,SelectContent as Q,SelectItem as g,SelectTrigger as h,SelectValue as S}from"../../../../components/ui/select.js";import{TreeActions as v,TreeBranch as A,TreeChevronSpacer as R,TreeEmptyState as C,TreeIconButton as U,TreeRow as B,TreeSectionHeader as w}from"../../../../components/ui/tree.js";function V({groupId:o,ruleId:l,qualifiers:s,dispatch:n}){const i=c("Commissions.EditorRules.Qualifiers"),m=c("Commissions.EditorRules.Qualifiers.Types");return r("div",{className:"flex flex-col gap-1",children:[e(w,{title:i("title"),count:s.length}),s.length===0?e(C,{message:i("empty")}):e(A,{children:s.map((a,p)=>r(B,{children:[e(R,{}),r("span",{className:"text-xs font-medium text-foreground",children:["#",p+1]}),e(T,{children:i("badge")}),r(E,{value:a.type,onValueChange:t=>n({type:"QUALIFIER_UPDATE",groupId:o,ruleId:l,qualifierId:a.id,patch:{type:t}}),children:[e(h,{className:"h-7 w-full min-w-32 sm:w-48",children:e(S,{children:t=>t?m(t):null})}),e(Q,{children:u.map(t=>e(g,{value:t,children:m(t)},t))})]}),e(I,{min:0,value:a.value,onValueChange:t=>n({type:"QUALIFIER_UPDATE",groupId:o,ruleId:l,qualifierId:a.id,patch:{value:t}}),className:"h-7 w-24 sm:w-32","aria-label":i("valueLabel")}),e("div",{className:"ml-auto",children:e(U,{icon:e(f,{size:14,"aria-hidden":!0}),label:i("removeQualifier"),onClick:()=>n({type:"QUALIFIER_REMOVE",groupId:o,ruleId:l,qualifierId:a.id})})})]},a.id))}),e(v,{children:r(y,{type:"button",variant:"secondary",size:"xs",onClick:()=>n({type:"QUALIFIER_ADD",groupId:o,ruleId:l,qualifier:{id:crypto.randomUUID(),type:"deposits_sum",value:0}}),children:[e(d,{size:14,"aria-hidden":!0}),i("addQualifier")]})})]})}export{V as QualifiersBlock};
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import type { ConditionFieldNode, ConditionNode, ModifierKey, Qualifier, Reward } from "../../../../db/types/index.js";
|
|
2
|
+
import type { EditorState, RuleState } from "./state.js";
|
|
3
|
+
export type EditorAction = {
|
|
4
|
+
type: "INIT";
|
|
5
|
+
state: EditorState;
|
|
6
|
+
} | {
|
|
7
|
+
type: "GROUP_ADD";
|
|
8
|
+
id: string;
|
|
9
|
+
} | {
|
|
10
|
+
type: "GROUP_REMOVE";
|
|
11
|
+
groupId: string;
|
|
12
|
+
} | {
|
|
13
|
+
type: "GROUP_TOGGLE_COLLAPSED";
|
|
14
|
+
groupId: string;
|
|
15
|
+
} | {
|
|
16
|
+
type: "GROUP_MOVE";
|
|
17
|
+
groupId: string;
|
|
18
|
+
direction: "up" | "down";
|
|
19
|
+
} | {
|
|
20
|
+
type: "RULE_ADD";
|
|
21
|
+
groupId: string;
|
|
22
|
+
id: string;
|
|
23
|
+
conditionRootId: string;
|
|
24
|
+
} | {
|
|
25
|
+
type: "RULE_REMOVE";
|
|
26
|
+
groupId: string;
|
|
27
|
+
ruleId: string;
|
|
28
|
+
} | {
|
|
29
|
+
type: "RULE_DUPLICATE";
|
|
30
|
+
groupId: string;
|
|
31
|
+
ruleId: string;
|
|
32
|
+
clone: RuleState;
|
|
33
|
+
} | {
|
|
34
|
+
type: "RULE_TOGGLE_COLLAPSED";
|
|
35
|
+
groupId: string;
|
|
36
|
+
ruleId: string;
|
|
37
|
+
} | {
|
|
38
|
+
type: "RULE_MOVE";
|
|
39
|
+
groupId: string;
|
|
40
|
+
ruleId: string;
|
|
41
|
+
direction: "up" | "down";
|
|
42
|
+
} | {
|
|
43
|
+
type: "QUALIFIER_ADD";
|
|
44
|
+
groupId: string;
|
|
45
|
+
ruleId: string;
|
|
46
|
+
qualifier: Qualifier;
|
|
47
|
+
} | {
|
|
48
|
+
type: "QUALIFIER_UPDATE";
|
|
49
|
+
groupId: string;
|
|
50
|
+
ruleId: string;
|
|
51
|
+
qualifierId: string;
|
|
52
|
+
patch: Partial<Qualifier>;
|
|
53
|
+
} | {
|
|
54
|
+
type: "QUALIFIER_REMOVE";
|
|
55
|
+
groupId: string;
|
|
56
|
+
ruleId: string;
|
|
57
|
+
qualifierId: string;
|
|
58
|
+
} | {
|
|
59
|
+
type: "CONDITION_NODE_ADD";
|
|
60
|
+
groupId: string;
|
|
61
|
+
ruleId: string;
|
|
62
|
+
parentNodeId: string;
|
|
63
|
+
node: ConditionNode;
|
|
64
|
+
} | {
|
|
65
|
+
type: "CONDITION_NODE_UPDATE";
|
|
66
|
+
groupId: string;
|
|
67
|
+
ruleId: string;
|
|
68
|
+
nodeId: string;
|
|
69
|
+
patch: Partial<Omit<ConditionFieldNode, "id" | "type">>;
|
|
70
|
+
} | {
|
|
71
|
+
type: "CONDITION_NODE_REMOVE";
|
|
72
|
+
groupId: string;
|
|
73
|
+
ruleId: string;
|
|
74
|
+
nodeId: string;
|
|
75
|
+
} | {
|
|
76
|
+
type: "CONDITION_GROUP_TYPE_TOGGLE";
|
|
77
|
+
groupId: string;
|
|
78
|
+
ruleId: string;
|
|
79
|
+
nodeId: string;
|
|
80
|
+
} | {
|
|
81
|
+
type: "MODIFIER_TOGGLE";
|
|
82
|
+
groupId: string;
|
|
83
|
+
ruleId: string;
|
|
84
|
+
key: ModifierKey;
|
|
85
|
+
} | {
|
|
86
|
+
type: "REWARD_ADD";
|
|
87
|
+
groupId: string;
|
|
88
|
+
ruleId: string;
|
|
89
|
+
reward: Reward;
|
|
90
|
+
} | {
|
|
91
|
+
type: "REWARD_UPDATE";
|
|
92
|
+
groupId: string;
|
|
93
|
+
ruleId: string;
|
|
94
|
+
rewardId: string;
|
|
95
|
+
patch: Partial<Reward>;
|
|
96
|
+
} | {
|
|
97
|
+
type: "REWARD_REMOVE";
|
|
98
|
+
groupId: string;
|
|
99
|
+
ruleId: string;
|
|
100
|
+
rewardId: string;
|
|
101
|
+
};
|
|
102
|
+
export declare function editorReducer(state: EditorState, action: EditorAction): EditorState;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function R(d,r){switch(r.type){case"INIT":return r.state;case"GROUP_ADD":return{groups:[...d.groups,{id:r.id,collapsed:!1,rules:[]}]};case"GROUP_REMOVE":return{groups:d.groups.filter(e=>e.id!==r.groupId)};case"GROUP_TOGGLE_COLLAPSED":return I(d,r.groupId,e=>({...e,collapsed:!e.collapsed}));case"GROUP_MOVE":return{groups:p(d.groups,r.groupId,r.direction)};case"RULE_ADD":return I(d,r.groupId,e=>({...e,rules:[...e.rules,{id:r.id,qualifiers:[],conditions:{id:r.conditionRootId,type:"AND",children:[]},modifiers:{},rewards:[],collapsed:!1}]}));case"RULE_REMOVE":return I(d,r.groupId,e=>({...e,rules:e.rules.filter(i=>i.id!==r.ruleId)}));case"RULE_DUPLICATE":return I(d,r.groupId,e=>{const i=e.rules.findIndex(t=>t.id===r.ruleId);return i<0?e:{...e,rules:[...e.rules.slice(0,i+1),r.clone,...e.rules.slice(i+1)]}});case"RULE_TOGGLE_COLLAPSED":return u(d,r.groupId,r.ruleId,e=>({...e,collapsed:!e.collapsed}));case"RULE_MOVE":return I(d,r.groupId,e=>({...e,rules:p(e.rules,r.ruleId,r.direction)}));case"QUALIFIER_ADD":return u(d,r.groupId,r.ruleId,e=>({...e,qualifiers:[...e.qualifiers,r.qualifier]}));case"QUALIFIER_UPDATE":return u(d,r.groupId,r.ruleId,e=>({...e,qualifiers:e.qualifiers.map(i=>i.id===r.qualifierId?{...i,...r.patch}:i)}));case"QUALIFIER_REMOVE":return u(d,r.groupId,r.ruleId,e=>({...e,qualifiers:e.qualifiers.filter(i=>i.id!==r.qualifierId)}));case"CONDITION_NODE_ADD":return u(d,r.groupId,r.ruleId,e=>({...e,conditions:o(e.conditions,r.parentNodeId,r.node)}));case"CONDITION_NODE_UPDATE":return u(d,r.groupId,r.ruleId,e=>({...e,conditions:l(e.conditions,r.nodeId,r.patch)}));case"CONDITION_NODE_REMOVE":return u(d,r.groupId,r.ruleId,e=>({...e,conditions:g(e.conditions,r.nodeId)}));case"CONDITION_GROUP_TYPE_TOGGLE":return u(d,r.groupId,r.ruleId,e=>({...e,conditions:E(e.conditions,r.nodeId)}));case"MODIFIER_TOGGLE":return u(d,r.groupId,r.ruleId,e=>({...e,modifiers:{...e.modifiers,[r.key]:!e.modifiers[r.key]}}));case"REWARD_ADD":return u(d,r.groupId,r.ruleId,e=>({...e,rewards:[...e.rewards,r.reward]}));case"REWARD_UPDATE":return u(d,r.groupId,r.ruleId,e=>({...e,rewards:e.rewards.map(i=>i.id===r.rewardId?{...i,...r.patch}:i)}));case"REWARD_REMOVE":return u(d,r.groupId,r.ruleId,e=>({...e,rewards:e.rewards.filter(i=>i.id!==r.rewardId)}))}}function I(d,r,e){return{groups:d.groups.map(i=>i.id===r?e(i):i)}}function p(d,r,e){const i=d.findIndex(O=>O.id===r);if(i<0)return d;const t=e==="up"?i-1:i+1;if(t<0||t>=d.length)return d;const n=d.slice(),[s]=n.splice(i,1);return s?(n.splice(t,0,s),n):d}function u(d,r,e,i){return I(d,r,t=>({...t,rules:t.rules.map(n=>n.id===e?i(n):n)}))}function o(d,r,e){return d.id===r?{...d,children:[...d.children,e]}:{...d,children:d.children.map(i=>i.type==="FIELD"?i:o(i,r,e))}}function l(d,r,e){return d.id===r?d.type==="FIELD"?{...d,...e}:d:d.type==="FIELD"?d:{...d,children:d.children.map(i=>l(i,r,e))}}function g(d,r){return d.type==="FIELD"?d:{...d,children:d.children.filter(e=>e.id!==r).map(e=>g(e,r))}}function E(d,r){return d.type==="FIELD"?d:d.id===r?{...d,type:d.type==="AND"?"OR":"AND"}:{...d,children:d.children.map(e=>E(e,r))}}export{R as editorReducer};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Reward } from "../../../../db/types/index.js";
|
|
2
|
+
import type { Dispatch } from "react";
|
|
3
|
+
import type { EditorAction } from "./reducer.js";
|
|
4
|
+
export declare function RewardsBlock({ groupId, ruleId, rewards, dispatch, }: {
|
|
5
|
+
groupId: string;
|
|
6
|
+
ruleId: string;
|
|
7
|
+
rewards: Reward[];
|
|
8
|
+
dispatch: Dispatch<EditorAction>;
|
|
9
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{Fragment as W,jsx as e,jsxs as i}from"react/jsx-runtime";import{REWARD_EVENT_TRIGGERS as P,REWARD_METRICS as k}from"../../../../db/types/index.js";import{IconPlus as E,IconTrash as I}from"@tabler/icons-react";import{useTranslations as p}from"next-intl";import{Badge as T}from"../../../../components/ui/badge.js";import{Button as y}from"../../../../components/ui/button.js";import{NumberInput as x}from"../../../../components/ui/number-input.js";import{Select as C,SelectContent as D,SelectItem as N,SelectTrigger as S,SelectValue as b}from"../../../../components/ui/select.js";import{TreeActions as V,TreeBranch as _,TreeChevronSpacer as R,TreeEmptyState as z,TreeIconButton as A,TreeRow as w,TreeSectionHeader as F}from"../../../../components/ui/tree.js";function Q({groupId:s,ruleId:o,rewards:r,dispatch:c}){const d=p("Commissions.EditorRules.Rewards"),n=()=>c({type:"REWARD_ADD",groupId:s,ruleId:o,reward:{id:crypto.randomUUID(),type:"fixed",event:"ftd",value:0}}),m=()=>c({type:"REWARD_ADD",groupId:s,ruleId:o,reward:{id:crypto.randomUUID(),type:"percentage",metric:"casino_ngr",value:0}});return i("div",{className:"flex flex-col gap-1",children:[e(F,{title:d("title"),count:r.length}),r.length===0?e(z,{message:d("empty")}):e(_,{children:r.map((l,a)=>l.type==="fixed"?e(M,{groupId:s,ruleId:o,reward:l,index:a,dispatch:c},l.id):e(U,{groupId:s,ruleId:o,reward:l,index:a,dispatch:c},l.id))}),i(V,{children:[i(y,{type:"button",variant:"secondary",size:"xs",onClick:n,children:[e(E,{size:14,"aria-hidden":!0}),d("addFixed")]}),i(y,{type:"button",variant:"secondary",size:"xs",onClick:m,children:[e(E,{size:14,"aria-hidden":!0}),d("addPercentage")]})]})]})}function M({groupId:s,ruleId:o,reward:r,index:c,dispatch:d}){const n=p("Commissions.EditorRules.Rewards"),m=p("Commissions.EditorRules.Rewards.Events"),l=a=>d({type:"REWARD_UPDATE",groupId:s,ruleId:o,rewardId:r.id,patch:a});return i(w,{children:[e(R,{}),i("span",{className:"text-xs font-medium text-foreground",children:["#",c+1]}),e(T,{children:n("badgeFixed")}),e("span",{className:"text-xs text-muted-foreground",children:n("fixedOnPrefix")}),i(C,{value:r.event,onValueChange:a=>l({event:a}),children:[e(S,{className:"h-7 w-full min-w-32 sm:w-44",children:e(b,{children:a=>a?m(a):null})}),e(D,{children:P.map(a=>e(N,{value:a,children:m(a)},a))})]}),e("span",{className:"text-xs text-muted-foreground",children:n("fixedEquals")}),e(x,{min:0,value:r.value,onValueChange:a=>l({value:a}),className:"h-7 w-28","aria-label":n("amountLabel")}),e("div",{className:"ml-auto",children:e(B,{groupId:s,ruleId:o,rewardId:r.id,dispatch:d})})]})}function U({groupId:s,ruleId:o,reward:r,index:c,dispatch:d}){const n=p("Commissions.EditorRules.Rewards"),m=p("Commissions.EditorRules.Rewards.Metrics"),l=t=>d({type:"REWARD_UPDATE",groupId:s,ruleId:o,rewardId:r.id,patch:t}),a=r.tiers??[],f=t=>l({tiers:t.length>0?t:void 0}),v=(t,g)=>f(a.map((u,h)=>h===t?{...u,...g}:u));return i(W,{children:[i(w,{children:[e(R,{}),i("span",{className:"text-xs font-medium text-foreground",children:["#",c+1]}),e(T,{children:n("badgePercent")}),e(x,{min:0,max:100,value:r.value,onValueChange:t=>l({value:t}),className:"h-7 w-20","aria-label":n("percentageLabel")}),e("span",{className:"text-xs text-muted-foreground",children:n("percentageOf")}),i(C,{value:r.metric,onValueChange:t=>l({metric:t}),children:[e(S,{className:"h-7 w-full min-w-32 sm:w-40",children:e(b,{children:t=>t?m(t):null})}),e(D,{children:k.map(t=>e(N,{value:t,children:m(t)},t))})]}),e("div",{className:"ml-auto",children:e(B,{groupId:s,ruleId:o,rewardId:r.id,dispatch:d})})]}),a.map((t,g)=>i(w,{children:[e(R,{}),e(R,{}),e(T,{children:n("tierBadge")}),e("span",{className:"text-xs text-muted-foreground",children:n("tierFrom")}),e(x,{min:0,value:t.min,onValueChange:u=>v(g,{min:u}),className:"h-7 w-28","aria-label":n("tierMinLabel")}),e("span",{className:"text-xs text-muted-foreground",children:"\u2192"}),e(x,{min:0,max:100,value:t.rate,onValueChange:u=>v(g,{rate:u}),className:"h-7 w-20","aria-label":n("tierRateLabel")}),e("span",{className:"text-xs text-muted-foreground",children:"%"}),e("div",{className:"ml-auto",children:e(A,{icon:e(I,{size:14,"aria-hidden":!0}),label:n("removeTier"),onClick:()=>f(a.filter((u,h)=>h!==g))})})]},t.id)),i(w,{children:[e(R,{}),e(R,{}),i(y,{type:"button",variant:"secondary",size:"xs",onClick:()=>f([...a,{id:crypto.randomUUID(),min:0,rate:0}]),children:[e(E,{size:14,"aria-hidden":!0}),n("addTier")]})]})]})}function B({groupId:s,ruleId:o,rewardId:r,dispatch:c}){const d=p("Commissions.EditorRules.Rewards");return e(A,{icon:e(I,{size:14,"aria-hidden":!0}),label:d("removeReward"),onClick:()=>c({type:"REWARD_REMOVE",groupId:s,ruleId:o,rewardId:r})})}export{Q as RewardsBlock};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Dispatch } from "react";
|
|
2
|
+
import type { EditorAction } from "./reducer.js";
|
|
3
|
+
import { type RuleState } from "./state.js";
|
|
4
|
+
export declare function RuleCard({ groupId, rule, index, ruleCount, dispatch, }: {
|
|
5
|
+
groupId: string;
|
|
6
|
+
rule: RuleState;
|
|
7
|
+
index: number;
|
|
8
|
+
ruleCount: number;
|
|
9
|
+
dispatch: Dispatch<EditorAction>;
|
|
10
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{Fragment as L,jsx as i,jsxs as l}from"react/jsx-runtime";import{IconArrowDown as c,IconArrowUp as m,IconCopy as p,IconTrash as f}from"@tabler/icons-react";import{useTranslations as u}from"next-intl";import{TreeChevron as R,TreeCollapsible as C,TreeIconButton as d,TreeItemHeader as E,TreePanel as I,TreeRow as b}from"../../../../components/ui/tree.js";import{ConditionsBlock as w}from"./conditions-block.js";import{ModifiersBlock as y}from"./modifiers-block.js";import{QualifiersBlock as T}from"./qualifiers-block.js";import{RewardsBlock as h}from"./rewards-block.js";import{cloneRuleWithNewIds as U}from"./state.js";function v({groupId:o,rule:e,index:t,ruleCount:a,dispatch:r}){const n=u("Commissions.EditorRules"),s=n("ruleSummary",{qualifiers:e.qualifiers.length,conditions:e.conditions.children.length,modifiers:Object.values(e.modifiers).filter(Boolean).length,rewards:e.rewards.length});return l(C,{open:!e.collapsed,onOpenChange:()=>r({type:"RULE_TOGGLE_COLLAPSED",groupId:o,ruleId:e.id}),children:[l(b,{children:[i(R,{"aria-label":e.collapsed?n("expandRule"):n("collapseRule")}),i(E,{index:t,badge:n("ruleBadge"),summary:s,actions:l(L,{children:[i(d,{icon:i(m,{size:14,"aria-hidden":!0}),label:n("moveRuleUp"),onClick:()=>r({type:"RULE_MOVE",groupId:o,ruleId:e.id,direction:"up"}),disabled:t===0}),i(d,{icon:i(c,{size:14,"aria-hidden":!0}),label:n("moveRuleDown"),onClick:()=>r({type:"RULE_MOVE",groupId:o,ruleId:e.id,direction:"down"}),disabled:t===a-1}),i(d,{icon:i(p,{size:14,"aria-hidden":!0}),label:n("duplicateRule"),onClick:()=>r({type:"RULE_DUPLICATE",groupId:o,ruleId:e.id,clone:U(e,crypto.randomUUID())})}),i(d,{icon:i(f,{size:14,"aria-hidden":!0}),label:n("deleteRule"),onClick:()=>r({type:"RULE_REMOVE",groupId:o,ruleId:e.id})})]})})]}),l(I,{children:[i(w,{groupId:o,ruleId:e.id,conditions:e.conditions,dispatch:r}),i(T,{groupId:o,ruleId:e.id,qualifiers:e.qualifiers,dispatch:r}),i(y,{groupId:o,ruleId:e.id,modifiers:e.modifiers,dispatch:r}),i(h,{groupId:o,ruleId:e.id,rewards:e.rewards,dispatch:r})]})]})}export{v as RuleCard};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CommissionRuleGroupWithRules } from "../../actions.js";
|
|
2
|
+
import { type EditorState } from "./state.js";
|
|
3
|
+
export declare function RuleEditor({ name, initialRuleGroups, }: {
|
|
4
|
+
name: string;
|
|
5
|
+
initialRuleGroups: CommissionRuleGroupWithRules[];
|
|
6
|
+
}): import("react").JSX.Element;
|
|
7
|
+
export type { EditorState };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as t,jsxs as E}from"react/jsx-runtime";import{useTranslations as u}from"next-intl";import{useMemo as d,useReducer as m}from"react";import{TreeBranch as l,TreeEmptyState as c,TreeSectionHeader as g}from"../../../../components/ui/tree.js";import{editorReducer as R}from"./reducer.js";import{RuleGroupCard as f}from"./rule-group-card.js";import{mapServerToEditorState as h,serializeEditorState as y}from"./state.js";function D({name:s,initialRuleGroups:p}){const o=u("Commissions.EditorRules"),[e,r]=m(R,p,h),a=d(()=>y(e),[e]);return E("div",{className:"flex flex-col gap-1",children:[t("input",{type:"hidden",name:s,value:a}),t(g,{title:o("title"),count:e.groups.length,onAdd:()=>r({type:"GROUP_ADD",id:crypto.randomUUID()}),addLabel:o("addGroup")}),e.groups.length===0?t(c,{message:o("noGroups")}):t(l,{children:e.groups.map((i,n)=>t(f,{group:i,index:n,groupCount:e.groups.length,dispatch:r},i.id))})]})}export{D as RuleEditor};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Dispatch } from "react";
|
|
2
|
+
import type { EditorAction } from "./reducer.js";
|
|
3
|
+
import type { GroupState } from "./state.js";
|
|
4
|
+
export declare function RuleGroupCard({ group, index, groupCount, dispatch, }: {
|
|
5
|
+
group: GroupState;
|
|
6
|
+
index: number;
|
|
7
|
+
groupCount: number;
|
|
8
|
+
dispatch: Dispatch<EditorAction>;
|
|
9
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{Fragment as U,jsx as o,jsxs as t}from"react/jsx-runtime";import{IconArrowDown as s,IconArrowUp as u,IconTrash as c}from"@tabler/icons-react";import{useTranslations as m}from"next-intl";import{TreeBranch as T,TreeChevron as C,TreeCollapsible as G,TreeEmptyState as I,TreeIconButton as d,TreeItemHeader as R,TreePanel as y,TreeRow as b,TreeSectionHeader as h}from"../../../../components/ui/tree.js";import{RuleCard as E}from"./rule-card.js";function A({group:e,index:i,groupCount:a,dispatch:n}){const r=m("Commissions.EditorRules");return t(G,{open:!e.collapsed,onOpenChange:()=>n({type:"GROUP_TOGGLE_COLLAPSED",groupId:e.id}),children:[t(b,{children:[o(C,{"aria-label":e.collapsed?r("expandGroup"):r("collapseGroup")}),o(R,{index:i,badge:r("groupBadge"),summary:r("ruleCount",{count:e.rules.length}),actions:t(U,{children:[o(d,{icon:o(u,{size:14,"aria-hidden":!0}),label:r("moveGroupUp"),onClick:()=>n({type:"GROUP_MOVE",groupId:e.id,direction:"up"}),disabled:i===0}),o(d,{icon:o(s,{size:14,"aria-hidden":!0}),label:r("moveGroupDown"),onClick:()=>n({type:"GROUP_MOVE",groupId:e.id,direction:"down"}),disabled:i===a-1}),o(d,{icon:o(c,{size:14,"aria-hidden":!0}),label:r("deleteGroup"),onClick:()=>n({type:"GROUP_REMOVE",groupId:e.id})})]})})]}),t(y,{children:[o(h,{title:r("rulesSection"),count:e.rules.length,onAdd:()=>n({type:"RULE_ADD",groupId:e.id,id:crypto.randomUUID(),conditionRootId:crypto.randomUUID()}),addLabel:r("addRule")}),e.rules.length===0?o(I,{message:r("noRules")}):o(T,{children:e.rules.map((l,p)=>o(E,{groupId:e.id,rule:l,index:p,ruleCount:e.rules.length,dispatch:n},l.id))})]})]})}export{A as RuleGroupCard};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ConditionGroupNode, Modifiers, Qualifier, Reward } from "../../../../db/types/index.js";
|
|
2
|
+
import type { CommissionRuleGroupWithRules } from "../../actions.js";
|
|
3
|
+
export type RuleState = {
|
|
4
|
+
id: string;
|
|
5
|
+
qualifiers: Qualifier[];
|
|
6
|
+
conditions: ConditionGroupNode;
|
|
7
|
+
modifiers: Modifiers;
|
|
8
|
+
rewards: Reward[];
|
|
9
|
+
collapsed: boolean;
|
|
10
|
+
};
|
|
11
|
+
export type GroupState = {
|
|
12
|
+
id: string;
|
|
13
|
+
collapsed: boolean;
|
|
14
|
+
rules: RuleState[];
|
|
15
|
+
};
|
|
16
|
+
export type EditorState = {
|
|
17
|
+
groups: GroupState[];
|
|
18
|
+
};
|
|
19
|
+
export declare function mapServerToEditorState(ruleGroups: CommissionRuleGroupWithRules[]): EditorState;
|
|
20
|
+
export declare function serializeEditorState(state: EditorState): string;
|
|
21
|
+
export declare function cloneRuleWithNewIds(rule: RuleState, newId: string): RuleState;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function d(i){return{groups:i.map(e=>({id:e.id,collapsed:!1,rules:e.rules.map(o=>({id:o.id,qualifiers:o.qualifiers,conditions:o.conditions,modifiers:o.modifiers,rewards:o.rewards,collapsed:!0}))}))}}function s(i){return JSON.stringify(i.groups.map((e,o)=>({priority:(o+1)*10,rules:e.rules.map(r=>({qualifiers:r.qualifiers,conditions:r.conditions,modifiers:r.modifiers,rewards:r.rewards}))})))}function n(i,e){return{id:e,qualifiers:i.qualifiers.map(o=>({...o,id:crypto.randomUUID()})),conditions:t(i.conditions),modifiers:{...i.modifiers},rewards:i.rewards.map(o=>({...o,id:crypto.randomUUID()})),collapsed:!1}}function t(i){return i.type==="FIELD"?{...i,id:crypto.randomUUID()}:{...i,id:crypto.randomUUID(),children:i.children.map(t)}}export{n as cloneRuleWithNewIds,d as mapServerToEditorState,s as serializeEditorState};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{Fragment as u,jsx as s,jsxs as n}from"react/jsx-runtime";import{MODIFIER_KEYS as c}from"../../../db/types/index.js";import{useLocale as f,useTranslations as a}from"next-intl";import{Badge as d}from"../../../components/ui/badge.js";import{getCountryName as g}from"../../../lib/countries.js";function G({groups:e}){const t=a("Commissions.EditorRules");return e.length===0?s("p",{className:"text-sm text-muted-foreground",children:t("noGroups")}):s("div",{className:"flex flex-col gap-6",children:e.map((o,i)=>s(x,{group:o,index:i},o.id))})}function x({group:e,index:t}){const o=a("Commissions.EditorRules");return n("section",{className:"flex flex-col gap-3",children:[n("header",{className:"flex items-baseline gap-2",children:[s("h3",{className:"text-sm font-semibold text-foreground",children:o("groupIndex",{n:t+1})}),n("span",{className:"text-xs text-muted-foreground",children:["(",o("ruleCount",{count:e.rules.length}),")"]})]}),e.rules.length===0?s("p",{className:"text-xs text-muted-foreground",children:o("noRules")}):s("div",{className:"divide-y divide-border overflow-hidden rounded-md border border-border bg-muted/30",children:e.rules.map((i,r)=>s(y,{rule:i,index:r},i.id))})]})}function y({rule:e,index:t}){const o=a("Commissions.EditorRules");return n("div",{className:"flex flex-col gap-3 p-4",children:[s("h4",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:o("ruleIndex",{n:t+1})}),n("dl",{className:"grid grid-cols-1 gap-3 sm:grid-cols-[8rem_1fr]",children:[s(R,{qualifiers:e.qualifiers}),s(N,{conditions:e.conditions}),s(v,{modifiers:e.modifiers}),s(w,{rewards:e.rewards})]})]})}function l({label:e,empty:t,children:o}){return n(u,{children:[s("dt",{className:"text-xs font-medium text-muted-foreground",children:e}),s("dd",{className:"min-w-0 text-sm text-foreground",children:t?s("span",{className:"text-muted-foreground",children:"\u2014"}):o})]})}function R({qualifiers:e}){const t=a("Commissions.EditorRules.Qualifiers"),o=a("Commissions.EditorRules.Qualifiers.Types");return s(l,{label:t("title"),empty:e.length===0,children:s("ul",{className:"flex flex-col gap-1",children:e.map(i=>n("li",{children:[o(i.type)," ",s("span",{className:"tabular-nums",children:i.value})]},i.id))})})}function N({conditions:e}){const t=a("Commissions.EditorRules.Conditions");return s(l,{label:t("title"),empty:e.children.length===0,children:s(m,{node:e})})}function m({node:e}){return e.type==="FIELD"?s(C,{node:e}):n("div",{className:"flex flex-col gap-1",children:[s("span",{className:"text-xs font-medium text-muted-foreground",children:e.type}),s("ul",{className:"flex flex-col gap-1 border-l border-border pl-3",children:e.children.map(t=>s("li",{children:s(m,{node:t})},t.id))})]})}function C({node:e}){const t=a("Commissions.EditorRules.Conditions.Fields"),o=a("Commissions.EditorRules.Conditions.Products"),i=f(),r=b(e,i,p=>o(p));return n("span",{className:"flex flex-wrap items-baseline gap-x-2 gap-y-0.5",children:[s("span",{children:t(e.field)}),s("span",{className:"text-xs text-muted-foreground",children:e.op}),s("span",{children:r})]})}function b(e,t,o){if(e.field==="country"){const i=Array.isArray(e.value)?e.value.filter(r=>typeof r=="string"):typeof e.value=="string"&&e.value?[e.value]:[];return i.length===0?"\u2014":i.map(r=>g(r,t)).join(", ")}if(e.field==="product"){const i=String(e.value??"");return i==="casino"||i==="sportsbook"?o(i):i||"\u2014"}return typeof e.value=="number"?String(e.value):String(e.value??"\u2014")}function v({modifiers:e}){const t=a("Commissions.EditorRules.Modifiers"),o=c.filter(i=>e[i]);return s(l,{label:t("title"),empty:o.length===0,children:s("ul",{className:"flex flex-wrap gap-1.5",children:o.map(i=>s("li",{children:s(d,{children:t(i)})},i))})})}function w({rewards:e}){const t=a("Commissions.EditorRules.Rewards"),o=a("Commissions.EditorRules.Rewards.Events"),i=a("Commissions.EditorRules.Rewards.Metrics");return s(l,{label:t("title"),empty:e.length===0,children:s("ul",{className:"flex flex-col gap-1.5",children:e.map(r=>s("li",{className:"flex flex-wrap items-center gap-2",children:r.type==="fixed"?n(u,{children:[s(d,{children:t("badgeFixed")}),n("span",{children:[o(r.event)," ",t("fixedEquals")," ",s("span",{className:"tabular-nums",children:r.value})]})]}):n(u,{children:[s(d,{children:t("badgePercent")}),n("span",{children:[s("span",{className:"tabular-nums",children:r.value}),t("percentageOf")," ",i(r.metric)]})]})},r.id))})})}export{G as RuleGroupsReadView};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const COMMISSION_SORT_KEYS: readonly ["title", "createdAt"];
|
|
2
|
+
export type CommissionSortKey = (typeof COMMISSION_SORT_KEYS)[number];
|
|
3
|
+
export declare const COMMISSION_STATUSES: readonly ["all", "draft", "published", "deactivated"];
|
|
4
|
+
export type CommissionStatusFilter = (typeof COMMISSION_STATUSES)[number];
|
|
5
|
+
export declare const commissionStatusParser: Omit<import("nuqs/server").SingleParserBuilder<"draft" | "published" | "deactivated" | "all">, "parseServerSide"> & {
|
|
6
|
+
readonly defaultValue: NonNullable<"draft" | "published" | "deactivated" | "all">;
|
|
7
|
+
parseServerSide(value: string | string[] | undefined): NonNullable<"draft" | "published" | "deactivated" | "all">;
|
|
8
|
+
};
|
|
9
|
+
export declare const loadCommissionStatus: import("nuqs/server").LoaderFunction<{
|
|
10
|
+
status: Omit<import("nuqs/server").SingleParserBuilder<"draft" | "published" | "deactivated" | "all">, "parseServerSide"> & {
|
|
11
|
+
readonly defaultValue: NonNullable<"draft" | "published" | "deactivated" | "all">;
|
|
12
|
+
parseServerSide(value: string | string[] | undefined): NonNullable<"draft" | "published" | "deactivated" | "all">;
|
|
13
|
+
};
|
|
14
|
+
}>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createLoader as t,parseAsStringLiteral as e}from"nuqs/server";const r=["title","createdAt"],o=["all","draft","published","deactivated"],s=e(o).withDefault("all"),a=t({status:s});export{r as COMMISSION_SORT_KEYS,o as COMMISSION_STATUSES,s as commissionStatusParser,a as loadCommissionStatus};
|