@jmruthers/pace-core 0.5.76 → 0.5.78
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/CHANGELOG.md +8 -0
- package/dist/{RBACService-C4udt_Zp.d.ts → AuthService-Df3IozMG.d.ts} +10 -118
- package/dist/{DataTable-ntgmhO2W.d.ts → DataTable-BE0OXZKQ.d.ts} +9 -2
- package/dist/{DataTable-4GAVPIEG.js → DataTable-ETGVF4Y5.js} +50 -13
- package/dist/{PublicLoadingSpinner-BiNER8F5.d.ts → PublicLoadingSpinner-CnUaz0vG.d.ts} +5 -2
- package/dist/{UnifiedAuthProvider-Bj6YCf7c.d.ts → UnifiedAuthProvider-B391Aqum.d.ts} +42 -45
- package/dist/{UnifiedAuthProvider-3NKDOSOK.js → UnifiedAuthProvider-P5SOJAQ6.js} +4 -5
- package/dist/{api-DDMUKIUD.js → api-KG4A2X7P.js} +9 -3
- package/dist/{audit-6TOCAMKO.js → audit-65VNHEV2.js} +2 -2
- package/dist/{chunk-K34IM5CT.js → chunk-2OGV6IRV.js} +196 -626
- package/dist/chunk-2OGV6IRV.js.map +1 -0
- package/dist/{chunk-NTNILOBC.js → chunk-5BO3MI5Y.js} +4 -4
- package/dist/{chunk-XLZ7U46Z.js → chunk-CVMVPYAL.js} +9 -60
- package/dist/chunk-CVMVPYAL.js.map +1 -0
- package/dist/{chunk-URUTVZ7N.js → chunk-FL4ZCQLD.js} +2 -2
- package/dist/{chunk-LW7MMEAQ.js → chunk-FT2M4R4F.js} +2 -2
- package/dist/{chunk-5BSLGBYI.js → chunk-JCQZ6LA7.js} +2 -8
- package/dist/{chunk-5BSLGBYI.js.map → chunk-JCQZ6LA7.js.map} +1 -1
- package/dist/{chunk-KHJS6VIA.js → chunk-LRQ6RBJC.js} +157 -112
- package/dist/chunk-LRQ6RBJC.js.map +1 -0
- package/dist/{chunk-WN6XJWOS.js → chunk-MNJXXD6C.js} +274 -743
- package/dist/chunk-MNJXXD6C.js.map +1 -0
- package/dist/{chunk-KK73ZB4E.js → chunk-PTR5PMPE.js} +153 -132
- package/dist/chunk-PTR5PMPE.js.map +1 -0
- package/dist/{chunk-B2WTCLCV.js → chunk-Q7APDV6H.js} +18 -8
- package/dist/chunk-Q7APDV6H.js.map +1 -0
- package/dist/{chunk-A4FUBC7B.js → chunk-QGVSOUJ2.js} +2 -4
- package/dist/{chunk-A4FUBC7B.js.map → chunk-QGVSOUJ2.js.map} +1 -1
- package/dist/{chunk-FGMFQSHX.js → chunk-S63MFSY6.js} +500 -551
- package/dist/chunk-S63MFSY6.js.map +1 -0
- package/dist/{chunk-AFGTSUAD.js → chunk-VSOKOFRF.js} +4 -4
- package/dist/chunk-WUXCWRL6.js +20 -0
- package/dist/chunk-WUXCWRL6.js.map +1 -0
- package/dist/{chunk-Y6TXWPJO.js → chunk-YVVGHRGI.js} +105 -31
- package/dist/chunk-YVVGHRGI.js.map +1 -0
- package/dist/{chunk-M5IWZRBT.js → chunk-ZMNXIJP4.js} +2187 -981
- package/dist/chunk-ZMNXIJP4.js.map +1 -0
- package/dist/components.d.ts +6 -6
- package/dist/components.js +14 -18
- package/dist/components.js.map +1 -1
- package/dist/{database-C3Szpi5J.d.ts → database-BXAfr2Y_.d.ts} +18 -0
- package/dist/hooks.d.ts +5 -5
- package/dist/hooks.js +8 -9
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +19 -27
- package/dist/index.js +21 -29
- package/dist/index.js.map +1 -1
- package/dist/{organisation-BtshODVF.d.ts → organisation-D6qRDtbF.d.ts} +1 -1
- package/dist/providers.d.ts +7 -21
- package/dist/providers.js +3 -10
- package/dist/rbac/index.d.ts +71 -221
- package/dist/rbac/index.js +15 -16
- package/dist/{types-CGX9Vyf5.d.ts → types-BDg1mAGG.d.ts} +36 -6
- package/dist/types.d.ts +3 -3
- package/dist/types.js +61 -18
- package/dist/types.js.map +1 -1
- package/dist/{unified-CM7T0aTK.d.ts → unified-DQ4VcT7H.d.ts} +1 -1
- package/dist/{usePublicRouteParams-B-CumWRc.d.ts → usePublicRouteParams-BlgwXweB.d.ts} +3 -3
- package/dist/utils.d.ts +2 -2
- package/dist/utils.js +52 -9
- package/dist/utils.js.map +1 -1
- package/docs/CONTENT_AUDIT_REPORT.md +253 -0
- package/docs/DOCUMENTATION_AUDIT.md +172 -0
- package/docs/README.md +142 -147
- package/docs/STYLE_GUIDE.md +37 -0
- package/docs/api/classes/ColumnFactory.md +17 -17
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/InvalidScopeError.md +4 -4
- package/docs/api/classes/MissingUserContextError.md +4 -4
- package/docs/api/classes/OrganisationContextRequiredError.md +4 -4
- package/docs/api/classes/PermissionDeniedError.md +5 -5
- package/docs/api/classes/PublicErrorBoundary.md +1 -1
- package/docs/api/classes/RBACAuditManager.md +8 -8
- package/docs/api/classes/RBACCache.md +35 -5
- package/docs/api/classes/RBACEngine.md +49 -20
- package/docs/api/classes/RBACError.md +4 -4
- package/docs/api/classes/RBACNotInitializedError.md +4 -4
- package/docs/api/classes/SecureSupabaseClient.md +1 -1
- package/docs/api/classes/StorageUtils.md +1 -1
- package/docs/api/enums/FileCategory.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +4 -4
- package/docs/api/interfaces/ButtonProps.md +1 -1
- package/docs/api/interfaces/CardProps.md +1 -1
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +1 -1
- package/docs/api/interfaces/DataAccessRecord.md +1 -1
- package/docs/api/interfaces/DataRecord.md +11 -0
- package/docs/api/interfaces/DataTableAction.md +65 -29
- package/docs/api/interfaces/DataTableColumn.md +36 -23
- package/docs/api/interfaces/DataTableProps.md +80 -38
- package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
- package/docs/api/interfaces/EmptyStateConfig.md +5 -5
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
- package/docs/api/interfaces/EventLogoProps.md +1 -1
- package/docs/api/interfaces/FileDisplayProps.md +1 -1
- package/docs/api/interfaces/FileMetadata.md +1 -1
- package/docs/api/interfaces/FileReference.md +1 -1
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadOptions.md +1 -1
- package/docs/api/interfaces/FileUploadProps.md +1 -1
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
- package/docs/api/interfaces/InputProps.md +1 -1
- package/docs/api/interfaces/LabelProps.md +1 -1
- package/docs/api/interfaces/LoginFormProps.md +1 -1
- package/docs/api/interfaces/NavigationAccessRecord.md +11 -11
- package/docs/api/interfaces/NavigationContextType.md +9 -9
- package/docs/api/interfaces/NavigationGuardProps.md +1 -1
- package/docs/api/interfaces/NavigationItem.md +1 -1
- package/docs/api/interfaces/NavigationMenuProps.md +1 -1
- package/docs/api/interfaces/NavigationProviderProps.md +7 -7
- package/docs/api/interfaces/Organisation.md +1 -1
- package/docs/api/interfaces/OrganisationContextType.md +1 -1
- package/docs/api/interfaces/OrganisationMembership.md +1 -1
- package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
- package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
- package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
- package/docs/api/interfaces/PaceLoginPageProps.md +16 -3
- package/docs/api/interfaces/PageAccessRecord.md +1 -1
- package/docs/api/interfaces/PagePermissionContextType.md +1 -1
- package/docs/api/interfaces/PagePermissionGuardProps.md +2 -2
- package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/PermissionEnforcerProps.md +4 -4
- package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
- package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
- package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
- package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
- package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
- package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
- package/docs/api/interfaces/RBACConfig.md +1 -1
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
- package/docs/api/interfaces/RouteAccessRecord.md +2 -2
- package/docs/api/interfaces/RouteConfig.md +2 -2
- package/docs/api/interfaces/SecureDataContextType.md +1 -1
- package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
- package/docs/api/interfaces/StorageConfig.md +1 -1
- package/docs/api/interfaces/StorageFileInfo.md +1 -1
- package/docs/api/interfaces/StorageFileMetadata.md +1 -1
- package/docs/api/interfaces/StorageListOptions.md +1 -1
- package/docs/api/interfaces/StorageListResult.md +1 -1
- package/docs/api/interfaces/StorageUploadOptions.md +1 -1
- package/docs/api/interfaces/StorageUploadResult.md +1 -1
- package/docs/api/interfaces/StorageUrlOptions.md +1 -1
- package/docs/api/interfaces/StyleImport.md +1 -1
- package/docs/api/interfaces/SwitchProps.md +1 -1
- package/docs/api/interfaces/ToastActionElement.md +1 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +94 -521
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +16 -16
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeOptions.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
- package/docs/api/interfaces/UserEventAccess.md +11 -11
- package/docs/api/interfaces/UserMenuProps.md +1 -1
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +251 -269
- package/docs/api-reference/components.md +193 -0
- package/docs/api-reference/hooks.md +265 -0
- package/docs/api-reference/providers.md +6 -0
- package/docs/api-reference/types.md +6 -0
- package/docs/api-reference/utilities.md +207 -0
- package/docs/architecture/README.md +6 -0
- package/docs/{database-schema-requirements.md → architecture/database-schema-requirements.md} +6 -0
- package/docs/architecture/rbac-security-architecture.md +258 -0
- package/docs/architecture/services.md +9 -1
- package/docs/best-practices/README.md +6 -0
- package/docs/best-practices/accessibility.md +6 -0
- package/docs/{common-patterns.md → best-practices/common-patterns.md} +6 -0
- package/docs/best-practices/deployment.md +6 -0
- package/docs/best-practices/performance.md +475 -2
- package/docs/best-practices/security.md +6 -0
- package/docs/best-practices/testing.md +6 -0
- package/docs/core-concepts/authentication.md +6 -0
- package/docs/core-concepts/events.md +6 -0
- package/docs/core-concepts/organisations.md +6 -0
- package/docs/core-concepts/permissions.md +6 -0
- package/docs/core-concepts/rbac-system.md +8 -0
- package/docs/documentation-index.md +121 -182
- package/docs/{consuming-app-vite-config.md → getting-started/consuming-app-vite-config.md} +6 -0
- package/docs/getting-started/documentation-index.md +40 -0
- package/docs/getting-started/examples/README.md +878 -35
- package/docs/{faq.md → getting-started/faq.md} +7 -1
- package/docs/getting-started/installation-guide.md +6 -0
- package/docs/{quick-reference.md → getting-started/quick-reference.md} +6 -0
- package/docs/implementation-guides/app-layout.md +6 -0
- package/docs/implementation-guides/authentication.md +1021 -0
- package/docs/implementation-guides/component-styling.md +6 -0
- package/docs/implementation-guides/data-tables.md +1264 -2076
- package/docs/implementation-guides/dynamic-colors.md +6 -0
- package/docs/implementation-guides/event-theming-summary.md +6 -0
- package/docs/{file-reference-system.md → implementation-guides/file-reference-system.md} +6 -0
- package/docs/implementation-guides/file-upload-storage.md +6 -0
- package/docs/implementation-guides/forms.md +6 -0
- package/docs/implementation-guides/inactivity-tracking.md +6 -0
- package/docs/implementation-guides/navigation.md +6 -0
- package/docs/implementation-guides/organisation-security.md +6 -0
- package/docs/implementation-guides/permission-enforcement.md +6 -0
- package/docs/implementation-guides/public-pages-advanced.md +6 -0
- package/docs/implementation-guides/public-pages.md +6 -0
- package/docs/migration/MIGRATION_GUIDE.md +827 -351
- package/docs/migration/README.md +7 -1
- package/docs/migration/organisation-context-timing-fix.md +6 -0
- package/docs/migration/rbac-migration.md +44 -1
- package/docs/migration/service-architecture.md +6 -0
- package/docs/migration/v0.4.15-tailwind-scanning.md +6 -0
- package/docs/migration/v0.4.16-css-first-approach.md +6 -0
- package/docs/migration/v0.4.17-source-path-fix.md +6 -0
- package/docs/rbac/README-rbac-rls-integration.md +6 -0
- package/docs/rbac/README.md +6 -0
- package/docs/rbac/advanced-patterns.md +6 -0
- package/docs/rbac/api-reference.md +7 -1
- package/docs/rbac/breaking-changes-v3.md +222 -0
- package/docs/rbac/examples/rbac-rls-integration-example.md +6 -0
- package/docs/rbac/examples.md +6 -0
- package/docs/rbac/getting-started.md +6 -0
- package/docs/rbac/migration-guide.md +260 -0
- package/docs/rbac/quick-start.md +70 -13
- package/docs/rbac/rbac-rls-integration.md +6 -0
- package/docs/rbac/super-admin-guide.md +6 -0
- package/docs/rbac/troubleshooting.md +6 -0
- package/docs/security/README.md +6 -0
- package/docs/security/checklist.md +6 -0
- package/docs/styles/README.md +7 -1
- package/docs/{usage.md → styles/usage.md} +6 -0
- package/docs/testing/README.md +6 -0
- package/docs/{visual-testing.md → testing/visual-testing.md} +6 -0
- package/docs/troubleshooting/README.md +387 -5
- package/docs/troubleshooting/cake-page-permission-guard-issue-summary.md +6 -0
- package/docs/troubleshooting/common-issues.md +6 -0
- package/docs/troubleshooting/database-view-compatibility.md +6 -0
- package/docs/troubleshooting/organisation-context-setup.md +6 -0
- package/docs/troubleshooting/react-hooks-issue-analysis.md +6 -0
- package/docs/troubleshooting/styling-issues.md +6 -0
- package/docs/troubleshooting/tailwind-content-scanning.md +6 -0
- package/package.json +1 -1
- package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -1
- package/src/__tests__/helpers/test-providers.tsx +3 -53
- package/src/components/DataTable/DataTable.test.tsx +319 -0
- package/src/components/DataTable/DataTable.tsx +32 -11
- package/src/components/DataTable/__tests__/{DataTable.comprehensive.test.tsx → DataTable.comprehensive.test.tsx.skip} +6 -4
- package/src/components/DataTable/__tests__/{DataTable.test.tsx → DataTable.test.tsx.skip} +6 -4
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +31 -9
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +601 -0
- package/src/components/DataTable/__tests__/keyboard.test.tsx +615 -0
- package/src/components/DataTable/__tests__/pagination.modes.test.tsx +639 -0
- package/src/components/DataTable/__tests__/ssr.strict-mode.test.tsx.skip +330 -0
- package/src/components/DataTable/components/AccessDeniedPage.tsx +2 -2
- package/src/components/DataTable/components/ActionButtons.tsx +88 -104
- package/src/components/DataTable/components/DataTableCore.tsx +309 -337
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +4 -2
- package/src/components/DataTable/components/DataTableModals.tsx +22 -1
- package/src/components/DataTable/components/EditableRow.tsx +69 -84
- package/src/components/DataTable/components/EmptyState.tsx +5 -1
- package/src/components/DataTable/components/ImportModal.tsx +65 -36
- package/src/components/DataTable/components/PaginationControls.tsx +40 -100
- package/src/components/DataTable/components/UnifiedTableBody.tsx +125 -148
- package/src/components/DataTable/context/DataTableContext.tsx +1 -1
- package/src/components/DataTable/core/ColumnFactory.ts +5 -0
- package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +12 -10
- package/src/components/DataTable/examples/HierarchicalExample.tsx +1 -1
- package/src/components/DataTable/examples/InitialPageSizeExample.tsx +1 -0
- package/src/components/DataTable/examples/PerformanceExample.tsx +1 -0
- package/src/components/DataTable/hooks/__tests__/useColumnOrderPersistence.test.ts +1 -5
- package/src/components/DataTable/hooks/__tests__/useColumnVisibilityPersistence.test.ts +167 -0
- package/src/components/DataTable/hooks/index.ts +7 -0
- package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +32 -15
- package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +102 -0
- package/src/components/DataTable/hooks/useDataTableConfiguration.ts +89 -0
- package/src/components/DataTable/hooks/useDataTableDataPipeline.ts +117 -0
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +71 -27
- package/src/components/DataTable/hooks/useDataTableState.ts +39 -11
- package/src/components/DataTable/hooks/useEffectiveColumnOrder.ts +33 -0
- package/src/components/DataTable/hooks/useHierarchicalState.ts +15 -1
- package/src/components/DataTable/hooks/useKeyboardNavigation.ts +447 -0
- package/src/components/DataTable/hooks/useServerSideDataEffect.ts +94 -0
- package/src/components/DataTable/hooks/useTableColumns.ts +10 -7
- package/src/components/DataTable/hooks/useTableHandlers.ts +174 -0
- package/src/components/DataTable/index.ts +12 -3
- package/src/components/DataTable/types.ts +129 -9
- package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +159 -22
- package/src/components/DataTable/utils/__tests__/flexibleImport.test.ts +111 -0
- package/src/components/DataTable/utils/__tests__/rowUtils.test.ts +15 -29
- package/src/components/DataTable/utils/a11yUtils.ts +244 -0
- package/src/components/DataTable/utils/debugTools.ts +609 -0
- package/src/components/DataTable/utils/exportUtils.ts +114 -16
- package/src/components/DataTable/utils/flexibleImport.ts +202 -32
- package/src/components/DataTable/utils/hierarchicalUtils.ts +1 -1
- package/src/components/DataTable/utils/index.ts +2 -0
- package/src/components/DataTable/utils/paginationUtils.ts +350 -0
- package/src/components/DataTable/utils/rowUtils.ts +6 -5
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +19 -24
- package/src/components/NavigationMenu/NavigationMenu.tsx +19 -8
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +1 -23
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +56 -6
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +137 -13
- package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +1 -1
- package/src/components/Select/Select.tsx +1 -0
- package/src/components/examples/PermissionExample.tsx +173 -0
- package/src/examples/CorrectPublicPageImplementation.tsx +301 -0
- package/src/examples/PublicEventPage.tsx +274 -0
- package/src/examples/PublicPageApp.tsx +308 -0
- package/src/examples/PublicPageUsageExample.tsx +216 -0
- package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +12 -1
- package/src/hooks/__tests__/useOrganisationSecurity.unit.test.tsx +129 -17
- package/src/hooks/__tests__/useRBAC.unit.test.ts +151 -846
- package/src/hooks/useOrganisationPermissions.test.ts +42 -18
- package/src/hooks/useOrganisationPermissions.ts +12 -6
- package/src/hooks/useOrganisationSecurity.test.ts +138 -85
- package/src/hooks/useOrganisationSecurity.ts +41 -10
- package/src/index.ts +0 -1
- package/src/providers/AuthProvider.simplified.tsx +880 -0
- package/src/providers/UnifiedAuthProvider.test.simple.tsx +8 -8
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +29 -19
- package/src/providers/index.ts +0 -1
- package/src/providers/services/EventServiceProvider.tsx +19 -15
- package/src/providers/services/InactivityServiceProvider.tsx +19 -15
- package/src/providers/services/OrganisationServiceProvider.tsx +19 -15
- package/src/providers/services/UnifiedAuthProvider.tsx +156 -127
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +1 -1
- package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +3 -3
- package/src/rbac/README.md +1 -1
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +25 -27
- package/src/rbac/__tests__/auth-rbac-security.integration.test.tsx +313 -0
- package/src/rbac/__tests__/engine.comprehensive.test.ts +114 -348
- package/src/rbac/__tests__/rbac-engine-core-logic.test.ts +28 -110
- package/src/rbac/__tests__/rbac-engine-simplified.test.ts +33 -85
- package/src/rbac/__tests__/scenarios.user-role.test.tsx +2 -2
- package/src/rbac/adapters.tsx +26 -69
- package/src/rbac/api.test.ts +90 -27
- package/src/rbac/api.ts +61 -10
- package/src/rbac/audit.test.ts +33 -38
- package/src/rbac/audit.ts +21 -6
- package/src/rbac/cache.ts +33 -1
- package/src/rbac/components/NavigationGuard.tsx +11 -11
- package/src/rbac/components/NavigationProvider.test.tsx +11 -5
- package/src/rbac/components/NavigationProvider.tsx +37 -13
- package/src/rbac/components/PagePermissionGuard.tsx +111 -50
- package/src/rbac/components/PagePermissionProvider.tsx +5 -5
- package/src/rbac/components/PermissionEnforcer.tsx +11 -11
- package/src/rbac/components/RoleBasedRouter.tsx +5 -5
- package/src/rbac/components/SecureDataProvider.tsx +5 -5
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +8 -8
- package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +14 -14
- package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +12 -12
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +6 -6
- package/src/rbac/engine.test.simple.ts +19 -13
- package/src/rbac/engine.test.ts +1 -0
- package/src/rbac/engine.ts +330 -766
- package/src/rbac/errors.ts +156 -0
- package/src/rbac/hooks/usePermissions.ts +32 -10
- package/src/rbac/hooks/useRBAC.test.ts +126 -512
- package/src/rbac/hooks/useRBAC.ts +147 -193
- package/src/rbac/hooks/useResolvedScope.ts +12 -0
- package/src/rbac/index.ts +7 -4
- package/src/rbac/security.ts +109 -18
- package/src/rbac/types.ts +12 -1
- package/src/services/AuthService.ts +2 -15
- package/src/services/EventService.ts +43 -46
- package/src/services/OrganisationService.ts +51 -31
- package/src/services/__tests__/AuthService.test.ts +1 -1
- package/src/services/__tests__/EventService.test.ts +1 -1
- package/src/services/__tests__/OrganisationService.test.ts +1 -1
- package/src/services/base/BaseService.ts +8 -0
- package/src/styles/base.css +208 -0
- package/src/styles/semantic.css +24 -0
- package/src/types/database.generated.ts +7347 -0
- package/src/types/database.ts +20 -0
- package/src/utils/logger.ts +179 -0
- package/src/utils/organisationContext.ts +11 -4
- package/src/utils/storage/__tests__/helpers.unit.test.ts +6 -2
- package/dist/appNameResolver-UURKN7NF.js +0 -22
- package/dist/audit-6TOCAMKO.js.map +0 -1
- package/dist/chunk-B2WTCLCV.js.map +0 -1
- package/dist/chunk-FGMFQSHX.js.map +0 -1
- package/dist/chunk-K34IM5CT.js.map +0 -1
- package/dist/chunk-KHJS6VIA.js.map +0 -1
- package/dist/chunk-KK73ZB4E.js.map +0 -1
- package/dist/chunk-M5IWZRBT.js.map +0 -1
- package/dist/chunk-ULBI5JGB.js +0 -109
- package/dist/chunk-ULBI5JGB.js.map +0 -1
- package/dist/chunk-WN6XJWOS.js.map +0 -1
- package/dist/chunk-XLZ7U46Z.js.map +0 -1
- package/dist/chunk-Y6TXWPJO.js.map +0 -1
- package/docs/DOCUMENTATION_CHECKLIST.md +0 -281
- package/docs/TERMINOLOGY.md +0 -231
- package/docs/api/interfaces/RBACContextType.md +0 -468
- package/docs/api/interfaces/RBACProviderProps.md +0 -107
- package/docs/best-practices/performance-expansion.md +0 -473
- package/docs/breaking-changes.md +0 -179
- package/docs/consuming-app-example.md +0 -290
- package/docs/documentation-templates.md +0 -539
- package/docs/examples/navigation-menu-auth-fix.md +0 -344
- package/docs/getting-started/examples/basic-auth-app.md +0 -520
- package/docs/getting-started/examples/full-featured-app.md +0 -616
- package/docs/getting-started/quick-start.md +0 -376
- package/docs/implementation-guides/datatable-filtering.md +0 -313
- package/docs/implementation-guides/datatable-rbac-usage.md +0 -317
- package/docs/implementation-guides/hierarchical-datatable.md +0 -850
- package/docs/implementation-guides/large-datasets.md +0 -281
- package/docs/implementation-guides/performance.md +0 -403
- package/docs/migration/quick-migration-guide.md +0 -320
- package/docs/migration-guide.md +0 -193
- package/docs/migration-guides/unified-auth-provider-mandatory-timeouts.md +0 -226
- package/docs/performance/README.md +0 -551
- package/docs/style-guide.md +0 -964
- package/docs/troubleshooting/authentication-issues.md +0 -334
- package/docs/troubleshooting/debugging.md +0 -1117
- package/docs/troubleshooting/migration.md +0 -918
- package/src/__tests__/hooks/usePermissions.test.ts +0 -261
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.rbac.test.tsx +0 -574
- package/src/hooks/__tests__/ServiceHooks.test.tsx +0 -613
- package/src/hooks/services/__tests__/useServiceHooks.test.tsx +0 -137
- package/src/hooks/services/usePermissions.ts +0 -70
- package/src/hooks/services/useRBACService.ts +0 -30
- package/src/hooks/usePermissionCheck.ts +0 -150
- package/src/providers/__tests__/ServiceProviders.test.tsx +0 -477
- package/src/providers/services/RBACServiceProvider.tsx +0 -79
- package/src/rbac/__tests__/integration.authflow.test.tsx +0 -119
- package/src/rbac/__tests__/integration.navigation.test.tsx +0 -69
- package/src/rbac/__tests__/integration.securedata.test.tsx +0 -92
- package/src/rbac/__tests__/integration.smoke.test.tsx +0 -73
- package/src/rbac/providers/RBACProvider.tsx +0 -645
- package/src/rbac/providers/__tests__/RBACProvider.integration.test.tsx +0 -688
- package/src/rbac/providers/__tests__/RBACProvider.test.tsx +0 -1186
- package/src/rbac/providers/index.ts +0 -11
- package/src/services/RBACService.ts +0 -522
- package/src/services/__tests__/RBACService.test.ts +0 -492
- package/src/services/interfaces/IRBACService.ts +0 -62
- package/src/utils/appNameResolver.test 2.ts +0 -494
- /package/dist/{DataTable-4GAVPIEG.js.map → DataTable-ETGVF4Y5.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-3NKDOSOK.js.map → UnifiedAuthProvider-P5SOJAQ6.js.map} +0 -0
- /package/dist/{api-DDMUKIUD.js.map → api-KG4A2X7P.js.map} +0 -0
- /package/dist/{appNameResolver-UURKN7NF.js.map → audit-65VNHEV2.js.map} +0 -0
- /package/dist/{chunk-NTNILOBC.js.map → chunk-5BO3MI5Y.js.map} +0 -0
- /package/dist/{chunk-URUTVZ7N.js.map → chunk-FL4ZCQLD.js.map} +0 -0
- /package/dist/{chunk-LW7MMEAQ.js.map → chunk-FT2M4R4F.js.map} +0 -0
- /package/dist/{chunk-AFGTSUAD.js.map → chunk-VSOKOFRF.js.map} +0 -0
- /package/docs/{app.css.example → styles/app.css.example} +0 -0
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file Service Hooks Error Handling Tests
|
|
3
|
-
* @package @jmruthers/pace-core
|
|
4
|
-
* @module Hooks/Services/__tests__
|
|
5
|
-
* @since 1.0.0
|
|
6
|
-
*
|
|
7
|
-
* Tests for service hooks covering error scenarios and context handling.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
11
|
-
import { renderHook } from '@testing-library/react';
|
|
12
|
-
import { useEventService } from '../useEventService';
|
|
13
|
-
import { useOrganisationService } from '../useOrganisationService';
|
|
14
|
-
import { useInactivityService } from '../useInactivityService';
|
|
15
|
-
import { useRBACService } from '../useRBACService';
|
|
16
|
-
import { useAuthService } from '../useAuthService';
|
|
17
|
-
|
|
18
|
-
// Mock contexts
|
|
19
|
-
const createMockContext = (service: any) => ({
|
|
20
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
21
|
-
subscribe: vi.fn(() => () => {}), // Return unsubscribe function
|
|
22
|
-
[Object.keys(service)[0]]: service[Object.keys(service)[0]] || service
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
describe('Service Hooks Error Handling', () => {
|
|
26
|
-
describe('useEventService', () => {
|
|
27
|
-
it('throws error when used outside provider', () => {
|
|
28
|
-
expect(() => {
|
|
29
|
-
renderHook(() => useEventService());
|
|
30
|
-
}).toThrow('useEventService must be used within EventServiceProvider');
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
it('returns service when context is provided', () => {
|
|
34
|
-
const mockService = { getEvents: vi.fn(), refreshEvents: vi.fn() };
|
|
35
|
-
const mockContext = createMockContext({ eventService: mockService });
|
|
36
|
-
|
|
37
|
-
vi.mock('../../providers/services/EventServiceProvider', () => ({
|
|
38
|
-
EventServiceContext: {
|
|
39
|
-
Provider: ({ children }: any) => children
|
|
40
|
-
},
|
|
41
|
-
__esModule: true
|
|
42
|
-
}));
|
|
43
|
-
|
|
44
|
-
// This test requires a provider wrapper
|
|
45
|
-
expect(true).toBe(true);
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
describe('useOrganisationService', () => {
|
|
50
|
-
it('throws error when used outside provider', () => {
|
|
51
|
-
expect(() => {
|
|
52
|
-
renderHook(() => useOrganisationService());
|
|
53
|
-
}).toThrow('useOrganisationService must be used within OrganisationServiceProvider');
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
it('validates provider requirement', () => {
|
|
57
|
-
expect(() => {
|
|
58
|
-
renderHook(() => useOrganisationService());
|
|
59
|
-
}).toThrow();
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
describe('useInactivityService', () => {
|
|
64
|
-
it('throws error when used outside provider', () => {
|
|
65
|
-
expect(() => {
|
|
66
|
-
renderHook(() => useInactivityService());
|
|
67
|
-
}).toThrow('useInactivityService must be used within InactivityServiceProvider');
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
it('validates provider requirement', () => {
|
|
71
|
-
expect(() => {
|
|
72
|
-
renderHook(() => useInactivityService());
|
|
73
|
-
}).toThrow();
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
describe('useRBACService', () => {
|
|
78
|
-
it('throws error when used outside provider', () => {
|
|
79
|
-
expect(() => {
|
|
80
|
-
renderHook(() => useRBACService());
|
|
81
|
-
}).toThrow('useRBACService must be used within RBACServiceProvider');
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
it('validates provider requirement', () => {
|
|
85
|
-
expect(() => {
|
|
86
|
-
renderHook(() => useRBACService());
|
|
87
|
-
}).toThrow();
|
|
88
|
-
});
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
describe('useAuthService', () => {
|
|
92
|
-
it('throws error when used outside provider', () => {
|
|
93
|
-
expect(() => {
|
|
94
|
-
renderHook(() => useAuthService());
|
|
95
|
-
}).toThrow('useAuthService must be used within AuthServiceProvider');
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
it('validates provider requirement', () => {
|
|
99
|
-
expect(() => {
|
|
100
|
-
renderHook(() => useAuthService());
|
|
101
|
-
}).toThrow();
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
describe('Error Message Consistency', () => {
|
|
106
|
-
it('all hooks use consistent error message pattern', () => {
|
|
107
|
-
const errorMessages = [
|
|
108
|
-
'useEventService must be used within EventServiceProvider',
|
|
109
|
-
'useOrganisationService must be used within OrganisationServiceProvider',
|
|
110
|
-
'useInactivityService must be used within InactivityServiceProvider',
|
|
111
|
-
'useRBACService must be used within RBACServiceProvider',
|
|
112
|
-
'useAuthService must be used within AuthServiceProvider'
|
|
113
|
-
];
|
|
114
|
-
|
|
115
|
-
errorMessages.forEach(msg => {
|
|
116
|
-
expect(msg).toMatch(/must be used within \w+Provider$/);
|
|
117
|
-
});
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
describe('Subscription Cleanup', () => {
|
|
122
|
-
it('service hooks handle subscription cleanup', () => {
|
|
123
|
-
// All service hooks use same pattern: subscribe in useEffect, return unsubscribe
|
|
124
|
-
const checkPattern = (hook: any) => {
|
|
125
|
-
// The pattern is: useEffect(() => { return context.service.subscribe(() => forceUpdate()); }, []);
|
|
126
|
-
expect(typeof hook).toBe('function');
|
|
127
|
-
};
|
|
128
|
-
|
|
129
|
-
checkPattern(useEventService);
|
|
130
|
-
checkPattern(useOrganisationService);
|
|
131
|
-
checkPattern(useInactivityService);
|
|
132
|
-
checkPattern(useRBACService);
|
|
133
|
-
checkPattern(useAuthService);
|
|
134
|
-
});
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file Permissions Convenience Hook
|
|
3
|
-
* @package @jmruthers/pace-core
|
|
4
|
-
* @module Hooks/Services
|
|
5
|
-
* @since 0.1.0
|
|
6
|
-
*
|
|
7
|
-
* Convenience hook for permissions.
|
|
8
|
-
* Returns just the permission state and methods needed by components.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { useRBACService } from './useRBACService';
|
|
12
|
-
import { AccessLevel } from '../../types/unified';
|
|
13
|
-
|
|
14
|
-
export interface PermissionsState {
|
|
15
|
-
permissions: Record<string, boolean>;
|
|
16
|
-
roles: string[];
|
|
17
|
-
accessLevel: AccessLevel;
|
|
18
|
-
rbacLoading: boolean;
|
|
19
|
-
rbacError: Error | null;
|
|
20
|
-
selectedEventId: string | null;
|
|
21
|
-
appConfig: any | null;
|
|
22
|
-
userEventAccess: any[];
|
|
23
|
-
eventAccessLoading: boolean;
|
|
24
|
-
selectedOrganisationId: string | null;
|
|
25
|
-
|
|
26
|
-
// Permission methods
|
|
27
|
-
hasPermission: (permission: string, orgId?: string) => boolean;
|
|
28
|
-
hasAnyPermission: (permissions: string[], orgId?: string) => boolean;
|
|
29
|
-
hasAllPermissions: (permissions: string[], orgId?: string) => boolean;
|
|
30
|
-
hasRole: (role: string) => boolean;
|
|
31
|
-
hasAccessLevel: (level: AccessLevel) => boolean;
|
|
32
|
-
canAccess: (resource: string, action: string, orgId?: string) => boolean;
|
|
33
|
-
validatePermission: (permission: string, orgId?: string) => Promise<boolean>;
|
|
34
|
-
validateAccess: (resource: string, action: string, orgId?: string) => Promise<boolean>;
|
|
35
|
-
refreshPermissions: (eventId?: string, orgId?: string) => Promise<void>;
|
|
36
|
-
setSelectedEventId: (eventId: string | null) => void;
|
|
37
|
-
loadUserEventAccess: (orgId?: string) => Promise<void>;
|
|
38
|
-
getUserEventAccess: (eventId: string) => any | undefined;
|
|
39
|
-
requireOrganisationContext: () => string;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export function usePermissions(): PermissionsState {
|
|
43
|
-
const rbacService = useRBACService();
|
|
44
|
-
|
|
45
|
-
return {
|
|
46
|
-
permissions: rbacService.getPermissions(),
|
|
47
|
-
roles: rbacService.getRoles(),
|
|
48
|
-
accessLevel: rbacService.getAccessLevel(),
|
|
49
|
-
rbacLoading: rbacService.isLoading(),
|
|
50
|
-
rbacError: rbacService.getError(),
|
|
51
|
-
selectedEventId: rbacService.getSelectedEventId(),
|
|
52
|
-
appConfig: rbacService.getAppConfig(),
|
|
53
|
-
userEventAccess: rbacService.getUserEventAccess(),
|
|
54
|
-
eventAccessLoading: rbacService.isEventAccessLoading(),
|
|
55
|
-
selectedOrganisationId: rbacService.getSelectedOrganisationId(),
|
|
56
|
-
hasPermission: rbacService.hasPermission.bind(rbacService),
|
|
57
|
-
hasAnyPermission: rbacService.hasAnyPermission.bind(rbacService),
|
|
58
|
-
hasAllPermissions: rbacService.hasAllPermissions.bind(rbacService),
|
|
59
|
-
hasRole: rbacService.hasRole.bind(rbacService),
|
|
60
|
-
hasAccessLevel: rbacService.hasAccessLevel.bind(rbacService),
|
|
61
|
-
canAccess: rbacService.canAccess.bind(rbacService),
|
|
62
|
-
validatePermission: rbacService.validatePermission.bind(rbacService),
|
|
63
|
-
validateAccess: rbacService.validateAccess.bind(rbacService),
|
|
64
|
-
refreshPermissions: rbacService.refreshPermissions.bind(rbacService),
|
|
65
|
-
setSelectedEventId: rbacService.setSelectedEventId.bind(rbacService),
|
|
66
|
-
loadUserEventAccess: rbacService.loadUserEventAccess.bind(rbacService),
|
|
67
|
-
getUserEventAccess: rbacService.getUserEventAccess.bind(rbacService),
|
|
68
|
-
requireOrganisationContext: rbacService.requireOrganisationContext.bind(rbacService),
|
|
69
|
-
};
|
|
70
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file RBAC Service Hook
|
|
3
|
-
* @package @jmruthers/pace-core
|
|
4
|
-
* @module Hooks/Services
|
|
5
|
-
* @since 0.1.0
|
|
6
|
-
*
|
|
7
|
-
* React hook for RBACService.
|
|
8
|
-
* Provides RBAC service with reactive state updates.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { useContext, useReducer, useEffect } from 'react';
|
|
12
|
-
import { RBACServiceContext } from '../../providers/services/RBACServiceProvider';
|
|
13
|
-
import { RBACService } from '../../services/RBACService';
|
|
14
|
-
|
|
15
|
-
export function useRBACService(): RBACService {
|
|
16
|
-
const context = useContext(RBACServiceContext);
|
|
17
|
-
|
|
18
|
-
if (!context) {
|
|
19
|
-
throw new Error('useRBACService must be used within RBACServiceProvider');
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
// Subscribe to service state changes
|
|
23
|
-
const [, forceUpdate] = useReducer(x => x + 1, 0);
|
|
24
|
-
|
|
25
|
-
useEffect(() => {
|
|
26
|
-
return context.rbacService.subscribe(() => forceUpdate());
|
|
27
|
-
}, [context.rbacService]);
|
|
28
|
-
|
|
29
|
-
return context.rbacService;
|
|
30
|
-
}
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file usePermissionCheck Hook
|
|
3
|
-
* @package @jmruthers/pace-core
|
|
4
|
-
* @module Hooks/PermissionCheck
|
|
5
|
-
* @since 0.1.0
|
|
6
|
-
*
|
|
7
|
-
* A hook for checking user permissions that replaces dynamic imports
|
|
8
|
-
* with a more testable and predictable pattern.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { useCallback } from 'react';
|
|
12
|
-
import { useUnifiedAuth } from '../providers/services/UnifiedAuthProvider';
|
|
13
|
-
import { isSuperAdmin, isPermitted } from '../rbac/api';
|
|
14
|
-
import type { Operation, Permission } from '../rbac/types';
|
|
15
|
-
|
|
16
|
-
export interface PermissionCheckResult {
|
|
17
|
-
hasPermission: boolean;
|
|
18
|
-
isLoading: boolean;
|
|
19
|
-
error: Error | null;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export interface UsePermissionCheckOptions {
|
|
23
|
-
/** The operation to check (read, create, update, delete, manage) */
|
|
24
|
-
operation: Operation;
|
|
25
|
-
/** The page ID to check permissions for */
|
|
26
|
-
pageId?: string;
|
|
27
|
-
/** Whether to use cached results */
|
|
28
|
-
useCache?: boolean;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Hook for checking user permissions
|
|
33
|
-
*
|
|
34
|
-
* This hook replaces dynamic imports with a more testable pattern.
|
|
35
|
-
* It uses the RBAC API functions directly, making it easier to mock in tests.
|
|
36
|
-
*
|
|
37
|
-
* @param options - Permission check options
|
|
38
|
-
* @returns Permission check result with loading and error states
|
|
39
|
-
*
|
|
40
|
-
* @example
|
|
41
|
-
* ```tsx
|
|
42
|
-
* function MyComponent() {
|
|
43
|
-
* const { hasPermission, isLoading, error } = usePermissionCheck({
|
|
44
|
-
* operation: 'read',
|
|
45
|
-
* pageId: 'dashboard'
|
|
46
|
-
* });
|
|
47
|
-
*
|
|
48
|
-
* if (isLoading) return <div>Checking permissions...</div>;
|
|
49
|
-
* if (error) return <div>Error: {error.message}</div>;
|
|
50
|
-
*
|
|
51
|
-
* return hasPermission ? <Dashboard /> : <AccessDenied />;
|
|
52
|
-
* }
|
|
53
|
-
* ```
|
|
54
|
-
*/
|
|
55
|
-
export function usePermissionCheck(options: UsePermissionCheckOptions): PermissionCheckResult {
|
|
56
|
-
const { operation, pageId, useCache = true } = options;
|
|
57
|
-
const { user, session, supabase, appName, selectedEvent, selectedOrganisation } = useUnifiedAuth();
|
|
58
|
-
|
|
59
|
-
const checkPermission = useCallback(async (): Promise<boolean> => {
|
|
60
|
-
try {
|
|
61
|
-
if (!user?.id) return false;
|
|
62
|
-
|
|
63
|
-
const scope = {
|
|
64
|
-
organisationId: user.user_metadata?.organisationId || user.app_metadata?.organisationId,
|
|
65
|
-
eventId: user.user_metadata?.eventId || user.app_metadata?.eventId,
|
|
66
|
-
appId: user.user_metadata?.appId || user.app_metadata?.appId,
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
// Check if user is super admin first - super admins can access everything
|
|
70
|
-
// regardless of organisation context
|
|
71
|
-
const isSuper = await isSuperAdmin(user.id);
|
|
72
|
-
|
|
73
|
-
if (isSuper) {
|
|
74
|
-
// Super admin bypass - allow access regardless of organisation context
|
|
75
|
-
return true;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// For non-super admins, ensure we have at least organisationId for RBAC
|
|
79
|
-
if (!scope.organisationId) {
|
|
80
|
-
console.warn('No organisation context available for permission check, denying access');
|
|
81
|
-
return false;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
return await isPermitted({
|
|
85
|
-
userId: user.id,
|
|
86
|
-
scope,
|
|
87
|
-
permission: operation as Permission,
|
|
88
|
-
pageId
|
|
89
|
-
});
|
|
90
|
-
} catch (error) {
|
|
91
|
-
console.error('Permission check failed:', error);
|
|
92
|
-
// Let the error bubble up so it can be handled by the calling code
|
|
93
|
-
throw error;
|
|
94
|
-
}
|
|
95
|
-
}, [user?.id, operation, pageId]);
|
|
96
|
-
|
|
97
|
-
return {
|
|
98
|
-
hasPermission: false, // This will be set by the calling component
|
|
99
|
-
isLoading: false, // This will be set by the calling component
|
|
100
|
-
error: null // This will be set by the calling component
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Hook for checking multiple permissions
|
|
106
|
-
*
|
|
107
|
-
* @param permissions - Array of permission checks
|
|
108
|
-
* @returns Array of permission check results
|
|
109
|
-
*/
|
|
110
|
-
export function useMultiplePermissionChecks(
|
|
111
|
-
permissions: UsePermissionCheckOptions[]
|
|
112
|
-
): PermissionCheckResult[] {
|
|
113
|
-
return permissions.map(options => usePermissionCheck(options));
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Hook for checking if user has any of the specified permissions
|
|
118
|
-
*
|
|
119
|
-
* @param permissions - Array of permission checks
|
|
120
|
-
* @returns Whether user has any of the permissions
|
|
121
|
-
*/
|
|
122
|
-
export function useHasAnyPermission(
|
|
123
|
-
permissions: UsePermissionCheckOptions[]
|
|
124
|
-
): PermissionCheckResult {
|
|
125
|
-
// This would need to be implemented with proper state management
|
|
126
|
-
// For now, return a placeholder
|
|
127
|
-
return {
|
|
128
|
-
hasPermission: false,
|
|
129
|
-
isLoading: false,
|
|
130
|
-
error: null
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Hook for checking if user has all of the specified permissions
|
|
136
|
-
*
|
|
137
|
-
* @param permissions - Array of permission checks
|
|
138
|
-
* @returns Whether user has all of the permissions
|
|
139
|
-
*/
|
|
140
|
-
export function useHasAllPermissions(
|
|
141
|
-
permissions: UsePermissionCheckOptions[]
|
|
142
|
-
): PermissionCheckResult {
|
|
143
|
-
// This would need to be implemented with proper state management
|
|
144
|
-
// For now, return a placeholder
|
|
145
|
-
return {
|
|
146
|
-
hasPermission: false,
|
|
147
|
-
isLoading: false,
|
|
148
|
-
error: null
|
|
149
|
-
};
|
|
150
|
-
}
|