@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,164 @@
|
|
|
1
|
+
import { Badge as e, Button as t } from "../components/ui.js";
|
|
2
|
+
import { PageLayout as n } from "../components/PageLayout.js";
|
|
3
|
+
import { formatCurrency as r, formatDateTime as i } from "../utils/formatters.js";
|
|
4
|
+
import { MetricCard as a, MetricsGrid as o } from "../components/MetricCard.js";
|
|
5
|
+
import { DataTable as s } from "../components/DataTable.js";
|
|
6
|
+
import "../components/index.js";
|
|
7
|
+
import { useListAllPlansQuery as c, useListAllQuotasQuery as l, useListRefundRecordsQuery as u } from "../../generated/global-operations.js";
|
|
8
|
+
import { ArrowUpRight as d, CreditCard as f, Download as p, Plus as m, Receipt as h, Shield as g } from "lucide-react";
|
|
9
|
+
import { jsx as _, jsxs as v } from "react/jsx-runtime";
|
|
10
|
+
//#region src/admin/pages/BillingPage.tsx
|
|
11
|
+
function y() {
|
|
12
|
+
let { data: y, loading: b } = c(), { data: x, loading: S } = l(), { data: C, loading: w } = u({ variables: {
|
|
13
|
+
page: 1,
|
|
14
|
+
pageSize: 10
|
|
15
|
+
} }), T = y?.getAllPlans || [], E = x?.getAllQuotas || [], D = C?.getRefundRecords?.records || [];
|
|
16
|
+
return /* @__PURE__ */ _(n, {
|
|
17
|
+
title: "Billing & Subscriptions",
|
|
18
|
+
description: "Manage platform-wide plans, quotas, and refunds",
|
|
19
|
+
actions: /* @__PURE__ */ v("div", {
|
|
20
|
+
className: "flex gap-2",
|
|
21
|
+
children: [/* @__PURE__ */ v(t, {
|
|
22
|
+
variant: "outline",
|
|
23
|
+
children: [/* @__PURE__ */ _(p, { className: "mr-2 h-4 w-4" }), "Export Audit"]
|
|
24
|
+
}), /* @__PURE__ */ v(t, { children: [/* @__PURE__ */ _(m, { className: "mr-2 h-4 w-4" }), "Create Plan"] })]
|
|
25
|
+
}),
|
|
26
|
+
children: /* @__PURE__ */ v("div", {
|
|
27
|
+
className: "space-y-8",
|
|
28
|
+
children: [
|
|
29
|
+
/* @__PURE__ */ v(o, { children: [
|
|
30
|
+
/* @__PURE__ */ _(a, {
|
|
31
|
+
title: "Total Revenue (30d)",
|
|
32
|
+
value: "$124,500",
|
|
33
|
+
icon: /* @__PURE__ */ _(f, { className: "h-4 w-4" }),
|
|
34
|
+
trend: "up"
|
|
35
|
+
}),
|
|
36
|
+
/* @__PURE__ */ _(a, {
|
|
37
|
+
title: "Active Subscriptions",
|
|
38
|
+
value: "1,248",
|
|
39
|
+
icon: /* @__PURE__ */ _(g, { className: "h-4 w-4" })
|
|
40
|
+
}),
|
|
41
|
+
/* @__PURE__ */ _(a, {
|
|
42
|
+
title: "Pending Refunds",
|
|
43
|
+
value: C?.getRefundRecords?.totalCount ?? 0,
|
|
44
|
+
icon: /* @__PURE__ */ _(d, { className: "h-4 w-4" }),
|
|
45
|
+
priority: "high"
|
|
46
|
+
}),
|
|
47
|
+
/* @__PURE__ */ _(a, {
|
|
48
|
+
title: "Upcoming Invoices",
|
|
49
|
+
value: "42",
|
|
50
|
+
icon: /* @__PURE__ */ _(h, { className: "h-4 w-4" })
|
|
51
|
+
})
|
|
52
|
+
] }),
|
|
53
|
+
/* @__PURE__ */ v("div", {
|
|
54
|
+
className: "grid gap-8 lg:grid-cols-2",
|
|
55
|
+
children: [/* @__PURE__ */ v("div", {
|
|
56
|
+
className: "space-y-4",
|
|
57
|
+
children: [/* @__PURE__ */ _("h2", {
|
|
58
|
+
className: "text-lg font-semibold",
|
|
59
|
+
children: "Platform Plans"
|
|
60
|
+
}), /* @__PURE__ */ _(s, {
|
|
61
|
+
columns: [
|
|
62
|
+
{
|
|
63
|
+
key: "name",
|
|
64
|
+
header: "Plan Name",
|
|
65
|
+
render: (e) => /* @__PURE__ */ _("span", {
|
|
66
|
+
className: "font-medium",
|
|
67
|
+
children: e.name
|
|
68
|
+
})
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
key: "price",
|
|
72
|
+
header: "Price",
|
|
73
|
+
render: (e) => r(e.price, e.currency)
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
key: "duration",
|
|
77
|
+
header: "Interval"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
key: "isActive",
|
|
81
|
+
header: "Status",
|
|
82
|
+
render: (t) => /* @__PURE__ */ _(e, {
|
|
83
|
+
variant: t.isActive ? "success" : "secondary",
|
|
84
|
+
children: t.isActive ? "Active" : "Inactive"
|
|
85
|
+
})
|
|
86
|
+
}
|
|
87
|
+
],
|
|
88
|
+
data: T,
|
|
89
|
+
keyExtractor: (e) => e.id,
|
|
90
|
+
loading: b
|
|
91
|
+
})]
|
|
92
|
+
}), /* @__PURE__ */ v("div", {
|
|
93
|
+
className: "space-y-4",
|
|
94
|
+
children: [/* @__PURE__ */ _("h2", {
|
|
95
|
+
className: "text-lg font-semibold",
|
|
96
|
+
children: "Resource Quotas"
|
|
97
|
+
}), /* @__PURE__ */ _(s, {
|
|
98
|
+
columns: [
|
|
99
|
+
{
|
|
100
|
+
key: "name",
|
|
101
|
+
header: "Quota Name"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
key: "quotaType",
|
|
105
|
+
header: "Metric Type"
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
key: "isActive",
|
|
109
|
+
header: "Status",
|
|
110
|
+
render: (t) => /* @__PURE__ */ _(e, {
|
|
111
|
+
variant: t.isActive ? "success" : "secondary",
|
|
112
|
+
children: t.isActive ? "Active" : "Inactive"
|
|
113
|
+
})
|
|
114
|
+
}
|
|
115
|
+
],
|
|
116
|
+
data: E,
|
|
117
|
+
keyExtractor: (e) => e.id,
|
|
118
|
+
loading: S
|
|
119
|
+
})]
|
|
120
|
+
})]
|
|
121
|
+
}),
|
|
122
|
+
/* @__PURE__ */ v("div", {
|
|
123
|
+
className: "space-y-4",
|
|
124
|
+
children: [/* @__PURE__ */ _("h2", {
|
|
125
|
+
className: "text-lg font-semibold",
|
|
126
|
+
children: "Recent Refund Records"
|
|
127
|
+
}), /* @__PURE__ */ _(s, {
|
|
128
|
+
columns: [
|
|
129
|
+
{
|
|
130
|
+
key: "amount",
|
|
131
|
+
header: "Amount",
|
|
132
|
+
render: (e) => r(e.amount, e.currency)
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
key: "status",
|
|
136
|
+
header: "Status",
|
|
137
|
+
render: (t) => /* @__PURE__ */ _(e, {
|
|
138
|
+
variant: t.status === "COMPLETED" ? "success" : "warning",
|
|
139
|
+
children: t.status
|
|
140
|
+
})
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
key: "reason",
|
|
144
|
+
header: "Reason"
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
key: "createdAt",
|
|
148
|
+
header: "Date",
|
|
149
|
+
render: (e) => i(e.createdAt)
|
|
150
|
+
}
|
|
151
|
+
],
|
|
152
|
+
data: D,
|
|
153
|
+
keyExtractor: (e) => e.id,
|
|
154
|
+
loading: w
|
|
155
|
+
})]
|
|
156
|
+
})
|
|
157
|
+
]
|
|
158
|
+
})
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
//#endregion
|
|
162
|
+
export { y as BillingPage };
|
|
163
|
+
|
|
164
|
+
//# sourceMappingURL=BillingPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BillingPage.js","names":[],"sources":["../../../src/admin/pages/BillingPage.tsx"],"sourcesContent":["import { CreditCard, Plus, ArrowUpRight, Shield, Receipt, Download } from 'lucide-react';\nimport { PageLayout, Button, DataTable, Badge, MetricCard, MetricsGrid } from '../components';\nimport {\n useListAllPlansQuery,\n useListAllQuotasQuery,\n useListRefundRecordsQuery,\n} from '../../generated/global-operations';\nimport { formatCurrency, formatDateTime } from '../utils/formatters';\n\nexport function BillingPage() {\n const { data: plansData, loading: plansLoading } = useListAllPlansQuery();\n const { data: quotasData, loading: quotasLoading } = useListAllQuotasQuery();\n const { data: refundsData, loading: refundsLoading } = useListRefundRecordsQuery({\n variables: { page: 1, pageSize: 10 },\n });\n\n const plans = plansData?.getAllPlans || [];\n const quotas = quotasData?.getAllQuotas || [];\n const refunds = refundsData?.getRefundRecords?.records || [];\n\n const planColumns = [\n {\n key: 'name',\n header: 'Plan Name',\n render: (plan: any) => <span className=\"font-medium\">{plan.name}</span>,\n },\n {\n key: 'price',\n header: 'Price',\n render: (plan: any) => formatCurrency(plan.price, plan.currency),\n },\n {\n key: 'duration',\n header: 'Interval',\n },\n {\n key: 'isActive',\n header: 'Status',\n render: (plan: any) => (\n <Badge variant={plan.isActive ? 'success' : 'secondary'}>\n {plan.isActive ? 'Active' : 'Inactive'}\n </Badge>\n ),\n },\n ];\n\n const quotaColumns = [\n {\n key: 'name',\n header: 'Quota Name',\n },\n {\n key: 'quotaType',\n header: 'Metric Type',\n },\n {\n key: 'isActive',\n header: 'Status',\n render: (quota: any) => (\n <Badge variant={quota.isActive ? 'success' : 'secondary'}>\n {quota.isActive ? 'Active' : 'Inactive'}\n </Badge>\n ),\n },\n ];\n\n const refundColumns = [\n {\n key: 'amount',\n header: 'Amount',\n render: (refund: any) => formatCurrency(refund.amount, refund.currency),\n },\n {\n key: 'status',\n header: 'Status',\n render: (refund: any) => (\n <Badge variant={refund.status === 'COMPLETED' ? 'success' : 'warning'}>\n {refund.status}\n </Badge>\n ),\n },\n {\n key: 'reason',\n header: 'Reason',\n },\n {\n key: 'createdAt',\n header: 'Date',\n render: (refund: any) => formatDateTime(refund.createdAt),\n },\n ];\n\n return (\n <PageLayout\n title=\"Billing & Subscriptions\"\n description=\"Manage platform-wide plans, quotas, and refunds\"\n actions={\n <div className=\"flex gap-2\">\n <Button variant=\"outline\">\n <Download className=\"mr-2 h-4 w-4\" />\n Export Audit\n </Button>\n <Button>\n <Plus className=\"mr-2 h-4 w-4\" />\n Create Plan\n </Button>\n </div>\n }\n >\n <div className=\"space-y-8\">\n <MetricsGrid>\n <MetricCard\n title=\"Total Revenue (30d)\"\n value=\"$124,500\"\n icon={<CreditCard className=\"h-4 w-4\" />}\n trend=\"up\"\n />\n <MetricCard\n title=\"Active Subscriptions\"\n value=\"1,248\"\n icon={<Shield className=\"h-4 w-4\" />}\n />\n <MetricCard\n title=\"Pending Refunds\"\n value={refundsData?.getRefundRecords?.totalCount ?? 0}\n icon={<ArrowUpRight className=\"h-4 w-4\" />}\n priority=\"high\"\n />\n <MetricCard title=\"Upcoming Invoices\" value=\"42\" icon={<Receipt className=\"h-4 w-4\" />} />\n </MetricsGrid>\n\n <div className=\"grid gap-8 lg:grid-cols-2\">\n <div className=\"space-y-4\">\n <h2 className=\"text-lg font-semibold\">Platform Plans</h2>\n <DataTable\n columns={planColumns}\n data={plans}\n keyExtractor={(p) => p.id}\n loading={plansLoading}\n />\n </div>\n <div className=\"space-y-4\">\n <h2 className=\"text-lg font-semibold\">Resource Quotas</h2>\n <DataTable\n columns={quotaColumns}\n data={quotas}\n keyExtractor={(q) => q.id}\n loading={quotasLoading}\n />\n </div>\n </div>\n\n <div className=\"space-y-4\">\n <h2 className=\"text-lg font-semibold\">Recent Refund Records</h2>\n <DataTable\n columns={refundColumns}\n data={refunds}\n keyExtractor={(r) => r.id}\n loading={refundsLoading}\n />\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommunicationsPage.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/CommunicationsPage.tsx"],"names":[],"mappings":"AAiBA,wBAAgB,kBAAkB,4CAoIjC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { Badge as e, Button as t, EmptyState as n } from "../components/ui.js";
|
|
2
|
+
import { PageLayout as r } from "../components/PageLayout.js";
|
|
3
|
+
import { formatDateTime as i, formatPercentage as a } from "../utils/formatters.js";
|
|
4
|
+
import { MetricCard as o, MetricsGrid as s } from "../components/MetricCard.js";
|
|
5
|
+
import { DataTable as c } from "../components/DataTable.js";
|
|
6
|
+
import "../components/index.js";
|
|
7
|
+
import { useGetNewsletterStatsQuery as l, useListNewslettersQuery as u, useSendNewsletterMutation as d } from "../../generated/global-operations.js";
|
|
8
|
+
import { Eye as f, Mail as p, MousePointer2 as m, Plus as h, Send as g, Users as _ } from "lucide-react";
|
|
9
|
+
import { jsx as v, jsxs as y } from "react/jsx-runtime";
|
|
10
|
+
//#region src/admin/pages/CommunicationsPage.tsx
|
|
11
|
+
function b() {
|
|
12
|
+
let { data: b, loading: x } = l(), { data: S, loading: C, refetch: w } = u({ variables: { limit: 50 } }), [T] = d(), E = b?.newsletterStats, D = S?.newsletters || [], O = async (e) => {
|
|
13
|
+
if (confirm("Are you sure you want to send this newsletter to all subscribers?")) try {
|
|
14
|
+
await T({ variables: { id: e } }), w();
|
|
15
|
+
} catch (e) {
|
|
16
|
+
console.error("Failed to send newsletter:", e);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
return /* @__PURE__ */ v(r, {
|
|
20
|
+
title: "Communications",
|
|
21
|
+
description: "Manage platform newsletters and system notifications",
|
|
22
|
+
actions: /* @__PURE__ */ y(t, { children: [/* @__PURE__ */ v(h, { className: "mr-2 h-4 w-4" }), "Create Newsletter"] }),
|
|
23
|
+
children: /* @__PURE__ */ y("div", {
|
|
24
|
+
className: "space-y-8",
|
|
25
|
+
children: [/* @__PURE__ */ y(s, { children: [
|
|
26
|
+
/* @__PURE__ */ v(o, {
|
|
27
|
+
title: "Total Subscribers",
|
|
28
|
+
value: E?.totalSubscribers ?? 0,
|
|
29
|
+
loading: x,
|
|
30
|
+
icon: /* @__PURE__ */ v(_, { className: "h-4 w-4" })
|
|
31
|
+
}),
|
|
32
|
+
/* @__PURE__ */ v(o, {
|
|
33
|
+
title: "Newsletters Sent",
|
|
34
|
+
value: E?.totalSent ?? 0,
|
|
35
|
+
loading: x,
|
|
36
|
+
icon: /* @__PURE__ */ v(g, { className: "h-4 w-4" })
|
|
37
|
+
}),
|
|
38
|
+
/* @__PURE__ */ v(o, {
|
|
39
|
+
title: "Avg. Open Rate",
|
|
40
|
+
value: a(E?.averageOpenRate ?? 0),
|
|
41
|
+
loading: x,
|
|
42
|
+
icon: /* @__PURE__ */ v(f, { className: "h-4 w-4" })
|
|
43
|
+
}),
|
|
44
|
+
/* @__PURE__ */ v(o, {
|
|
45
|
+
title: "Avg. Click Rate",
|
|
46
|
+
value: a(E?.averageClickRate ?? 0),
|
|
47
|
+
loading: x,
|
|
48
|
+
icon: /* @__PURE__ */ v(m, { className: "h-4 w-4" })
|
|
49
|
+
})
|
|
50
|
+
] }), /* @__PURE__ */ y("div", {
|
|
51
|
+
className: "space-y-4",
|
|
52
|
+
children: [/* @__PURE__ */ v("h2", {
|
|
53
|
+
className: "text-lg font-semibold",
|
|
54
|
+
children: "Newsletters"
|
|
55
|
+
}), /* @__PURE__ */ v(c, {
|
|
56
|
+
columns: [
|
|
57
|
+
{
|
|
58
|
+
key: "title",
|
|
59
|
+
header: "Title",
|
|
60
|
+
render: (e) => /* @__PURE__ */ y("div", {
|
|
61
|
+
className: "flex flex-col",
|
|
62
|
+
children: [/* @__PURE__ */ v("span", {
|
|
63
|
+
className: "font-medium text-foreground",
|
|
64
|
+
children: e.title
|
|
65
|
+
}), /* @__PURE__ */ v("span", {
|
|
66
|
+
className: "text-xs text-muted-foreground",
|
|
67
|
+
children: e.subject
|
|
68
|
+
})]
|
|
69
|
+
})
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
key: "status",
|
|
73
|
+
header: "Status",
|
|
74
|
+
render: (t) => /* @__PURE__ */ v(e, {
|
|
75
|
+
variant: {
|
|
76
|
+
SENT: "success",
|
|
77
|
+
SCHEDULED: "warning",
|
|
78
|
+
DRAFT: "secondary"
|
|
79
|
+
}[t.status] || "outline",
|
|
80
|
+
children: t.status
|
|
81
|
+
})
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
key: "sentAt",
|
|
85
|
+
header: "Sent Date",
|
|
86
|
+
render: (e) => e.sentAt ? i(e.sentAt) : "-"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
key: "actions",
|
|
90
|
+
header: "",
|
|
91
|
+
align: "right",
|
|
92
|
+
render: (e) => /* @__PURE__ */ v("div", {
|
|
93
|
+
className: "flex justify-end gap-2",
|
|
94
|
+
children: e.status === "DRAFT" && /* @__PURE__ */ y(t, {
|
|
95
|
+
size: "sm",
|
|
96
|
+
onClick: () => O(e.id),
|
|
97
|
+
children: [/* @__PURE__ */ v(g, { className: "mr-2 h-3 w-3" }), "Send Now"]
|
|
98
|
+
})
|
|
99
|
+
})
|
|
100
|
+
}
|
|
101
|
+
],
|
|
102
|
+
data: D,
|
|
103
|
+
keyExtractor: (e) => e.id,
|
|
104
|
+
loading: C,
|
|
105
|
+
emptyState: /* @__PURE__ */ v(n, {
|
|
106
|
+
icon: /* @__PURE__ */ v(p, { className: "h-8 w-8" }),
|
|
107
|
+
title: "No newsletters found",
|
|
108
|
+
description: "Create your first newsletter to communicate with users"
|
|
109
|
+
})
|
|
110
|
+
})]
|
|
111
|
+
})]
|
|
112
|
+
})
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
//#endregion
|
|
116
|
+
export { b as CommunicationsPage };
|
|
117
|
+
|
|
118
|
+
//# sourceMappingURL=CommunicationsPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommunicationsPage.js","names":[],"sources":["../../../src/admin/pages/CommunicationsPage.tsx"],"sourcesContent":["import { Mail, Plus, Send, Users, Eye, MousePointer2 } from 'lucide-react';\nimport {\n PageLayout,\n Button,\n DataTable,\n Badge,\n MetricCard,\n MetricsGrid,\n EmptyState,\n} from '../components';\nimport {\n useListNewslettersQuery,\n useGetNewsletterStatsQuery,\n useSendNewsletterMutation,\n} from '../../generated/global-operations';\nimport { formatDateTime, formatPercentage } from '../utils/formatters';\n\nexport function CommunicationsPage() {\n const { data: statsData, loading: statsLoading } = useGetNewsletterStatsQuery();\n const {\n data: listData,\n loading: listLoading,\n refetch,\n } = useListNewslettersQuery({\n variables: { limit: 50 },\n });\n\n const [sendNewsletter] = useSendNewsletterMutation();\n\n const stats = statsData?.newsletterStats;\n const newsletters = listData?.newsletters || [];\n\n const handleSend = async (id: string) => {\n if (confirm('Are you sure you want to send this newsletter to all subscribers?')) {\n try {\n await sendNewsletter({ variables: { id } });\n refetch();\n } catch (err) {\n console.error('Failed to send newsletter:', err);\n }\n }\n };\n\n const columns = [\n {\n key: 'title',\n header: 'Title',\n render: (news: any) => (\n <div className=\"flex flex-col\">\n <span className=\"font-medium text-foreground\">{news.title}</span>\n <span className=\"text-xs text-muted-foreground\">{news.subject}</span>\n </div>\n ),\n },\n {\n key: 'status',\n header: 'Status',\n render: (news: any) => {\n const variants: Record<\n string,\n 'default' | 'secondary' | 'success' | 'warning' | 'destructive' | 'outline'\n > = {\n SENT: 'success',\n SCHEDULED: 'warning',\n DRAFT: 'secondary',\n };\n return <Badge variant={variants[news.status] || 'outline'}>{news.status}</Badge>;\n },\n },\n {\n key: 'sentAt',\n header: 'Sent Date',\n render: (news: any) => (news.sentAt ? formatDateTime(news.sentAt) : '-'),\n },\n {\n key: 'actions',\n header: '',\n align: 'right' as const,\n render: (news: any) => (\n <div className=\"flex justify-end gap-2\">\n {news.status === 'DRAFT' && (\n <Button size=\"sm\" onClick={() => handleSend(news.id)}>\n <Send className=\"mr-2 h-3 w-3\" />\n Send Now\n </Button>\n )}\n </div>\n ),\n },\n ];\n\n return (\n <PageLayout\n title=\"Communications\"\n description=\"Manage platform newsletters and system notifications\"\n actions={\n <Button>\n <Plus className=\"mr-2 h-4 w-4\" />\n Create Newsletter\n </Button>\n }\n >\n <div className=\"space-y-8\">\n <MetricsGrid>\n <MetricCard\n title=\"Total Subscribers\"\n value={stats?.totalSubscribers ?? 0}\n loading={statsLoading}\n icon={<Users className=\"h-4 w-4\" />}\n />\n <MetricCard\n title=\"Newsletters Sent\"\n value={stats?.totalSent ?? 0}\n loading={statsLoading}\n icon={<Send className=\"h-4 w-4\" />}\n />\n <MetricCard\n title=\"Avg. Open Rate\"\n value={formatPercentage(stats?.averageOpenRate ?? 0)}\n loading={statsLoading}\n icon={<Eye className=\"h-4 w-4\" />}\n />\n <MetricCard\n title=\"Avg. Click Rate\"\n value={formatPercentage(stats?.averageClickRate ?? 0)}\n loading={statsLoading}\n icon={<MousePointer2 className=\"h-4 w-4\" />}\n />\n </MetricsGrid>\n\n <div className=\"space-y-4\">\n <h2 className=\"text-lg font-semibold\">Newsletters</h2>\n <DataTable\n columns={columns}\n data={newsletters}\n keyExtractor={(n) => n.id}\n loading={listLoading}\n emptyState={\n <EmptyState\n icon={<Mail className=\"h-8 w-8\" />}\n title=\"No newsletters found\"\n description=\"Create your first newsletter to communicate with users\"\n />\n }\n />\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;AAiBA,SAAgB,IAAqB;CACnC,IAAM,EAAE,MAAM,GAAW,SAAS,MAAiB,GAA4B,EACzE,EACJ,MAAM,GACN,SAAS,GACT,eACE,EAAwB,EAC1B,WAAW,EAAE,OAAO,IAAI,EACzB,CAAC,EAEI,CAAC,KAAkB,GAA2B,EAE9C,IAAQ,GAAW,iBACnB,IAAc,GAAU,eAAe,EAAE,EAEzC,IAAa,OAAO,MAAe;AACvC,MAAI,QAAQ,oEAAoE,CAC9E,KAAI;AAEF,GADA,MAAM,EAAe,EAAE,WAAW,EAAE,OAAI,EAAE,CAAC,EAC3C,GAAS;WACF,GAAK;AACZ,WAAQ,MAAM,8BAA8B,EAAI;;;AAqDtD,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,oBAE1B,EAAA,CAAA;YAGX,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD,EAAA,UAAA;IACE,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,GAAO,oBAAoB;KAClC,SAAS;KACT,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;KACnC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,GAAO,aAAa;KAC3B,SAAS;KACT,MAAM,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA;KAClC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,EAAiB,GAAO,mBAAmB,EAAE;KACpD,SAAS;KACT,MAAM,kBAAC,GAAD,EAAK,WAAU,WAAY,CAAA;KACjC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,EAAiB,GAAO,oBAAoB,EAAE;KACrD,SAAS;KACT,MAAM,kBAAC,GAAD,EAAe,WAAU,WAAY,CAAA;KAC3C,CAAA;IACU,EAAA,CAAA,EAEd,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eAAwB;KAAgB,CAAA,EACtD,kBAAC,GAAD;KACW,SA1FH;MACd;OACE,KAAK;OACL,QAAQ;OACR,SAAS,MACP,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,QAAD;SAAM,WAAU;mBAA+B,EAAK;SAAa,CAAA,EACjE,kBAAC,QAAD;SAAM,WAAU;mBAAiC,EAAK;SAAe,CAAA,CACjE;;OAET;MACD;OACE,KAAK;OACL,QAAQ;OACR,SAAS,MASA,kBAAC,GAAD;QAAO,SALV;SACF,MAAM;SACN,WAAW;SACX,OAAO;SACR,CAC+B,EAAK,WAAW;kBAAY,EAAK;QAAe,CAAA;OAEnF;MACD;OACE,KAAK;OACL,QAAQ;OACR,SAAS,MAAe,EAAK,SAAS,EAAe,EAAK,OAAO,GAAG;OACrE;MACD;OACE,KAAK;OACL,QAAQ;OACR,OAAO;OACP,SAAS,MACP,kBAAC,OAAD;QAAK,WAAU;kBACZ,EAAK,WAAW,WACf,kBAAC,GAAD;SAAQ,MAAK;SAAK,eAAe,EAAW,EAAK,GAAG;mBAApD,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,WAE1B;;QAEP,CAAA;OAET;MACF;KA6CS,MAAM;KACN,eAAe,MAAM,EAAE;KACvB,SAAS;KACT,YACE,kBAAC,GAAD;MACE,MAAM,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA;MAClC,OAAM;MACN,aAAY;MACZ,CAAA;KAEJ,CAAA,CACE;MACF;;EACK,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardPage.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/DashboardPage.tsx"],"names":[],"mappings":"AAkCA;;GAEG;AACH,wBAAgB,aAAa,4CAoI5B"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { useAdmin as e } from "../providers/AdminProvider.js";
|
|
2
|
+
import { useAdminPermissions as t } from "../hooks/useAdminPermissions.js";
|
|
3
|
+
import { PageLayout as n } from "../components/PageLayout.js";
|
|
4
|
+
import { MetricCard as r, MetricsGrid as i } from "../components/MetricCard.js";
|
|
5
|
+
import { ActivityFeed as a } from "../components/ActivityFeed.js";
|
|
6
|
+
import { QuickLinks as o } from "../components/Charts.js";
|
|
7
|
+
import { tWithFallback as s } from "../utils/i18n.js";
|
|
8
|
+
import { PermissionGuard as c } from "../components/PermissionGuard.js";
|
|
9
|
+
import "../components/index.js";
|
|
10
|
+
import { joinPath as l } from "../utils/navigation.js";
|
|
11
|
+
import { mapActivityLogToUi as u } from "../utils/mappers.js";
|
|
12
|
+
import { useGetDashboardActiveWorkspaceCountQuery as d, useGetDashboardOrganizationCountQuery as f, useGetDashboardTenantCountQuery as p, useGetDashboardUserCountQuery as m, useGetRecentActivityLogsQuery as h } from "../../generated/global-operations.js";
|
|
13
|
+
import { useMemo as g } from "react";
|
|
14
|
+
import { Briefcase as _, Building2 as v, FileText as y, HelpCircle as b, Layout as x, Plus as S, UserPlus as C, Users as w } from "lucide-react";
|
|
15
|
+
import { jsx as T, jsxs as E } from "react/jsx-runtime";
|
|
16
|
+
import { useI18n as D } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
17
|
+
//#region src/admin/pages/DashboardPage.tsx
|
|
18
|
+
function O() {
|
|
19
|
+
let { canViewDashboard: O, isLoading: k } = t(), { basePath: A = "" } = e(), { t: j } = D(), M = (e, t, n) => s(j, e, t, n), N = k || !O, { data: P, loading: F } = p({
|
|
20
|
+
fetchPolicy: "cache-and-network",
|
|
21
|
+
skip: N
|
|
22
|
+
}), { data: I, loading: L } = f({
|
|
23
|
+
fetchPolicy: "cache-and-network",
|
|
24
|
+
skip: N
|
|
25
|
+
}), { data: R, loading: z } = d({
|
|
26
|
+
fetchPolicy: "cache-and-network",
|
|
27
|
+
skip: N
|
|
28
|
+
}), { data: B, loading: V } = m({
|
|
29
|
+
fetchPolicy: "cache-and-network",
|
|
30
|
+
skip: N
|
|
31
|
+
}), { data: H, loading: U } = h({
|
|
32
|
+
variables: { limit: 10 },
|
|
33
|
+
fetchPolicy: "cache-and-network",
|
|
34
|
+
skip: N
|
|
35
|
+
}), W = {
|
|
36
|
+
tenants: P?.tenants?.total ?? 0,
|
|
37
|
+
organizations: I?.organizations?.total ?? 0,
|
|
38
|
+
workspaces: R?.workspaces?.total ?? 0,
|
|
39
|
+
users: B?.userCount ?? 0
|
|
40
|
+
}, G = g(() => (H?.activityLogs?.nodes ?? []).map(u), [H]), K = [
|
|
41
|
+
{
|
|
42
|
+
to: l(A, "tenants"),
|
|
43
|
+
label: M("admin.dashboard.quickLinks.addTenant", "Add Tenant"),
|
|
44
|
+
icon: /* @__PURE__ */ T(S, { className: "h-4 w-4" }),
|
|
45
|
+
description: M("admin.dashboard.quickLinks.addTenantDescription", "Create a new tenant")
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
to: l(A, "users"),
|
|
49
|
+
label: M("admin.dashboard.quickLinks.inviteUser", "Invite User"),
|
|
50
|
+
icon: /* @__PURE__ */ T(C, { className: "h-4 w-4" }),
|
|
51
|
+
description: M("admin.dashboard.quickLinks.inviteUserDescription", "Invite a new user")
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
to: l(A, "audit"),
|
|
55
|
+
label: M("admin.dashboard.quickLinks.auditLogs", "Audit Logs"),
|
|
56
|
+
icon: /* @__PURE__ */ T(y, { className: "h-4 w-4" }),
|
|
57
|
+
description: M("admin.dashboard.quickLinks.auditLogsDescription", "View security audit trail")
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
to: l(A, "support"),
|
|
61
|
+
label: M("admin.dashboard.quickLinks.support", "Support"),
|
|
62
|
+
icon: /* @__PURE__ */ T(b, { className: "h-4 w-4" }),
|
|
63
|
+
description: M("admin.dashboard.quickLinks.supportDescription", "Manage support tickets")
|
|
64
|
+
}
|
|
65
|
+
], q = F || L || z || V;
|
|
66
|
+
return /* @__PURE__ */ T(c, {
|
|
67
|
+
allowed: O,
|
|
68
|
+
isLoading: k,
|
|
69
|
+
pageTitle: M("admin.dashboard.title", "Dashboard"),
|
|
70
|
+
denyMessage: M("admin.dashboard.denyMessage", "You don't have permission to view the admin dashboard."),
|
|
71
|
+
children: /* @__PURE__ */ T(n, {
|
|
72
|
+
title: M("admin.dashboard.title", "Dashboard"),
|
|
73
|
+
description: M("admin.dashboard.description", "Platform overview and key metrics"),
|
|
74
|
+
children: /* @__PURE__ */ E("div", {
|
|
75
|
+
className: "space-y-6",
|
|
76
|
+
children: [/* @__PURE__ */ E(i, { children: [
|
|
77
|
+
/* @__PURE__ */ T(r, {
|
|
78
|
+
title: M("admin.dashboard.metrics.totalTenants", "Total Tenants"),
|
|
79
|
+
value: W.tenants,
|
|
80
|
+
loading: q,
|
|
81
|
+
icon: /* @__PURE__ */ T(v, { className: "h-5 w-5 text-blue-500" })
|
|
82
|
+
}),
|
|
83
|
+
/* @__PURE__ */ T(r, {
|
|
84
|
+
title: M("admin.dashboard.metrics.organizations", "Organizations"),
|
|
85
|
+
value: W.organizations,
|
|
86
|
+
loading: q,
|
|
87
|
+
icon: /* @__PURE__ */ T(_, { className: "h-5 w-5 text-purple-500" })
|
|
88
|
+
}),
|
|
89
|
+
/* @__PURE__ */ T(r, {
|
|
90
|
+
title: M("admin.dashboard.metrics.activeWorkspaces", "Active Workspaces"),
|
|
91
|
+
value: W.workspaces,
|
|
92
|
+
loading: q,
|
|
93
|
+
icon: /* @__PURE__ */ T(x, { className: "h-5 w-5 text-green-500" })
|
|
94
|
+
}),
|
|
95
|
+
/* @__PURE__ */ T(r, {
|
|
96
|
+
title: M("admin.dashboard.metrics.totalUsers", "Total Users"),
|
|
97
|
+
value: W.users,
|
|
98
|
+
loading: q,
|
|
99
|
+
icon: /* @__PURE__ */ T(w, { className: "h-5 w-5 text-orange-500" })
|
|
100
|
+
})
|
|
101
|
+
] }), /* @__PURE__ */ E("div", {
|
|
102
|
+
className: "grid gap-6 lg:grid-cols-3",
|
|
103
|
+
children: [/* @__PURE__ */ T("div", {
|
|
104
|
+
className: "lg:col-span-2",
|
|
105
|
+
children: /* @__PURE__ */ T(a, {
|
|
106
|
+
activities: G,
|
|
107
|
+
loading: U
|
|
108
|
+
})
|
|
109
|
+
}), /* @__PURE__ */ T("div", {
|
|
110
|
+
className: "space-y-4",
|
|
111
|
+
children: /* @__PURE__ */ T(o, { links: K })
|
|
112
|
+
})]
|
|
113
|
+
})]
|
|
114
|
+
})
|
|
115
|
+
})
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
//#endregion
|
|
119
|
+
export { O as DashboardPage };
|
|
120
|
+
|
|
121
|
+
//# sourceMappingURL=DashboardPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardPage.js","names":[],"sources":["../../../src/admin/pages/DashboardPage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n Building2,\n Users,\n Layout,\n Briefcase,\n Plus,\n UserPlus,\n FileText,\n HelpCircle,\n} from 'lucide-react';\nimport { useAdmin } from '../providers/AdminProvider';\nimport { useAdminPermissions } from '../hooks/useAdminPermissions';\nimport {\n PageLayout,\n MetricCard,\n MetricsGrid,\n ActivityFeed,\n QuickLinks,\n PermissionGuard,\n} from '../components';\nimport { joinPath } from '../utils/navigation';\nimport { mapActivityLogToUi } from '../utils/mappers';\nimport type { Activity } from '../types';\nimport {\n useGetDashboardTenantCountQuery,\n useGetDashboardOrganizationCountQuery,\n useGetDashboardActiveWorkspaceCountQuery,\n useGetDashboardUserCountQuery,\n useGetRecentActivityLogsQuery,\n} from '../../generated/global-operations';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { tWithFallback } from '../utils/i18n';\n\n/**\n * Dashboard page — platform overview with real-time metrics\n */\nexport function DashboardPage() {\n const { canViewDashboard, isLoading: permissionsLoading } = useAdminPermissions();\n const { basePath = '' } = useAdmin();\n const { t } = useI18n();\n const tr = (key: string, fallback: string, params?: Record<string, string | number>): string =>\n tWithFallback(t, key, fallback, params);\n\n const skipQueries = permissionsLoading || !canViewDashboard;\n\n const { data: tenantData, loading: tenantLoading } = useGetDashboardTenantCountQuery({\n fetchPolicy: 'cache-and-network',\n skip: skipQueries,\n });\n const { data: orgData, loading: orgLoading } = useGetDashboardOrganizationCountQuery({\n fetchPolicy: 'cache-and-network',\n skip: skipQueries,\n });\n const { data: workspaceData, loading: workspaceLoading } =\n useGetDashboardActiveWorkspaceCountQuery({\n fetchPolicy: 'cache-and-network',\n skip: skipQueries,\n });\n const { data: userData, loading: userLoading } = useGetDashboardUserCountQuery({\n fetchPolicy: 'cache-and-network',\n skip: skipQueries,\n });\n const { data: activityData, loading: activityLoading } = useGetRecentActivityLogsQuery({\n variables: { limit: 10 },\n fetchPolicy: 'cache-and-network',\n skip: skipQueries,\n });\n\n const metrics = {\n tenants: tenantData?.tenants?.total ?? 0,\n organizations: orgData?.organizations?.total ?? 0,\n workspaces: workspaceData?.workspaces?.total ?? 0,\n users: userData?.userCount ?? 0,\n };\n\n const recentActivity: Activity[] = useMemo(\n () => (activityData?.activityLogs?.nodes ?? []).map(mapActivityLogToUi),\n [activityData]\n );\n\n const quickLinks = [\n {\n to: joinPath(basePath, 'tenants'),\n label: tr('admin.dashboard.quickLinks.addTenant', 'Add Tenant'),\n icon: <Plus className=\"h-4 w-4\" />,\n description: tr('admin.dashboard.quickLinks.addTenantDescription', 'Create a new tenant'),\n },\n {\n to: joinPath(basePath, 'users'),\n label: tr('admin.dashboard.quickLinks.inviteUser', 'Invite User'),\n icon: <UserPlus className=\"h-4 w-4\" />,\n description: tr('admin.dashboard.quickLinks.inviteUserDescription', 'Invite a new user'),\n },\n {\n to: joinPath(basePath, 'audit'),\n label: tr('admin.dashboard.quickLinks.auditLogs', 'Audit Logs'),\n icon: <FileText className=\"h-4 w-4\" />,\n description: tr(\n 'admin.dashboard.quickLinks.auditLogsDescription',\n 'View security audit trail'\n ),\n },\n {\n to: joinPath(basePath, 'support'),\n label: tr('admin.dashboard.quickLinks.support', 'Support'),\n icon: <HelpCircle className=\"h-4 w-4\" />,\n description: tr('admin.dashboard.quickLinks.supportDescription', 'Manage support tickets'),\n },\n ];\n\n const isLoading = tenantLoading || orgLoading || workspaceLoading || userLoading;\n\n return (\n <PermissionGuard\n allowed={canViewDashboard}\n isLoading={permissionsLoading}\n pageTitle={tr('admin.dashboard.title', 'Dashboard')}\n denyMessage={tr(\n 'admin.dashboard.denyMessage',\n \"You don't have permission to view the admin dashboard.\"\n )}\n >\n <PageLayout\n title={tr('admin.dashboard.title', 'Dashboard')}\n description={tr('admin.dashboard.description', 'Platform overview and key metrics')}\n >\n <div className=\"space-y-6\">\n {/* Metrics Grid */}\n <MetricsGrid>\n <MetricCard\n title={tr('admin.dashboard.metrics.totalTenants', 'Total Tenants')}\n value={metrics.tenants}\n loading={isLoading}\n icon={<Building2 className=\"h-5 w-5 text-blue-500\" />}\n />\n <MetricCard\n title={tr('admin.dashboard.metrics.organizations', 'Organizations')}\n value={metrics.organizations}\n loading={isLoading}\n icon={<Briefcase className=\"h-5 w-5 text-purple-500\" />}\n />\n <MetricCard\n title={tr('admin.dashboard.metrics.activeWorkspaces', 'Active Workspaces')}\n value={metrics.workspaces}\n loading={isLoading}\n icon={<Layout className=\"h-5 w-5 text-green-500\" />}\n />\n <MetricCard\n title={tr('admin.dashboard.metrics.totalUsers', 'Total Users')}\n value={metrics.users}\n loading={isLoading}\n icon={<Users className=\"h-5 w-5 text-orange-500\" />}\n />\n </MetricsGrid>\n\n {/* Content Area */}\n <div className=\"grid gap-6 lg:grid-cols-3\">\n <div className=\"lg:col-span-2\">\n <ActivityFeed activities={recentActivity} loading={activityLoading} />\n </div>\n <div className=\"space-y-4\">\n <QuickLinks links={quickLinks} />\n </div>\n </div>\n </div>\n </PageLayout>\n </PermissionGuard>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAqCA,SAAgB,IAAgB;CAC9B,IAAM,EAAE,qBAAkB,WAAW,MAAuB,GAAqB,EAC3E,EAAE,cAAW,OAAO,GAAU,EAC9B,EAAE,SAAM,GAAS,EACjB,KAAM,GAAa,GAAkB,MACzC,EAAc,GAAG,GAAK,GAAU,EAAO,EAEnC,IAAc,KAAsB,CAAC,GAErC,EAAE,MAAM,GAAY,SAAS,MAAkB,EAAgC;EACnF,aAAa;EACb,MAAM;EACP,CAAC,EACI,EAAE,MAAM,GAAS,SAAS,MAAe,EAAsC;EACnF,aAAa;EACb,MAAM;EACP,CAAC,EACI,EAAE,MAAM,GAAe,SAAS,MACpC,EAAyC;EACvC,aAAa;EACb,MAAM;EACP,CAAC,EACE,EAAE,MAAM,GAAU,SAAS,MAAgB,EAA8B;EAC7E,aAAa;EACb,MAAM;EACP,CAAC,EACI,EAAE,MAAM,GAAc,SAAS,MAAoB,EAA8B;EACrF,WAAW,EAAE,OAAO,IAAI;EACxB,aAAa;EACb,MAAM;EACP,CAAC,EAEI,IAAU;EACd,SAAS,GAAY,SAAS,SAAS;EACvC,eAAe,GAAS,eAAe,SAAS;EAChD,YAAY,GAAe,YAAY,SAAS;EAChD,OAAO,GAAU,aAAa;EAC/B,EAEK,IAA6B,SAC1B,GAAc,cAAc,SAAS,EAAE,EAAE,IAAI,EAAmB,EACvE,CAAC,EAAa,CACf,EAEK,IAAa;EACjB;GACE,IAAI,EAAS,GAAU,UAAU;GACjC,OAAO,EAAG,wCAAwC,aAAa;GAC/D,MAAM,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA;GAClC,aAAa,EAAG,mDAAmD,sBAAsB;GAC1F;EACD;GACE,IAAI,EAAS,GAAU,QAAQ;GAC/B,OAAO,EAAG,yCAAyC,cAAc;GACjE,MAAM,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;GACtC,aAAa,EAAG,oDAAoD,oBAAoB;GACzF;EACD;GACE,IAAI,EAAS,GAAU,QAAQ;GAC/B,OAAO,EAAG,wCAAwC,aAAa;GAC/D,MAAM,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;GACtC,aAAa,EACX,mDACA,4BACD;GACF;EACD;GACE,IAAI,EAAS,GAAU,UAAU;GACjC,OAAO,EAAG,sCAAsC,UAAU;GAC1D,MAAM,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;GACxC,aAAa,EAAG,iDAAiD,yBAAyB;GAC3F;EACF,EAEK,IAAY,KAAiB,KAAc,KAAoB;AAErE,QACE,kBAAC,GAAD;EACE,SAAS;EACT,WAAW;EACX,WAAW,EAAG,yBAAyB,YAAY;EACnD,aAAa,EACX,+BACA,yDACD;YAED,kBAAC,GAAD;GACE,OAAO,EAAG,yBAAyB,YAAY;GAC/C,aAAa,EAAG,+BAA+B,oCAAoC;aAEnF,kBAAC,OAAD;IAAK,WAAU;cAAf,CAEE,kBAAC,GAAD,EAAA,UAAA;KACE,kBAAC,GAAD;MACE,OAAO,EAAG,wCAAwC,gBAAgB;MAClE,OAAO,EAAQ;MACf,SAAS;MACT,MAAM,kBAAC,GAAD,EAAW,WAAU,yBAA0B,CAAA;MACrD,CAAA;KACF,kBAAC,GAAD;MACE,OAAO,EAAG,yCAAyC,gBAAgB;MACnE,OAAO,EAAQ;MACf,SAAS;MACT,MAAM,kBAAC,GAAD,EAAW,WAAU,2BAA4B,CAAA;MACvD,CAAA;KACF,kBAAC,GAAD;MACE,OAAO,EAAG,4CAA4C,oBAAoB;MAC1E,OAAO,EAAQ;MACf,SAAS;MACT,MAAM,kBAAC,GAAD,EAAQ,WAAU,0BAA2B,CAAA;MACnD,CAAA;KACF,kBAAC,GAAD;MACE,OAAO,EAAG,sCAAsC,cAAc;MAC9D,OAAO,EAAQ;MACf,SAAS;MACT,MAAM,kBAAC,GAAD,EAAO,WAAU,2BAA4B,CAAA;MACnD,CAAA;KACU,EAAA,CAAA,EAGd,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD;OAAc,YAAY;OAAgB,SAAS;OAAmB,CAAA;MAClE,CAAA,EACN,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD,EAAY,OAAO,GAAc,CAAA;MAC7B,CAAA,CACF;OACF;;GACK,CAAA;EACG,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeatureFlagsPage.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/FeatureFlagsPage.tsx"],"names":[],"mappings":"AAUA,wBAAgB,gBAAgB,4CA+I/B"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { Button as e, EmptyState as t, Input as n } from "../components/ui.js";
|
|
2
|
+
import { PageLayout as r } from "../components/PageLayout.js";
|
|
3
|
+
import { DataTable as i } from "../components/DataTable.js";
|
|
4
|
+
import { RowActions as a } from "../components/RowActions.js";
|
|
5
|
+
import "../components/index.js";
|
|
6
|
+
import { useDeleteFeatureFlagMutation as o, useListFeatureFlagsQuery as s, useUpdateFeatureFlagMutation as c } from "../../generated/global-operations.js";
|
|
7
|
+
import { FeatureFlagStatus as l } from "../../generated/global-types.js";
|
|
8
|
+
import { useState as u } from "react";
|
|
9
|
+
import { Plus as d, Search as f, ToggleLeft as p, Trash2 as m } from "lucide-react";
|
|
10
|
+
import { jsx as h, jsxs as g } from "react/jsx-runtime";
|
|
11
|
+
//#region src/admin/pages/FeatureFlagsPage.tsx
|
|
12
|
+
function _() {
|
|
13
|
+
let [_, v] = u(""), { data: y, loading: b, error: x, refetch: S } = s({ variables: { filter: _ ? { name: { contains: _ } } : void 0 } }), [C] = c(), [w] = o(), T = y?.featureFlags?.items || [], E = async (e, t) => {
|
|
14
|
+
let n = t === l.Active ? l.Archived : l.Active;
|
|
15
|
+
try {
|
|
16
|
+
await C({ variables: {
|
|
17
|
+
id: e,
|
|
18
|
+
input: { status: n }
|
|
19
|
+
} }), S();
|
|
20
|
+
} catch (e) {
|
|
21
|
+
console.error("Failed to update status:", e);
|
|
22
|
+
}
|
|
23
|
+
}, D = async (e) => {
|
|
24
|
+
if (confirm("Are you sure you want to delete this feature flag?")) try {
|
|
25
|
+
await w({ variables: { id: e } }), S();
|
|
26
|
+
} catch (e) {
|
|
27
|
+
console.error("Failed to delete flag:", e);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
return x ? /* @__PURE__ */ h(r, {
|
|
31
|
+
title: "Feature Flags",
|
|
32
|
+
description: "Error loading feature flags",
|
|
33
|
+
children: /* @__PURE__ */ g("div", {
|
|
34
|
+
className: "p-4 text-destructive",
|
|
35
|
+
children: ["Error: ", x.message]
|
|
36
|
+
})
|
|
37
|
+
}) : /* @__PURE__ */ h(r, {
|
|
38
|
+
title: "Feature Flags",
|
|
39
|
+
description: "Manage and monitor platform feature flags",
|
|
40
|
+
actions: /* @__PURE__ */ g(e, { children: [/* @__PURE__ */ h(d, { className: "mr-2 h-4 w-4" }), "Create Feature Flag"] }),
|
|
41
|
+
children: /* @__PURE__ */ g("div", {
|
|
42
|
+
className: "space-y-4",
|
|
43
|
+
children: [/* @__PURE__ */ h("div", {
|
|
44
|
+
className: "flex items-center justify-between",
|
|
45
|
+
children: /* @__PURE__ */ g("div", {
|
|
46
|
+
className: "relative max-w-sm flex-1",
|
|
47
|
+
children: [/* @__PURE__ */ h(f, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }), /* @__PURE__ */ h(n, {
|
|
48
|
+
placeholder: "Search feature flags...",
|
|
49
|
+
className: "pl-9",
|
|
50
|
+
value: _,
|
|
51
|
+
onChange: (e) => v(e.target.value)
|
|
52
|
+
})]
|
|
53
|
+
})
|
|
54
|
+
}), /* @__PURE__ */ h(i, {
|
|
55
|
+
columns: [
|
|
56
|
+
{
|
|
57
|
+
key: "name",
|
|
58
|
+
header: "Name",
|
|
59
|
+
render: (e) => /* @__PURE__ */ g("div", {
|
|
60
|
+
className: "flex flex-col text-left",
|
|
61
|
+
children: [/* @__PURE__ */ h("span", {
|
|
62
|
+
className: "font-medium",
|
|
63
|
+
children: e.name
|
|
64
|
+
}), /* @__PURE__ */ h("span", {
|
|
65
|
+
className: "text-xs text-muted-foreground",
|
|
66
|
+
children: e.key
|
|
67
|
+
})]
|
|
68
|
+
})
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
key: "flagType",
|
|
72
|
+
header: "Type"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
key: "status",
|
|
76
|
+
header: "Status",
|
|
77
|
+
render: (t) => {
|
|
78
|
+
let n = t.status === l.Active;
|
|
79
|
+
return /* @__PURE__ */ h(e, {
|
|
80
|
+
variant: "outline",
|
|
81
|
+
size: "sm",
|
|
82
|
+
onClick: () => E(t.id, t.status),
|
|
83
|
+
className: n ? "border-primary text-primary" : "text-muted-foreground",
|
|
84
|
+
children: n ? "Active" : "Archived"
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
key: "actions",
|
|
90
|
+
header: "",
|
|
91
|
+
align: "right",
|
|
92
|
+
render: (e) => /* @__PURE__ */ h(a, { actions: [{
|
|
93
|
+
key: "delete",
|
|
94
|
+
label: "Delete",
|
|
95
|
+
icon: /* @__PURE__ */ h(m, { className: "h-4 w-4" }),
|
|
96
|
+
onClick: () => D(e.id),
|
|
97
|
+
destructive: !0
|
|
98
|
+
}] })
|
|
99
|
+
}
|
|
100
|
+
],
|
|
101
|
+
data: T,
|
|
102
|
+
keyExtractor: (e) => e.id,
|
|
103
|
+
loading: b,
|
|
104
|
+
emptyState: /* @__PURE__ */ h(t, {
|
|
105
|
+
icon: /* @__PURE__ */ h(p, { className: "h-8 w-8" }),
|
|
106
|
+
title: "No feature flags found",
|
|
107
|
+
description: "Feature flags will appear here when they are created"
|
|
108
|
+
})
|
|
109
|
+
})]
|
|
110
|
+
})
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
//#endregion
|
|
114
|
+
export { _ as FeatureFlagsPage };
|
|
115
|
+
|
|
116
|
+
//# sourceMappingURL=FeatureFlagsPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeatureFlagsPage.js","names":[],"sources":["../../../src/admin/pages/FeatureFlagsPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { ToggleLeft, Search, Plus, Trash2 } from 'lucide-react';\nimport { PageLayout, Input, Button, EmptyState, DataTable, RowActions } from '../components';\nimport {\n useListFeatureFlagsQuery,\n useUpdateFeatureFlagMutation,\n useDeleteFeatureFlagMutation,\n} from '../../generated/global-operations';\nimport { FeatureFlagStatus } from '../../generated/global-types';\n\nexport function FeatureFlagsPage() {\n const [search, setSearch] = useState('');\n const { data, loading, error, refetch } = useListFeatureFlagsQuery({\n variables: {\n filter: search ? { name: { contains: search } } : undefined,\n },\n });\n\n const [updateFeatureFlag] = useUpdateFeatureFlagMutation();\n const [deleteFeatureFlag] = useDeleteFeatureFlagMutation();\n\n const flags = data?.featureFlags?.items || [];\n\n const handleToggleStatus = async (id: string, currentStatus: FeatureFlagStatus) => {\n const newStatus =\n currentStatus === FeatureFlagStatus.Active\n ? FeatureFlagStatus.Archived\n : FeatureFlagStatus.Active;\n\n try {\n await updateFeatureFlag({\n variables: {\n id,\n input: { status: newStatus },\n },\n });\n refetch();\n } catch (err) {\n console.error('Failed to update status:', err);\n }\n };\n\n const handleDelete = async (id: string) => {\n if (confirm('Are you sure you want to delete this feature flag?')) {\n try {\n await deleteFeatureFlag({ variables: { id } });\n refetch();\n } catch (err) {\n console.error('Failed to delete flag:', err);\n }\n }\n };\n\n const columns = [\n {\n key: 'name',\n header: 'Name',\n render: (flag: any) => (\n <div className=\"flex flex-col text-left\">\n <span className=\"font-medium\">{flag.name}</span>\n <span className=\"text-xs text-muted-foreground\">{flag.key}</span>\n </div>\n ),\n },\n {\n key: 'flagType',\n header: 'Type',\n },\n {\n key: 'status',\n header: 'Status',\n render: (flag: any) => {\n const isActive = flag.status === FeatureFlagStatus.Active;\n return (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => handleToggleStatus(flag.id, flag.status)}\n className={isActive ? 'border-primary text-primary' : 'text-muted-foreground'}\n >\n {isActive ? 'Active' : 'Archived'}\n </Button>\n );\n },\n },\n {\n key: 'actions',\n header: '',\n align: 'right' as const,\n render: (flag: any) => (\n <RowActions\n actions={[\n {\n key: 'delete',\n label: 'Delete',\n icon: <Trash2 className=\"h-4 w-4\" />,\n onClick: () => handleDelete(flag.id),\n destructive: true,\n },\n ]}\n />\n ),\n },\n ];\n\n if (error) {\n return (\n <PageLayout title=\"Feature Flags\" description=\"Error loading feature flags\">\n <div className=\"p-4 text-destructive\">Error: {error.message}</div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Feature Flags\"\n description=\"Manage and monitor platform feature flags\"\n actions={\n <Button>\n <Plus className=\"mr-2 h-4 w-4\" />\n Create Feature Flag\n </Button>\n }\n >\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"relative max-w-sm flex-1\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n placeholder=\"Search feature flags...\"\n className=\"pl-9\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n </div>\n\n <DataTable\n columns={columns}\n data={flags}\n keyExtractor={(flag) => flag.id}\n loading={loading}\n emptyState={\n <EmptyState\n icon={<ToggleLeft className=\"h-8 w-8\" />}\n title=\"No feature flags found\"\n description=\"Feature flags will appear here when they are created\"\n />\n }\n />\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;AAUA,SAAgB,IAAmB;CACjC,IAAM,CAAC,GAAQ,KAAa,EAAS,GAAG,EAClC,EAAE,SAAM,YAAS,UAAO,eAAY,EAAyB,EACjE,WAAW,EACT,QAAQ,IAAS,EAAE,MAAM,EAAE,UAAU,GAAQ,EAAE,GAAG,KAAA,GACnD,EACF,CAAC,EAEI,CAAC,KAAqB,GAA8B,EACpD,CAAC,KAAqB,GAA8B,EAEpD,IAAQ,GAAM,cAAc,SAAS,EAAE,EAEvC,IAAqB,OAAO,GAAY,MAAqC;EACjF,IAAM,IACJ,MAAkB,EAAkB,SAChC,EAAkB,WAClB,EAAkB;AAExB,MAAI;AAOF,GANA,MAAM,EAAkB,EACtB,WAAW;IACT;IACA,OAAO,EAAE,QAAQ,GAAW;IAC7B,EACF,CAAC,EACF,GAAS;WACF,GAAK;AACZ,WAAQ,MAAM,4BAA4B,EAAI;;IAI5C,IAAe,OAAO,MAAe;AACzC,MAAI,QAAQ,qDAAqD,CAC/D,KAAI;AAEF,GADA,MAAM,EAAkB,EAAE,WAAW,EAAE,OAAI,EAAE,CAAC,EAC9C,GAAS;WACF,GAAK;AACZ,WAAQ,MAAM,0BAA0B,EAAI;;;AAiElD,QARI,IAEA,kBAAC,GAAD;EAAY,OAAM;EAAgB,aAAY;YAC5C,kBAAC,OAAD;GAAK,WAAU;aAAf,CAAsC,WAAQ,EAAM,QAAc;;EACvD,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,sBAE1B,EAAA,CAAA;YAGX,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,0EAA2E,CAAA,EAC7F,kBAAC,GAAD;MACE,aAAY;MACZ,WAAU;MACV,OAAO;MACP,WAAW,MAAM,EAAU,EAAE,OAAO,MAAM;MAC1C,CAAA,CACE;;IACF,CAAA,EAEN,kBAAC,GAAD;IACW,SArFD;KACd;MACE,KAAK;MACL,QAAQ;MACR,SAAS,MACP,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD;QAAM,WAAU;kBAAe,EAAK;QAAY,CAAA,EAChD,kBAAC,QAAD;QAAM,WAAU;kBAAiC,EAAK;QAAW,CAAA,CAC7D;;MAET;KACD;MACE,KAAK;MACL,QAAQ;MACT;KACD;MACE,KAAK;MACL,QAAQ;MACR,SAAS,MAAc;OACrB,IAAM,IAAW,EAAK,WAAW,EAAkB;AACnD,cACE,kBAAC,GAAD;QACE,SAAQ;QACR,MAAK;QACL,eAAe,EAAmB,EAAK,IAAI,EAAK,OAAO;QACvD,WAAW,IAAW,gCAAgC;kBAErD,IAAW,WAAW;QAChB,CAAA;;MAGd;KACD;MACE,KAAK;MACL,QAAQ;MACR,OAAO;MACP,SAAS,MACP,kBAAC,GAAD,EACE,SAAS,CACP;OACE,KAAK;OACL,OAAO;OACP,MAAM,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA;OACpC,eAAe,EAAa,EAAK,GAAG;OACpC,aAAa;OACd,CACF,EACD,CAAA;MAEL;KACF;IAoCO,MAAM;IACN,eAAe,MAAS,EAAK;IACpB;IACT,YACE,kBAAC,GAAD;KACE,MAAM,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;KACxC,OAAM;KACN,aAAY;KACZ,CAAA;IAEJ,CAAA,CACE;;EACK,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrganizationsListPage.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/OrganizationsListPage.tsx"],"names":[],"mappings":"AAQA,wBAAgB,qBAAqB,4CA2GpC"}
|