@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,90 @@
|
|
|
1
|
+
//#region src/admin/constants/index.ts
|
|
2
|
+
var e = {
|
|
3
|
+
active: {
|
|
4
|
+
label: "Active",
|
|
5
|
+
color: "bg-success/10 text-success border-success/20"
|
|
6
|
+
},
|
|
7
|
+
suspended: {
|
|
8
|
+
label: "Suspended",
|
|
9
|
+
color: "bg-destructive/10 text-destructive border-destructive/20"
|
|
10
|
+
},
|
|
11
|
+
trial: {
|
|
12
|
+
label: "Trial",
|
|
13
|
+
color: "bg-warning/10 text-warning border-warning/20"
|
|
14
|
+
},
|
|
15
|
+
deleted: {
|
|
16
|
+
label: "Deleted",
|
|
17
|
+
color: "bg-muted text-muted-foreground border-muted"
|
|
18
|
+
},
|
|
19
|
+
pending: {
|
|
20
|
+
label: "Pending",
|
|
21
|
+
color: "bg-info/10 text-info border-info/20"
|
|
22
|
+
},
|
|
23
|
+
provisioning: {
|
|
24
|
+
label: "Provisioning",
|
|
25
|
+
color: "bg-amber-100 text-amber-700 border-amber-200"
|
|
26
|
+
}
|
|
27
|
+
}, t = {
|
|
28
|
+
active: {
|
|
29
|
+
label: "Active",
|
|
30
|
+
color: "bg-success/10 text-success border-success/20"
|
|
31
|
+
},
|
|
32
|
+
inactive: {
|
|
33
|
+
label: "Inactive",
|
|
34
|
+
color: "bg-muted text-muted-foreground border-muted"
|
|
35
|
+
},
|
|
36
|
+
blocked: {
|
|
37
|
+
label: "Blocked",
|
|
38
|
+
color: "bg-destructive/10 text-destructive border-destructive/20"
|
|
39
|
+
},
|
|
40
|
+
pending: {
|
|
41
|
+
label: "Pending",
|
|
42
|
+
color: "bg-warning/10 text-warning border-warning/20"
|
|
43
|
+
}
|
|
44
|
+
}, n = {
|
|
45
|
+
healthy: {
|
|
46
|
+
label: "Healthy",
|
|
47
|
+
color: "bg-success/10 text-success border-success/20"
|
|
48
|
+
},
|
|
49
|
+
degraded: {
|
|
50
|
+
label: "Degraded",
|
|
51
|
+
color: "bg-warning/10 text-warning border-warning/20"
|
|
52
|
+
},
|
|
53
|
+
down: {
|
|
54
|
+
label: "Down",
|
|
55
|
+
color: "bg-destructive/10 text-destructive border-destructive/20"
|
|
56
|
+
},
|
|
57
|
+
unknown: {
|
|
58
|
+
label: "Unknown",
|
|
59
|
+
color: "bg-muted text-muted-foreground border-muted"
|
|
60
|
+
}
|
|
61
|
+
}, r = {
|
|
62
|
+
pending: {
|
|
63
|
+
label: "Pending",
|
|
64
|
+
color: "bg-muted text-muted-foreground border-muted"
|
|
65
|
+
},
|
|
66
|
+
running: {
|
|
67
|
+
label: "Running",
|
|
68
|
+
color: "bg-info/10 text-info border-info/20"
|
|
69
|
+
},
|
|
70
|
+
in_progress: {
|
|
71
|
+
label: "In Progress",
|
|
72
|
+
color: "bg-info/10 text-info border-info/20"
|
|
73
|
+
},
|
|
74
|
+
success: {
|
|
75
|
+
label: "Success",
|
|
76
|
+
color: "bg-success/10 text-success border-success/20"
|
|
77
|
+
},
|
|
78
|
+
failed: {
|
|
79
|
+
label: "Failed",
|
|
80
|
+
color: "bg-destructive/10 text-destructive border-destructive/20"
|
|
81
|
+
},
|
|
82
|
+
rolled_back: {
|
|
83
|
+
label: "Rolled Back",
|
|
84
|
+
color: "bg-warning/10 text-warning border-warning/20"
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
//#endregion
|
|
88
|
+
export { r as DEPLOYMENT_STATUS_CONFIG, n as HEALTH_STATUS_CONFIG, e as TENANT_STATUS_CONFIG, t as USER_STATUS_CONFIG };
|
|
89
|
+
|
|
90
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/admin/constants/index.ts"],"sourcesContent":["import type {\n TenantStatus,\n UserStatus,\n SubscriptionStatus,\n TicketStatus,\n TicketPriority,\n HealthStatus,\n DeploymentStatus,\n CloudProvider,\n} from '../types';\n\n/**\n * Tenant status labels and colors\n */\nexport const TENANT_STATUS_CONFIG: Record<TenantStatus, { label: string; color: string }> = {\n active: { label: 'Active', color: 'bg-success/10 text-success border-success/20' },\n suspended: {\n label: 'Suspended',\n color: 'bg-destructive/10 text-destructive border-destructive/20',\n },\n trial: { label: 'Trial', color: 'bg-warning/10 text-warning border-warning/20' },\n deleted: { label: 'Deleted', color: 'bg-muted text-muted-foreground border-muted' },\n pending: { label: 'Pending', color: 'bg-info/10 text-info border-info/20' },\n provisioning: { label: 'Provisioning', color: 'bg-amber-100 text-amber-700 border-amber-200' },\n};\n\n/**\n * User status labels and colors\n */\nexport const USER_STATUS_CONFIG: Record<UserStatus, { label: string; color: string }> = {\n active: { label: 'Active', color: 'bg-success/10 text-success border-success/20' },\n inactive: { label: 'Inactive', color: 'bg-muted text-muted-foreground border-muted' },\n blocked: { label: 'Blocked', color: 'bg-destructive/10 text-destructive border-destructive/20' },\n pending: { label: 'Pending', color: 'bg-warning/10 text-warning border-warning/20' },\n};\n\n/**\n * Subscription status labels and colors\n */\nexport const SUBSCRIPTION_STATUS_CONFIG: Record<\n SubscriptionStatus,\n { label: string; color: string }\n> = {\n active: { label: 'Active', color: 'bg-success/10 text-success border-success/20' },\n canceled: { label: 'Canceled', color: 'bg-muted text-muted-foreground border-muted' },\n past_due: {\n label: 'Past Due',\n color: 'bg-destructive/10 text-destructive border-destructive/20',\n },\n trialing: { label: 'Trialing', color: 'bg-info/10 text-info border-info/20' },\n paused: { label: 'Paused', color: 'bg-warning/10 text-warning border-warning/20' },\n};\n\n/**\n * Ticket status labels and colors\n */\nexport const TICKET_STATUS_CONFIG: Record<TicketStatus, { label: string; color: string }> = {\n open: { label: 'Open', color: 'bg-info/10 text-info border-info/20' },\n in_progress: { label: 'In Progress', color: 'bg-warning/10 text-warning border-warning/20' },\n resolved: { label: 'Resolved', color: 'bg-success/10 text-success border-success/20' },\n closed: { label: 'Closed', color: 'bg-muted text-muted-foreground border-muted' },\n};\n\n/**\n * Ticket priority labels and colors\n */\nexport const TICKET_PRIORITY_CONFIG: Record<TicketPriority, { label: string; color: string }> = {\n low: { label: 'Low', color: 'bg-muted text-muted-foreground border-muted' },\n medium: { label: 'Medium', color: 'bg-info/10 text-info border-info/20' },\n high: { label: 'High', color: 'bg-warning/10 text-warning border-warning/20' },\n critical: {\n label: 'Critical',\n color: 'bg-destructive/10 text-destructive border-destructive/20',\n },\n};\n\n/**\n * Health status labels and colors\n */\nexport const HEALTH_STATUS_CONFIG: Record<HealthStatus, { label: string; color: string }> = {\n healthy: { label: 'Healthy', color: 'bg-success/10 text-success border-success/20' },\n degraded: { label: 'Degraded', color: 'bg-warning/10 text-warning border-warning/20' },\n down: { label: 'Down', color: 'bg-destructive/10 text-destructive border-destructive/20' },\n unknown: { label: 'Unknown', color: 'bg-muted text-muted-foreground border-muted' },\n};\n\n/**\n * Deployment status labels and colors\n */\nexport const DEPLOYMENT_STATUS_CONFIG: Record<DeploymentStatus, { label: string; color: string }> =\n {\n pending: { label: 'Pending', color: 'bg-muted text-muted-foreground border-muted' },\n running: { label: 'Running', color: 'bg-info/10 text-info border-info/20' },\n in_progress: { label: 'In Progress', color: 'bg-info/10 text-info border-info/20' },\n success: { label: 'Success', color: 'bg-success/10 text-success border-success/20' },\n failed: { label: 'Failed', color: 'bg-destructive/10 text-destructive border-destructive/20' },\n rolled_back: { label: 'Rolled Back', color: 'bg-warning/10 text-warning border-warning/20' },\n };\n\n/**\n * Cloud provider labels and colors\n */\nexport const CLOUD_PROVIDER_CONFIG: Record<\n CloudProvider,\n { label: string; color: string; icon: string }\n> = {\n aws: {\n label: 'AWS',\n color: 'bg-orange-500/10 text-orange-500 border-orange-500/20',\n icon: 'aws',\n },\n azure: {\n label: 'Azure',\n color: 'bg-blue-500/10 text-blue-500 border-blue-500/20',\n icon: 'azure',\n },\n gcp: { label: 'GCP', color: 'bg-red-500/10 text-red-500 border-red-500/20', icon: 'gcp' },\n digitalocean: {\n label: 'DigitalOcean',\n color: 'bg-cyan-500/10 text-cyan-500 border-cyan-500/20',\n icon: 'do',\n },\n};\n\n/**\n * Chart colors using semantic tokens\n */\nexport const CHART_COLORS = {\n primary: 'hsl(var(--chart-1))',\n secondary: 'hsl(var(--chart-2))',\n tertiary: 'hsl(var(--chart-3))',\n quaternary: 'hsl(var(--chart-4))',\n quinary: 'hsl(var(--chart-5))',\n};\n\n/**\n * Default pagination\n */\nexport const DEFAULT_PAGE_SIZE = 20;\nexport const PAGE_SIZE_OPTIONS = [10, 20, 50, 100];\n"],"mappings":";AAcA,IAAa,IAA+E;CAC1F,QAAQ;EAAE,OAAO;EAAU,OAAO;EAAgD;CAClF,WAAW;EACT,OAAO;EACP,OAAO;EACR;CACD,OAAO;EAAE,OAAO;EAAS,OAAO;EAAgD;CAChF,SAAS;EAAE,OAAO;EAAW,OAAO;EAA+C;CACnF,SAAS;EAAE,OAAO;EAAW,OAAO;EAAuC;CAC3E,cAAc;EAAE,OAAO;EAAgB,OAAO;EAAgD;CAC/F,EAKY,IAA2E;CACtF,QAAQ;EAAE,OAAO;EAAU,OAAO;EAAgD;CAClF,UAAU;EAAE,OAAO;EAAY,OAAO;EAA+C;CACrF,SAAS;EAAE,OAAO;EAAW,OAAO;EAA4D;CAChG,SAAS;EAAE,OAAO;EAAW,OAAO;EAAgD;CACrF,EA6CY,IAA+E;CAC1F,SAAS;EAAE,OAAO;EAAW,OAAO;EAAgD;CACpF,UAAU;EAAE,OAAO;EAAY,OAAO;EAAgD;CACtF,MAAM;EAAE,OAAO;EAAQ,OAAO;EAA4D;CAC1F,SAAS;EAAE,OAAO;EAAW,OAAO;EAA+C;CACpF,EAKY,IACX;CACE,SAAS;EAAE,OAAO;EAAW,OAAO;EAA+C;CACnF,SAAS;EAAE,OAAO;EAAW,OAAO;EAAuC;CAC3E,aAAa;EAAE,OAAO;EAAe,OAAO;EAAuC;CACnF,SAAS;EAAE,OAAO;EAAW,OAAO;EAAgD;CACpF,QAAQ;EAAE,OAAO;EAAU,OAAO;EAA4D;CAC9F,aAAa;EAAE,OAAO;EAAe,OAAO;EAAgD;CAC7F"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin Console Permission Constants
|
|
3
|
+
*
|
|
4
|
+
* Maps to resource types and actions in global-rbac-svc seed.
|
|
5
|
+
* The admin console uses global-layer resources: tenant, user, billing,
|
|
6
|
+
* notification, rbac.
|
|
7
|
+
*/
|
|
8
|
+
export declare const ADMIN_PERMISSIONS: {
|
|
9
|
+
readonly TENANT_READ: "tenant:read";
|
|
10
|
+
readonly TENANT_WRITE: "tenant:write";
|
|
11
|
+
readonly TENANT_DELETE: "tenant:delete";
|
|
12
|
+
readonly TENANT_ADMIN: "tenant:admin";
|
|
13
|
+
readonly USER_READ: "user:read";
|
|
14
|
+
readonly USER_UPDATE: "user:update";
|
|
15
|
+
readonly USER_DELETE: "user:delete";
|
|
16
|
+
readonly USER_ADMIN: "user:admin";
|
|
17
|
+
readonly BILLING_READ: "billing:read";
|
|
18
|
+
readonly NOTIFICATION_READ: "notification:read";
|
|
19
|
+
readonly RBAC_AUDIT_READ: "rbac:audit:read";
|
|
20
|
+
readonly WORKSPACE_ADMIN: "workspace:admin";
|
|
21
|
+
readonly PRODUCT_READ: "product:read";
|
|
22
|
+
readonly PRODUCT_WRITE: "product:write";
|
|
23
|
+
readonly WAITLIST_READ: "newsletter-waitlist:read";
|
|
24
|
+
readonly WAITLIST_MANAGE: "newsletter-waitlist:approve";
|
|
25
|
+
};
|
|
26
|
+
export type AdminPermission = (typeof ADMIN_PERMISSIONS)[keyof typeof ADMIN_PERMISSIONS];
|
|
27
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../src/admin/constants/permissions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;CAgCpB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
//#region src/admin/constants/permissions.ts
|
|
2
|
+
var e = {
|
|
3
|
+
TENANT_READ: "tenant:read",
|
|
4
|
+
TENANT_WRITE: "tenant:write",
|
|
5
|
+
TENANT_DELETE: "tenant:delete",
|
|
6
|
+
TENANT_ADMIN: "tenant:admin",
|
|
7
|
+
USER_READ: "user:read",
|
|
8
|
+
USER_UPDATE: "user:update",
|
|
9
|
+
USER_DELETE: "user:delete",
|
|
10
|
+
USER_ADMIN: "user:admin",
|
|
11
|
+
BILLING_READ: "billing:read",
|
|
12
|
+
NOTIFICATION_READ: "notification:read",
|
|
13
|
+
RBAC_AUDIT_READ: "rbac:audit:read",
|
|
14
|
+
WORKSPACE_ADMIN: "workspace:admin",
|
|
15
|
+
PRODUCT_READ: "product:read",
|
|
16
|
+
PRODUCT_WRITE: "product:write",
|
|
17
|
+
WAITLIST_READ: "newsletter-waitlist:read",
|
|
18
|
+
WAITLIST_MANAGE: "newsletter-waitlist:approve"
|
|
19
|
+
};
|
|
20
|
+
//#endregion
|
|
21
|
+
export { e as ADMIN_PERMISSIONS };
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","names":[],"sources":["../../../src/admin/constants/permissions.ts"],"sourcesContent":["/**\n * Admin Console Permission Constants\n *\n * Maps to resource types and actions in global-rbac-svc seed.\n * The admin console uses global-layer resources: tenant, user, billing,\n * notification, rbac.\n */\n\nexport const ADMIN_PERMISSIONS = {\n // Tenant management\n TENANT_READ: 'tenant:read',\n TENANT_WRITE: 'tenant:write',\n TENANT_DELETE: 'tenant:delete',\n TENANT_ADMIN: 'tenant:admin',\n\n // User management\n USER_READ: 'user:read',\n USER_UPDATE: 'user:update',\n USER_DELETE: 'user:delete',\n USER_ADMIN: 'user:admin',\n\n // Billing\n BILLING_READ: 'billing:read',\n\n // Notifications / Communications\n NOTIFICATION_READ: 'notification:read',\n\n // Audit logs\n RBAC_AUDIT_READ: 'rbac:audit:read',\n\n // Workspace / Sandbox\n WORKSPACE_ADMIN: 'workspace:admin',\n\n // Product management\n PRODUCT_READ: 'product:read',\n PRODUCT_WRITE: 'product:write',\n\n // Waitlist management\n WAITLIST_READ: 'newsletter-waitlist:read',\n WAITLIST_MANAGE: 'newsletter-waitlist:approve',\n} as const;\n\nexport type AdminPermission = (typeof ADMIN_PERMISSIONS)[keyof typeof ADMIN_PERMISSIONS];\n"],"mappings":";AAQA,IAAa,IAAoB;CAE/B,aAAa;CACb,cAAc;CACd,eAAe;CACf,cAAc;CAGd,WAAW;CACX,aAAa;CACb,aAAa;CACb,YAAY;CAGZ,cAAc;CAGd,mBAAmB;CAGnB,iBAAiB;CAGjB,iBAAiB;CAGjB,cAAc;CACd,eAAe;CAGf,eAAe;CACf,iBAAiB;CAClB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook for admin console RBAC permissions.
|
|
3
|
+
*
|
|
4
|
+
* SUPER_ADMIN role / actor type (verified from profile or JWT) bypasses all
|
|
5
|
+
* permission checks.
|
|
6
|
+
* Other users require granular permissions from the global RBAC service.
|
|
7
|
+
*/
|
|
8
|
+
export declare function useAdminPermissions(): {
|
|
9
|
+
canViewTenants: boolean;
|
|
10
|
+
canManageTenants: boolean;
|
|
11
|
+
canDeleteTenants: boolean;
|
|
12
|
+
isTenantAdmin: boolean;
|
|
13
|
+
canViewUsers: boolean;
|
|
14
|
+
canUpdateUsers: boolean;
|
|
15
|
+
canDeleteUsers: boolean;
|
|
16
|
+
isUserAdmin: boolean;
|
|
17
|
+
canViewBilling: boolean;
|
|
18
|
+
canViewCommunications: boolean;
|
|
19
|
+
canViewAuditLogs: boolean;
|
|
20
|
+
canManageSettings: boolean;
|
|
21
|
+
canViewSRE: boolean;
|
|
22
|
+
canManageSandbox: boolean;
|
|
23
|
+
canViewProducts: boolean;
|
|
24
|
+
canManageProducts: boolean;
|
|
25
|
+
canViewWaitlist: boolean;
|
|
26
|
+
canManageWaitlist: boolean;
|
|
27
|
+
canViewDashboard: boolean;
|
|
28
|
+
isLoading: boolean;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=useAdminPermissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAdminPermissions.d.ts","sourceRoot":"","sources":["../../../src/admin/hooks/useAdminPermissions.ts"],"names":[],"mappings":"AA+BA;;;;;;GAMG;AACH,wBAAgB,mBAAmB;;;;;;;;;;;;;;;;;;;;;EA8ElC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { ADMIN_PERMISSIONS as e } from "../constants/permissions.js";
|
|
2
|
+
import { usePermissions as t } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
3
|
+
import { useAuth as n } from "@burdenoff/fe-libs/shared/providers/shell/AuthProvider";
|
|
4
|
+
//#region src/admin/hooks/useAdminPermissions.ts
|
|
5
|
+
function r(e) {
|
|
6
|
+
if (!e) return {
|
|
7
|
+
role: null,
|
|
8
|
+
actorType: null
|
|
9
|
+
};
|
|
10
|
+
let t = e.split(".");
|
|
11
|
+
if (t.length !== 3) return {
|
|
12
|
+
role: null,
|
|
13
|
+
actorType: null
|
|
14
|
+
};
|
|
15
|
+
try {
|
|
16
|
+
let e = t[1].replace(/-/g, "+").replace(/_/g, "/"), n = e.padEnd(Math.ceil(e.length / 4) * 4, "="), r = JSON.parse(atob(n));
|
|
17
|
+
return {
|
|
18
|
+
role: typeof r.role == "string" ? r.role : null,
|
|
19
|
+
actorType: typeof r.actor_type == "string" ? r.actor_type : typeof r.actorType == "string" ? r.actorType : null
|
|
20
|
+
};
|
|
21
|
+
} catch {
|
|
22
|
+
return {
|
|
23
|
+
role: null,
|
|
24
|
+
actorType: null
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function i() {
|
|
29
|
+
let { hasPermission: i, isLoading: a } = t(), o = n(), s = r(o.tokens?.accessToken), c = typeof o.user?.actorType == "string" ? o.user.actorType : typeof o.user?.actor_type == "string" ? o.user.actor_type : null, l = o.user?.role === "SUPER_ADMIN" || o.user?.role === "super_admin" || c === "super_admin" || s.role === "SUPER_ADMIN" || s.role === "super_admin" || s.actorType === "super_admin", u = (e) => l || i(e), d = l || i(e.TENANT_READ) || i(e.TENANT_ADMIN) || i(e.USER_READ) || i(e.USER_ADMIN) || i(e.BILLING_READ) || i(e.NOTIFICATION_READ) || i(e.RBAC_AUDIT_READ) || i(e.WORKSPACE_ADMIN);
|
|
30
|
+
return {
|
|
31
|
+
canViewTenants: u(e.TENANT_READ),
|
|
32
|
+
canManageTenants: u(e.TENANT_WRITE),
|
|
33
|
+
canDeleteTenants: u(e.TENANT_DELETE),
|
|
34
|
+
isTenantAdmin: u(e.TENANT_ADMIN),
|
|
35
|
+
canViewUsers: u(e.USER_READ),
|
|
36
|
+
canUpdateUsers: u(e.USER_UPDATE),
|
|
37
|
+
canDeleteUsers: u(e.USER_DELETE),
|
|
38
|
+
isUserAdmin: u(e.USER_ADMIN),
|
|
39
|
+
canViewBilling: u(e.BILLING_READ),
|
|
40
|
+
canViewCommunications: u(e.NOTIFICATION_READ),
|
|
41
|
+
canViewAuditLogs: u(e.RBAC_AUDIT_READ),
|
|
42
|
+
canManageSettings: u(e.TENANT_ADMIN),
|
|
43
|
+
canViewSRE: u(e.TENANT_ADMIN),
|
|
44
|
+
canManageSandbox: u(e.WORKSPACE_ADMIN),
|
|
45
|
+
canViewProducts: d,
|
|
46
|
+
canManageProducts: u(e.PRODUCT_WRITE),
|
|
47
|
+
canViewWaitlist: d,
|
|
48
|
+
canManageWaitlist: l || i(e.WAITLIST_MANAGE) || i(e.TENANT_ADMIN),
|
|
49
|
+
canViewDashboard: d,
|
|
50
|
+
isLoading: l ? !1 : a
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//#endregion
|
|
54
|
+
export { i as useAdminPermissions };
|
|
55
|
+
|
|
56
|
+
//# sourceMappingURL=useAdminPermissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAdminPermissions.js","names":[],"sources":["../../../src/admin/hooks/useAdminPermissions.ts"],"sourcesContent":["import { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { useAuth } from '@burdenoff/fe-libs/shared/providers/shell/AuthProvider';\nimport { ADMIN_PERMISSIONS } from '../constants/permissions';\n\ninterface JwtAccessClaims {\n role: string | null;\n actorType: string | null;\n}\n\nfunction decodeJwtAccessClaims(token: string | undefined): JwtAccessClaims {\n if (!token) return { role: null, actorType: null };\n const parts = token.split('.');\n if (parts.length !== 3) return { role: null, actorType: null };\n try {\n const base64 = parts[1].replace(/-/g, '+').replace(/_/g, '/');\n const normalized = base64.padEnd(Math.ceil(base64.length / 4) * 4, '=');\n const payload = JSON.parse(atob(normalized)) as Record<string, unknown>;\n return {\n role: typeof payload.role === 'string' ? payload.role : null,\n actorType:\n typeof payload.actor_type === 'string'\n ? payload.actor_type\n : typeof payload.actorType === 'string'\n ? payload.actorType\n : null,\n };\n } catch {\n return { role: null, actorType: null };\n }\n}\n\n/**\n * Hook for admin console RBAC permissions.\n *\n * SUPER_ADMIN role / actor type (verified from profile or JWT) bypasses all\n * permission checks.\n * Other users require granular permissions from the global RBAC service.\n */\nexport function useAdminPermissions() {\n const { hasPermission, isLoading } = usePermissions();\n const auth = useAuth();\n\n const jwtClaims = decodeJwtAccessClaims(auth.tokens?.accessToken);\n const userActorType =\n typeof auth.user?.actorType === 'string'\n ? auth.user.actorType\n : typeof auth.user?.actor_type === 'string'\n ? auth.user.actor_type\n : null;\n const isSuperAdmin =\n auth.user?.role === 'SUPER_ADMIN' ||\n auth.user?.role === 'super_admin' ||\n userActorType === 'super_admin' ||\n jwtClaims.role === 'SUPER_ADMIN' ||\n jwtClaims.role === 'super_admin' ||\n jwtClaims.actorType === 'super_admin';\n\n const check = (permission: string) => isSuperAdmin || hasPermission(permission);\n\n // True if the user holds any admin-level permission (read or admin grants)\n const hasAnyAdminAccess =\n isSuperAdmin ||\n hasPermission(ADMIN_PERMISSIONS.TENANT_READ) ||\n hasPermission(ADMIN_PERMISSIONS.TENANT_ADMIN) ||\n hasPermission(ADMIN_PERMISSIONS.USER_READ) ||\n hasPermission(ADMIN_PERMISSIONS.USER_ADMIN) ||\n hasPermission(ADMIN_PERMISSIONS.BILLING_READ) ||\n hasPermission(ADMIN_PERMISSIONS.NOTIFICATION_READ) ||\n hasPermission(ADMIN_PERMISSIONS.RBAC_AUDIT_READ) ||\n hasPermission(ADMIN_PERMISSIONS.WORKSPACE_ADMIN);\n\n return {\n // Tenant management\n canViewTenants: check(ADMIN_PERMISSIONS.TENANT_READ),\n canManageTenants: check(ADMIN_PERMISSIONS.TENANT_WRITE),\n canDeleteTenants: check(ADMIN_PERMISSIONS.TENANT_DELETE),\n isTenantAdmin: check(ADMIN_PERMISSIONS.TENANT_ADMIN),\n\n // User management\n canViewUsers: check(ADMIN_PERMISSIONS.USER_READ),\n canUpdateUsers: check(ADMIN_PERMISSIONS.USER_UPDATE),\n canDeleteUsers: check(ADMIN_PERMISSIONS.USER_DELETE),\n isUserAdmin: check(ADMIN_PERMISSIONS.USER_ADMIN),\n\n // Billing\n canViewBilling: check(ADMIN_PERMISSIONS.BILLING_READ),\n\n // Communications\n canViewCommunications: check(ADMIN_PERMISSIONS.NOTIFICATION_READ),\n\n // Audit\n canViewAuditLogs: check(ADMIN_PERMISSIONS.RBAC_AUDIT_READ),\n\n // Platform settings / SRE\n canManageSettings: check(ADMIN_PERMISSIONS.TENANT_ADMIN),\n canViewSRE: check(ADMIN_PERMISSIONS.TENANT_ADMIN),\n\n // Workspace / Sandbox\n canManageSandbox: check(ADMIN_PERMISSIONS.WORKSPACE_ADMIN),\n\n // Products\n canViewProducts: hasAnyAdminAccess,\n canManageProducts: check(ADMIN_PERMISSIONS.PRODUCT_WRITE),\n\n // Waitlist\n canViewWaitlist: hasAnyAdminAccess,\n canManageWaitlist:\n isSuperAdmin ||\n hasPermission(ADMIN_PERMISSIONS.WAITLIST_MANAGE) ||\n hasPermission(ADMIN_PERMISSIONS.TENANT_ADMIN),\n\n // General pages — any admin role can access\n canViewDashboard: hasAnyAdminAccess,\n\n isLoading: isSuperAdmin ? false : isLoading,\n };\n}\n"],"mappings":";;;;AASA,SAAS,EAAsB,GAA4C;AACzE,KAAI,CAAC,EAAO,QAAO;EAAE,MAAM;EAAM,WAAW;EAAM;CAClD,IAAM,IAAQ,EAAM,MAAM,IAAI;AAC9B,KAAI,EAAM,WAAW,EAAG,QAAO;EAAE,MAAM;EAAM,WAAW;EAAM;AAC9D,KAAI;EACF,IAAM,IAAS,EAAM,GAAG,QAAQ,MAAM,IAAI,CAAC,QAAQ,MAAM,IAAI,EACvD,IAAa,EAAO,OAAO,KAAK,KAAK,EAAO,SAAS,EAAE,GAAG,GAAG,IAAI,EACjE,IAAU,KAAK,MAAM,KAAK,EAAW,CAAC;AAC5C,SAAO;GACL,MAAM,OAAO,EAAQ,QAAS,WAAW,EAAQ,OAAO;GACxD,WACE,OAAO,EAAQ,cAAe,WAC1B,EAAQ,aACR,OAAO,EAAQ,aAAc,WAC3B,EAAQ,YACR;GACT;SACK;AACN,SAAO;GAAE,MAAM;GAAM,WAAW;GAAM;;;AAW1C,SAAgB,IAAsB;CACpC,IAAM,EAAE,kBAAe,iBAAc,GAAgB,EAC/C,IAAO,GAAS,EAEhB,IAAY,EAAsB,EAAK,QAAQ,YAAY,EAC3D,IACJ,OAAO,EAAK,MAAM,aAAc,WAC5B,EAAK,KAAK,YACV,OAAO,EAAK,MAAM,cAAe,WAC/B,EAAK,KAAK,aACV,MACF,IACJ,EAAK,MAAM,SAAS,iBACpB,EAAK,MAAM,SAAS,iBACpB,MAAkB,iBAClB,EAAU,SAAS,iBACnB,EAAU,SAAS,iBACnB,EAAU,cAAc,eAEpB,KAAS,MAAuB,KAAgB,EAAc,EAAW,EAGzE,IACJ,KACA,EAAc,EAAkB,YAAY,IAC5C,EAAc,EAAkB,aAAa,IAC7C,EAAc,EAAkB,UAAU,IAC1C,EAAc,EAAkB,WAAW,IAC3C,EAAc,EAAkB,aAAa,IAC7C,EAAc,EAAkB,kBAAkB,IAClD,EAAc,EAAkB,gBAAgB,IAChD,EAAc,EAAkB,gBAAgB;AAElD,QAAO;EAEL,gBAAgB,EAAM,EAAkB,YAAY;EACpD,kBAAkB,EAAM,EAAkB,aAAa;EACvD,kBAAkB,EAAM,EAAkB,cAAc;EACxD,eAAe,EAAM,EAAkB,aAAa;EAGpD,cAAc,EAAM,EAAkB,UAAU;EAChD,gBAAgB,EAAM,EAAkB,YAAY;EACpD,gBAAgB,EAAM,EAAkB,YAAY;EACpD,aAAa,EAAM,EAAkB,WAAW;EAGhD,gBAAgB,EAAM,EAAkB,aAAa;EAGrD,uBAAuB,EAAM,EAAkB,kBAAkB;EAGjE,kBAAkB,EAAM,EAAkB,gBAAgB;EAG1D,mBAAmB,EAAM,EAAkB,aAAa;EACxD,YAAY,EAAM,EAAkB,aAAa;EAGjD,kBAAkB,EAAM,EAAkB,gBAAgB;EAG1D,iBAAiB;EACjB,mBAAmB,EAAM,EAAkB,cAAc;EAGzD,iBAAiB;EACjB,mBACE,KACA,EAAc,EAAkB,gBAAgB,IAChD,EAAc,EAAkB,aAAa;EAG/C,kBAAkB;EAElB,WAAW,IAAe,KAAQ;EACnC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin Console Microfrontend
|
|
3
|
+
*
|
|
4
|
+
* Provides a comprehensive platform administration interface
|
|
5
|
+
* for managing tenants, users, billing, support, and system health.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```tsx
|
|
9
|
+
* import { AdminRoot, type AdminRootProps } from '@burdenoff/microfe-admin';
|
|
10
|
+
*
|
|
11
|
+
* function App() {
|
|
12
|
+
* const props: AdminRootProps = {
|
|
13
|
+
* basePath: '/admin',
|
|
14
|
+
* navigate: (path) => router.push(path),
|
|
15
|
+
* currentUser: { id: '1', email: 'admin@example.com', role: 'PLATFORM_SUPERADMIN' },
|
|
16
|
+
* tenantId: 'tenant-123',
|
|
17
|
+
* apiGatewayUrl: 'https://api.example.com',
|
|
18
|
+
* authToken: 'token',
|
|
19
|
+
* };
|
|
20
|
+
*
|
|
21
|
+
* return <AdminRoot {...props} />;
|
|
22
|
+
* }
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export { AdminRoot } from './AdminRoot';
|
|
26
|
+
export type { AdminRootProps, AdminUser, AdminRole, AdminView, Tenant, TenantStatus, TenantSettings, User, UserStatus, Subscription, SubscriptionStatus, Invoice, InvoiceStatus, DashboardMetrics, Activity, NavItem, FooterItem, } from './types';
|
|
27
|
+
export { useAdmin } from './providers/AdminProvider';
|
|
28
|
+
export { useAdminStore } from './store/adminStore';
|
|
29
|
+
export { TenantForm, UserForm, SubscriptionForm, FormSheet, FormSheetFooter, FormSection, FormRow, } from './components';
|
|
30
|
+
export * from './schemas';
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EACV,cAAc,EACd,SAAS,EACT,SAAS,EACT,SAAS,EACT,MAAM,EACN,YAAY,EACZ,cAAc,EACd,IAAI,EACJ,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,QAAQ,EACR,OAAO,EACP,UAAU,GACX,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EACL,UAAU,EACV,QAAQ,EACR,gBAAgB,EAChB,SAAS,EACT,eAAe,EACf,WAAW,EACX,OAAO,GACR,MAAM,cAAc,CAAC;AAGtB,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import "./providers/AdminProvider.js";
|
|
2
|
+
import "./components/FormSheet.js";
|
|
3
|
+
import "./components/forms/TenantForm.js";
|
|
4
|
+
import "./components/forms/UserForm.js";
|
|
5
|
+
import "./components/forms/SubscriptionForm.js";
|
|
6
|
+
import "./components/index.js";
|
|
7
|
+
import "./store/adminStore.js";
|
|
8
|
+
import "./AdminRoot.js";
|
|
9
|
+
import "./schemas/index.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuditLogsPage.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/AuditLogsPage.tsx"],"names":[],"mappings":"AA+BA;;GAEG;AACH,wBAAgB,aAAa,4CAmP5B"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { useAdminPermissions as e } from "../hooks/useAdminPermissions.js";
|
|
2
|
+
import { Button as t, EmptyState as n, Input as r } from "../components/ui.js";
|
|
3
|
+
import { PageLayout as i } from "../components/PageLayout.js";
|
|
4
|
+
import { formatRelativeTime as a } from "../utils/formatters.js";
|
|
5
|
+
import { DataTable as o, Pagination as s } from "../components/DataTable.js";
|
|
6
|
+
import { PermissionGuard as c } from "../components/PermissionGuard.js";
|
|
7
|
+
import "../components/index.js";
|
|
8
|
+
import { useListAuditLogsQuery as l } from "../../generated/global-operations.js";
|
|
9
|
+
import { useCallback as u, useMemo as d, useState as f } from "react";
|
|
10
|
+
import { Database as p, Download as m, FileText as h, Key as g, Search as _, Settings as v, Shield as y, User as b } from "lucide-react";
|
|
11
|
+
import { jsx as x, jsxs as S } from "react/jsx-runtime";
|
|
12
|
+
//#region src/admin/pages/AuditLogsPage.tsx
|
|
13
|
+
var C = 20, w = {
|
|
14
|
+
auth: /* @__PURE__ */ x(b, { className: "h-3 w-3" }),
|
|
15
|
+
user: /* @__PURE__ */ x(b, { className: "h-3 w-3" }),
|
|
16
|
+
settings: /* @__PURE__ */ x(v, { className: "h-3 w-3" }),
|
|
17
|
+
rbac: /* @__PURE__ */ x(y, { className: "h-3 w-3" }),
|
|
18
|
+
data: /* @__PURE__ */ x(p, { className: "h-3 w-3" }),
|
|
19
|
+
api: /* @__PURE__ */ x(g, { className: "h-3 w-3" })
|
|
20
|
+
};
|
|
21
|
+
function T(e) {
|
|
22
|
+
return w[e.split(".")[0]] ?? /* @__PURE__ */ x(h, { className: "h-3 w-3" });
|
|
23
|
+
}
|
|
24
|
+
function E() {
|
|
25
|
+
let { canViewAuditLogs: p, isLoading: g } = e(), [v, y] = f(1), [b, w] = f(""), [E, D] = f(""), O = g || !p, { data: k, loading: A, error: j } = l({
|
|
26
|
+
variables: {
|
|
27
|
+
resource: E || void 0,
|
|
28
|
+
limit: C,
|
|
29
|
+
offset: (v - 1) * C
|
|
30
|
+
},
|
|
31
|
+
fetchPolicy: "cache-and-network",
|
|
32
|
+
skip: O
|
|
33
|
+
}), M = d(() => (k?.auditLogs?.edges ?? []).map((e) => e.node), [k]), N = d(() => {
|
|
34
|
+
if (!b) return M;
|
|
35
|
+
let e = b.toLowerCase();
|
|
36
|
+
return M.filter((t) => t.action.toLowerCase().includes(e) || t.actorId.toLowerCase().includes(e) || t.resource.toLowerCase().includes(e) || t.tenantId.toLowerCase().includes(e));
|
|
37
|
+
}, [M, b]), P = k?.auditLogs?.totalCount ?? 0, F = Math.ceil(P / C), I = u(() => {
|
|
38
|
+
let e = N;
|
|
39
|
+
if (e.length === 0) return;
|
|
40
|
+
let t = [
|
|
41
|
+
"id",
|
|
42
|
+
"action",
|
|
43
|
+
"actorId",
|
|
44
|
+
"actorType",
|
|
45
|
+
"resource",
|
|
46
|
+
"resourceId",
|
|
47
|
+
"tenantId",
|
|
48
|
+
"ipAddress",
|
|
49
|
+
"userAgent",
|
|
50
|
+
"changes",
|
|
51
|
+
"metadata",
|
|
52
|
+
"createdAt"
|
|
53
|
+
], n = (e) => {
|
|
54
|
+
if (e == null) return "";
|
|
55
|
+
let t = typeof e == "object" ? JSON.stringify(e) : String(e);
|
|
56
|
+
return /[",\n\r]/.test(t) ? `"${t.replace(/"/g, "\"\"")}"` : t;
|
|
57
|
+
}, r = [t.join(","), ...e.map((e) => [
|
|
58
|
+
n(e.id),
|
|
59
|
+
n(e.action),
|
|
60
|
+
n(e.actorId),
|
|
61
|
+
n(e.actorType),
|
|
62
|
+
n(e.resource),
|
|
63
|
+
n(e.resourceId),
|
|
64
|
+
n(e.tenantId),
|
|
65
|
+
n(e.ipAddress),
|
|
66
|
+
n(e.userAgent),
|
|
67
|
+
n(e.changes),
|
|
68
|
+
n(e.metadata),
|
|
69
|
+
n(e.createdAt)
|
|
70
|
+
].join(","))].join("\n"), i = new Blob([r], { type: "text/csv;charset=utf-8;" }), a = URL.createObjectURL(i), o = document.createElement("a"), s = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
|
|
71
|
+
o.href = a, o.setAttribute("download", `audit-logs-${s}.csv`), document.body.appendChild(o), o.click(), document.body.removeChild(o), URL.revokeObjectURL(a);
|
|
72
|
+
}, [N]);
|
|
73
|
+
return /* @__PURE__ */ x(c, {
|
|
74
|
+
allowed: p,
|
|
75
|
+
isLoading: g,
|
|
76
|
+
pageTitle: "Audit Logs",
|
|
77
|
+
denyMessage: "You don't have permission to view audit logs.",
|
|
78
|
+
children: /* @__PURE__ */ x(i, {
|
|
79
|
+
title: "Audit Logs",
|
|
80
|
+
description: `Security and compliance audit trail${P ? ` · ${P} total` : ""}`,
|
|
81
|
+
actions: /* @__PURE__ */ S(t, {
|
|
82
|
+
variant: "outline",
|
|
83
|
+
onClick: I,
|
|
84
|
+
disabled: A || N.length === 0,
|
|
85
|
+
"data-testid": "audit-logs-export-csv",
|
|
86
|
+
children: [/* @__PURE__ */ x(m, { className: "mr-2 h-4 w-4" }), "Export CSV"]
|
|
87
|
+
}),
|
|
88
|
+
children: /* @__PURE__ */ S("div", {
|
|
89
|
+
className: "space-y-4",
|
|
90
|
+
children: [
|
|
91
|
+
/* @__PURE__ */ S("div", {
|
|
92
|
+
className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
|
|
93
|
+
children: [/* @__PURE__ */ S("div", {
|
|
94
|
+
className: "relative max-w-sm flex-1",
|
|
95
|
+
children: [/* @__PURE__ */ x(_, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }), /* @__PURE__ */ x(r, {
|
|
96
|
+
placeholder: "Search by action, actor, or resource...",
|
|
97
|
+
value: b,
|
|
98
|
+
onChange: (e) => w(e.target.value),
|
|
99
|
+
className: "pl-9"
|
|
100
|
+
})]
|
|
101
|
+
}), /* @__PURE__ */ x(r, {
|
|
102
|
+
placeholder: "Filter by resource (e.g. tenant, user)...",
|
|
103
|
+
value: E,
|
|
104
|
+
onChange: (e) => {
|
|
105
|
+
y(1), D(e.target.value);
|
|
106
|
+
},
|
|
107
|
+
className: "max-w-xs"
|
|
108
|
+
})]
|
|
109
|
+
}),
|
|
110
|
+
j && /* @__PURE__ */ S("div", {
|
|
111
|
+
className: "rounded-md border border-destructive/50 bg-destructive/10 p-4 text-sm text-destructive",
|
|
112
|
+
children: ["Failed to load audit logs: ", j.message]
|
|
113
|
+
}),
|
|
114
|
+
/* @__PURE__ */ x(o, {
|
|
115
|
+
columns: [
|
|
116
|
+
{
|
|
117
|
+
key: "action",
|
|
118
|
+
header: "Action",
|
|
119
|
+
render: (e) => /* @__PURE__ */ S("div", {
|
|
120
|
+
className: "flex items-center gap-2",
|
|
121
|
+
children: [/* @__PURE__ */ x("span", {
|
|
122
|
+
className: "text-muted-foreground",
|
|
123
|
+
children: T(e.action)
|
|
124
|
+
}), /* @__PURE__ */ x("span", {
|
|
125
|
+
className: "font-mono text-sm font-medium text-foreground",
|
|
126
|
+
children: e.action
|
|
127
|
+
})]
|
|
128
|
+
})
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
key: "actorId",
|
|
132
|
+
header: "Actor",
|
|
133
|
+
width: "180px",
|
|
134
|
+
render: (e) => /* @__PURE__ */ S("div", {
|
|
135
|
+
className: "min-w-0",
|
|
136
|
+
children: [/* @__PURE__ */ x("div", {
|
|
137
|
+
className: "truncate text-sm",
|
|
138
|
+
children: e.actorId
|
|
139
|
+
}), /* @__PURE__ */ x("div", {
|
|
140
|
+
className: "text-xs text-muted-foreground capitalize",
|
|
141
|
+
children: e.actorType
|
|
142
|
+
})]
|
|
143
|
+
})
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
key: "resource",
|
|
147
|
+
header: "Resource",
|
|
148
|
+
width: "150px",
|
|
149
|
+
render: (e) => /* @__PURE__ */ S("div", {
|
|
150
|
+
className: "min-w-0",
|
|
151
|
+
children: [/* @__PURE__ */ x("div", {
|
|
152
|
+
className: "truncate text-sm",
|
|
153
|
+
children: e.resource
|
|
154
|
+
}), e.resourceId && /* @__PURE__ */ S("div", {
|
|
155
|
+
className: "truncate text-xs text-muted-foreground",
|
|
156
|
+
children: ["#", String(e.resourceId).slice(-8)]
|
|
157
|
+
})]
|
|
158
|
+
})
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
key: "tenantId",
|
|
162
|
+
header: "Tenant",
|
|
163
|
+
width: "130px",
|
|
164
|
+
render: (e) => /* @__PURE__ */ x("span", {
|
|
165
|
+
className: "text-xs text-muted-foreground",
|
|
166
|
+
children: e.tenantId ? `#${e.tenantId.slice(-8)}` : "—"
|
|
167
|
+
})
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
key: "ipAddress",
|
|
171
|
+
header: "IP",
|
|
172
|
+
width: "120px",
|
|
173
|
+
render: (e) => /* @__PURE__ */ x("span", {
|
|
174
|
+
className: "font-mono text-xs text-muted-foreground",
|
|
175
|
+
children: e.ipAddress ?? "—"
|
|
176
|
+
})
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
key: "createdAt",
|
|
180
|
+
header: "Time",
|
|
181
|
+
width: "110px",
|
|
182
|
+
render: (e) => a(e.createdAt)
|
|
183
|
+
}
|
|
184
|
+
],
|
|
185
|
+
data: N,
|
|
186
|
+
keyExtractor: (e) => e.id,
|
|
187
|
+
loading: A,
|
|
188
|
+
emptyState: /* @__PURE__ */ x(n, {
|
|
189
|
+
icon: /* @__PURE__ */ x(h, { className: "h-8 w-8" }),
|
|
190
|
+
title: "No audit logs found",
|
|
191
|
+
description: "Audit events will appear here when actions are performed"
|
|
192
|
+
})
|
|
193
|
+
}),
|
|
194
|
+
P > C && /* @__PURE__ */ x(s, {
|
|
195
|
+
page: v,
|
|
196
|
+
totalPages: F,
|
|
197
|
+
totalItems: P,
|
|
198
|
+
pageSize: C,
|
|
199
|
+
onPageChange: y
|
|
200
|
+
})
|
|
201
|
+
]
|
|
202
|
+
})
|
|
203
|
+
})
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
//#endregion
|
|
207
|
+
export { E as AuditLogsPage };
|
|
208
|
+
|
|
209
|
+
//# sourceMappingURL=AuditLogsPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuditLogsPage.js","names":[],"sources":["../../../src/admin/pages/AuditLogsPage.tsx"],"sourcesContent":["import { useState, useMemo, useCallback } from 'react';\nimport { FileText, Search, Download, User, Settings, Shield, Database, Key } from 'lucide-react';\nimport {\n PageLayout,\n Input,\n DataTable,\n Pagination,\n EmptyState,\n Button,\n PermissionGuard,\n} from '../components';\nimport { useAdminPermissions } from '../hooks/useAdminPermissions';\nimport { formatRelativeTime } from '../utils/formatters';\nimport { useListAuditLogsQuery } from '../../generated/global-operations';\n\nconst PAGE_SIZE = 20;\n\nconst ACTION_ICONS: Record<string, React.ReactNode> = {\n auth: <User className=\"h-3 w-3\" />,\n user: <User className=\"h-3 w-3\" />,\n settings: <Settings className=\"h-3 w-3\" />,\n rbac: <Shield className=\"h-3 w-3\" />,\n data: <Database className=\"h-3 w-3\" />,\n api: <Key className=\"h-3 w-3\" />,\n};\n\nfunction getActionIcon(action: string) {\n const prefix = action.split('.')[0];\n return ACTION_ICONS[prefix] ?? <FileText className=\"h-3 w-3\" />;\n}\n\n/**\n * Audit logs page — connected to real backend\n */\nexport function AuditLogsPage() {\n const { canViewAuditLogs, isLoading: permissionsLoading } = useAdminPermissions();\n\n const [page, setPage] = useState(1);\n const [search, setSearch] = useState('');\n const [resourceFilter, setResourceFilter] = useState('');\n\n const skipQueries = permissionsLoading || !canViewAuditLogs;\n\n const { data, loading, error } = useListAuditLogsQuery({\n variables: {\n resource: resourceFilter || undefined,\n limit: PAGE_SIZE,\n offset: (page - 1) * PAGE_SIZE,\n },\n fetchPolicy: 'cache-and-network',\n skip: skipQueries,\n });\n\n const auditLogs = useMemo(() => {\n const edges = data?.auditLogs?.edges ?? [];\n return edges.map((e: (typeof edges)[number]) => e.node);\n }, [data]);\n\n type AuditLogNode = (typeof auditLogs)[number];\n\n const filteredLogs = useMemo(() => {\n if (!search) return auditLogs;\n const q = search.toLowerCase();\n return auditLogs.filter(\n (log: AuditLogNode) =>\n log.action.toLowerCase().includes(q) ||\n log.actorId.toLowerCase().includes(q) ||\n log.resource.toLowerCase().includes(q) ||\n log.tenantId.toLowerCase().includes(q)\n );\n }, [auditLogs, search]);\n\n const total = data?.auditLogs?.totalCount ?? 0;\n const totalPages = Math.ceil(total / PAGE_SIZE);\n\n const exportToCsv = useCallback(() => {\n const rows = filteredLogs;\n if (rows.length === 0) return;\n\n const headers = [\n 'id',\n 'action',\n 'actorId',\n 'actorType',\n 'resource',\n 'resourceId',\n 'tenantId',\n 'ipAddress',\n 'userAgent',\n 'changes',\n 'metadata',\n 'createdAt',\n ];\n\n const escape = (value: unknown): string => {\n if (value === null || value === undefined) return '';\n const str = typeof value === 'object' ? JSON.stringify(value) : String(value);\n // RFC 4180: wrap in quotes if it contains quote, comma, or newline; double internal quotes\n if (/[\",\\n\\r]/.test(str)) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n return str;\n };\n\n const csvLines = [\n headers.join(','),\n ...rows.map((log: AuditLogNode) =>\n [\n escape(log.id),\n escape(log.action),\n escape(log.actorId),\n escape(log.actorType),\n escape(log.resource),\n escape(log.resourceId),\n escape(log.tenantId),\n escape(log.ipAddress),\n escape((log as { userAgent?: unknown }).userAgent),\n escape((log as { changes?: unknown }).changes),\n escape((log as { metadata?: unknown }).metadata),\n escape(log.createdAt),\n ].join(',')\n ),\n ];\n\n const csv = csvLines.join('\\n');\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n const stamp = new Date().toISOString().replace(/[:.]/g, '-');\n link.href = url;\n link.setAttribute('download', `audit-logs-${stamp}.csv`);\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }, [filteredLogs]);\n\n const columns = [\n {\n key: 'action',\n header: 'Action',\n render: (log: (typeof auditLogs)[number]) => (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">{getActionIcon(log.action)}</span>\n <span className=\"font-mono text-sm font-medium text-foreground\">{log.action}</span>\n </div>\n ),\n },\n {\n key: 'actorId',\n header: 'Actor',\n width: '180px',\n render: (log: (typeof auditLogs)[number]) => (\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm\">{log.actorId}</div>\n <div className=\"text-xs text-muted-foreground capitalize\">{log.actorType}</div>\n </div>\n ),\n },\n {\n key: 'resource',\n header: 'Resource',\n width: '150px',\n render: (log: (typeof auditLogs)[number]) => (\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm\">{log.resource}</div>\n {log.resourceId && (\n <div className=\"truncate text-xs text-muted-foreground\">\n #{String(log.resourceId).slice(-8)}\n </div>\n )}\n </div>\n ),\n },\n {\n key: 'tenantId',\n header: 'Tenant',\n width: '130px',\n render: (log: (typeof auditLogs)[number]) => (\n <span className=\"text-xs text-muted-foreground\">\n {log.tenantId ? `#${log.tenantId.slice(-8)}` : '—'}\n </span>\n ),\n },\n {\n key: 'ipAddress',\n header: 'IP',\n width: '120px',\n render: (log: (typeof auditLogs)[number]) => (\n <span className=\"font-mono text-xs text-muted-foreground\">{log.ipAddress ?? '—'}</span>\n ),\n },\n {\n key: 'createdAt',\n header: 'Time',\n width: '110px',\n render: (log: (typeof auditLogs)[number]) => formatRelativeTime(log.createdAt),\n },\n ];\n\n return (\n <PermissionGuard\n allowed={canViewAuditLogs}\n isLoading={permissionsLoading}\n pageTitle=\"Audit Logs\"\n denyMessage=\"You don't have permission to view audit logs.\"\n >\n <PageLayout\n title=\"Audit Logs\"\n description={`Security and compliance audit trail${total ? ` · ${total} total` : ''}`}\n actions={\n <Button\n variant=\"outline\"\n onClick={exportToCsv}\n disabled={loading || filteredLogs.length === 0}\n data-testid=\"audit-logs-export-csv\"\n >\n <Download className=\"mr-2 h-4 w-4\" />\n Export CSV\n </Button>\n }\n >\n <div className=\"space-y-4\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm: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 by action, actor, or resource...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n <Input\n placeholder=\"Filter by resource (e.g. tenant, user)...\"\n value={resourceFilter}\n onChange={(e) => {\n setPage(1);\n setResourceFilter(e.target.value);\n }}\n className=\"max-w-xs\"\n />\n </div>\n\n {error && (\n <div className=\"rounded-md border border-destructive/50 bg-destructive/10 p-4 text-sm text-destructive\">\n Failed to load audit logs: {error.message}\n </div>\n )}\n\n <DataTable\n columns={columns}\n data={filteredLogs}\n keyExtractor={(l) => l.id}\n loading={loading}\n emptyState={\n <EmptyState\n icon={<FileText className=\"h-8 w-8\" />}\n title=\"No audit logs found\"\n description=\"Audit events will appear here when actions are performed\"\n />\n }\n />\n\n {total > PAGE_SIZE && (\n <Pagination\n page={page}\n totalPages={totalPages}\n totalItems={total}\n pageSize={PAGE_SIZE}\n onPageChange={setPage}\n />\n )}\n </div>\n </PageLayout>\n </PermissionGuard>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BillingPage.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/BillingPage.tsx"],"names":[],"mappings":"AASA,wBAAgB,WAAW,4CA2J1B"}
|