@burdenoff/microfe-admin 2026.511.1
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 +74 -0
- package/dist/admin/AdminRoot.d.ts +31 -0
- package/dist/admin/AdminRoot.d.ts.map +1 -0
- package/dist/admin/AdminRoot.js +175 -0
- package/dist/admin/AdminRoot.js.map +1 -0
- package/dist/admin/AdminRoutes.d.ts +29 -0
- package/dist/admin/AdminRoutes.d.ts.map +1 -0
- package/dist/admin/AdminRoutes.js +143 -0
- package/dist/admin/AdminRoutes.js.map +1 -0
- package/dist/admin/components/AccessDenied.d.ts +8 -0
- package/dist/admin/components/AccessDenied.d.ts.map +1 -0
- package/dist/admin/components/AccessDenied.js +28 -0
- package/dist/admin/components/AccessDenied.js.map +1 -0
- package/dist/admin/components/ActivityFeed.d.ts +20 -0
- package/dist/admin/components/ActivityFeed.d.ts.map +1 -0
- package/dist/admin/components/ActivityFeed.js +91 -0
- package/dist/admin/components/ActivityFeed.js.map +1 -0
- package/dist/admin/components/Charts.d.ts +33 -0
- package/dist/admin/components/Charts.d.ts.map +1 -0
- package/dist/admin/components/Charts.js +37 -0
- package/dist/admin/components/Charts.js.map +1 -0
- package/dist/admin/components/ConfirmDialog.d.ts +45 -0
- package/dist/admin/components/ConfirmDialog.d.ts.map +1 -0
- package/dist/admin/components/ConfirmDialog.js +4 -0
- package/dist/admin/components/DataTable.d.ts +64 -0
- package/dist/admin/components/DataTable.d.ts.map +1 -0
- package/dist/admin/components/DataTable.js +127 -0
- package/dist/admin/components/DataTable.js.map +1 -0
- package/dist/admin/components/FormSheet.d.ts +79 -0
- package/dist/admin/components/FormSheet.d.ts.map +1 -0
- package/dist/admin/components/FormSheet.js +111 -0
- package/dist/admin/components/FormSheet.js.map +1 -0
- package/dist/admin/components/MetricCard.d.ts +40 -0
- package/dist/admin/components/MetricCard.d.ts.map +1 -0
- package/dist/admin/components/MetricCard.js +57 -0
- package/dist/admin/components/MetricCard.js.map +1 -0
- package/dist/admin/components/PageLayout.d.ts +34 -0
- package/dist/admin/components/PageLayout.d.ts.map +1 -0
- package/dist/admin/components/PageLayout.js +31 -0
- package/dist/admin/components/PageLayout.js.map +1 -0
- package/dist/admin/components/PermissionGuard.d.ts +12 -0
- package/dist/admin/components/PermissionGuard.d.ts.map +1 -0
- package/dist/admin/components/PermissionGuard.js +18 -0
- package/dist/admin/components/PermissionGuard.js.map +1 -0
- package/dist/admin/components/RowActions.d.ts +41 -0
- package/dist/admin/components/RowActions.d.ts.map +1 -0
- package/dist/admin/components/RowActions.js +93 -0
- package/dist/admin/components/RowActions.js.map +1 -0
- package/dist/admin/components/StatusBadge.d.ts +35 -0
- package/dist/admin/components/StatusBadge.d.ts.map +1 -0
- package/dist/admin/components/StatusBadge.js +41 -0
- package/dist/admin/components/StatusBadge.js.map +1 -0
- package/dist/admin/components/Toast.d.ts +26 -0
- package/dist/admin/components/Toast.d.ts.map +1 -0
- package/dist/admin/components/Toast.js +133 -0
- package/dist/admin/components/Toast.js.map +1 -0
- package/dist/admin/components/forms/SubscriptionForm.d.ts +57 -0
- package/dist/admin/components/forms/SubscriptionForm.d.ts.map +1 -0
- package/dist/admin/components/forms/SubscriptionForm.js +299 -0
- package/dist/admin/components/forms/SubscriptionForm.js.map +1 -0
- package/dist/admin/components/forms/TenantForm.d.ts +68 -0
- package/dist/admin/components/forms/TenantForm.d.ts.map +1 -0
- package/dist/admin/components/forms/TenantForm.js +346 -0
- package/dist/admin/components/forms/TenantForm.js.map +1 -0
- package/dist/admin/components/forms/TicketForm.d.ts +67 -0
- package/dist/admin/components/forms/TicketForm.d.ts.map +1 -0
- package/dist/admin/components/forms/TicketForm.js +55 -0
- package/dist/admin/components/forms/TicketForm.js.map +1 -0
- package/dist/admin/components/forms/UserForm.d.ts +57 -0
- package/dist/admin/components/forms/UserForm.d.ts.map +1 -0
- package/dist/admin/components/forms/UserForm.js +253 -0
- package/dist/admin/components/forms/UserForm.js.map +1 -0
- package/dist/admin/components/forms/index.d.ts +5 -0
- package/dist/admin/components/forms/index.d.ts.map +1 -0
- package/dist/admin/components/forms/index.js +4 -0
- package/dist/admin/components/index.d.ts +15 -0
- package/dist/admin/components/index.d.ts.map +1 -0
- package/dist/admin/components/index.js +17 -0
- package/dist/admin/components/ui.d.ts +52 -0
- package/dist/admin/components/ui.d.ts.map +1 -0
- package/dist/admin/components/ui.js +140 -0
- package/dist/admin/components/ui.js.map +1 -0
- package/dist/admin/constants/index.d.ts +75 -0
- package/dist/admin/constants/index.d.ts.map +1 -0
- package/dist/admin/constants/index.js +90 -0
- package/dist/admin/constants/index.js.map +1 -0
- package/dist/admin/constants/permissions.d.ts +27 -0
- package/dist/admin/constants/permissions.d.ts.map +1 -0
- package/dist/admin/constants/permissions.js +23 -0
- package/dist/admin/constants/permissions.js.map +1 -0
- package/dist/admin/hooks/useAdminPermissions.d.ts +30 -0
- package/dist/admin/hooks/useAdminPermissions.d.ts.map +1 -0
- package/dist/admin/hooks/useAdminPermissions.js +56 -0
- package/dist/admin/hooks/useAdminPermissions.js.map +1 -0
- package/dist/admin/index.d.ts +31 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +9 -0
- package/dist/admin/pages/AuditLogsPage.d.ts +5 -0
- package/dist/admin/pages/AuditLogsPage.d.ts.map +1 -0
- package/dist/admin/pages/AuditLogsPage.js +209 -0
- package/dist/admin/pages/AuditLogsPage.js.map +1 -0
- package/dist/admin/pages/BillingPage.d.ts +2 -0
- package/dist/admin/pages/BillingPage.d.ts.map +1 -0
- package/dist/admin/pages/BillingPage.js +164 -0
- package/dist/admin/pages/BillingPage.js.map +1 -0
- package/dist/admin/pages/CommunicationsPage.d.ts +2 -0
- package/dist/admin/pages/CommunicationsPage.d.ts.map +1 -0
- package/dist/admin/pages/CommunicationsPage.js +118 -0
- package/dist/admin/pages/CommunicationsPage.js.map +1 -0
- package/dist/admin/pages/DashboardPage.d.ts +5 -0
- package/dist/admin/pages/DashboardPage.d.ts.map +1 -0
- package/dist/admin/pages/DashboardPage.js +121 -0
- package/dist/admin/pages/DashboardPage.js.map +1 -0
- package/dist/admin/pages/FeatureFlagsPage.d.ts +2 -0
- package/dist/admin/pages/FeatureFlagsPage.d.ts.map +1 -0
- package/dist/admin/pages/FeatureFlagsPage.js +116 -0
- package/dist/admin/pages/FeatureFlagsPage.js.map +1 -0
- package/dist/admin/pages/OrganizationsListPage.d.ts +2 -0
- package/dist/admin/pages/OrganizationsListPage.d.ts.map +1 -0
- package/dist/admin/pages/OrganizationsListPage.js +112 -0
- package/dist/admin/pages/OrganizationsListPage.js.map +1 -0
- package/dist/admin/pages/ProductsPage.d.ts +5 -0
- package/dist/admin/pages/ProductsPage.d.ts.map +1 -0
- package/dist/admin/pages/ProductsPage.js +392 -0
- package/dist/admin/pages/ProductsPage.js.map +1 -0
- package/dist/admin/pages/ReferralsPage.d.ts +2 -0
- package/dist/admin/pages/ReferralsPage.d.ts.map +1 -0
- package/dist/admin/pages/ReferralsPage.js +272 -0
- package/dist/admin/pages/ReferralsPage.js.map +1 -0
- package/dist/admin/pages/RolesPermissionsPage.d.ts +2 -0
- package/dist/admin/pages/RolesPermissionsPage.d.ts.map +1 -0
- package/dist/admin/pages/RolesPermissionsPage.js +145 -0
- package/dist/admin/pages/RolesPermissionsPage.js.map +1 -0
- package/dist/admin/pages/SREPage.d.ts +5 -0
- package/dist/admin/pages/SREPage.d.ts.map +1 -0
- package/dist/admin/pages/SREPage.js +405 -0
- package/dist/admin/pages/SREPage.js.map +1 -0
- package/dist/admin/pages/SandboxSettingsPage.d.ts +7 -0
- package/dist/admin/pages/SandboxSettingsPage.d.ts.map +1 -0
- package/dist/admin/pages/SandboxSettingsPage.js +497 -0
- package/dist/admin/pages/SandboxSettingsPage.js.map +1 -0
- package/dist/admin/pages/SettingsPage.d.ts +5 -0
- package/dist/admin/pages/SettingsPage.d.ts.map +1 -0
- package/dist/admin/pages/SettingsPage.js +279 -0
- package/dist/admin/pages/SettingsPage.js.map +1 -0
- package/dist/admin/pages/TenantDetailPage.d.ts +5 -0
- package/dist/admin/pages/TenantDetailPage.d.ts.map +1 -0
- package/dist/admin/pages/TenantDetailPage.js +274 -0
- package/dist/admin/pages/TenantDetailPage.js.map +1 -0
- package/dist/admin/pages/TenantFormRoutePage.d.ts +6 -0
- package/dist/admin/pages/TenantFormRoutePage.d.ts.map +1 -0
- package/dist/admin/pages/TenantFormRoutePage.js +136 -0
- package/dist/admin/pages/TenantFormRoutePage.js.map +1 -0
- package/dist/admin/pages/TenantsListPage.d.ts +5 -0
- package/dist/admin/pages/TenantsListPage.d.ts.map +1 -0
- package/dist/admin/pages/TenantsListPage.js +339 -0
- package/dist/admin/pages/TenantsListPage.js.map +1 -0
- package/dist/admin/pages/UsersListPage.d.ts +5 -0
- package/dist/admin/pages/UsersListPage.d.ts.map +1 -0
- package/dist/admin/pages/UsersListPage.js +250 -0
- package/dist/admin/pages/UsersListPage.js.map +1 -0
- package/dist/admin/pages/WaitlistPage.d.ts +2 -0
- package/dist/admin/pages/WaitlistPage.d.ts.map +1 -0
- package/dist/admin/pages/WaitlistPage.js +241 -0
- package/dist/admin/pages/WaitlistPage.js.map +1 -0
- package/dist/admin/pages/WorkflowsPage.d.ts +2 -0
- package/dist/admin/pages/WorkflowsPage.d.ts.map +1 -0
- package/dist/admin/pages/WorkflowsPage.js +126 -0
- package/dist/admin/pages/WorkflowsPage.js.map +1 -0
- package/dist/admin/pages/WorkspacesListPage.d.ts +2 -0
- package/dist/admin/pages/WorkspacesListPage.d.ts.map +1 -0
- package/dist/admin/pages/WorkspacesListPage.js +100 -0
- package/dist/admin/pages/WorkspacesListPage.js.map +1 -0
- package/dist/admin/pages/index.d.ts +20 -0
- package/dist/admin/pages/index.d.ts.map +1 -0
- package/dist/admin/pages/index.js +19 -0
- package/dist/admin/providers/AdminProvider.d.ts +13 -0
- package/dist/admin/providers/AdminProvider.d.ts.map +1 -0
- package/dist/admin/providers/AdminProvider.js +43 -0
- package/dist/admin/providers/AdminProvider.js.map +1 -0
- package/dist/admin/schemas/index.d.ts +409 -0
- package/dist/admin/schemas/index.d.ts.map +1 -0
- package/dist/admin/schemas/index.js +111 -0
- package/dist/admin/schemas/index.js.map +1 -0
- package/dist/admin/store/adminStore.d.ts +28 -0
- package/dist/admin/store/adminStore.d.ts.map +1 -0
- package/dist/admin/store/adminStore.js +48 -0
- package/dist/admin/store/adminStore.js.map +1 -0
- package/dist/admin/types/index.d.ts +325 -0
- package/dist/admin/types/index.d.ts.map +1 -0
- package/dist/admin/utils/cn.d.ts +7 -0
- package/dist/admin/utils/cn.d.ts.map +1 -0
- package/dist/admin/utils/cn.js +10 -0
- package/dist/admin/utils/cn.js.map +1 -0
- package/dist/admin/utils/directActivityGraphql.d.ts +11 -0
- package/dist/admin/utils/directActivityGraphql.d.ts.map +1 -0
- package/dist/admin/utils/directActivityGraphql.js +25 -0
- package/dist/admin/utils/directActivityGraphql.js.map +1 -0
- package/dist/admin/utils/formatters.d.ts +33 -0
- package/dist/admin/utils/formatters.d.ts.map +1 -0
- package/dist/admin/utils/formatters.js +54 -0
- package/dist/admin/utils/formatters.js.map +1 -0
- package/dist/admin/utils/gatewayGraphql.d.ts +9 -0
- package/dist/admin/utils/gatewayGraphql.d.ts.map +1 -0
- package/dist/admin/utils/i18n.d.ts +6 -0
- package/dist/admin/utils/i18n.d.ts.map +1 -0
- package/dist/admin/utils/i18n.js +15 -0
- package/dist/admin/utils/i18n.js.map +1 -0
- package/dist/admin/utils/mappers.d.ts +15 -0
- package/dist/admin/utils/mappers.d.ts.map +1 -0
- package/dist/admin/utils/mappers.js +73 -0
- package/dist/admin/utils/mappers.js.map +1 -0
- package/dist/admin/utils/navigation.d.ts +9 -0
- package/dist/admin/utils/navigation.d.ts.map +1 -0
- package/dist/admin/utils/navigation.js +8 -0
- package/dist/admin/utils/navigation.js.map +1 -0
- package/dist/admin/utils/tenantEvents.d.ts +11 -0
- package/dist/admin/utils/tenantEvents.d.ts.map +1 -0
- package/dist/admin/utils/tenantEvents.js +8 -0
- package/dist/admin/utils/tenantEvents.js.map +1 -0
- package/dist/dev/main.d.ts +2 -0
- package/dist/dev/main.d.ts.map +1 -0
- package/dist/generated/global-operations.d.ts +2749 -0
- package/dist/generated/global-operations.d.ts.map +1 -0
- package/dist/generated/global-operations.js +907 -0
- package/dist/generated/global-operations.js.map +1 -0
- package/dist/generated/global-types.d.ts +20773 -0
- package/dist/generated/global-types.d.ts.map +1 -0
- package/dist/generated/global-types.js +12 -0
- package/dist/generated/global-types.js.map +1 -0
- package/dist/generated/wspace-operations.d.ts +132 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -0
- package/dist/generated/wspace-operations.js +65 -0
- package/dist/generated/wspace-operations.js.map +1 -0
- package/dist/generated/wspace-types.d.ts +53363 -0
- package/dist/generated/wspace-types.d.ts.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/node_modules/@hookform/resolvers/dist/resolvers.js +34 -0
- package/dist/node_modules/@hookform/resolvers/dist/resolvers.js.map +1 -0
- package/dist/node_modules/@hookform/resolvers/zod/dist/zod.js +118 -0
- package/dist/node_modules/@hookform/resolvers/zod/dist/zod.js.map +1 -0
- package/dist/node_modules/clsx/dist/clsx.js +18 -0
- package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
- package/dist/node_modules/date-fns/_lib/addLeadingZeros.js +8 -0
- package/dist/node_modules/date-fns/_lib/addLeadingZeros.js.map +1 -0
- package/dist/node_modules/date-fns/_lib/defaultOptions.js +9 -0
- package/dist/node_modules/date-fns/_lib/defaultOptions.js.map +1 -0
- package/dist/node_modules/date-fns/_lib/format/formatters.js +384 -0
- package/dist/node_modules/date-fns/_lib/format/formatters.js.map +1 -0
- package/dist/node_modules/date-fns/_lib/format/lightFormatters.js +45 -0
- package/dist/node_modules/date-fns/_lib/format/lightFormatters.js.map +1 -0
- package/dist/node_modules/date-fns/_lib/format/longFormatters.js +42 -0
- package/dist/node_modules/date-fns/_lib/format/longFormatters.js.map +1 -0
- package/dist/node_modules/date-fns/_lib/getRoundingMethod.js +11 -0
- package/dist/node_modules/date-fns/_lib/getRoundingMethod.js.map +1 -0
- package/dist/node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js +10 -0
- package/dist/node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js.map +1 -0
- package/dist/node_modules/date-fns/_lib/normalizeDates.js +10 -0
- package/dist/node_modules/date-fns/_lib/normalizeDates.js.map +1 -0
- package/dist/node_modules/date-fns/_lib/protectedTokens.js +25 -0
- package/dist/node_modules/date-fns/_lib/protectedTokens.js.map +1 -0
- package/dist/node_modules/date-fns/compareAsc.js +10 -0
- package/dist/node_modules/date-fns/compareAsc.js.map +1 -0
- package/dist/node_modules/date-fns/constants.js +8 -0
- package/dist/node_modules/date-fns/constants.js.map +1 -0
- package/dist/node_modules/date-fns/constructFrom.js +9 -0
- package/dist/node_modules/date-fns/constructFrom.js.map +1 -0
- package/dist/node_modules/date-fns/constructNow.js +9 -0
- package/dist/node_modules/date-fns/constructNow.js.map +1 -0
- package/dist/node_modules/date-fns/differenceInCalendarDays.js +13 -0
- package/dist/node_modules/date-fns/differenceInCalendarDays.js.map +1 -0
- package/dist/node_modules/date-fns/differenceInCalendarMonths.js +10 -0
- package/dist/node_modules/date-fns/differenceInCalendarMonths.js.map +1 -0
- package/dist/node_modules/date-fns/differenceInMilliseconds.js +9 -0
- package/dist/node_modules/date-fns/differenceInMilliseconds.js.map +1 -0
- package/dist/node_modules/date-fns/differenceInMonths.js +18 -0
- package/dist/node_modules/date-fns/differenceInMonths.js.map +1 -0
- package/dist/node_modules/date-fns/differenceInSeconds.js +11 -0
- package/dist/node_modules/date-fns/differenceInSeconds.js.map +1 -0
- package/dist/node_modules/date-fns/endOfDay.js +10 -0
- package/dist/node_modules/date-fns/endOfDay.js.map +1 -0
- package/dist/node_modules/date-fns/endOfMonth.js +10 -0
- package/dist/node_modules/date-fns/endOfMonth.js.map +1 -0
- package/dist/node_modules/date-fns/format.js +61 -0
- package/dist/node_modules/date-fns/format.js.map +1 -0
- package/dist/node_modules/date-fns/formatDistance.js +39 -0
- package/dist/node_modules/date-fns/formatDistance.js.map +1 -0
- package/dist/node_modules/date-fns/formatDistanceToNow.js +10 -0
- package/dist/node_modules/date-fns/formatDistanceToNow.js.map +1 -0
- package/dist/node_modules/date-fns/getDayOfYear.js +12 -0
- package/dist/node_modules/date-fns/getDayOfYear.js.map +1 -0
- package/dist/node_modules/date-fns/getISOWeek.js +13 -0
- package/dist/node_modules/date-fns/getISOWeek.js.map +1 -0
- package/dist/node_modules/date-fns/getISOWeekYear.js +16 -0
- package/dist/node_modules/date-fns/getISOWeekYear.js.map +1 -0
- package/dist/node_modules/date-fns/getWeek.js +13 -0
- package/dist/node_modules/date-fns/getWeek.js.map +1 -0
- package/dist/node_modules/date-fns/getWeekYear.js +17 -0
- package/dist/node_modules/date-fns/getWeekYear.js.map +1 -0
- package/dist/node_modules/date-fns/isDate.js +8 -0
- package/dist/node_modules/date-fns/isDate.js.map +1 -0
- package/dist/node_modules/date-fns/isLastDayOfMonth.js +12 -0
- package/dist/node_modules/date-fns/isLastDayOfMonth.js.map +1 -0
- package/dist/node_modules/date-fns/isValid.js +10 -0
- package/dist/node_modules/date-fns/isValid.js.map +1 -0
- package/dist/node_modules/date-fns/locale/_lib/buildFormatLongFn.js +11 -0
- package/dist/node_modules/date-fns/locale/_lib/buildFormatLongFn.js.map +1 -0
- package/dist/node_modules/date-fns/locale/_lib/buildLocalizeFn.js +19 -0
- package/dist/node_modules/date-fns/locale/_lib/buildLocalizeFn.js.map +1 -0
- package/dist/node_modules/date-fns/locale/_lib/buildMatchFn.js +24 -0
- package/dist/node_modules/date-fns/locale/_lib/buildMatchFn.js.map +1 -0
- package/dist/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js +20 -0
- package/dist/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js.map +1 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/formatDistance.js +71 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/formatDistance.js.map +1 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/formatLong.js +34 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/formatLong.js.map +1 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/formatRelative.js +13 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/formatRelative.js.map +1 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/localize.js +204 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/localize.js.map +1 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/match.js +126 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/match.js.map +1 -0
- package/dist/node_modules/date-fns/locale/en-US.js +22 -0
- package/dist/node_modules/date-fns/locale/en-US.js.map +1 -0
- package/dist/node_modules/date-fns/parseISO.js +119 -0
- package/dist/node_modules/date-fns/parseISO.js.map +1 -0
- package/dist/node_modules/date-fns/startOfDay.js +10 -0
- package/dist/node_modules/date-fns/startOfDay.js.map +1 -0
- package/dist/node_modules/date-fns/startOfISOWeek.js +12 -0
- package/dist/node_modules/date-fns/startOfISOWeek.js.map +1 -0
- package/dist/node_modules/date-fns/startOfISOWeekYear.js +12 -0
- package/dist/node_modules/date-fns/startOfISOWeekYear.js.map +1 -0
- package/dist/node_modules/date-fns/startOfWeek.js +11 -0
- package/dist/node_modules/date-fns/startOfWeek.js.map +1 -0
- package/dist/node_modules/date-fns/startOfWeekYear.js +13 -0
- package/dist/node_modules/date-fns/startOfWeekYear.js.map +1 -0
- package/dist/node_modules/date-fns/startOfYear.js +10 -0
- package/dist/node_modules/date-fns/startOfYear.js.map +1 -0
- package/dist/node_modules/date-fns/toDate.js +9 -0
- package/dist/node_modules/date-fns/toDate.js.map +1 -0
- package/dist/node_modules/react-hook-form/dist/index.esm.js +1210 -0
- package/dist/node_modules/react-hook-form/dist/index.esm.js.map +1 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1716 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
- package/dist/node_modules/zod/v3/ZodError.js +82 -0
- package/dist/node_modules/zod/v3/ZodError.js.map +1 -0
- package/dist/node_modules/zod/v3/errors.js +10 -0
- package/dist/node_modules/zod/v3/errors.js.map +1 -0
- package/dist/node_modules/zod/v3/helpers/errorUtil.js +9 -0
- package/dist/node_modules/zod/v3/helpers/errorUtil.js.map +1 -0
- package/dist/node_modules/zod/v3/helpers/parseUtil.js +93 -0
- package/dist/node_modules/zod/v3/helpers/parseUtil.js.map +1 -0
- package/dist/node_modules/zod/v3/helpers/util.js +76 -0
- package/dist/node_modules/zod/v3/helpers/util.js.map +1 -0
- package/dist/node_modules/zod/v3/locales/en.js +62 -0
- package/dist/node_modules/zod/v3/locales/en.js.map +1 -0
- package/dist/node_modules/zod/v3/types.js +2459 -0
- package/dist/node_modules/zod/v3/types.js.map +1 -0
- package/dist/node_modules/zod/v4/core/core.js +35 -0
- package/dist/node_modules/zod/v4/core/core.js.map +1 -0
- package/dist/node_modules/zod/v4/core/errors.js +24 -0
- package/dist/node_modules/zod/v4/core/errors.js.map +1 -0
- package/dist/node_modules/zod/v4/core/parse.js +29 -0
- package/dist/node_modules/zod/v4/core/parse.js.map +1 -0
- package/dist/node_modules/zod/v4/core/util.js +20 -0
- package/dist/node_modules/zod/v4/core/util.js.map +1 -0
- package/package.json +111 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
export type ToastType = 'success' | 'error' | 'warning' | 'info';
|
|
4
|
+
export interface Toast {
|
|
5
|
+
id: string;
|
|
6
|
+
type: ToastType;
|
|
7
|
+
title: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
duration?: number;
|
|
10
|
+
}
|
|
11
|
+
interface ToastContextValue {
|
|
12
|
+
toasts: Toast[];
|
|
13
|
+
addToast: (toast: Omit<Toast, 'id'>) => void;
|
|
14
|
+
removeToast: (id: string) => void;
|
|
15
|
+
success: (title: string, description?: string) => void;
|
|
16
|
+
error: (title: string, description?: string) => void;
|
|
17
|
+
warning: (title: string, description?: string) => void;
|
|
18
|
+
info: (title: string, description?: string) => void;
|
|
19
|
+
}
|
|
20
|
+
export declare function useToast(): ToastContextValue;
|
|
21
|
+
interface ToastProviderProps {
|
|
22
|
+
children: ReactNode;
|
|
23
|
+
}
|
|
24
|
+
export declare function ToastProvider({ children }: ToastProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=Toast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toast.d.ts","sourceRoot":"","sources":["../../../src/admin/components/Toast.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA+D,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAQpG,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAEjE,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,iBAAiB;IACzB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC;IAC7C,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACrD;AAQD,wBAAgB,QAAQ,sBAMvB;AAMD,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE,kBAAkB,2CA8C7D"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { cn as e } from "../utils/cn.js";
|
|
2
|
+
import { createContext as t, useCallback as n, useContext as r, useEffect as i, useState as a } from "react";
|
|
3
|
+
import { AlertCircle as o, AlertTriangle as s, CheckCircle2 as c, Info as l, X as u } from "lucide-react";
|
|
4
|
+
import { jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
5
|
+
//#region src/admin/components/Toast.tsx
|
|
6
|
+
var p = t(null);
|
|
7
|
+
function m() {
|
|
8
|
+
let e = r(p);
|
|
9
|
+
if (!e) throw Error("useToast must be used within a ToastProvider");
|
|
10
|
+
return e;
|
|
11
|
+
}
|
|
12
|
+
function h({ children: e }) {
|
|
13
|
+
let [t, r] = a([]), i = n((e) => {
|
|
14
|
+
let t = `toast-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
|
|
15
|
+
r((n) => [...n, {
|
|
16
|
+
...e,
|
|
17
|
+
id: t
|
|
18
|
+
}]);
|
|
19
|
+
}, []), o = n((e) => {
|
|
20
|
+
r((t) => t.filter((t) => t.id !== e));
|
|
21
|
+
}, []), s = n((e, t) => {
|
|
22
|
+
i({
|
|
23
|
+
type: "success",
|
|
24
|
+
title: e,
|
|
25
|
+
description: t,
|
|
26
|
+
duration: 4e3
|
|
27
|
+
});
|
|
28
|
+
}, [i]), c = n((e, t) => {
|
|
29
|
+
i({
|
|
30
|
+
type: "error",
|
|
31
|
+
title: e,
|
|
32
|
+
description: t,
|
|
33
|
+
duration: 6e3
|
|
34
|
+
});
|
|
35
|
+
}, [i]), l = n((e, t) => {
|
|
36
|
+
i({
|
|
37
|
+
type: "warning",
|
|
38
|
+
title: e,
|
|
39
|
+
description: t,
|
|
40
|
+
duration: 5e3
|
|
41
|
+
});
|
|
42
|
+
}, [i]), u = n((e, t) => {
|
|
43
|
+
i({
|
|
44
|
+
type: "info",
|
|
45
|
+
title: e,
|
|
46
|
+
description: t,
|
|
47
|
+
duration: 4e3
|
|
48
|
+
});
|
|
49
|
+
}, [i]);
|
|
50
|
+
return /* @__PURE__ */ f(p.Provider, {
|
|
51
|
+
value: {
|
|
52
|
+
toasts: t,
|
|
53
|
+
addToast: i,
|
|
54
|
+
removeToast: o,
|
|
55
|
+
success: s,
|
|
56
|
+
error: c,
|
|
57
|
+
warning: l,
|
|
58
|
+
info: u
|
|
59
|
+
},
|
|
60
|
+
children: [e, /* @__PURE__ */ d(g, {
|
|
61
|
+
toasts: t,
|
|
62
|
+
removeToast: o
|
|
63
|
+
})]
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
function g({ toasts: e, removeToast: t }) {
|
|
67
|
+
return e.length === 0 ? null : /* @__PURE__ */ d("div", {
|
|
68
|
+
className: "fixed bottom-4 right-4 z-[100] flex flex-col gap-2 max-w-sm",
|
|
69
|
+
children: e.map((e) => /* @__PURE__ */ d(v, {
|
|
70
|
+
toast: e,
|
|
71
|
+
onDismiss: () => t(e.id)
|
|
72
|
+
}, e.id))
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
var _ = {
|
|
76
|
+
success: {
|
|
77
|
+
icon: c,
|
|
78
|
+
bg: "bg-success/10",
|
|
79
|
+
border: "border-success/30",
|
|
80
|
+
iconColor: "text-success"
|
|
81
|
+
},
|
|
82
|
+
error: {
|
|
83
|
+
icon: o,
|
|
84
|
+
bg: "bg-destructive/10",
|
|
85
|
+
border: "border-destructive/30",
|
|
86
|
+
iconColor: "text-destructive"
|
|
87
|
+
},
|
|
88
|
+
warning: {
|
|
89
|
+
icon: s,
|
|
90
|
+
bg: "bg-warning/10",
|
|
91
|
+
border: "border-warning/30",
|
|
92
|
+
iconColor: "text-warning"
|
|
93
|
+
},
|
|
94
|
+
info: {
|
|
95
|
+
icon: l,
|
|
96
|
+
bg: "bg-primary/10",
|
|
97
|
+
border: "border-primary/30",
|
|
98
|
+
iconColor: "text-primary"
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
function v({ toast: t, onDismiss: n }) {
|
|
102
|
+
let { icon: r, bg: a, border: o, iconColor: s } = _[t.type];
|
|
103
|
+
return i(() => {
|
|
104
|
+
let e = t.duration ?? 4e3, r = setTimeout(n, e);
|
|
105
|
+
return () => clearTimeout(r);
|
|
106
|
+
}, [t.duration, n]), /* @__PURE__ */ f("div", {
|
|
107
|
+
className: e("flex items-start gap-3 rounded-lg border p-4 shadow-lg backdrop-blur-sm", "animate-in slide-in-from-right-full duration-300", "bg-background/95", a, o),
|
|
108
|
+
role: "alert",
|
|
109
|
+
children: [
|
|
110
|
+
/* @__PURE__ */ d(r, { className: e("h-5 w-5 shrink-0 mt-0.5", s) }),
|
|
111
|
+
/* @__PURE__ */ f("div", {
|
|
112
|
+
className: "flex-1 min-w-0",
|
|
113
|
+
children: [/* @__PURE__ */ d("p", {
|
|
114
|
+
className: "text-sm font-medium text-foreground",
|
|
115
|
+
children: t.title
|
|
116
|
+
}), t.description && /* @__PURE__ */ d("p", {
|
|
117
|
+
className: "mt-1 text-xs text-muted-foreground",
|
|
118
|
+
children: t.description
|
|
119
|
+
})]
|
|
120
|
+
}),
|
|
121
|
+
/* @__PURE__ */ d("button", {
|
|
122
|
+
onClick: n,
|
|
123
|
+
className: "shrink-0 rounded-md p-1 hover:bg-muted transition-colors",
|
|
124
|
+
"aria-label": "Dismiss",
|
|
125
|
+
children: /* @__PURE__ */ d(u, { className: "h-4 w-4 text-muted-foreground" })
|
|
126
|
+
})
|
|
127
|
+
]
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
//#endregion
|
|
131
|
+
export { h as ToastProvider, m as useToast };
|
|
132
|
+
|
|
133
|
+
//# sourceMappingURL=Toast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toast.js","names":[],"sources":["../../../src/admin/components/Toast.tsx"],"sourcesContent":["import { createContext, useContext, useState, useCallback, useEffect, type ReactNode } from 'react';\nimport { X, CheckCircle2, AlertCircle, AlertTriangle, Info } from 'lucide-react';\nimport { cn } from '../utils/cn';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type ToastType = 'success' | 'error' | 'warning' | 'info';\n\nexport interface Toast {\n id: string;\n type: ToastType;\n title: string;\n description?: string;\n duration?: number;\n}\n\ninterface ToastContextValue {\n toasts: Toast[];\n addToast: (toast: Omit<Toast, 'id'>) => void;\n removeToast: (id: string) => void;\n success: (title: string, description?: string) => void;\n error: (title: string, description?: string) => void;\n warning: (title: string, description?: string) => void;\n info: (title: string, description?: string) => void;\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst ToastContext = createContext<ToastContextValue | null>(null);\n\nexport function useToast() {\n const context = useContext(ToastContext);\n if (!context) {\n throw new Error('useToast must be used within a ToastProvider');\n }\n return context;\n}\n\n// ============================================================================\n// Provider\n// ============================================================================\n\ninterface ToastProviderProps {\n children: ReactNode;\n}\n\nexport function ToastProvider({ children }: ToastProviderProps) {\n const [toasts, setToasts] = useState<Toast[]>([]);\n\n const addToast = useCallback((toast: Omit<Toast, 'id'>) => {\n const id = `toast-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n setToasts((prev) => [...prev, { ...toast, id }]);\n }, []);\n\n const removeToast = useCallback((id: string) => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, []);\n\n const success = useCallback(\n (title: string, description?: string) => {\n addToast({ type: 'success', title, description, duration: 4000 });\n },\n [addToast]\n );\n\n const error = useCallback(\n (title: string, description?: string) => {\n addToast({ type: 'error', title, description, duration: 6000 });\n },\n [addToast]\n );\n\n const warning = useCallback(\n (title: string, description?: string) => {\n addToast({ type: 'warning', title, description, duration: 5000 });\n },\n [addToast]\n );\n\n const info = useCallback(\n (title: string, description?: string) => {\n addToast({ type: 'info', title, description, duration: 4000 });\n },\n [addToast]\n );\n\n return (\n <ToastContext.Provider value={{ toasts, addToast, removeToast, success, error, warning, info }}>\n {children}\n <ToastContainer toasts={toasts} removeToast={removeToast} />\n </ToastContext.Provider>\n );\n}\n\n// ============================================================================\n// Toast Container\n// ============================================================================\n\ninterface ToastContainerProps {\n toasts: Toast[];\n removeToast: (id: string) => void;\n}\n\nfunction ToastContainer({ toasts, removeToast }: ToastContainerProps) {\n if (toasts.length === 0) return null;\n\n return (\n <div className=\"fixed bottom-4 right-4 z-[100] flex flex-col gap-2 max-w-sm\">\n {toasts.map((toast) => (\n <ToastItem key={toast.id} toast={toast} onDismiss={() => removeToast(toast.id)} />\n ))}\n </div>\n );\n}\n\n// ============================================================================\n// Toast Item\n// ============================================================================\n\ninterface ToastItemProps {\n toast: Toast;\n onDismiss: () => void;\n}\n\nconst toastStyles: Record<\n ToastType,\n { icon: typeof CheckCircle2; bg: string; border: string; iconColor: string }\n> = {\n success: {\n icon: CheckCircle2,\n bg: 'bg-success/10',\n border: 'border-success/30',\n iconColor: 'text-success',\n },\n error: {\n icon: AlertCircle,\n bg: 'bg-destructive/10',\n border: 'border-destructive/30',\n iconColor: 'text-destructive',\n },\n warning: {\n icon: AlertTriangle,\n bg: 'bg-warning/10',\n border: 'border-warning/30',\n iconColor: 'text-warning',\n },\n info: {\n icon: Info,\n bg: 'bg-primary/10',\n border: 'border-primary/30',\n iconColor: 'text-primary',\n },\n};\n\nfunction ToastItem({ toast, onDismiss }: ToastItemProps) {\n const { icon: Icon, bg, border, iconColor } = toastStyles[toast.type];\n\n // Auto-dismiss\n useEffect(() => {\n const duration = toast.duration ?? 4000;\n const timer = setTimeout(onDismiss, duration);\n return () => clearTimeout(timer);\n }, [toast.duration, onDismiss]);\n\n return (\n <div\n className={cn(\n 'flex items-start gap-3 rounded-lg border p-4 shadow-lg backdrop-blur-sm',\n 'animate-in slide-in-from-right-full duration-300',\n 'bg-background/95',\n bg,\n border\n )}\n role=\"alert\"\n >\n <Icon className={cn('h-5 w-5 shrink-0 mt-0.5', iconColor)} />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-foreground\">{toast.title}</p>\n {toast.description && (\n <p className=\"mt-1 text-xs text-muted-foreground\">{toast.description}</p>\n )}\n </div>\n <button\n onClick={onDismiss}\n className=\"shrink-0 rounded-md p-1 hover:bg-muted transition-colors\"\n aria-label=\"Dismiss\"\n >\n <X className=\"h-4 w-4 text-muted-foreground\" />\n </button>\n </div>\n );\n}\n"],"mappings":";;;;;AAgCA,IAAM,IAAe,EAAwC,KAAK;AAElE,SAAgB,IAAW;CACzB,IAAM,IAAU,EAAW,EAAa;AACxC,KAAI,CAAC,EACH,OAAU,MAAM,+CAA+C;AAEjE,QAAO;;AAWT,SAAgB,EAAc,EAAE,eAAgC;CAC9D,IAAM,CAAC,GAAQ,KAAa,EAAkB,EAAE,CAAC,EAE3C,IAAW,GAAa,MAA6B;EACzD,IAAM,IAAK,SAAS,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,GAAG,EAAE;AACxE,KAAW,MAAS,CAAC,GAAG,GAAM;GAAE,GAAG;GAAO;GAAI,CAAC,CAAC;IAC/C,EAAE,CAAC,EAEA,IAAc,GAAa,MAAe;AAC9C,KAAW,MAAS,EAAK,QAAQ,MAAM,EAAE,OAAO,EAAG,CAAC;IACnD,EAAE,CAAC,EAEA,IAAU,GACb,GAAe,MAAyB;AACvC,IAAS;GAAE,MAAM;GAAW;GAAO;GAAa,UAAU;GAAM,CAAC;IAEnE,CAAC,EAAS,CACX,EAEK,IAAQ,GACX,GAAe,MAAyB;AACvC,IAAS;GAAE,MAAM;GAAS;GAAO;GAAa,UAAU;GAAM,CAAC;IAEjE,CAAC,EAAS,CACX,EAEK,IAAU,GACb,GAAe,MAAyB;AACvC,IAAS;GAAE,MAAM;GAAW;GAAO;GAAa,UAAU;GAAM,CAAC;IAEnE,CAAC,EAAS,CACX,EAEK,IAAO,GACV,GAAe,MAAyB;AACvC,IAAS;GAAE,MAAM;GAAQ;GAAO;GAAa,UAAU;GAAM,CAAC;IAEhE,CAAC,EAAS,CACX;AAED,QACE,kBAAC,EAAa,UAAd;EAAuB,OAAO;GAAE;GAAQ;GAAU;GAAa;GAAS;GAAO;GAAS;GAAM;YAA9F,CACG,GACD,kBAAC,GAAD;GAAwB;GAAqB;GAAe,CAAA,CACtC;;;AAa5B,SAAS,EAAe,EAAE,WAAQ,kBAAoC;AAGpE,QAFI,EAAO,WAAW,IAAU,OAG9B,kBAAC,OAAD;EAAK,WAAU;YACZ,EAAO,KAAK,MACX,kBAAC,GAAD;GAAiC;GAAO,iBAAiB,EAAY,EAAM,GAAG;GAAI,EAAlE,EAAM,GAA4D,CAClF;EACE,CAAA;;AAaV,IAAM,IAGF;CACF,SAAS;EACP,MAAM;EACN,IAAI;EACJ,QAAQ;EACR,WAAW;EACZ;CACD,OAAO;EACL,MAAM;EACN,IAAI;EACJ,QAAQ;EACR,WAAW;EACZ;CACD,SAAS;EACP,MAAM;EACN,IAAI;EACJ,QAAQ;EACR,WAAW;EACZ;CACD,MAAM;EACJ,MAAM;EACN,IAAI;EACJ,QAAQ;EACR,WAAW;EACZ;CACF;AAED,SAAS,EAAU,EAAE,UAAO,gBAA6B;CACvD,IAAM,EAAE,MAAM,GAAM,OAAI,WAAQ,iBAAc,EAAY,EAAM;AAShE,QANA,QAAgB;EACd,IAAM,IAAW,EAAM,YAAY,KAC7B,IAAQ,WAAW,GAAW,EAAS;AAC7C,eAAa,aAAa,EAAM;IAC/B,CAAC,EAAM,UAAU,EAAU,CAAC,EAG7B,kBAAC,OAAD;EACE,WAAW,EACT,2EACA,oDACA,oBACA,GACA,EACD;EACD,MAAK;YARP;GAUE,kBAAC,GAAD,EAAM,WAAW,EAAG,2BAA2B,EAAU,EAAI,CAAA;GAC7D,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,KAAD;KAAG,WAAU;eAAuC,EAAM;KAAU,CAAA,EACnE,EAAM,eACL,kBAAC,KAAD;KAAG,WAAU;eAAsC,EAAM;KAAgB,CAAA,CAEvE;;GACN,kBAAC,UAAD;IACE,SAAS;IACT,WAAU;IACV,cAAW;cAEX,kBAAC,GAAD,EAAG,WAAU,iCAAkC,CAAA;IACxC,CAAA;GACL"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { Subscription } from '../../types';
|
|
3
|
+
|
|
4
|
+
declare const subscriptionFormSchema: z.ZodObject<{
|
|
5
|
+
tenantId: z.ZodString;
|
|
6
|
+
plan: z.ZodEnum<["Free", "Starter", "Professional", "Enterprise", "Custom"]>;
|
|
7
|
+
billingCycle: z.ZodEnum<["monthly", "yearly"]>;
|
|
8
|
+
seats: z.ZodNumber;
|
|
9
|
+
status: z.ZodOptional<z.ZodEnum<["active", "cancelled", "past_due", "trialing", "paused"]>>;
|
|
10
|
+
startDate: z.ZodOptional<z.ZodString>;
|
|
11
|
+
trialEndDate: z.ZodOptional<z.ZodString>;
|
|
12
|
+
}, "strip", z.ZodTypeAny, {
|
|
13
|
+
tenantId: string;
|
|
14
|
+
plan: "Free" | "Starter" | "Professional" | "Enterprise" | "Custom";
|
|
15
|
+
billingCycle: "monthly" | "yearly";
|
|
16
|
+
seats: number;
|
|
17
|
+
status?: "active" | "past_due" | "trialing" | "paused" | "cancelled" | undefined;
|
|
18
|
+
startDate?: string | undefined;
|
|
19
|
+
trialEndDate?: string | undefined;
|
|
20
|
+
}, {
|
|
21
|
+
tenantId: string;
|
|
22
|
+
plan: "Free" | "Starter" | "Professional" | "Enterprise" | "Custom";
|
|
23
|
+
billingCycle: "monthly" | "yearly";
|
|
24
|
+
seats: number;
|
|
25
|
+
status?: "active" | "past_due" | "trialing" | "paused" | "cancelled" | undefined;
|
|
26
|
+
startDate?: string | undefined;
|
|
27
|
+
trialEndDate?: string | undefined;
|
|
28
|
+
}>;
|
|
29
|
+
type SubscriptionFormData = z.infer<typeof subscriptionFormSchema>;
|
|
30
|
+
/**
|
|
31
|
+
* SubscriptionForm props
|
|
32
|
+
*/
|
|
33
|
+
export interface SubscriptionFormProps {
|
|
34
|
+
/** Whether the form is open */
|
|
35
|
+
open: boolean;
|
|
36
|
+
/** Callback when the form should close */
|
|
37
|
+
onClose: () => void;
|
|
38
|
+
/** Existing subscription data for editing (undefined for create) */
|
|
39
|
+
subscription?: Subscription;
|
|
40
|
+
/** Pre-selected tenant ID */
|
|
41
|
+
tenantId?: string;
|
|
42
|
+
/** List of available tenants for selection */
|
|
43
|
+
tenants?: {
|
|
44
|
+
id: string;
|
|
45
|
+
name: string;
|
|
46
|
+
}[];
|
|
47
|
+
/** Callback on successful save */
|
|
48
|
+
onSave: (data: SubscriptionFormData & {
|
|
49
|
+
id?: string;
|
|
50
|
+
}) => Promise<void>;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* SubscriptionForm - Create/Edit subscription form in a slide-over panel
|
|
54
|
+
*/
|
|
55
|
+
export declare function SubscriptionForm({ open, onClose, subscription, tenantId, tenants, onSave, }: SubscriptionFormProps): import("react/jsx-runtime").JSX.Element;
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=SubscriptionForm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubscriptionForm.d.ts","sourceRoot":"","sources":["../../../../src/admin/components/forms/SubscriptionForm.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA+DhD,QAAA,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;EAQ1B,CAAC;AAEH,KAAK,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,+BAA+B;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,0CAA0C;IAC1C,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,oEAAoE;IACpE,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,OAAO,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACzC,kCAAkC;IAClC,MAAM,EAAE,CAAC,IAAI,EAAE,oBAAoB,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACzE;AAuBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,OAAO,EACP,YAAY,EACZ,QAAQ,EACR,OAAY,EACZ,MAAM,GACP,EAAE,qBAAqB,2CAuLvB"}
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { cn as e } from "../../utils/cn.js";
|
|
2
|
+
import { Input as t } from "../ui.js";
|
|
3
|
+
import { FormRow as n, FormSection as r, FormSheet as i, FormSheetFooter as a } from "../FormSheet.js";
|
|
4
|
+
import { useForm as o } from "../../../node_modules/react-hook-form/dist/index.esm.js";
|
|
5
|
+
import { a as s } from "../../../node_modules/@hookform/resolvers/zod/dist/zod.js";
|
|
6
|
+
import { coerce as c, enumType as l, objectType as u, stringType as d } from "../../../node_modules/zod/v3/types.js";
|
|
7
|
+
import * as f from "react";
|
|
8
|
+
import { jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
9
|
+
//#region src/admin/components/forms/SubscriptionForm.tsx
|
|
10
|
+
function h({ label: e, error: t, required: n, children: r, description: i }) {
|
|
11
|
+
return /* @__PURE__ */ m("div", {
|
|
12
|
+
className: "space-y-1.5",
|
|
13
|
+
children: [
|
|
14
|
+
/* @__PURE__ */ m("label", {
|
|
15
|
+
className: "text-sm font-medium text-foreground",
|
|
16
|
+
children: [e, n && /* @__PURE__ */ p("span", {
|
|
17
|
+
className: "text-destructive ml-0.5",
|
|
18
|
+
children: "*"
|
|
19
|
+
})]
|
|
20
|
+
}),
|
|
21
|
+
r,
|
|
22
|
+
i && !t && /* @__PURE__ */ p("p", {
|
|
23
|
+
className: "text-xs text-muted-foreground",
|
|
24
|
+
children: i
|
|
25
|
+
}),
|
|
26
|
+
t && /* @__PURE__ */ p("p", {
|
|
27
|
+
className: "text-xs text-destructive",
|
|
28
|
+
children: t
|
|
29
|
+
})
|
|
30
|
+
]
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
var g = f.forwardRef(({ className: t, options: n, placeholder: r, ...i }, a) => /* @__PURE__ */ m("select", {
|
|
34
|
+
ref: a,
|
|
35
|
+
className: e("flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", "disabled:cursor-not-allowed disabled:opacity-50", t),
|
|
36
|
+
...i,
|
|
37
|
+
children: [r && /* @__PURE__ */ p("option", {
|
|
38
|
+
value: "",
|
|
39
|
+
disabled: !0,
|
|
40
|
+
children: r
|
|
41
|
+
}), n.map((e) => /* @__PURE__ */ p("option", {
|
|
42
|
+
value: e.value,
|
|
43
|
+
children: e.label
|
|
44
|
+
}, e.value))]
|
|
45
|
+
}));
|
|
46
|
+
g.displayName = "SelectField";
|
|
47
|
+
var _ = u({
|
|
48
|
+
tenantId: d().min(1, "Tenant is required"),
|
|
49
|
+
plan: l([
|
|
50
|
+
"Free",
|
|
51
|
+
"Starter",
|
|
52
|
+
"Professional",
|
|
53
|
+
"Enterprise",
|
|
54
|
+
"Custom"
|
|
55
|
+
]),
|
|
56
|
+
billingCycle: l(["monthly", "yearly"]),
|
|
57
|
+
seats: c.number().int().min(1, "At least 1 seat is required"),
|
|
58
|
+
status: l([
|
|
59
|
+
"active",
|
|
60
|
+
"cancelled",
|
|
61
|
+
"past_due",
|
|
62
|
+
"trialing",
|
|
63
|
+
"paused"
|
|
64
|
+
]).optional(),
|
|
65
|
+
startDate: d().optional(),
|
|
66
|
+
trialEndDate: d().optional()
|
|
67
|
+
}), v = [
|
|
68
|
+
{
|
|
69
|
+
value: "Free",
|
|
70
|
+
label: "Free - $0/mo"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
value: "Starter",
|
|
74
|
+
label: "Starter - $29/mo"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
value: "Professional",
|
|
78
|
+
label: "Professional - $99/mo"
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
value: "Enterprise",
|
|
82
|
+
label: "Enterprise - $299/mo"
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
value: "Custom",
|
|
86
|
+
label: "Custom Pricing"
|
|
87
|
+
}
|
|
88
|
+
], y = [{
|
|
89
|
+
value: "monthly",
|
|
90
|
+
label: "Monthly"
|
|
91
|
+
}, {
|
|
92
|
+
value: "yearly",
|
|
93
|
+
label: "Yearly (Save 20%)"
|
|
94
|
+
}], b = [
|
|
95
|
+
{
|
|
96
|
+
value: "active",
|
|
97
|
+
label: "Active"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
value: "cancelled",
|
|
101
|
+
label: "Cancelled"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
value: "past_due",
|
|
105
|
+
label: "Past Due"
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
value: "trialing",
|
|
109
|
+
label: "Trialing"
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
value: "paused",
|
|
113
|
+
label: "Paused"
|
|
114
|
+
}
|
|
115
|
+
];
|
|
116
|
+
function x({ open: e, onClose: c, subscription: l, tenantId: u, tenants: d = [], onSave: x }) {
|
|
117
|
+
let S = !!l, C = "subscription-form", w = {
|
|
118
|
+
tenantId: l?.tenantId ?? u ?? "",
|
|
119
|
+
plan: l?.plan ?? "Starter",
|
|
120
|
+
billingCycle: l?.billingCycle ?? "monthly",
|
|
121
|
+
seats: l?.seats ?? 1,
|
|
122
|
+
status: l?.status,
|
|
123
|
+
startDate: l?.startDate ? new Date(l.startDate).toISOString().split("T")[0] : (/* @__PURE__ */ new Date()).toISOString().split("T")[0],
|
|
124
|
+
trialEndDate: l?.trialEndDate ? new Date(l.trialEndDate).toISOString().split("T")[0] : void 0
|
|
125
|
+
}, { register: T, handleSubmit: E, formState: { errors: D, isSubmitting: O }, reset: k, watch: A } = o({
|
|
126
|
+
resolver: s(_),
|
|
127
|
+
defaultValues: w
|
|
128
|
+
});
|
|
129
|
+
f.useEffect(() => {
|
|
130
|
+
e && k(w);
|
|
131
|
+
}, [
|
|
132
|
+
e,
|
|
133
|
+
l?.id,
|
|
134
|
+
u
|
|
135
|
+
]);
|
|
136
|
+
let j = async (e) => {
|
|
137
|
+
try {
|
|
138
|
+
await x({
|
|
139
|
+
...e,
|
|
140
|
+
id: l?.id
|
|
141
|
+
}), c();
|
|
142
|
+
} catch (e) {
|
|
143
|
+
console.error("Failed to save subscription:", e);
|
|
144
|
+
}
|
|
145
|
+
}, M = A("plan"), N = A("billingCycle"), P = A("seats") || 1, F = {
|
|
146
|
+
Free: 0,
|
|
147
|
+
Starter: 29,
|
|
148
|
+
Professional: 99,
|
|
149
|
+
Enterprise: 299,
|
|
150
|
+
Custom: 0
|
|
151
|
+
}[M] || 0, I = N === "yearly" ? .8 : 1, L = F * P * I * (N === "yearly" ? 12 : 1);
|
|
152
|
+
return /* @__PURE__ */ p(i, {
|
|
153
|
+
open: e,
|
|
154
|
+
onClose: c,
|
|
155
|
+
title: S ? "Edit Subscription" : "Create Subscription",
|
|
156
|
+
description: S ? "Modify subscription details" : "Set up a new subscription for a tenant",
|
|
157
|
+
width: "md",
|
|
158
|
+
footer: /* @__PURE__ */ p(a, {
|
|
159
|
+
formId: C,
|
|
160
|
+
submitLabel: S ? "Save Changes" : "Create Subscription",
|
|
161
|
+
onCancel: c,
|
|
162
|
+
isSubmitting: O
|
|
163
|
+
}),
|
|
164
|
+
children: /* @__PURE__ */ m("form", {
|
|
165
|
+
id: C,
|
|
166
|
+
onSubmit: E(j),
|
|
167
|
+
className: "space-y-6",
|
|
168
|
+
children: [
|
|
169
|
+
d.length > 0 && !u && /* @__PURE__ */ p(r, { children: /* @__PURE__ */ p(h, {
|
|
170
|
+
label: "Tenant",
|
|
171
|
+
required: !0,
|
|
172
|
+
error: D.tenantId?.message,
|
|
173
|
+
description: "Select the tenant for this subscription",
|
|
174
|
+
children: /* @__PURE__ */ p(g, {
|
|
175
|
+
...T("tenantId"),
|
|
176
|
+
options: d.map((e) => ({
|
|
177
|
+
value: e.id,
|
|
178
|
+
label: e.name
|
|
179
|
+
})),
|
|
180
|
+
placeholder: "Select a tenant..."
|
|
181
|
+
})
|
|
182
|
+
}) }),
|
|
183
|
+
/* @__PURE__ */ m(r, {
|
|
184
|
+
title: "Plan Details",
|
|
185
|
+
children: [
|
|
186
|
+
/* @__PURE__ */ m(n, { children: [/* @__PURE__ */ p(h, {
|
|
187
|
+
label: "Plan",
|
|
188
|
+
required: !0,
|
|
189
|
+
children: /* @__PURE__ */ p(g, {
|
|
190
|
+
...T("plan"),
|
|
191
|
+
options: v
|
|
192
|
+
})
|
|
193
|
+
}), /* @__PURE__ */ p(h, {
|
|
194
|
+
label: "Billing Cycle",
|
|
195
|
+
required: !0,
|
|
196
|
+
children: /* @__PURE__ */ p(g, {
|
|
197
|
+
...T("billingCycle"),
|
|
198
|
+
options: y
|
|
199
|
+
})
|
|
200
|
+
})] }),
|
|
201
|
+
/* @__PURE__ */ p(h, {
|
|
202
|
+
label: "Seats",
|
|
203
|
+
required: !0,
|
|
204
|
+
error: D.seats?.message,
|
|
205
|
+
description: "Number of user seats included",
|
|
206
|
+
children: /* @__PURE__ */ p(t, {
|
|
207
|
+
type: "number",
|
|
208
|
+
...T("seats"),
|
|
209
|
+
placeholder: "1",
|
|
210
|
+
min: 1,
|
|
211
|
+
max: 1e4
|
|
212
|
+
})
|
|
213
|
+
}),
|
|
214
|
+
S && /* @__PURE__ */ p(h, {
|
|
215
|
+
label: "Status",
|
|
216
|
+
children: /* @__PURE__ */ p(g, {
|
|
217
|
+
...T("status"),
|
|
218
|
+
options: b
|
|
219
|
+
})
|
|
220
|
+
})
|
|
221
|
+
]
|
|
222
|
+
}),
|
|
223
|
+
/* @__PURE__ */ p(r, {
|
|
224
|
+
title: "Dates",
|
|
225
|
+
children: /* @__PURE__ */ m(n, { children: [/* @__PURE__ */ p(h, {
|
|
226
|
+
label: "Start Date",
|
|
227
|
+
error: D.startDate?.message,
|
|
228
|
+
children: /* @__PURE__ */ p(t, {
|
|
229
|
+
type: "date",
|
|
230
|
+
...T("startDate")
|
|
231
|
+
})
|
|
232
|
+
}), /* @__PURE__ */ p(h, {
|
|
233
|
+
label: "Trial End Date",
|
|
234
|
+
error: D.trialEndDate?.message,
|
|
235
|
+
description: "Leave empty for no trial",
|
|
236
|
+
children: /* @__PURE__ */ p(t, {
|
|
237
|
+
type: "date",
|
|
238
|
+
...T("trialEndDate")
|
|
239
|
+
})
|
|
240
|
+
})] })
|
|
241
|
+
}),
|
|
242
|
+
M !== "Custom" && F > 0 && /* @__PURE__ */ p(r, {
|
|
243
|
+
title: "Cost Summary",
|
|
244
|
+
children: /* @__PURE__ */ p("div", {
|
|
245
|
+
className: "rounded-lg border border-border bg-muted/30 p-4",
|
|
246
|
+
children: /* @__PURE__ */ m("div", {
|
|
247
|
+
className: "space-y-2",
|
|
248
|
+
children: [
|
|
249
|
+
/* @__PURE__ */ m("div", {
|
|
250
|
+
className: "flex justify-between text-sm",
|
|
251
|
+
children: [/* @__PURE__ */ p("span", {
|
|
252
|
+
className: "text-muted-foreground",
|
|
253
|
+
children: "Base Price"
|
|
254
|
+
}), /* @__PURE__ */ m("span", { children: [
|
|
255
|
+
"$",
|
|
256
|
+
F,
|
|
257
|
+
"/user/month"
|
|
258
|
+
] })]
|
|
259
|
+
}),
|
|
260
|
+
/* @__PURE__ */ m("div", {
|
|
261
|
+
className: "flex justify-between text-sm",
|
|
262
|
+
children: [/* @__PURE__ */ p("span", {
|
|
263
|
+
className: "text-muted-foreground",
|
|
264
|
+
children: "Seats"
|
|
265
|
+
}), /* @__PURE__ */ m("span", { children: ["× ", P] })]
|
|
266
|
+
}),
|
|
267
|
+
N === "yearly" && /* @__PURE__ */ m("div", {
|
|
268
|
+
className: "flex justify-between text-sm text-success",
|
|
269
|
+
children: [/* @__PURE__ */ p("span", { children: "Annual Discount" }), /* @__PURE__ */ p("span", { children: "-20%" })]
|
|
270
|
+
}),
|
|
271
|
+
/* @__PURE__ */ p("div", {
|
|
272
|
+
className: "border-t border-border pt-2 mt-2",
|
|
273
|
+
children: /* @__PURE__ */ m("div", {
|
|
274
|
+
className: "flex justify-between font-medium",
|
|
275
|
+
children: [/* @__PURE__ */ p("span", { children: N === "yearly" ? "Annual Total" : "Monthly Total" }), /* @__PURE__ */ m("span", {
|
|
276
|
+
className: "text-lg",
|
|
277
|
+
children: [
|
|
278
|
+
"$",
|
|
279
|
+
L.toFixed(2),
|
|
280
|
+
/* @__PURE__ */ m("span", {
|
|
281
|
+
className: "text-sm font-normal text-muted-foreground",
|
|
282
|
+
children: ["/", N === "yearly" ? "year" : "month"]
|
|
283
|
+
})
|
|
284
|
+
]
|
|
285
|
+
})]
|
|
286
|
+
})
|
|
287
|
+
})
|
|
288
|
+
]
|
|
289
|
+
})
|
|
290
|
+
})
|
|
291
|
+
})
|
|
292
|
+
]
|
|
293
|
+
})
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
//#endregion
|
|
297
|
+
export { x as SubscriptionForm };
|
|
298
|
+
|
|
299
|
+
//# sourceMappingURL=SubscriptionForm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubscriptionForm.js","names":[],"sources":["../../../../src/admin/components/forms/SubscriptionForm.tsx"],"sourcesContent":["import * as React from 'react';\nimport { useForm } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { z } from 'zod';\nimport { FormSheet, FormSheetFooter, FormSection, FormRow } from '../FormSheet';\nimport { Input } from '../ui';\nimport { cn } from '../../utils/cn';\nimport type { Subscription } from '../../types';\n\n/**\n * Form field wrapper with label and error\n */\ninterface FormFieldProps {\n label: string;\n error?: string;\n required?: boolean;\n children: React.ReactNode;\n description?: string;\n}\n\nfunction FormField({ label, error, required, children, description }: FormFieldProps) {\n return (\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium text-foreground\">\n {label}\n {required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n {children}\n {description && !error && <p className=\"text-xs text-muted-foreground\">{description}</p>}\n {error && <p className=\"text-xs text-destructive\">{error}</p>}\n </div>\n );\n}\n\n/**\n * Select wrapper styled like Input\n */\ninterface SelectFieldProps extends React.SelectHTMLAttributes<HTMLSelectElement> {\n options: { value: string; label: string }[];\n placeholder?: string;\n}\n\nconst SelectField = React.forwardRef<HTMLSelectElement, SelectFieldProps>(\n ({ className, options, placeholder, ...props }, ref) => (\n <select\n ref={ref}\n className={cn(\n 'flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors',\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n {...props}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n )\n);\nSelectField.displayName = 'SelectField';\n\n// Unified form schema (handles both create and edit)\nconst subscriptionFormSchema = z.object({\n tenantId: z.string().min(1, 'Tenant is required'),\n plan: z.enum(['Free', 'Starter', 'Professional', 'Enterprise', 'Custom']),\n billingCycle: z.enum(['monthly', 'yearly']),\n seats: z.coerce.number().int().min(1, 'At least 1 seat is required'),\n status: z.enum(['active', 'cancelled', 'past_due', 'trialing', 'paused']).optional(),\n startDate: z.string().optional(),\n trialEndDate: z.string().optional(),\n});\n\ntype SubscriptionFormData = z.infer<typeof subscriptionFormSchema>;\n\n/**\n * SubscriptionForm props\n */\nexport interface SubscriptionFormProps {\n /** Whether the form is open */\n open: boolean;\n /** Callback when the form should close */\n onClose: () => void;\n /** Existing subscription data for editing (undefined for create) */\n subscription?: Subscription;\n /** Pre-selected tenant ID */\n tenantId?: string;\n /** List of available tenants for selection */\n tenants?: { id: string; name: string }[];\n /** Callback on successful save */\n onSave: (data: SubscriptionFormData & { id?: string }) => Promise<void>;\n}\n\nconst planOptions = [\n { value: 'Free', label: 'Free - $0/mo' },\n { value: 'Starter', label: 'Starter - $29/mo' },\n { value: 'Professional', label: 'Professional - $99/mo' },\n { value: 'Enterprise', label: 'Enterprise - $299/mo' },\n { value: 'Custom', label: 'Custom Pricing' },\n];\n\nconst billingCycleOptions = [\n { value: 'monthly', label: 'Monthly' },\n { value: 'yearly', label: 'Yearly (Save 20%)' },\n];\n\nconst statusOptions = [\n { value: 'active', label: 'Active' },\n { value: 'cancelled', label: 'Cancelled' },\n { value: 'past_due', label: 'Past Due' },\n { value: 'trialing', label: 'Trialing' },\n { value: 'paused', label: 'Paused' },\n];\n\n/**\n * SubscriptionForm - Create/Edit subscription form in a slide-over panel\n */\nexport function SubscriptionForm({\n open,\n onClose,\n subscription,\n tenantId,\n tenants = [],\n onSave,\n}: SubscriptionFormProps) {\n const isEditing = !!subscription;\n const formId = 'subscription-form';\n\n const defaultValues: SubscriptionFormData = {\n tenantId: subscription?.tenantId ?? tenantId ?? '',\n plan: (subscription?.plan ?? 'Starter') as SubscriptionFormData['plan'],\n billingCycle: (subscription?.billingCycle ?? 'monthly') as SubscriptionFormData['billingCycle'],\n seats: subscription?.seats ?? 1,\n status: subscription?.status as SubscriptionFormData['status'],\n startDate: subscription?.startDate\n ? new Date(subscription.startDate).toISOString().split('T')[0]\n : new Date().toISOString().split('T')[0],\n trialEndDate: subscription?.trialEndDate\n ? new Date(subscription.trialEndDate).toISOString().split('T')[0]\n : undefined,\n };\n\n const {\n register,\n handleSubmit,\n formState: { errors, isSubmitting },\n reset,\n watch,\n } = useForm<SubscriptionFormData>({\n resolver: zodResolver(subscriptionFormSchema),\n defaultValues,\n });\n\n // Reset form when subscription or tenantId changes\n React.useEffect(() => {\n if (open) {\n reset(defaultValues);\n }\n }, [open, subscription?.id, tenantId]);\n\n const onSubmit = async (data: SubscriptionFormData) => {\n try {\n await onSave({ ...data, id: subscription?.id });\n onClose();\n } catch (error) {\n console.error('Failed to save subscription:', error);\n }\n };\n\n // Calculate estimated cost\n const plan = watch('plan');\n const billingCycle = watch('billingCycle');\n const seats = watch('seats') || 1;\n\n const planPrices: Record<string, number> = {\n Free: 0,\n Starter: 29,\n Professional: 99,\n Enterprise: 299,\n Custom: 0,\n };\n\n const monthlyPrice = planPrices[plan] || 0;\n const yearlyMultiplier = billingCycle === 'yearly' ? 0.8 : 1; // 20% discount for yearly\n const estimatedCost = monthlyPrice * seats * yearlyMultiplier;\n const billingPeriod = billingCycle === 'yearly' ? 12 : 1;\n const totalPerPeriod = estimatedCost * billingPeriod;\n\n return (\n <FormSheet\n open={open}\n onClose={onClose}\n title={isEditing ? 'Edit Subscription' : 'Create Subscription'}\n description={\n isEditing ? 'Modify subscription details' : 'Set up a new subscription for a tenant'\n }\n width=\"md\"\n footer={\n <FormSheetFooter\n formId={formId}\n submitLabel={isEditing ? 'Save Changes' : 'Create Subscription'}\n onCancel={onClose}\n isSubmitting={isSubmitting}\n />\n }\n >\n <form id={formId} onSubmit={handleSubmit(onSubmit)} className=\"space-y-6\">\n {/* Tenant Selection */}\n {tenants.length > 0 && !tenantId && (\n <FormSection>\n <FormField\n label=\"Tenant\"\n required\n error={errors.tenantId?.message}\n description=\"Select the tenant for this subscription\"\n >\n <SelectField\n {...register('tenantId')}\n options={tenants.map((t) => ({ value: t.id, label: t.name }))}\n placeholder=\"Select a tenant...\"\n />\n </FormField>\n </FormSection>\n )}\n\n {/* Plan Selection */}\n <FormSection title=\"Plan Details\">\n <FormRow>\n <FormField label=\"Plan\" required>\n <SelectField {...register('plan')} options={planOptions} />\n </FormField>\n\n <FormField label=\"Billing Cycle\" required>\n <SelectField {...register('billingCycle')} options={billingCycleOptions} />\n </FormField>\n </FormRow>\n\n <FormField\n label=\"Seats\"\n required\n error={errors.seats?.message}\n description=\"Number of user seats included\"\n >\n <Input type=\"number\" {...register('seats')} placeholder=\"1\" min={1} max={10000} />\n </FormField>\n\n {isEditing && (\n <FormField label=\"Status\">\n <SelectField {...register('status')} options={statusOptions} />\n </FormField>\n )}\n </FormSection>\n\n {/* Dates */}\n <FormSection title=\"Dates\">\n <FormRow>\n <FormField label=\"Start Date\" error={errors.startDate?.message}>\n <Input type=\"date\" {...register('startDate')} />\n </FormField>\n\n <FormField\n label=\"Trial End Date\"\n error={errors.trialEndDate?.message}\n description=\"Leave empty for no trial\"\n >\n <Input type=\"date\" {...register('trialEndDate')} />\n </FormField>\n </FormRow>\n </FormSection>\n\n {/* Cost Summary */}\n {plan !== 'Custom' && monthlyPrice > 0 && (\n <FormSection title=\"Cost Summary\">\n <div className=\"rounded-lg border border-border bg-muted/30 p-4\">\n <div className=\"space-y-2\">\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-muted-foreground\">Base Price</span>\n <span>${monthlyPrice}/user/month</span>\n </div>\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-muted-foreground\">Seats</span>\n <span>× {seats}</span>\n </div>\n {billingCycle === 'yearly' && (\n <div className=\"flex justify-between text-sm text-success\">\n <span>Annual Discount</span>\n <span>-20%</span>\n </div>\n )}\n <div className=\"border-t border-border pt-2 mt-2\">\n <div className=\"flex justify-between font-medium\">\n <span>{billingCycle === 'yearly' ? 'Annual Total' : 'Monthly Total'}</span>\n <span className=\"text-lg\">\n ${totalPerPeriod.toFixed(2)}\n <span className=\"text-sm font-normal text-muted-foreground\">\n /{billingCycle === 'yearly' ? 'year' : 'month'}\n </span>\n </span>\n </div>\n </div>\n </div>\n </div>\n </FormSection>\n )}\n </form>\n </FormSheet>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { Tenant } from '../../types';
|
|
3
|
+
|
|
4
|
+
declare function buildTenantFormSchema(tr: (key: string, fallback: string) => string): z.ZodObject<{
|
|
5
|
+
name: z.ZodString;
|
|
6
|
+
slug: z.ZodString;
|
|
7
|
+
domain: z.ZodOptional<z.ZodString>;
|
|
8
|
+
ownerEmail: z.ZodString;
|
|
9
|
+
billingEmail: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
|
|
10
|
+
plan: z.ZodString;
|
|
11
|
+
status: z.ZodOptional<z.ZodString>;
|
|
12
|
+
settings: z.ZodOptional<z.ZodObject<{
|
|
13
|
+
allowSignup: z.ZodBoolean;
|
|
14
|
+
ssoEnabled: z.ZodBoolean;
|
|
15
|
+
mfaRequired: z.ZodBoolean;
|
|
16
|
+
dataRetentionDays: z.ZodNumber;
|
|
17
|
+
}, "strip", z.ZodTypeAny, {
|
|
18
|
+
allowSignup: boolean;
|
|
19
|
+
ssoEnabled: boolean;
|
|
20
|
+
mfaRequired: boolean;
|
|
21
|
+
dataRetentionDays: number;
|
|
22
|
+
}, {
|
|
23
|
+
allowSignup: boolean;
|
|
24
|
+
ssoEnabled: boolean;
|
|
25
|
+
mfaRequired: boolean;
|
|
26
|
+
dataRetentionDays: number;
|
|
27
|
+
}>>;
|
|
28
|
+
}, "strip", z.ZodTypeAny, {
|
|
29
|
+
name: string;
|
|
30
|
+
slug: string;
|
|
31
|
+
ownerEmail: string;
|
|
32
|
+
plan: string;
|
|
33
|
+
status?: string | undefined;
|
|
34
|
+
settings?: {
|
|
35
|
+
allowSignup: boolean;
|
|
36
|
+
ssoEnabled: boolean;
|
|
37
|
+
mfaRequired: boolean;
|
|
38
|
+
dataRetentionDays: number;
|
|
39
|
+
} | undefined;
|
|
40
|
+
domain?: string | undefined;
|
|
41
|
+
billingEmail?: string | undefined;
|
|
42
|
+
}, {
|
|
43
|
+
name: string;
|
|
44
|
+
slug: string;
|
|
45
|
+
ownerEmail: string;
|
|
46
|
+
plan: string;
|
|
47
|
+
status?: string | undefined;
|
|
48
|
+
settings?: {
|
|
49
|
+
allowSignup: boolean;
|
|
50
|
+
ssoEnabled: boolean;
|
|
51
|
+
mfaRequired: boolean;
|
|
52
|
+
dataRetentionDays: number;
|
|
53
|
+
} | undefined;
|
|
54
|
+
domain?: string | undefined;
|
|
55
|
+
billingEmail?: string | undefined;
|
|
56
|
+
}>;
|
|
57
|
+
type TenantFormData = z.infer<ReturnType<typeof buildTenantFormSchema>>;
|
|
58
|
+
export interface TenantFormProps {
|
|
59
|
+
open: boolean;
|
|
60
|
+
onClose: () => void;
|
|
61
|
+
tenant?: Tenant;
|
|
62
|
+
onSave: (data: TenantFormData & {
|
|
63
|
+
id?: string;
|
|
64
|
+
}) => Promise<void>;
|
|
65
|
+
}
|
|
66
|
+
export declare function TenantForm({ open, onClose, tenant, onSave }: TenantFormProps): import("react/jsx-runtime").JSX.Element;
|
|
67
|
+
export {};
|
|
68
|
+
//# sourceMappingURL=TenantForm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TenantForm.d.ts","sourceRoot":"","sources":["../../../../src/admin/components/forms/TenantForm.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AA0F1C,iBAAS,qBAAqB,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0C3E;AAED,KAAK,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC,CAAC;AAExE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,CAAC,IAAI,EAAE,cAAc,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACnE;AAED,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,eAAe,2CAwV5E"}
|