@m5kdev/web-ui 0.7.0 → 0.8.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/dist/src/animations/card.motion.d.ts +7 -2
- package/dist/src/animations/card.motion.js +25 -6
- package/dist/src/animations/card.motion.js.map +1 -0
- package/dist/src/components/AvatarUpload.d.ts +14 -5
- package/dist/src/components/AvatarUpload.js +105 -63
- package/dist/src/components/AvatarUpload.js.map +1 -0
- package/dist/src/components/Button.d.ts +14 -4
- package/dist/src/components/Button.js +13 -4
- package/dist/src/components/Button.js.map +1 -0
- package/dist/src/components/Calendar.d.ts +33 -31
- package/dist/src/components/Calendar.js +14 -6
- package/dist/src/components/Calendar.js.map +1 -0
- package/dist/src/components/{Calendar.css → Calendar2.css} +757 -684
- package/dist/src/components/CardsSelect.d.ts +25 -21
- package/dist/src/components/CardsSelect.js +75 -42
- package/dist/src/components/CardsSelect.js.map +1 -0
- package/dist/src/components/CollapsibleSidebarMenuItem.d.ts +22 -9
- package/dist/src/components/CollapsibleSidebarMenuItem.js +31 -8
- package/dist/src/components/CollapsibleSidebarMenuItem.js.map +1 -0
- package/dist/src/components/ColorPicker.d.ts +15 -4
- package/dist/src/components/ColorPicker.js +46 -16
- package/dist/src/components/ColorPicker.js.map +1 -0
- package/dist/src/components/CopyButton.d.ts +18 -6
- package/dist/src/components/CopyButton.js +28 -19
- package/dist/src/components/CopyButton.js.map +1 -0
- package/dist/src/components/CropDialog.d.ts +20 -8
- package/dist/src/components/CropDialog.js +108 -62
- package/dist/src/components/CropDialog.js.map +1 -0
- package/dist/src/components/DialogProvider.d.ts +22 -14
- package/dist/src/components/DialogProvider.js +67 -45
- package/dist/src/components/DialogProvider.js.map +1 -0
- package/dist/src/components/ErrorFallback.d.ts +13 -4
- package/dist/src/components/ErrorFallback.js +29 -4
- package/dist/src/components/ErrorFallback.js.map +1 -0
- package/dist/src/components/FileDropzone.d.ts +12 -4
- package/dist/src/components/FileDropzone.js +98 -60
- package/dist/src/components/FileDropzone.js.map +1 -0
- package/dist/src/components/MultiSelectDropdown.d.ts +25 -22
- package/dist/src/components/MultiSelectDropdown.js +99 -49
- package/dist/src/components/MultiSelectDropdown.js.map +1 -0
- package/dist/src/components/Orb.d.ts +17 -6
- package/dist/src/components/Orb.js +263 -255
- package/dist/src/components/Orb.js.map +1 -0
- package/dist/src/components/PageAlert.d.ts +20 -15
- package/dist/src/components/PageAlert.js +67 -39
- package/dist/src/components/PageAlert.js.map +1 -0
- package/dist/src/components/SelectChips.d.ts +21 -10
- package/dist/src/components/SelectChips.js +21 -9
- package/dist/src/components/SelectChips.js.map +1 -0
- package/dist/src/components/SidebarItem.d.ts +18 -7
- package/dist/src/components/SidebarItem.js +16 -4
- package/dist/src/components/SidebarItem.js.map +1 -0
- package/dist/src/components/Steps.d.ts +21 -16
- package/dist/src/components/Steps.js +193 -27
- package/dist/src/components/Steps.js.map +1 -0
- package/dist/src/components/TablerIconPicker.d.ts +13 -2
- package/dist/src/components/TablerIconPicker.js +4254 -4234
- package/dist/src/components/TablerIconPicker.js.map +1 -0
- package/dist/src/components/app-header.d.ts +14 -6
- package/dist/src/components/app-header.js +27 -6
- package/dist/src/components/app-header.js.map +1 -0
- package/dist/src/components/blur-card.d.ts +25 -11
- package/dist/src/components/blur-card.js +134 -31
- package/dist/src/components/blur-card.js.map +1 -0
- package/dist/src/components/features-section-demo-1.d.ts +22 -6
- package/dist/src/components/features-section-demo-1.js +119 -47
- package/dist/src/components/features-section-demo-1.js.map +1 -0
- package/dist/src/components/features-section-demo-2.d.ts +7 -1
- package/dist/src/components/features-section-demo-2.js +80 -49
- package/dist/src/components/features-section-demo-2.js.map +1 -0
- package/dist/src/components/features-section-demo-3.d.ts +16 -8
- package/dist/src/components/features-section-demo-3.js +239 -103
- package/dist/src/components/features-section-demo-3.js.map +1 -0
- package/dist/src/components/mode-toggle.d.ts +7 -1
- package/dist/src/components/mode-toggle.js +42 -7
- package/dist/src/components/mode-toggle.js.map +1 -0
- package/dist/src/components/nav-main.d.ts +20 -12
- package/dist/src/components/nav-main.js +31 -5
- package/dist/src/components/nav-main.js.map +1 -0
- package/dist/src/components/pricing-cards.d.ts +7 -1
- package/dist/src/components/pricing-cards.js +125 -24
- package/dist/src/components/pricing-cards.js.map +1 -0
- package/dist/src/components/shared/ButtonCopy.d.ts +17 -6
- package/dist/src/components/shared/ButtonCopy.js +31 -20
- package/dist/src/components/shared/ButtonCopy.js.map +1 -0
- package/dist/src/components/team-switcher.d.ts +16 -8
- package/dist/src/components/team-switcher.js +70 -8
- package/dist/src/components/team-switcher.js.map +1 -0
- package/dist/src/components/theme-provider.d.ts +18 -8
- package/dist/src/components/theme-provider.js +42 -38
- package/dist/src/components/theme-provider.js.map +1 -0
- package/dist/src/components/typewriter.d.ts +35 -14
- package/dist/src/components/typewriter.js +45 -36
- package/dist/src/components/typewriter.js.map +1 -0
- package/dist/src/components/ui/alert-dialog.d.ts +48 -13
- package/dist/src/components/ui/alert-dialog.js +58 -15
- package/dist/src/components/ui/alert-dialog.js.map +1 -0
- package/dist/src/components/ui/alert.d.ts +24 -8
- package/dist/src/components/ui/alert.js +28 -15
- package/dist/src/components/ui/alert.js.map +1 -0
- package/dist/src/components/ui/avatar.d.ts +9 -5
- package/dist/src/components/ui/avatar.js +23 -7
- package/dist/src/components/ui/avatar.js.map +1 -0
- package/dist/src/components/ui/badge.d.ts +17 -8
- package/dist/src/components/ui/badge.js +17 -14
- package/dist/src/components/ui/badge.js.map +1 -0
- package/dist/src/components/ui/bento-grid.d.ts +26 -11
- package/dist/src/components/ui/bento-grid.js +30 -6
- package/dist/src/components/ui/bento-grid.js.map +1 -0
- package/dist/src/components/ui/bento-grid2.d.ts +30 -14
- package/dist/src/components/ui/bento-grid2.js +45 -9
- package/dist/src/components/ui/bento-grid2.js.map +1 -0
- package/dist/src/components/ui/breadcrumb.d.ts +27 -15
- package/dist/src/components/ui/breadcrumb.js +54 -14
- package/dist/src/components/ui/breadcrumb.js.map +1 -0
- package/dist/src/components/ui/button.d.ts +14 -9
- package/dist/src/components/ui/button.js +37 -26
- package/dist/src/components/ui/button.js.map +1 -0
- package/dist/src/components/ui/card.d.ts +12 -8
- package/dist/src/components/ui/card.js +38 -10
- package/dist/src/components/ui/card.js.map +1 -0
- package/dist/src/components/ui/checkbox.d.ts +6 -2
- package/dist/src/components/ui/checkbox.js +17 -5
- package/dist/src/components/ui/checkbox.js.map +1 -0
- package/dist/src/components/ui/collapsible.d.ts +9 -4
- package/dist/src/components/ui/collapsible.js +5 -1
- package/dist/src/components/ui/collapsible.js.map +1 -0
- package/dist/src/components/ui/dialog.d.ts +44 -12
- package/dist/src/components/ui/dialog.js +64 -14
- package/dist/src/components/ui/dialog.js.map +1 -0
- package/dist/src/components/ui/dropdown-menu.d.ts +32 -24
- package/dist/src/components/ui/dropdown-menu.js +64 -14
- package/dist/src/components/ui/dropdown-menu.js.map +1 -0
- package/dist/src/components/ui/floating-navbar.d.ts +18 -9
- package/dist/src/components/ui/floating-navbar.js +49 -35
- package/dist/src/components/ui/floating-navbar.js.map +1 -0
- package/dist/src/components/ui/form.d.ts +30 -21
- package/dist/src/components/ui/form.js +76 -44
- package/dist/src/components/ui/form.js.map +1 -0
- package/dist/src/components/ui/image.d.ts +6 -2
- package/dist/src/components/ui/image.js +51 -11
- package/dist/src/components/ui/image.js.map +1 -0
- package/dist/src/components/ui/input.d.ts +6 -2
- package/dist/src/components/ui/input.js +14 -5
- package/dist/src/components/ui/input.js.map +1 -0
- package/dist/src/components/ui/label.d.ts +8 -3
- package/dist/src/components/ui/label.js +13 -5
- package/dist/src/components/ui/label.js.map +1 -0
- package/dist/src/components/ui/pagination.d.ts +39 -12
- package/dist/src/components/ui/pagination.js +64 -14
- package/dist/src/components/ui/pagination.js.map +1 -0
- package/dist/src/components/ui/progress.d.ts +6 -2
- package/dist/src/components/ui/progress.js +16 -4
- package/dist/src/components/ui/progress.js.map +1 -0
- package/dist/src/components/ui/resizable-navbar.d.ts +84 -43
- package/dist/src/components/ui/resizable-navbar.js +126 -74
- package/dist/src/components/ui/resizable-navbar.js.map +1 -0
- package/dist/src/components/ui/segment-control.d.ts +10 -7
- package/dist/src/components/ui/segment-control.js +83 -38
- package/dist/src/components/ui/segment-control.js.map +1 -0
- package/dist/src/components/ui/select.d.ts +16 -12
- package/dist/src/components/ui/select.js +63 -14
- package/dist/src/components/ui/select.js.map +1 -0
- package/dist/src/components/ui/separator.d.ts +6 -2
- package/dist/src/components/ui/separator.js +14 -4
- package/dist/src/components/ui/separator.js.map +1 -0
- package/dist/src/components/ui/sheet.d.ts +30 -19
- package/dist/src/components/ui/sheet.js +52 -23
- package/dist/src/components/ui/sheet.js.map +1 -0
- package/dist/src/components/ui/sidebar.d.ts +69 -62
- package/dist/src/components/ui/sidebar.js +326 -171
- package/dist/src/components/ui/sidebar.js.map +1 -0
- package/dist/src/components/ui/skeleton.d.ts +9 -1
- package/dist/src/components/ui/skeleton.js +10 -3
- package/dist/src/components/ui/skeleton.js.map +1 -0
- package/dist/src/components/ui/slider.d.ts +6 -2
- package/dist/src/components/ui/slider.js +16 -4
- package/dist/src/components/ui/slider.js.map +1 -0
- package/dist/src/components/ui/sonner.d.ts +10 -3
- package/dist/src/components/ui/sonner.js +18 -11
- package/dist/src/components/ui/sonner.js.map +1 -0
- package/dist/src/components/ui/spinner.d.ts +21 -10
- package/dist/src/components/ui/spinner.js +24 -24
- package/dist/src/components/ui/spinner.js.map +1 -0
- package/dist/src/components/ui/switch.d.ts +6 -2
- package/dist/src/components/ui/switch.js +13 -4
- package/dist/src/components/ui/switch.js.map +1 -0
- package/dist/src/components/ui/table.d.ts +39 -10
- package/dist/src/components/ui/table.js +51 -11
- package/dist/src/components/ui/table.js.map +1 -0
- package/dist/src/components/ui/tabs.d.ts +23 -6
- package/dist/src/components/ui/tabs.js +27 -7
- package/dist/src/components/ui/tabs.js.map +1 -0
- package/dist/src/components/ui/textarea.d.ts +10 -2
- package/dist/src/components/ui/textarea.js +11 -3
- package/dist/src/components/ui/textarea.js.map +1 -0
- package/dist/src/components/ui/timeline.d.ts +16 -9
- package/dist/src/components/ui/timeline.js +87 -24
- package/dist/src/components/ui/timeline.js.map +1 -0
- package/dist/src/components/ui/toast.d.ts +19 -14
- package/dist/src/components/ui/toast.js +48 -22
- package/dist/src/components/ui/toast.js.map +1 -0
- package/dist/src/components/ui/tooltip.d.ts +23 -6
- package/dist/src/components/ui/tooltip.js +27 -7
- package/dist/src/components/ui/tooltip.js.map +1 -0
- package/dist/src/components/ui/typewriter-effect.d.ts +28 -14
- package/dist/src/components/ui/typewriter-effect.js +102 -72
- package/dist/src/components/ui/typewriter-effect.js.map +1 -0
- package/dist/src/hooks/use-mobile.d.ts +5 -1
- package/dist/src/hooks/use-mobile.js +18 -13
- package/dist/src/hooks/use-mobile.js.map +1 -0
- package/dist/src/hooks/useDialog.d.ts +8 -4
- package/dist/src/hooks/useDialog.js +24 -20
- package/dist/src/hooks/useDialog.js.map +1 -0
- package/dist/src/icons/GoogleIcon.d.ts +9 -5
- package/dist/src/icons/GoogleIcon.js +32 -3
- package/dist/src/icons/GoogleIcon.js.map +1 -0
- package/dist/src/icons/LinkedInIcon.d.ts +9 -5
- package/dist/src/icons/LinkedInIcon.js +27 -3
- package/dist/src/icons/LinkedInIcon.js.map +1 -0
- package/dist/src/icons/MicrosoftIcon.d.ts +9 -5
- package/dist/src/icons/MicrosoftIcon.js +31 -3
- package/dist/src/icons/MicrosoftIcon.js.map +1 -0
- package/dist/src/lib/chatwoot.d.ts +19 -10
- package/dist/src/lib/chatwoot.js +25 -27
- package/dist/src/lib/chatwoot.js.map +1 -0
- package/dist/src/lib/utils.d.ts +7 -2
- package/dist/src/lib/utils.js +7 -2
- package/dist/src/lib/utils.js.map +1 -0
- package/dist/src/modules/app/components/AppLoader.d.ts +8 -2
- package/dist/src/modules/app/components/AppLoader.js +14 -3
- package/dist/src/modules/app/components/AppLoader.js.map +1 -0
- package/dist/src/modules/app/components/AppShell.d.ts +15 -6
- package/dist/src/modules/app/components/AppShell.js +14 -5
- package/dist/src/modules/app/components/AppShell.js.map +1 -0
- package/dist/src/modules/app/components/AppSidebar.d.ts +16 -6
- package/dist/src/modules/app/components/AppSidebar.js +17 -4
- package/dist/src/modules/app/components/AppSidebar.js.map +1 -0
- package/dist/src/modules/app/components/AppSidebarContent.d.ts +22 -13
- package/dist/src/modules/app/components/AppSidebarContent.js +34 -5
- package/dist/src/modules/app/components/AppSidebarContent.js.map +1 -0
- package/dist/src/modules/app/components/AppSidebarHeader.d.ts +18 -8
- package/dist/src/modules/app/components/AppSidebarHeader.js +37 -6
- package/dist/src/modules/app/components/AppSidebarHeader.js.map +1 -0
- package/dist/src/modules/app/components/AppSidebarInvites.d.ts +11 -3
- package/dist/src/modules/app/components/AppSidebarInvites.js +39 -8
- package/dist/src/modules/app/components/AppSidebarInvites.js.map +1 -0
- package/dist/src/modules/app/components/AppSidebarUser.d.ts +20 -10
- package/dist/src/modules/app/components/AppSidebarUser.js +121 -12
- package/dist/src/modules/app/components/AppSidebarUser.js.map +1 -0
- package/dist/src/modules/auth/components/AdminUserManagement.d.ts +11 -4
- package/dist/src/modules/auth/components/AdminUserManagement.js +970 -418
- package/dist/src/modules/auth/components/AdminUserManagement.js.map +1 -0
- package/dist/src/modules/auth/components/AdminWaitlist.d.ts +11 -4
- package/dist/src/modules/auth/components/AdminWaitlist.js +284 -115
- package/dist/src/modules/auth/components/AdminWaitlist.js.map +1 -0
- package/dist/src/modules/auth/components/AuthLayout.d.ts +12 -4
- package/dist/src/modules/auth/components/AuthLayout.js +17 -3
- package/dist/src/modules/auth/components/AuthLayout.js.map +1 -0
- package/dist/src/modules/auth/components/AuthProviders.d.ts +17 -6
- package/dist/src/modules/auth/components/AuthProviders.js +80 -41
- package/dist/src/modules/auth/components/AuthProviders.js.map +1 -0
- package/dist/src/modules/auth/components/AuthRouter.d.ts +16 -7
- package/dist/src/modules/auth/components/AuthRouter.js +46 -10
- package/dist/src/modules/auth/components/AuthRouter.js.map +1 -0
- package/dist/src/modules/auth/components/ClaimAccountRoute.d.ts +12 -4
- package/dist/src/modules/auth/components/ClaimAccountRoute.js +202 -139
- package/dist/src/modules/auth/components/ClaimAccountRoute.js.map +1 -0
- package/dist/src/modules/auth/components/ErrorAuthRoute.d.ts +7 -1
- package/dist/src/modules/auth/components/ErrorAuthRoute.js +125 -89
- package/dist/src/modules/auth/components/ErrorAuthRoute.js.map +1 -0
- package/dist/src/modules/auth/components/ForgotPasswordForm.d.ts +7 -1
- package/dist/src/modules/auth/components/ForgotPasswordForm.js +49 -23
- package/dist/src/modules/auth/components/ForgotPasswordForm.js.map +1 -0
- package/dist/src/modules/auth/components/ForgotPasswordRoute.d.ts +7 -1
- package/dist/src/modules/auth/components/ForgotPasswordRoute.js +34 -6
- package/dist/src/modules/auth/components/ForgotPasswordRoute.js.map +1 -0
- package/dist/src/modules/auth/components/InviteFriends.d.ts +12 -4
- package/dist/src/modules/auth/components/InviteFriends.js +275 -69
- package/dist/src/modules/auth/components/InviteFriends.js.map +1 -0
- package/dist/src/modules/auth/components/LastUsedBadge.d.ts +17 -5
- package/dist/src/modules/auth/components/LastUsedBadge.js +16 -6
- package/dist/src/modules/auth/components/LastUsedBadge.js.map +1 -0
- package/dist/src/modules/auth/components/LoginForm.d.ts +11 -3
- package/dist/src/modules/auth/components/LoginForm.js +107 -40
- package/dist/src/modules/auth/components/LoginForm.js.map +1 -0
- package/dist/src/modules/auth/components/LoginRoute.d.ts +11 -3
- package/dist/src/modules/auth/components/LoginRoute.js +41 -8
- package/dist/src/modules/auth/components/LoginRoute.js.map +1 -0
- package/dist/src/modules/auth/components/LogoutRoute.d.ts +7 -1
- package/dist/src/modules/auth/components/LogoutRoute.js +18 -12
- package/dist/src/modules/auth/components/LogoutRoute.js.map +1 -0
- package/dist/src/modules/auth/components/OrganizationAcceptInvitationRoute.d.ts +21 -8
- package/dist/src/modules/auth/components/OrganizationAcceptInvitationRoute.js +107 -97
- package/dist/src/modules/auth/components/OrganizationAcceptInvitationRoute.js.map +1 -0
- package/dist/src/modules/auth/components/OrganizationMembersRoute.d.ts +58 -48
- package/dist/src/modules/auth/components/OrganizationMembersRoute.js +448 -349
- package/dist/src/modules/auth/components/OrganizationMembersRoute.js.map +1 -0
- package/dist/src/modules/auth/components/OrganizationPreferences.d.ts +27 -16
- package/dist/src/modules/auth/components/OrganizationPreferences.js +129 -124
- package/dist/src/modules/auth/components/OrganizationPreferences.js.map +1 -0
- package/dist/src/modules/auth/components/OrganizationSettingsRoute.d.ts +27 -18
- package/dist/src/modules/auth/components/OrganizationSettingsRoute.js +184 -144
- package/dist/src/modules/auth/components/OrganizationSettingsRoute.js.map +1 -0
- package/dist/src/modules/auth/components/OrganizationSwitcher.d.ts +17 -6
- package/dist/src/modules/auth/components/OrganizationSwitcher.js +91 -69
- package/dist/src/modules/auth/components/OrganizationSwitcher.js.map +1 -0
- package/dist/src/modules/auth/components/PreferencesEditor.d.ts +44 -33
- package/dist/src/modules/auth/components/PreferencesEditor.js +82 -58
- package/dist/src/modules/auth/components/PreferencesEditor.js.map +1 -0
- package/dist/src/modules/auth/components/ProfileRoute.d.ts +7 -1
- package/dist/src/modules/auth/components/ProfileRoute.js +79 -36
- package/dist/src/modules/auth/components/ProfileRoute.js.map +1 -0
- package/dist/src/modules/auth/components/RangeNuqsDatePicker.d.ts +44 -30
- package/dist/src/modules/auth/components/RangeNuqsDatePicker.js +234 -242
- package/dist/src/modules/auth/components/RangeNuqsDatePicker.js.map +1 -0
- package/dist/src/modules/auth/components/ResetPasswordForm.d.ts +7 -1
- package/dist/src/modules/auth/components/ResetPasswordForm.js +97 -35
- package/dist/src/modules/auth/components/ResetPasswordForm.js.map +1 -0
- package/dist/src/modules/auth/components/ResetPasswordRoute.d.ts +7 -1
- package/dist/src/modules/auth/components/ResetPasswordRoute.js +34 -6
- package/dist/src/modules/auth/components/ResetPasswordRoute.js.map +1 -0
- package/dist/src/modules/auth/components/SignupFormRoute.d.ts +15 -5
- package/dist/src/modules/auth/components/SignupFormRoute.js +142 -99
- package/dist/src/modules/auth/components/SignupFormRoute.js.map +1 -0
- package/dist/src/modules/auth/components/SignupRoute.d.ts +13 -5
- package/dist/src/modules/auth/components/SignupRoute.js +59 -13
- package/dist/src/modules/auth/components/SignupRoute.js.map +1 -0
- package/dist/src/modules/auth/components/UserPreferences.d.ts +22 -11
- package/dist/src/modules/auth/components/UserPreferences.js +24 -12
- package/dist/src/modules/auth/components/UserPreferences.js.map +1 -0
- package/dist/src/modules/auth/components/WaitlistCard.d.ts +11 -4
- package/dist/src/modules/auth/components/WaitlistCard.js +63 -28
- package/dist/src/modules/auth/components/WaitlistCard.js.map +1 -0
- package/dist/src/modules/auth/components/WaitlistCodeValidation.d.ts +13 -5
- package/dist/src/modules/auth/components/WaitlistCodeValidation.js +42 -40
- package/dist/src/modules/auth/components/WaitlistCodeValidation.js.map +1 -0
- package/dist/src/modules/billing/components/BillingBetaPage.d.ts +15 -6
- package/dist/src/modules/billing/components/BillingBetaPage.js +155 -8
- package/dist/src/modules/billing/components/BillingBetaPage.js.map +1 -0
- package/dist/src/modules/billing/components/BillingInvoicePage.d.ts +13 -5
- package/dist/src/modules/billing/components/BillingInvoicePage.js +160 -30
- package/dist/src/modules/billing/components/BillingInvoicePage.js.map +1 -0
- package/dist/src/modules/billing/components/BillingPlanSelect.d.ts +11 -4
- package/dist/src/modules/billing/components/BillingPlanSelect.js +10 -7
- package/dist/src/modules/billing/components/BillingPlanSelect.js.map +1 -0
- package/dist/src/modules/billing/components/BillingRouter.d.ts +15 -7
- package/dist/src/modules/billing/components/BillingRouter.js +19 -6
- package/dist/src/modules/billing/components/BillingRouter.js.map +1 -0
- package/dist/src/modules/billing/components/BillingSinglePlanSelect.d.ts +17 -7
- package/dist/src/modules/billing/components/BillingSinglePlanSelect.js +163 -42
- package/dist/src/modules/billing/components/BillingSinglePlanSelect.js.map +1 -0
- package/dist/src/modules/table/components/ColumnOrderAndVisibility.d.ts +18 -8
- package/dist/src/modules/table/components/ColumnOrderAndVisibility.js +81 -38
- package/dist/src/modules/table/components/ColumnOrderAndVisibility.js.map +1 -0
- package/dist/src/modules/table/components/NuqsTable.d.ts +33 -21
- package/dist/src/modules/table/components/NuqsTable.js +295 -221
- package/dist/src/modules/table/components/NuqsTable.js.map +1 -0
- package/dist/src/modules/table/components/TableFiltering.d.ts +33 -21
- package/dist/src/modules/table/components/TableFiltering.js +408 -226
- package/dist/src/modules/table/components/TableFiltering.js.map +1 -0
- package/dist/src/modules/table/components/TableGroupBy.d.ts +18 -8
- package/dist/src/modules/table/components/TableGroupBy.js +56 -16
- package/dist/src/modules/table/components/TableGroupBy.js.map +1 -0
- package/dist/src/modules/table/components/TablePagination.d.ts +17 -7
- package/dist/src/modules/table/components/TablePagination.js +64 -32
- package/dist/src/modules/table/components/TablePagination.js.map +1 -0
- package/dist/src/modules/table/components/table.types.d.ts +15 -10
- package/dist/src/modules/table/components/table.types.js +0 -1
- package/dist/src/modules/table/filterTransformers.d.ts +35 -30
- package/dist/src/modules/table/filterTransformers.js +198 -261
- package/dist/src/modules/table/filterTransformers.js.map +1 -0
- package/dist/src/types.d.ts +8 -3
- package/dist/src/types.js +0 -1
- package/package.json +8 -6
- package/dist/translations/en/web-ui.json +0 -209
- package/dist/tsconfig.lib.tsbuildinfo +0 -1
|
@@ -1,153 +1,193 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Button, Card, CardBody, CardHeader, Chip, Input, Spinner, Textarea } from "@heroui/react";
|
|
3
|
-
import { authClient } from "@m5kdev/frontend/modules/auth/auth.lib";
|
|
4
|
-
import { useSession } from "@m5kdev/frontend/modules/auth/hooks/useSession";
|
|
5
|
-
import { useQuery, useQueryClient } from "@tanstack/react-query";
|
|
6
1
|
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
2
|
+
import { Button, Card, CardBody, CardHeader, Chip, Input, Spinner, Textarea } from "@heroui/react";
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
4
|
import { useTranslation } from "react-i18next";
|
|
8
5
|
import { toast } from "sonner";
|
|
6
|
+
import { authClient } from "@m5kdev/frontend/modules/auth/auth.lib";
|
|
7
|
+
import { useQuery, useQueryClient } from "@tanstack/react-query";
|
|
8
|
+
import { useSession } from "@m5kdev/frontend/modules/auth/hooks/useSession";
|
|
9
|
+
//#region src/modules/auth/components/OrganizationSettingsRoute.tsx
|
|
9
10
|
function OrganizationStateCard({ title, message }) {
|
|
10
|
-
|
|
11
|
+
return /* @__PURE__ */ jsx("div", {
|
|
12
|
+
className: "p-6",
|
|
13
|
+
children: /* @__PURE__ */ jsxs(Card, { children: [/* @__PURE__ */ jsx(CardHeader, {
|
|
14
|
+
className: "text-lg font-semibold",
|
|
15
|
+
children: title
|
|
16
|
+
}), /* @__PURE__ */ jsx(CardBody, { children: message })] })
|
|
17
|
+
});
|
|
11
18
|
}
|
|
12
|
-
function useOrganizationAccess({ managerRoles, onInvalidateScopedQueries
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
activeOrganizationId,
|
|
39
|
-
activeOrganizationRole,
|
|
40
|
-
canManageOrganization,
|
|
41
|
-
refreshOrganizationQueries,
|
|
42
|
-
};
|
|
19
|
+
function useOrganizationAccess({ managerRoles, onInvalidateScopedQueries }) {
|
|
20
|
+
const { data: session, registerSession } = useSession();
|
|
21
|
+
const queryClient = useQueryClient();
|
|
22
|
+
const activeOrganizationId = session?.session.activeOrganizationId ?? "";
|
|
23
|
+
const activeOrganizationRole = (session?.session)?.activeOrganizationRole ?? "";
|
|
24
|
+
return {
|
|
25
|
+
activeOrganizationId,
|
|
26
|
+
activeOrganizationRole,
|
|
27
|
+
canManageOrganization: useMemo(() => new Set(managerRoles ?? ["admin", "owner"]), [managerRoles]).has(activeOrganizationRole),
|
|
28
|
+
refreshOrganizationQueries: useCallback(async () => {
|
|
29
|
+
await Promise.allSettled([
|
|
30
|
+
queryClient.invalidateQueries({ queryKey: ["auth-organization-list"] }),
|
|
31
|
+
queryClient.invalidateQueries({ queryKey: ["auth-organization-details", activeOrganizationId] }),
|
|
32
|
+
queryClient.invalidateQueries({ queryKey: ["auth-organization-members", activeOrganizationId] }),
|
|
33
|
+
queryClient.invalidateQueries({ queryKey: ["auth-organization-invitations", activeOrganizationId] })
|
|
34
|
+
]);
|
|
35
|
+
registerSession(() => {
|
|
36
|
+
onInvalidateScopedQueries?.();
|
|
37
|
+
});
|
|
38
|
+
}, [
|
|
39
|
+
activeOrganizationId,
|
|
40
|
+
onInvalidateScopedQueries,
|
|
41
|
+
queryClient,
|
|
42
|
+
registerSession
|
|
43
|
+
])
|
|
44
|
+
};
|
|
43
45
|
}
|
|
44
46
|
function useOrganizationConfig() {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
47
|
+
const { t } = useTranslation();
|
|
48
|
+
return {
|
|
49
|
+
resolvedLabels: useMemo(() => ({
|
|
50
|
+
settingsTitle: t("web-ui:organization.settings.title"),
|
|
51
|
+
settingsDescription: t("web-ui:organization.settings.description"),
|
|
52
|
+
settingsNoActive: t("web-ui:organization.settings.noActive"),
|
|
53
|
+
settingsManageOnly: t("web-ui:organization.settings.manageOnly"),
|
|
54
|
+
formName: t("web-ui:organization.settings.form.name"),
|
|
55
|
+
formSlug: t("web-ui:organization.settings.form.slug"),
|
|
56
|
+
formMetadata: t("web-ui:organization.settings.form.metadata"),
|
|
57
|
+
formMetadataInvalidJson: t("web-ui:organization.settings.form.metadataInvalidJson"),
|
|
58
|
+
formMetadataInvalid: t("web-ui:organization.settings.form.metadataInvalid"),
|
|
59
|
+
saveButton: t("web-ui:organization.settings.button.save"),
|
|
60
|
+
updateSuccess: t("web-ui:organization.settings.updateSuccess"),
|
|
61
|
+
updateError: t("web-ui:organization.settings.updateError"),
|
|
62
|
+
loadError: t("web-ui:organization.settings.loadError")
|
|
63
|
+
}), [t]),
|
|
64
|
+
resolvedRoleLabels: useMemo(() => ({
|
|
65
|
+
member: t("web-ui:organization.roles.member"),
|
|
66
|
+
admin: t("web-ui:organization.roles.admin"),
|
|
67
|
+
owner: t("web-ui:organization.roles.owner")
|
|
68
|
+
}), [t])
|
|
69
|
+
};
|
|
67
70
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
71
|
+
function OrganizationSettingsRoute({ managerRoles, onInvalidateScopedQueries }) {
|
|
72
|
+
const { resolvedLabels, resolvedRoleLabels } = useOrganizationConfig();
|
|
73
|
+
const { activeOrganizationId, activeOrganizationRole, canManageOrganization, refreshOrganizationQueries } = useOrganizationAccess({
|
|
74
|
+
managerRoles,
|
|
75
|
+
onInvalidateScopedQueries
|
|
76
|
+
});
|
|
77
|
+
const [organizationName, setOrganizationName] = useState("");
|
|
78
|
+
const [organizationSlug, setOrganizationSlug] = useState("");
|
|
79
|
+
const [organizationMetadata, setOrganizationMetadata] = useState("{}");
|
|
80
|
+
const [isSavingOrganization, setIsSavingOrganization] = useState(false);
|
|
81
|
+
const organizationQuery = useQuery({
|
|
82
|
+
queryKey: ["auth-organization-details", activeOrganizationId],
|
|
83
|
+
enabled: Boolean(activeOrganizationId && canManageOrganization),
|
|
84
|
+
queryFn: async () => {
|
|
85
|
+
const { data, error } = await authClient.organization.getFullOrganization({ query: {
|
|
86
|
+
organizationId: activeOrganizationId,
|
|
87
|
+
membersLimit: 200
|
|
88
|
+
} });
|
|
89
|
+
if (error) throw new Error(error.message ?? resolvedLabels.loadError);
|
|
90
|
+
return data;
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
useEffect(() => {
|
|
94
|
+
const organization = organizationQuery.data;
|
|
95
|
+
if (!organization) return;
|
|
96
|
+
setOrganizationName(organization.name ?? "");
|
|
97
|
+
setOrganizationSlug(organization.slug ?? "");
|
|
98
|
+
setOrganizationMetadata(JSON.stringify(organization.metadata ?? {}, null, 2));
|
|
99
|
+
}, [organizationQuery.data]);
|
|
100
|
+
const onUpdateOrganization = async () => {
|
|
101
|
+
if (!canManageOrganization || !activeOrganizationId) return;
|
|
102
|
+
try {
|
|
103
|
+
setIsSavingOrganization(true);
|
|
104
|
+
let parsedMetadata;
|
|
105
|
+
try {
|
|
106
|
+
parsedMetadata = organizationMetadata.trim() ? JSON.parse(organizationMetadata) : {};
|
|
107
|
+
} catch (parseError) {
|
|
108
|
+
const message = parseError instanceof SyntaxError ? resolvedLabels.formMetadataInvalidJson : parseError instanceof Error ? parseError.message : resolvedLabels.formMetadataInvalid;
|
|
109
|
+
throw new Error(message);
|
|
110
|
+
}
|
|
111
|
+
const { error } = await authClient.organization.update({
|
|
112
|
+
organizationId: activeOrganizationId,
|
|
113
|
+
data: {
|
|
114
|
+
name: organizationName.trim(),
|
|
115
|
+
slug: organizationSlug.trim(),
|
|
116
|
+
metadata: parsedMetadata
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
if (error) throw new Error(error.message ?? resolvedLabels.updateError);
|
|
120
|
+
await refreshOrganizationQueries();
|
|
121
|
+
toast.success(resolvedLabels.updateSuccess);
|
|
122
|
+
} catch (error) {
|
|
123
|
+
toast.error(error instanceof Error ? error.message : resolvedLabels.updateError);
|
|
124
|
+
} finally {
|
|
125
|
+
setIsSavingOrganization(false);
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
if (!activeOrganizationId) return /* @__PURE__ */ jsx(OrganizationStateCard, {
|
|
129
|
+
title: resolvedLabels.settingsTitle,
|
|
130
|
+
message: resolvedLabels.settingsNoActive
|
|
131
|
+
});
|
|
132
|
+
if (!canManageOrganization) return /* @__PURE__ */ jsx(OrganizationStateCard, {
|
|
133
|
+
title: resolvedLabels.settingsTitle,
|
|
134
|
+
message: resolvedLabels.settingsManageOnly
|
|
135
|
+
});
|
|
136
|
+
if (organizationQuery.isLoading) return /* @__PURE__ */ jsx("div", {
|
|
137
|
+
className: "p-6 flex justify-center",
|
|
138
|
+
children: /* @__PURE__ */ jsx(Spinner, {})
|
|
139
|
+
});
|
|
140
|
+
return /* @__PURE__ */ jsx("div", {
|
|
141
|
+
className: "p-6",
|
|
142
|
+
children: /* @__PURE__ */ jsxs(Card, { children: [/* @__PURE__ */ jsxs(CardHeader, {
|
|
143
|
+
className: "flex items-center justify-between",
|
|
144
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
145
|
+
className: "flex flex-col",
|
|
146
|
+
children: [/* @__PURE__ */ jsx("h2", {
|
|
147
|
+
className: "text-xl font-semibold",
|
|
148
|
+
children: resolvedLabels.settingsTitle
|
|
149
|
+
}), /* @__PURE__ */ jsx("p", {
|
|
150
|
+
className: "text-sm text-default-500",
|
|
151
|
+
children: resolvedLabels.settingsDescription
|
|
152
|
+
})]
|
|
153
|
+
}), /* @__PURE__ */ jsx(Chip, {
|
|
154
|
+
variant: "flat",
|
|
155
|
+
color: "primary",
|
|
156
|
+
children: resolvedRoleLabels[activeOrganizationRole] ?? activeOrganizationRole ?? resolvedRoleLabels.member
|
|
157
|
+
})]
|
|
158
|
+
}), /* @__PURE__ */ jsxs(CardBody, {
|
|
159
|
+
className: "grid gap-3",
|
|
160
|
+
children: [
|
|
161
|
+
/* @__PURE__ */ jsx(Input, {
|
|
162
|
+
label: resolvedLabels.formName,
|
|
163
|
+
value: organizationName,
|
|
164
|
+
onValueChange: setOrganizationName
|
|
165
|
+
}),
|
|
166
|
+
/* @__PURE__ */ jsx(Input, {
|
|
167
|
+
label: resolvedLabels.formSlug,
|
|
168
|
+
value: organizationSlug,
|
|
169
|
+
onValueChange: setOrganizationSlug
|
|
170
|
+
}),
|
|
171
|
+
/* @__PURE__ */ jsx(Textarea, {
|
|
172
|
+
label: resolvedLabels.formMetadata,
|
|
173
|
+
value: organizationMetadata,
|
|
174
|
+
onValueChange: setOrganizationMetadata,
|
|
175
|
+
minRows: 4
|
|
176
|
+
}),
|
|
177
|
+
/* @__PURE__ */ jsx("div", {
|
|
178
|
+
className: "flex justify-end",
|
|
179
|
+
children: /* @__PURE__ */ jsx(Button, {
|
|
180
|
+
color: "primary",
|
|
181
|
+
isLoading: isSavingOrganization,
|
|
182
|
+
onPress: onUpdateOrganization,
|
|
183
|
+
children: resolvedLabels.saveButton
|
|
184
|
+
})
|
|
185
|
+
})
|
|
186
|
+
]
|
|
187
|
+
})] })
|
|
188
|
+
});
|
|
153
189
|
}
|
|
190
|
+
//#endregion
|
|
191
|
+
export { OrganizationSettingsRoute };
|
|
192
|
+
|
|
193
|
+
//# sourceMappingURL=OrganizationSettingsRoute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrganizationSettingsRoute.js","names":[],"sources":["../../../../../src/modules/auth/components/OrganizationSettingsRoute.tsx"],"sourcesContent":["import { Button, Card, CardBody, CardHeader, Chip, Input, Spinner, Textarea } from \"@heroui/react\";\r\nimport { authClient } from \"@m5kdev/frontend/modules/auth/auth.lib\";\r\nimport { useSession } from \"@m5kdev/frontend/modules/auth/hooks/useSession\";\r\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\r\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { toast } from \"sonner\";\r\n\r\ntype OrganizationDetails = {\r\n id: string;\r\n name: string;\r\n slug: string;\r\n logo?: string | null;\r\n metadata?: Record<string, unknown> | null;\r\n};\r\n\r\nexport type OrganizationSettingsRouteLabels = {\r\n settingsTitle: string;\r\n settingsDescription: string;\r\n settingsNoActive: string;\r\n settingsManageOnly: string;\r\n formName: string;\r\n formSlug: string;\r\n formMetadata: string;\r\n formMetadataInvalidJson: string;\r\n formMetadataInvalid: string;\r\n saveButton: string;\r\n updateSuccess: string;\r\n updateError: string;\r\n loadError: string;\r\n};\r\n\r\nexport type OrganizationSettingsRouteProps = {\r\n managerRoles?: string[];\r\n onInvalidateScopedQueries?: () => void | Promise<void>;\r\n};\r\n\r\nfunction OrganizationStateCard({ title, message }: { title: string; message: string }) {\r\n return (\r\n <div className=\"p-6\">\r\n <Card>\r\n <CardHeader className=\"text-lg font-semibold\">{title}</CardHeader>\r\n <CardBody>{message}</CardBody>\r\n </Card>\r\n </div>\r\n );\r\n}\r\n\r\nfunction useOrganizationAccess({\r\n managerRoles,\r\n onInvalidateScopedQueries,\r\n}: Pick<OrganizationSettingsRouteProps, \"managerRoles\" | \"onInvalidateScopedQueries\">) {\r\n const { data: session, registerSession } = useSession();\r\n const queryClient = useQueryClient();\r\n\r\n const activeOrganizationId = session?.session.activeOrganizationId ?? \"\";\r\n const activeOrganizationRole =\r\n (session?.session as { activeOrganizationRole?: string } | undefined)?.activeOrganizationRole ??\r\n \"\";\r\n const managerRoleSet = useMemo(() => new Set(managerRoles ?? [\"admin\", \"owner\"]), [managerRoles]);\r\n const canManageOrganization = managerRoleSet.has(activeOrganizationRole);\r\n\r\n const refreshOrganizationQueries = useCallback(async () => {\r\n await Promise.allSettled([\r\n queryClient.invalidateQueries({ queryKey: [\"auth-organization-list\"] }),\r\n queryClient.invalidateQueries({\r\n queryKey: [\"auth-organization-details\", activeOrganizationId],\r\n }),\r\n queryClient.invalidateQueries({\r\n queryKey: [\"auth-organization-members\", activeOrganizationId],\r\n }),\r\n queryClient.invalidateQueries({\r\n queryKey: [\"auth-organization-invitations\", activeOrganizationId],\r\n }),\r\n ]);\r\n\r\n registerSession(() => {\r\n void onInvalidateScopedQueries?.();\r\n });\r\n }, [activeOrganizationId, onInvalidateScopedQueries, queryClient, registerSession]);\r\n\r\n return {\r\n activeOrganizationId,\r\n activeOrganizationRole,\r\n canManageOrganization,\r\n refreshOrganizationQueries,\r\n };\r\n}\r\n\r\nfunction useOrganizationConfig() {\r\n const { t } = useTranslation();\r\n\r\n const translatedLabels = useMemo<OrganizationSettingsRouteLabels>(\r\n () => ({\r\n settingsTitle: t(\"web-ui:organization.settings.title\"),\r\n settingsDescription: t(\"web-ui:organization.settings.description\"),\r\n settingsNoActive: t(\"web-ui:organization.settings.noActive\"),\r\n settingsManageOnly: t(\"web-ui:organization.settings.manageOnly\"),\r\n formName: t(\"web-ui:organization.settings.form.name\"),\r\n formSlug: t(\"web-ui:organization.settings.form.slug\"),\r\n formMetadata: t(\"web-ui:organization.settings.form.metadata\"),\r\n formMetadataInvalidJson: t(\"web-ui:organization.settings.form.metadataInvalidJson\"),\r\n formMetadataInvalid: t(\"web-ui:organization.settings.form.metadataInvalid\"),\r\n saveButton: t(\"web-ui:organization.settings.button.save\"),\r\n updateSuccess: t(\"web-ui:organization.settings.updateSuccess\"),\r\n updateError: t(\"web-ui:organization.settings.updateError\"),\r\n loadError: t(\"web-ui:organization.settings.loadError\"),\r\n }),\r\n [t]\r\n );\r\n\r\n const translatedRoleLabels = useMemo<Record<string, string>>(\r\n () => ({\r\n member: t(\"web-ui:organization.roles.member\"),\r\n admin: t(\"web-ui:organization.roles.admin\"),\r\n owner: t(\"web-ui:organization.roles.owner\"),\r\n }),\r\n [t]\r\n );\r\n\r\n return { resolvedLabels: translatedLabels, resolvedRoleLabels: translatedRoleLabels };\r\n}\r\n\r\nexport function OrganizationSettingsRoute({\r\n managerRoles,\r\n onInvalidateScopedQueries,\r\n}: OrganizationSettingsRouteProps) {\r\n const { resolvedLabels, resolvedRoleLabels } = useOrganizationConfig();\r\n\r\n const {\r\n activeOrganizationId,\r\n activeOrganizationRole,\r\n canManageOrganization,\r\n refreshOrganizationQueries,\r\n } = useOrganizationAccess({ managerRoles, onInvalidateScopedQueries });\r\n\r\n const [organizationName, setOrganizationName] = useState(\"\");\r\n const [organizationSlug, setOrganizationSlug] = useState(\"\");\r\n const [organizationMetadata, setOrganizationMetadata] = useState(\"{}\");\r\n const [isSavingOrganization, setIsSavingOrganization] = useState(false);\r\n\r\n const organizationQuery = useQuery({\r\n queryKey: [\"auth-organization-details\", activeOrganizationId],\r\n enabled: Boolean(activeOrganizationId && canManageOrganization),\r\n queryFn: async () => {\r\n const { data, error } = await authClient.organization.getFullOrganization({\r\n query: {\r\n organizationId: activeOrganizationId,\r\n membersLimit: 200,\r\n },\r\n });\r\n if (error) {\r\n throw new Error(error.message ?? resolvedLabels.loadError);\r\n }\r\n return data as OrganizationDetails | null;\r\n },\r\n });\r\n\r\n useEffect(() => {\r\n const organization = organizationQuery.data;\r\n if (!organization) {\r\n return;\r\n }\r\n\r\n setOrganizationName(organization.name ?? \"\");\r\n setOrganizationSlug(organization.slug ?? \"\");\r\n setOrganizationMetadata(JSON.stringify(organization.metadata ?? {}, null, 2));\r\n }, [organizationQuery.data]);\r\n\r\n const onUpdateOrganization = async () => {\r\n if (!canManageOrganization || !activeOrganizationId) {\r\n return;\r\n }\r\n\r\n try {\r\n setIsSavingOrganization(true);\r\n let parsedMetadata: Record<string, unknown>;\r\n try {\r\n parsedMetadata = organizationMetadata.trim()\r\n ? (JSON.parse(organizationMetadata) as Record<string, unknown>)\r\n : {};\r\n } catch (parseError) {\r\n const message =\r\n parseError instanceof SyntaxError\r\n ? resolvedLabels.formMetadataInvalidJson\r\n : parseError instanceof Error\r\n ? parseError.message\r\n : resolvedLabels.formMetadataInvalid;\r\n throw new Error(message);\r\n }\r\n\r\n const { error } = await authClient.organization.update({\r\n organizationId: activeOrganizationId,\r\n data: {\r\n name: organizationName.trim(),\r\n slug: organizationSlug.trim(),\r\n metadata: parsedMetadata,\r\n },\r\n });\r\n\r\n if (error) {\r\n throw new Error(error.message ?? resolvedLabels.updateError);\r\n }\r\n\r\n await refreshOrganizationQueries();\r\n toast.success(resolvedLabels.updateSuccess);\r\n } catch (error) {\r\n toast.error(error instanceof Error ? error.message : resolvedLabels.updateError);\r\n } finally {\r\n setIsSavingOrganization(false);\r\n }\r\n };\r\n\r\n if (!activeOrganizationId) {\r\n return (\r\n <OrganizationStateCard\r\n title={resolvedLabels.settingsTitle}\r\n message={resolvedLabels.settingsNoActive}\r\n />\r\n );\r\n }\r\n\r\n if (!canManageOrganization) {\r\n return (\r\n <OrganizationStateCard\r\n title={resolvedLabels.settingsTitle}\r\n message={resolvedLabels.settingsManageOnly}\r\n />\r\n );\r\n }\r\n\r\n if (organizationQuery.isLoading) {\r\n return (\r\n <div className=\"p-6 flex justify-center\">\r\n <Spinner />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"p-6\">\r\n <Card>\r\n <CardHeader className=\"flex items-center justify-between\">\r\n <div className=\"flex flex-col\">\r\n <h2 className=\"text-xl font-semibold\">{resolvedLabels.settingsTitle}</h2>\r\n <p className=\"text-sm text-default-500\">{resolvedLabels.settingsDescription}</p>\r\n </div>\r\n <Chip variant=\"flat\" color=\"primary\">\r\n {resolvedRoleLabels[activeOrganizationRole] ??\r\n activeOrganizationRole ??\r\n resolvedRoleLabels.member}\r\n </Chip>\r\n </CardHeader>\r\n <CardBody className=\"grid gap-3\">\r\n <Input\r\n label={resolvedLabels.formName}\r\n value={organizationName}\r\n onValueChange={setOrganizationName}\r\n />\r\n <Input\r\n label={resolvedLabels.formSlug}\r\n value={organizationSlug}\r\n onValueChange={setOrganizationSlug}\r\n />\r\n <Textarea\r\n label={resolvedLabels.formMetadata}\r\n value={organizationMetadata}\r\n onValueChange={setOrganizationMetadata}\r\n minRows={4}\r\n />\r\n <div className=\"flex justify-end\">\r\n <Button color=\"primary\" isLoading={isSavingOrganization} onPress={onUpdateOrganization}>\r\n {resolvedLabels.saveButton}\r\n </Button>\r\n </div>\r\n </CardBody>\r\n </Card>\r\n </div>\r\n );\r\n}\r\n"],"mappings":";;;;;;;;;AAqCA,SAAS,sBAAsB,EAAE,OAAO,WAA+C;AACrF,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,qBAAC,MAAD,EAAA,UAAA,CACE,oBAAC,YAAD;GAAY,WAAU;aAAyB;GAAmB,CAAA,EAClE,oBAAC,UAAD,EAAA,UAAW,SAAmB,CAAA,CACzB,EAAA,CAAA;EACH,CAAA;;AAIV,SAAS,sBAAsB,EAC7B,cACA,6BACqF;CACrF,MAAM,EAAE,MAAM,SAAS,oBAAoB,YAAY;CACvD,MAAM,cAAc,gBAAgB;CAEpC,MAAM,uBAAuB,SAAS,QAAQ,wBAAwB;CACtE,MAAM,0BACH,SAAS,UAA6D,0BACvE;AAuBF,QAAO;EACL;EACA;EACA,uBAzBqB,cAAc,IAAI,IAAI,gBAAgB,CAAC,SAAS,QAAQ,CAAC,EAAE,CAAC,aAAa,CAAC,CACpD,IAAI,uBAAuB;EAyBtE,4BAvBiC,YAAY,YAAY;AACzD,SAAM,QAAQ,WAAW;IACvB,YAAY,kBAAkB,EAAE,UAAU,CAAC,yBAAyB,EAAE,CAAC;IACvE,YAAY,kBAAkB,EAC5B,UAAU,CAAC,6BAA6B,qBAAqB,EAC9D,CAAC;IACF,YAAY,kBAAkB,EAC5B,UAAU,CAAC,6BAA6B,qBAAqB,EAC9D,CAAC;IACF,YAAY,kBAAkB,EAC5B,UAAU,CAAC,iCAAiC,qBAAqB,EAClE,CAAC;IACH,CAAC;AAEF,yBAAsB;AACf,iCAA6B;KAClC;KACD;GAAC;GAAsB;GAA2B;GAAa;GAAgB,CAAC;EAOlF;;AAGH,SAAS,wBAAwB;CAC/B,MAAM,EAAE,MAAM,gBAAgB;AA8B9B,QAAO;EAAE,gBA5BgB,eAChB;GACL,eAAe,EAAE,qCAAqC;GACtD,qBAAqB,EAAE,2CAA2C;GAClE,kBAAkB,EAAE,wCAAwC;GAC5D,oBAAoB,EAAE,0CAA0C;GAChE,UAAU,EAAE,yCAAyC;GACrD,UAAU,EAAE,yCAAyC;GACrD,cAAc,EAAE,6CAA6C;GAC7D,yBAAyB,EAAE,wDAAwD;GACnF,qBAAqB,EAAE,oDAAoD;GAC3E,YAAY,EAAE,2CAA2C;GACzD,eAAe,EAAE,6CAA6C;GAC9D,aAAa,EAAE,2CAA2C;GAC1D,WAAW,EAAE,yCAAyC;GACvD,GACD,CAAC,EAAE,CACJ;EAW0C,oBATd,eACpB;GACL,QAAQ,EAAE,mCAAmC;GAC7C,OAAO,EAAE,kCAAkC;GAC3C,OAAO,EAAE,kCAAkC;GAC5C,GACD,CAAC,EAAE,CACJ;EAEoF;;AAGvF,SAAgB,0BAA0B,EACxC,cACA,6BACiC;CACjC,MAAM,EAAE,gBAAgB,uBAAuB,uBAAuB;CAEtE,MAAM,EACJ,sBACA,wBACA,uBACA,+BACE,sBAAsB;EAAE;EAAc;EAA2B,CAAC;CAEtE,MAAM,CAAC,kBAAkB,uBAAuB,SAAS,GAAG;CAC5D,MAAM,CAAC,kBAAkB,uBAAuB,SAAS,GAAG;CAC5D,MAAM,CAAC,sBAAsB,2BAA2B,SAAS,KAAK;CACtE,MAAM,CAAC,sBAAsB,2BAA2B,SAAS,MAAM;CAEvE,MAAM,oBAAoB,SAAS;EACjC,UAAU,CAAC,6BAA6B,qBAAqB;EAC7D,SAAS,QAAQ,wBAAwB,sBAAsB;EAC/D,SAAS,YAAY;GACnB,MAAM,EAAE,MAAM,UAAU,MAAM,WAAW,aAAa,oBAAoB,EACxE,OAAO;IACL,gBAAgB;IAChB,cAAc;IACf,EACF,CAAC;AACF,OAAI,MACF,OAAM,IAAI,MAAM,MAAM,WAAW,eAAe,UAAU;AAE5D,UAAO;;EAEV,CAAC;AAEF,iBAAgB;EACd,MAAM,eAAe,kBAAkB;AACvC,MAAI,CAAC,aACH;AAGF,sBAAoB,aAAa,QAAQ,GAAG;AAC5C,sBAAoB,aAAa,QAAQ,GAAG;AAC5C,0BAAwB,KAAK,UAAU,aAAa,YAAY,EAAE,EAAE,MAAM,EAAE,CAAC;IAC5E,CAAC,kBAAkB,KAAK,CAAC;CAE5B,MAAM,uBAAuB,YAAY;AACvC,MAAI,CAAC,yBAAyB,CAAC,qBAC7B;AAGF,MAAI;AACF,2BAAwB,KAAK;GAC7B,IAAI;AACJ,OAAI;AACF,qBAAiB,qBAAqB,MAAM,GACvC,KAAK,MAAM,qBAAqB,GACjC,EAAE;YACC,YAAY;IACnB,MAAM,UACJ,sBAAsB,cAClB,eAAe,0BACf,sBAAsB,QACpB,WAAW,UACX,eAAe;AACvB,UAAM,IAAI,MAAM,QAAQ;;GAG1B,MAAM,EAAE,UAAU,MAAM,WAAW,aAAa,OAAO;IACrD,gBAAgB;IAChB,MAAM;KACJ,MAAM,iBAAiB,MAAM;KAC7B,MAAM,iBAAiB,MAAM;KAC7B,UAAU;KACX;IACF,CAAC;AAEF,OAAI,MACF,OAAM,IAAI,MAAM,MAAM,WAAW,eAAe,YAAY;AAG9D,SAAM,4BAA4B;AAClC,SAAM,QAAQ,eAAe,cAAc;WACpC,OAAO;AACd,SAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,eAAe,YAAY;YACxE;AACR,2BAAwB,MAAM;;;AAIlC,KAAI,CAAC,qBACH,QACE,oBAAC,uBAAD;EACE,OAAO,eAAe;EACtB,SAAS,eAAe;EACxB,CAAA;AAIN,KAAI,CAAC,sBACH,QACE,oBAAC,uBAAD;EACE,OAAO,eAAe;EACtB,SAAS,eAAe;EACxB,CAAA;AAIN,KAAI,kBAAkB,UACpB,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,oBAAC,SAAD,EAAW,CAAA;EACP,CAAA;AAIV,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,qBAAC,MAAD,EAAA,UAAA,CACE,qBAAC,YAAD;GAAY,WAAU;aAAtB,CACE,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,MAAD;KAAI,WAAU;eAAyB,eAAe;KAAmB,CAAA,EACzE,oBAAC,KAAD;KAAG,WAAU;eAA4B,eAAe;KAAwB,CAAA,CAC5E;OACN,oBAAC,MAAD;IAAM,SAAQ;IAAO,OAAM;cACxB,mBAAmB,2BAClB,0BACA,mBAAmB;IAChB,CAAA,CACI;MACb,qBAAC,UAAD;GAAU,WAAU;aAApB;IACE,oBAAC,OAAD;KACE,OAAO,eAAe;KACtB,OAAO;KACP,eAAe;KACf,CAAA;IACF,oBAAC,OAAD;KACE,OAAO,eAAe;KACtB,OAAO;KACP,eAAe;KACf,CAAA;IACF,oBAAC,UAAD;KACE,OAAO,eAAe;KACtB,OAAO;KACP,eAAe;KACf,SAAS;KACT,CAAA;IACF,oBAAC,OAAD;KAAK,WAAU;eACb,oBAAC,QAAD;MAAQ,OAAM;MAAU,WAAW;MAAsB,SAAS;gBAC/D,eAAe;MACT,CAAA;KACL,CAAA;IACG;KACN,EAAA,CAAA;EACH,CAAA"}
|
|
@@ -1,7 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import * as _$react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
|
+
|
|
3
|
+
//#region src/modules/auth/components/OrganizationSwitcher.d.ts
|
|
4
|
+
type OrganizationSwitcherProps = {
|
|
5
|
+
onInvalidateScopedQueries?: () => void | Promise<void>;
|
|
6
|
+
managerRoles?: string[];
|
|
7
|
+
managerPath?: string;
|
|
8
|
+
fallbackPath?: string;
|
|
6
9
|
};
|
|
7
|
-
|
|
10
|
+
declare function OrganizationSwitcher({
|
|
11
|
+
onInvalidateScopedQueries,
|
|
12
|
+
managerRoles,
|
|
13
|
+
managerPath,
|
|
14
|
+
fallbackPath
|
|
15
|
+
}: OrganizationSwitcherProps): _$react_jsx_runtime0.JSX.Element;
|
|
16
|
+
//#endregion
|
|
17
|
+
export { OrganizationSwitcher, OrganizationSwitcherProps };
|
|
18
|
+
//# sourceMappingURL=OrganizationSwitcher.d.ts.map
|
|
@@ -1,74 +1,96 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { cn } from "../../../lib/utils.js";
|
|
2
|
+
import { useSidebar } from "../../../components/ui/sidebar.js";
|
|
3
|
+
import { useCallback, useMemo, useState } from "react";
|
|
2
4
|
import { Button, Select, SelectItem } from "@heroui/react";
|
|
3
|
-
import {
|
|
4
|
-
import { useSession } from "@m5kdev/frontend/modules/auth/hooks/useSession";
|
|
5
|
-
import { useQuery } from "@tanstack/react-query";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
6
|
import { Building2 } from "lucide-react";
|
|
7
|
-
import { useCallback, useMemo, useState } from "react";
|
|
8
7
|
import { useTranslation } from "react-i18next";
|
|
9
|
-
import { Link } from "react-router";
|
|
8
|
+
import { Link as Link$1 } from "react-router";
|
|
10
9
|
import { toast } from "sonner";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
10
|
+
import { authClient } from "@m5kdev/frontend/modules/auth/auth.lib";
|
|
11
|
+
import { useQuery } from "@tanstack/react-query";
|
|
12
|
+
import { useSession } from "@m5kdev/frontend/modules/auth/hooks/useSession";
|
|
13
|
+
//#region src/modules/auth/components/OrganizationSwitcher.tsx
|
|
14
|
+
function OrganizationSwitcher({ onInvalidateScopedQueries, managerRoles = ["admin", "owner"], managerPath = "/organization/members", fallbackPath = "/" }) {
|
|
15
|
+
const { t } = useTranslation();
|
|
16
|
+
const { data: session, registerSession } = useSession();
|
|
17
|
+
const { open } = useSidebar();
|
|
18
|
+
const [isSwitching, setIsSwitching] = useState(false);
|
|
19
|
+
const activeOrganizationId = session?.session.activeOrganizationId ?? null;
|
|
20
|
+
const activeOrganizationRole = (session?.session)?.activeOrganizationRole ?? "";
|
|
21
|
+
const canManageOrganization = useMemo(() => new Set(managerRoles), [managerRoles]).has(activeOrganizationRole);
|
|
22
|
+
const { data: organizations = [], isError, error, refetch } = useQuery({
|
|
23
|
+
queryKey: ["auth-organization-list"],
|
|
24
|
+
queryFn: async () => {
|
|
25
|
+
const { data, error } = await authClient.organization.list();
|
|
26
|
+
if (error) throw new Error(error.message ?? t("web-ui:organization.switcher.failedToLoadOrganizations"));
|
|
27
|
+
return data ?? [];
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
const handleSwitchOrganization = useCallback(async (organizationId) => {
|
|
31
|
+
if (!organizationId || organizationId === activeOrganizationId || isSwitching) return;
|
|
32
|
+
try {
|
|
33
|
+
setIsSwitching(true);
|
|
34
|
+
const { error } = await authClient.organization.setActive({ organizationId });
|
|
35
|
+
if (error) throw new Error(error.message ?? t("web-ui:organization.switcher.failedToSwitchOrganization"));
|
|
36
|
+
registerSession(() => {
|
|
37
|
+
onInvalidateScopedQueries?.();
|
|
38
|
+
});
|
|
39
|
+
toast.success(t("web-ui:organization.switcher.organizationSwitched"));
|
|
40
|
+
} catch (error) {
|
|
41
|
+
toast.error(error instanceof Error ? error.message : t("web-ui:organization.switcher.failedToSwitchOrganization"));
|
|
42
|
+
} finally {
|
|
43
|
+
setIsSwitching(false);
|
|
44
|
+
}
|
|
45
|
+
}, [
|
|
46
|
+
activeOrganizationId,
|
|
47
|
+
isSwitching,
|
|
48
|
+
onInvalidateScopedQueries,
|
|
49
|
+
registerSession,
|
|
50
|
+
t
|
|
51
|
+
]);
|
|
52
|
+
if (!open) return /* @__PURE__ */ jsx(Button, {
|
|
53
|
+
as: Link$1,
|
|
54
|
+
to: canManageOrganization ? managerPath : fallbackPath,
|
|
55
|
+
variant: "light",
|
|
56
|
+
size: "sm",
|
|
57
|
+
isIconOnly: true,
|
|
58
|
+
"aria-label": t("web-ui:organization.switcher.label"),
|
|
59
|
+
children: /* @__PURE__ */ jsx(Building2, { className: "h-4 w-4" })
|
|
60
|
+
});
|
|
61
|
+
if (isError) return /* @__PURE__ */ jsxs("div", {
|
|
62
|
+
className: "mb-4 flex flex-col gap-2",
|
|
63
|
+
children: [/* @__PURE__ */ jsx("p", {
|
|
64
|
+
className: "text-sm text-destructive",
|
|
65
|
+
children: error instanceof Error ? error.message : t("web-ui:organization.switcher.failedToLoadOrganizations")
|
|
66
|
+
}), /* @__PURE__ */ jsx(Button, {
|
|
67
|
+
size: "sm",
|
|
68
|
+
variant: "flat",
|
|
69
|
+
onPress: () => void refetch(),
|
|
70
|
+
children: t("web-ui:organization.switcher.retry")
|
|
71
|
+
})]
|
|
72
|
+
});
|
|
73
|
+
return /* @__PURE__ */ jsx("div", {
|
|
74
|
+
className: "mb-4",
|
|
75
|
+
children: /* @__PURE__ */ jsx(Select, {
|
|
76
|
+
size: "sm",
|
|
77
|
+
label: t("web-ui:organization.switcher.label"),
|
|
78
|
+
selectedKeys: activeOrganizationId ? [activeOrganizationId] : [],
|
|
79
|
+
disallowEmptySelection: true,
|
|
80
|
+
isDisabled: isSwitching || organizations.length === 0,
|
|
81
|
+
onSelectionChange: (keys) => {
|
|
82
|
+
const selectedOrganizationId = Array.from(keys)[0];
|
|
83
|
+
if (selectedOrganizationId) handleSwitchOrganization(selectedOrganizationId);
|
|
84
|
+
},
|
|
85
|
+
classNames: {
|
|
86
|
+
trigger: cn("min-h-10"),
|
|
87
|
+
value: cn("text-sm")
|
|
88
|
+
},
|
|
89
|
+
children: organizations.map((organization) => /* @__PURE__ */ jsx(SelectItem, { children: organization.name }, organization.id))
|
|
90
|
+
})
|
|
91
|
+
});
|
|
74
92
|
}
|
|
93
|
+
//#endregion
|
|
94
|
+
export { OrganizationSwitcher };
|
|
95
|
+
|
|
96
|
+
//# sourceMappingURL=OrganizationSwitcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrganizationSwitcher.js","names":["Link"],"sources":["../../../../../src/modules/auth/components/OrganizationSwitcher.tsx"],"sourcesContent":["import { Button, Select, SelectItem } from \"@heroui/react\";\r\nimport { authClient } from \"@m5kdev/frontend/modules/auth/auth.lib\";\r\nimport { useSession } from \"@m5kdev/frontend/modules/auth/hooks/useSession\";\r\nimport { useQuery } from \"@tanstack/react-query\";\r\nimport { Building2 } from \"lucide-react\";\r\nimport { useCallback, useMemo, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Link } from \"react-router\";\r\nimport { toast } from \"sonner\";\r\nimport { useSidebar } from \"../../../components/ui/sidebar\";\r\nimport { cn } from \"../../../lib/utils\";\r\n\r\ntype OrganizationOption = {\r\n id: string;\r\n name: string;\r\n slug: string;\r\n};\r\n\r\nexport type OrganizationSwitcherProps = {\r\n onInvalidateScopedQueries?: () => void | Promise<void>;\r\n managerRoles?: string[];\r\n managerPath?: string;\r\n fallbackPath?: string;\r\n};\r\n\r\nexport function OrganizationSwitcher({\r\n onInvalidateScopedQueries,\r\n managerRoles = [\"admin\", \"owner\"],\r\n managerPath = \"/organization/members\",\r\n fallbackPath = \"/\",\r\n}: OrganizationSwitcherProps) {\r\n const { t } = useTranslation();\r\n const { data: session, registerSession } = useSession();\r\n const { open } = useSidebar();\r\n const [isSwitching, setIsSwitching] = useState(false);\r\n const activeOrganizationId = session?.session.activeOrganizationId ?? null;\r\n const activeOrganizationRole =\r\n (session?.session as { activeOrganizationRole?: string } | undefined)?.activeOrganizationRole ??\r\n \"\";\r\n const managerRoleSet = useMemo(() => new Set(managerRoles), [managerRoles]);\r\n const canManageOrganization = managerRoleSet.has(activeOrganizationRole);\r\n\r\n const {\r\n data: organizations = [],\r\n isError,\r\n error,\r\n refetch,\r\n } = useQuery({\r\n queryKey: [\"auth-organization-list\"],\r\n queryFn: async () => {\r\n const { data, error } = await authClient.organization.list();\r\n if (error) {\r\n throw new Error(\r\n error.message ?? t(\"web-ui:organization.switcher.failedToLoadOrganizations\")\r\n );\r\n }\r\n return (data ?? []) as OrganizationOption[];\r\n },\r\n });\r\n\r\n const handleSwitchOrganization = useCallback(\r\n async (organizationId: string) => {\r\n if (!organizationId || organizationId === activeOrganizationId || isSwitching) {\r\n return;\r\n }\r\n\r\n try {\r\n setIsSwitching(true);\r\n const { error } = await authClient.organization.setActive({ organizationId });\r\n if (error) {\r\n throw new Error(\r\n error.message ?? t(\"web-ui:organization.switcher.failedToSwitchOrganization\")\r\n );\r\n }\r\n\r\n registerSession(() => {\r\n void onInvalidateScopedQueries?.();\r\n });\r\n toast.success(t(\"web-ui:organization.switcher.organizationSwitched\"));\r\n } catch (error) {\r\n toast.error(\r\n error instanceof Error\r\n ? error.message\r\n : t(\"web-ui:organization.switcher.failedToSwitchOrganization\")\r\n );\r\n } finally {\r\n setIsSwitching(false);\r\n }\r\n },\r\n [activeOrganizationId, isSwitching, onInvalidateScopedQueries, registerSession, t]\r\n );\r\n\r\n if (!open) {\r\n return (\r\n <Button\r\n as={Link}\r\n to={canManageOrganization ? managerPath : fallbackPath}\r\n variant=\"light\"\r\n size=\"sm\"\r\n isIconOnly\r\n aria-label={t(\"web-ui:organization.switcher.label\")}\r\n >\r\n <Building2 className=\"h-4 w-4\" />\r\n </Button>\r\n );\r\n }\r\n\r\n if (isError) {\r\n return (\r\n <div className=\"mb-4 flex flex-col gap-2\">\r\n <p className=\"text-sm text-destructive\">\r\n {error instanceof Error\r\n ? error.message\r\n : t(\"web-ui:organization.switcher.failedToLoadOrganizations\")}\r\n </p>\r\n <Button size=\"sm\" variant=\"flat\" onPress={() => void refetch()}>\r\n {t(\"web-ui:organization.switcher.retry\")}\r\n </Button>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"mb-4\">\r\n <Select\r\n size=\"sm\"\r\n label={t(\"web-ui:organization.switcher.label\")}\r\n selectedKeys={activeOrganizationId ? [activeOrganizationId] : []}\r\n disallowEmptySelection\r\n isDisabled={isSwitching || organizations.length === 0}\r\n onSelectionChange={(keys) => {\r\n const selectedOrganizationId = Array.from(keys as Set<string>)[0];\r\n if (selectedOrganizationId) {\r\n void handleSwitchOrganization(selectedOrganizationId);\r\n }\r\n }}\r\n classNames={{\r\n trigger: cn(\"min-h-10\"),\r\n value: cn(\"text-sm\"),\r\n }}\r\n >\r\n {organizations.map((organization) => (\r\n <SelectItem key={organization.id}>{organization.name}</SelectItem>\r\n ))}\r\n </Select>\r\n </div>\r\n );\r\n}\r\n"],"mappings":";;;;;;;;;;;;;AAyBA,SAAgB,qBAAqB,EACnC,2BACA,eAAe,CAAC,SAAS,QAAQ,EACjC,cAAc,yBACd,eAAe,OACa;CAC5B,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EAAE,MAAM,SAAS,oBAAoB,YAAY;CACvD,MAAM,EAAE,SAAS,YAAY;CAC7B,MAAM,CAAC,aAAa,kBAAkB,SAAS,MAAM;CACrD,MAAM,uBAAuB,SAAS,QAAQ,wBAAwB;CACtE,MAAM,0BACH,SAAS,UAA6D,0BACvE;CAEF,MAAM,wBADiB,cAAc,IAAI,IAAI,aAAa,EAAE,CAAC,aAAa,CAAC,CAC9B,IAAI,uBAAuB;CAExE,MAAM,EACJ,MAAM,gBAAgB,EAAE,EACxB,SACA,OACA,YACE,SAAS;EACX,UAAU,CAAC,yBAAyB;EACpC,SAAS,YAAY;GACnB,MAAM,EAAE,MAAM,UAAU,MAAM,WAAW,aAAa,MAAM;AAC5D,OAAI,MACF,OAAM,IAAI,MACR,MAAM,WAAW,EAAE,yDAAyD,CAC7E;AAEH,UAAQ,QAAQ,EAAE;;EAErB,CAAC;CAEF,MAAM,2BAA2B,YAC/B,OAAO,mBAA2B;AAChC,MAAI,CAAC,kBAAkB,mBAAmB,wBAAwB,YAChE;AAGF,MAAI;AACF,kBAAe,KAAK;GACpB,MAAM,EAAE,UAAU,MAAM,WAAW,aAAa,UAAU,EAAE,gBAAgB,CAAC;AAC7E,OAAI,MACF,OAAM,IAAI,MACR,MAAM,WAAW,EAAE,0DAA0D,CAC9E;AAGH,yBAAsB;AACf,iCAA6B;KAClC;AACF,SAAM,QAAQ,EAAE,oDAAoD,CAAC;WAC9D,OAAO;AACd,SAAM,MACJ,iBAAiB,QACb,MAAM,UACN,EAAE,0DAA0D,CACjE;YACO;AACR,kBAAe,MAAM;;IAGzB;EAAC;EAAsB;EAAa;EAA2B;EAAiB;EAAE,CACnF;AAED,KAAI,CAAC,KACH,QACE,oBAAC,QAAD;EACE,IAAIA;EACJ,IAAI,wBAAwB,cAAc;EAC1C,SAAQ;EACR,MAAK;EACL,YAAA;EACA,cAAY,EAAE,qCAAqC;YAEnD,oBAAC,WAAD,EAAW,WAAU,WAAY,CAAA;EAC1B,CAAA;AAIb,KAAI,QACF,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,KAAD;GAAG,WAAU;aACV,iBAAiB,QACd,MAAM,UACN,EAAE,yDAAyD;GAC7D,CAAA,EACJ,oBAAC,QAAD;GAAQ,MAAK;GAAK,SAAQ;GAAO,eAAe,KAAK,SAAS;aAC3D,EAAE,qCAAqC;GACjC,CAAA,CACL;;AAIV,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,oBAAC,QAAD;GACE,MAAK;GACL,OAAO,EAAE,qCAAqC;GAC9C,cAAc,uBAAuB,CAAC,qBAAqB,GAAG,EAAE;GAChE,wBAAA;GACA,YAAY,eAAe,cAAc,WAAW;GACpD,oBAAoB,SAAS;IAC3B,MAAM,yBAAyB,MAAM,KAAK,KAAoB,CAAC;AAC/D,QAAI,uBACG,0BAAyB,uBAAuB;;GAGzD,YAAY;IACV,SAAS,GAAG,WAAW;IACvB,OAAO,GAAG,UAAU;IACrB;aAEA,cAAc,KAAK,iBAClB,oBAAC,YAAD,EAAA,UAAmC,aAAa,MAAkB,EAAjD,aAAa,GAAoC,CAClE;GACK,CAAA;EACL,CAAA"}
|