@jmruthers/pace-core 0.4.1 → 0.5.3
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 +26 -1
- package/README.md +231 -229
- package/dist/{DataTable-2LB6HI6V.js → DataTable-ZQDRE46Q.js} +15 -17
- package/dist/{DataTable-BDBqkU-i.d.ts → DataTable-ltTFXHS3.d.ts} +25 -51
- package/dist/{Table-CIm9IWqk.d.ts → PublicLoadingSpinner-Bq_-BeK-.d.ts} +635 -122
- package/dist/{UnifiedAuthProvider-V7y63NjT.d.ts → RBACProvider-BO4ilsQB.d.ts} +11 -36
- package/dist/UnifiedAuthProvider-DGQsy-vY.d.ts +103 -0
- package/dist/{api-AIJ3IJX3.js → api-H5A3H4IR.js} +6 -4
- package/dist/{appConfig-fB1pP_v3.d.ts → appConfig-BVGyuvI7.d.ts} +1 -1
- package/dist/appNameResolver-7GHF5ED2.js +22 -0
- package/dist/{audit-PD5L5ZSC.js → audit-BUW3LMJB.js} +3 -3
- package/dist/chunk-5H3C2SWM.js +3293 -0
- package/dist/chunk-5H3C2SWM.js.map +1 -0
- package/dist/chunk-5SIXIV7R.js +1925 -0
- package/dist/chunk-5SIXIV7R.js.map +1 -0
- package/dist/{chunk-YNU5QJ4S.js → chunk-7BNPOCLL.js} +22 -5
- package/dist/chunk-7BNPOCLL.js.map +1 -0
- package/dist/{chunk-4ZTIEYU2.js → chunk-CDQ3PX7L.js} +1 -1
- package/dist/chunk-CDQ3PX7L.js.map +1 -0
- package/dist/chunk-GNTALZV3.js +17 -0
- package/dist/chunk-GNTALZV3.js.map +1 -0
- package/dist/chunk-GWSBHC4J.js +1349 -0
- package/dist/chunk-GWSBHC4J.js.map +1 -0
- package/dist/{chunk-JUUNUW3O.js → chunk-HD7PYDUV.js} +14 -5
- package/dist/chunk-HD7PYDUV.js.map +1 -0
- package/dist/{chunk-H4PZ4B3Y.js → chunk-HXX35Q2M.js} +113 -27
- package/dist/chunk-HXX35Q2M.js.map +1 -0
- package/dist/chunk-K6B7BLSE.js +388 -0
- package/dist/chunk-K6B7BLSE.js.map +1 -0
- package/dist/chunk-M4RW7PIP.js +5441 -0
- package/dist/chunk-M4RW7PIP.js.map +1 -0
- package/dist/chunk-MZBUOP4P.js +119 -0
- package/dist/chunk-MZBUOP4P.js.map +1 -0
- package/dist/chunk-N2EUGZRW.js +98 -0
- package/dist/chunk-N2EUGZRW.js.map +1 -0
- package/dist/chunk-NQ4TOOO6.js +20 -0
- package/dist/chunk-NQ4TOOO6.js.map +1 -0
- package/dist/{chunk-DC5AMYBS.js → chunk-PLDDJCW6.js} +15 -5
- package/dist/chunk-PLDDJCW6.js.map +1 -0
- package/dist/{chunk-IOX76PSM.js → chunk-PVMYVQSM.js} +270 -28
- package/dist/chunk-PVMYVQSM.js.map +1 -0
- package/dist/{chunk-4MCJAK7J.js → chunk-QKHFMQ5R.js} +2155 -4853
- package/dist/chunk-QKHFMQ5R.js.map +1 -0
- package/dist/chunk-QVYBYGT2.js +428 -0
- package/dist/chunk-QVYBYGT2.js.map +1 -0
- package/dist/{chunk-WHLSWC6W.js → chunk-SS3E6QLB.js} +16 -61
- package/dist/chunk-SS3E6QLB.js.map +1 -0
- package/dist/chunk-WJARTBCT.js +128 -0
- package/dist/chunk-WJARTBCT.js.map +1 -0
- package/dist/chunk-YDJW5XTN.js +84 -0
- package/dist/chunk-YDJW5XTN.js.map +1 -0
- package/dist/components.d.ts +907 -10
- package/dist/components.js +3237 -204
- package/dist/components.js.map +1 -1
- package/dist/{database-CAMsquLm.d.ts → database-C3Szpi5J.d.ts} +28 -11
- package/dist/hooks.d.ts +7 -6
- package/dist/hooks.js +33 -11
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +247 -111
- package/dist/index.js +330 -185
- package/dist/index.js.map +1 -1
- package/dist/{organisation-DLNNQhPB.d.ts → organisation-CO3Sh3_D.d.ts} +1 -1
- package/dist/providers.d.ts +5 -4
- package/dist/providers.js +14 -5
- package/dist/rbac/index.d.ts +964 -839
- package/dist/rbac/index.js +58 -1970
- package/dist/rbac/index.js.map +1 -1
- package/dist/styles/core.css +364 -0
- package/dist/styles/fonts/georama-italic.woff2 +0 -0
- package/dist/styles/fonts/georama.woff2 +0 -0
- package/dist/styles/fonts/open-sans-italic.woff2 +0 -0
- package/dist/styles/fonts/open-sans.woff2 +0 -0
- package/dist/styles/fonts/reddit-mono.woff2 +0 -0
- package/dist/styles/index.d.ts +36 -0
- package/dist/styles/index.js +24 -0
- package/dist/styles/index.js.map +1 -0
- package/dist/theming/runtime.d.ts +73 -0
- package/dist/theming/runtime.js +16 -0
- package/dist/theming/runtime.js.map +1 -0
- package/dist/{types-Bavn44NW.d.ts → types-BRDU7N6w.d.ts} +79 -33
- package/dist/types.d.ts +5 -5
- package/dist/types.js +7 -2
- package/dist/types.js.map +1 -1
- package/dist/{unified-BtRpPbmp.d.ts → unified-CMPjE_fv.d.ts} +0 -1
- package/dist/usePublicRouteParams-B2OcAsur.d.ts +477 -0
- package/dist/utils.d.ts +83 -60
- package/dist/utils.js +293 -55651
- package/dist/utils.js.map +1 -1
- package/dist/validation.d.ts +1 -1
- package/dist/validation.js +1 -1
- package/docs/INDEX.md +192 -0
- package/docs/README.md +46 -32
- package/docs/api/README.md +231 -229
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/InvalidScopeError.md +73 -0
- package/docs/api/classes/MissingUserContextError.md +66 -0
- package/docs/api/classes/OrganisationContextRequiredError.md +66 -0
- package/docs/api/classes/PermissionDeniedError.md +73 -0
- package/docs/api/classes/PublicErrorBoundary.md +132 -0
- package/docs/api/classes/RBACAuditManager.md +270 -0
- package/docs/api/classes/RBACCache.md +284 -0
- package/docs/api/classes/RBACEngine.md +141 -0
- package/docs/api/classes/RBACError.md +76 -0
- package/docs/api/classes/RBACNotInitializedError.md +66 -0
- package/docs/api/classes/SecureSupabaseClient.md +135 -0
- package/docs/api/interfaces/AggregateConfig.md +4 -4
- package/docs/api/interfaces/ButtonProps.md +2 -2
- package/docs/api/interfaces/CardProps.md +2 -2
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +1 -1
- package/docs/api/interfaces/DataAccessRecord.md +96 -0
- package/docs/api/interfaces/DataTableAction.md +98 -7
- package/docs/api/interfaces/DataTableColumn.md +131 -12
- package/docs/api/interfaces/DataTableProps.md +77 -274
- package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
- package/docs/api/interfaces/EmptyStateConfig.md +5 -5
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +235 -0
- package/docs/api/interfaces/EventContextType.md +7 -7
- package/docs/api/interfaces/EventLogoProps.md +152 -0
- package/docs/api/interfaces/EventProviderProps.md +2 -2
- package/docs/api/interfaces/FileSizeLimits.md +7 -0
- package/docs/api/interfaces/FileUploadProps.md +154 -0
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +115 -0
- package/docs/api/interfaces/InputProps.md +2 -2
- package/docs/api/interfaces/LabelProps.md +1 -1
- package/docs/api/interfaces/LoginFormProps.md +1 -1
- package/docs/api/interfaces/NavigationAccessRecord.md +107 -0
- package/docs/api/interfaces/NavigationContextType.md +164 -0
- package/docs/api/interfaces/NavigationGuardProps.md +139 -0
- package/docs/api/interfaces/NavigationItem.md +1 -1
- package/docs/api/interfaces/NavigationMenuProps.md +1 -1
- package/docs/api/interfaces/NavigationProviderProps.md +117 -0
- 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 +26 -26
- package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
- package/docs/api/interfaces/PageAccessRecord.md +85 -0
- package/docs/api/interfaces/PagePermissionContextType.md +140 -0
- package/docs/api/interfaces/PagePermissionGuardProps.md +153 -0
- package/docs/api/interfaces/PagePermissionProviderProps.md +119 -0
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/PermissionEnforcerProps.md +153 -0
- package/docs/api/interfaces/PublicErrorBoundaryProps.md +94 -0
- package/docs/api/interfaces/PublicErrorBoundaryState.md +68 -0
- package/docs/api/interfaces/PublicLoadingSpinnerProps.md +86 -0
- package/docs/api/interfaces/PublicPageFooterProps.md +112 -0
- package/docs/api/interfaces/PublicPageHeaderProps.md +138 -0
- package/docs/api/interfaces/PublicPageLayoutProps.md +138 -0
- package/docs/api/interfaces/RBACConfig.md +99 -0
- package/docs/api/interfaces/RBACContextType.md +474 -0
- package/docs/api/interfaces/RBACLogger.md +112 -0
- package/docs/api/interfaces/RBACProviderProps.md +107 -0
- package/docs/api/interfaces/RoleBasedRouterContextType.md +151 -0
- package/docs/api/interfaces/RoleBasedRouterProps.md +156 -0
- package/docs/api/interfaces/RouteAccessRecord.md +107 -0
- package/docs/api/interfaces/RouteConfig.md +121 -0
- package/docs/api/interfaces/SecureDataContextType.md +168 -0
- package/docs/api/interfaces/SecureDataProviderProps.md +132 -0
- package/docs/api/interfaces/StorageConfig.md +41 -0
- package/docs/api/interfaces/StorageFileInfo.md +74 -0
- package/docs/api/interfaces/StorageFileMetadata.md +140 -0
- package/docs/api/interfaces/StorageListOptions.md +86 -0
- package/docs/api/interfaces/StorageListResult.md +41 -0
- package/docs/api/interfaces/StorageUploadOptions.md +88 -0
- package/docs/api/interfaces/StorageUploadResult.md +63 -0
- package/docs/api/interfaces/StorageUrlOptions.md +47 -0
- package/docs/api/interfaces/StyleImport.md +2 -2
- package/docs/api/interfaces/ToastActionElement.md +1 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +465 -64
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +95 -9
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +136 -0
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +123 -0
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +87 -0
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +81 -0
- package/docs/api/interfaces/UsePublicEventOptions.md +34 -0
- package/docs/api/interfaces/UsePublicEventReturn.md +68 -0
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +94 -0
- package/docs/api/interfaces/UserEventAccess.md +14 -14
- package/docs/api/interfaces/UserMenuProps.md +6 -6
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +4233 -1134
- package/docs/api-reference/components.md +761 -43
- package/docs/api-reference/hooks.md +126 -0
- package/docs/api-reference/providers.md +141 -65
- package/docs/api-reference/types.md +66 -36
- package/docs/api-reference/utilities.md +1 -1
- package/docs/architecture/README.md +1 -2
- package/docs/best-practices/README.md +400 -0
- package/docs/consuming-app-example.md +42 -96
- package/docs/consuming-app-vite-config.md +233 -0
- package/docs/core-concepts/events.md +3 -3
- package/docs/core-concepts/organisations.md +0 -1
- package/docs/core-concepts/rbac-system.md +23 -10
- package/docs/documentation-style-checklist.md +8 -2
- package/docs/examples/navigation-menu-auth-fix.md +344 -0
- package/docs/getting-started/examples/README.md +15 -1
- package/docs/getting-started/examples/basic-auth-app.md +444 -119
- package/docs/getting-started/examples/full-featured-app.md +6 -6
- package/docs/getting-started/installation.md +231 -52
- package/docs/getting-started/quick-start.md +121 -24
- package/docs/implementation-guides/app-layout.md +133 -108
- package/docs/implementation-guides/data-tables.md +1011 -29
- package/docs/implementation-guides/forms.md +3 -3
- package/docs/implementation-guides/hierarchical-datatable.md +850 -0
- package/docs/implementation-guides/large-datasets.md +2 -2
- package/docs/implementation-guides/navigation.md +1 -1
- package/docs/implementation-guides/permission-enforcement.md +4 -4
- package/docs/implementation-guides/public-pages.md +752 -0
- package/docs/migration/README.md +18 -8
- package/docs/migration/quick-migration-guide.md +320 -0
- package/docs/migration/rbac-migration.md +50 -0
- package/docs/migration/v0.4.15-tailwind-scanning.md +272 -0
- package/docs/migration/v0.4.16-css-first-approach.md +306 -0
- package/docs/migration/v0.4.17-source-path-fix.md +229 -0
- package/docs/migration-guide.md +77 -105
- package/docs/performance/README.md +1 -4
- package/docs/print-components/README.md +258 -0
- package/docs/print-components/api-reference.md +636 -0
- package/docs/print-components/examples/README.md +204 -0
- package/docs/print-components/examples/basic-report.tsx +92 -0
- package/docs/print-components/examples/card-catalog.tsx +149 -0
- package/docs/print-components/examples/cover-page-report.tsx +163 -0
- package/docs/print-components/quick-start.md +363 -0
- package/docs/quick-reference.md +53 -36
- package/docs/rbac/README.md +136 -69
- package/docs/rbac/api-reference.md +39 -8
- package/docs/rbac/examples.md +237 -66
- package/docs/rbac/getting-started.md +131 -16
- package/docs/rbac/quick-start.md +499 -323
- package/docs/rbac/troubleshooting.md +240 -262
- package/docs/security/README.md +50 -1
- package/docs/styles/README.md +226 -111
- package/docs/testing/README.md +6 -10
- package/docs/troubleshooting/README.md +497 -0
- package/docs/troubleshooting/common-issues.md +604 -14
- package/docs/troubleshooting/styling-issues.md +219 -0
- package/docs/troubleshooting/tailwind-content-scanning.md +213 -0
- package/docs/usage.md +54 -91
- package/docs/visual-testing.md +0 -7
- package/package.json +47 -25
- package/src/__mocks__/lucide-react.ts +181 -0
- package/src/__tests__/REBUILD_PLAN.md +223 -0
- package/src/__tests__/TESTING_GUIDELINES.md +341 -0
- package/src/__tests__/fixtures/mocks.ts +93 -0
- package/src/__tests__/helpers/component-test-utils.tsx +145 -0
- package/src/__tests__/helpers/test-utils.tsx +117 -0
- package/src/__tests__/integration/UserProfile.test.tsx +128 -0
- package/src/__tests__/setup.ts +71 -0
- package/src/__tests__/templates/accessibility.test.template.tsx +279 -0
- package/src/__tests__/templates/component.test.template.tsx +144 -0
- package/src/__tests__/templates/hook.test.template.ts +173 -0
- package/src/__tests__/templates/integration.test.template.tsx +199 -0
- package/src/__tests__/types/test.types.ts +106 -0
- package/src/components/Alert/Alert.test.tsx +496 -0
- package/src/components/Alert/Alert.tsx +134 -0
- package/src/components/Alert/index.ts +2 -0
- package/src/components/Avatar/Avatar.test.tsx +484 -0
- package/src/components/Avatar/Avatar.tsx +84 -0
- package/src/components/Avatar/index.ts +2 -0
- package/src/components/Button/Button.test.tsx +662 -0
- package/src/components/Button/Button.tsx +270 -0
- package/src/components/Button/index.ts +2 -0
- package/src/components/Card/Card.test.tsx +593 -0
- package/src/components/Card/Card.tsx +271 -0
- package/src/components/Card/index.ts +1 -0
- package/src/components/Checkbox/Checkbox.test.tsx +461 -0
- package/src/components/Checkbox/Checkbox.tsx +75 -0
- package/src/components/Checkbox/__mocks__/Checkbox.tsx +2 -0
- package/src/components/Checkbox/index.ts +2 -0
- package/src/components/DataTable/DataTable.tsx +446 -0
- package/src/components/DataTable/__tests__/README.md +145 -0
- package/src/components/DataTable/__tests__/mocks/MockRBACProvider.tsx +66 -0
- package/src/components/DataTable/__tests__/test-utils/dataFactories.ts +103 -0
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +381 -0
- package/src/components/DataTable/__tests__/test-utils.ts +94 -0
- package/src/components/DataTable/components/AccessDeniedPage.tsx +168 -0
- package/src/components/DataTable/components/ActionButtons.tsx +194 -0
- package/src/components/DataTable/components/BulkOperationsDropdown.tsx +160 -0
- package/src/components/DataTable/components/ColumnFilter.tsx +114 -0
- package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +100 -0
- package/src/components/DataTable/components/DataTableBody.tsx +461 -0
- package/src/components/DataTable/components/DataTableCore.tsx +1027 -0
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +214 -0
- package/src/components/DataTable/components/DataTableModals.tsx +87 -0
- package/src/components/DataTable/components/DataTableToolbar.tsx +262 -0
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +144 -0
- package/src/components/DataTable/components/EditableRow.tsx +159 -0
- package/src/components/DataTable/components/EmptyState.tsx +64 -0
- package/src/components/DataTable/components/ExpandButton.tsx +113 -0
- package/src/components/DataTable/components/FilterRow.tsx +100 -0
- package/src/components/DataTable/components/GroupHeader.tsx +42 -0
- package/src/components/DataTable/components/GroupingDropdown.tsx +96 -0
- package/src/components/DataTable/components/ImportModal.tsx +345 -0
- package/src/components/DataTable/components/LoadingState.tsx +12 -0
- package/src/components/DataTable/components/PaginationControls.tsx +332 -0
- package/src/components/DataTable/components/UnifiedTableBody.tsx +742 -0
- package/src/components/DataTable/components/ViewRowModal.tsx +68 -0
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +513 -0
- package/src/components/DataTable/components/index.ts +16 -0
- package/src/components/DataTable/context/DataTableContext.tsx +97 -0
- package/src/components/DataTable/core/ActionManager.ts +235 -0
- package/src/components/DataTable/core/ColumnFactory.ts +268 -0
- package/src/components/DataTable/core/ColumnManager.ts +205 -0
- package/src/components/DataTable/core/DataManager.ts +188 -0
- package/src/components/DataTable/core/DataTableContext.tsx +181 -0
- package/src/components/DataTable/core/LocalDataAdapter.ts +264 -0
- package/src/components/DataTable/core/PluginRegistry.ts +229 -0
- package/src/components/DataTable/core/StateManager.ts +311 -0
- package/src/components/DataTable/core/index.ts +8 -0
- package/src/components/DataTable/core/interfaces.ts +338 -0
- package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +419 -0
- package/src/components/DataTable/examples/HierarchicalExample.tsx +475 -0
- package/src/components/DataTable/examples/InitialPageSizeExample.tsx +176 -0
- package/src/components/DataTable/examples/PerformanceExample.tsx +505 -0
- package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +95 -0
- package/src/components/DataTable/hooks/useColumnReordering.ts +110 -0
- package/src/components/DataTable/hooks/useDataTableState.ts +325 -0
- package/src/components/DataTable/hooks/useHierarchicalState.ts +174 -0
- package/src/components/DataTable/index.ts +68 -0
- package/src/components/DataTable/styles.ts +171 -0
- package/src/components/DataTable/types.ts +511 -0
- package/src/components/DataTable/utils/debugTools.ts +583 -0
- package/src/components/DataTable/utils/errorHandling.ts +494 -0
- package/src/components/DataTable/utils/exportUtils.ts +126 -0
- package/src/components/DataTable/utils/flexibleImport.ts +510 -0
- package/src/components/DataTable/utils/hierarchicalSorting.ts +151 -0
- package/src/components/DataTable/utils/hierarchicalUtils.ts +218 -0
- package/src/components/DataTable/utils/index.ts +1 -0
- package/src/components/DataTable/utils/performanceUtils.ts +351 -0
- package/src/components/Dialog/Dialog.test.tsx +1139 -0
- package/src/components/Dialog/Dialog.tsx +782 -0
- package/src/components/Dialog/README.md +804 -0
- package/src/components/Dialog/examples/BasicHtmlTest.tsx +55 -0
- package/src/components/Dialog/examples/DebugHtmlExample.tsx +68 -0
- package/src/components/Dialog/examples/HtmlDialogExample.tsx +202 -0
- package/src/components/Dialog/examples/SimpleHtmlTest.tsx +61 -0
- package/src/components/Dialog/examples/SmartDialogExample.tsx +322 -0
- package/src/components/Dialog/index.ts +12 -0
- package/src/components/Dialog/utils/safeHtml.ts +185 -0
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +752 -0
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +312 -0
- package/src/components/ErrorBoundary/index.ts +8 -0
- package/src/components/EventSelector/EventSelector.tsx +360 -0
- package/src/components/EventSelector/index.ts +3 -0
- package/src/components/EventSelector/types.ts +79 -0
- package/src/components/FileUpload/FileUpload.example.tsx +218 -0
- package/src/components/FileUpload/FileUpload.test.tsx +665 -0
- package/src/components/FileUpload/FileUpload.tsx +237 -0
- package/src/components/FileUpload/index.ts +6 -0
- package/src/components/Footer/Footer.test.tsx +482 -0
- package/src/components/Footer/Footer.tsx +197 -0
- package/src/components/Footer/index.ts +17 -0
- package/src/components/Form/Form.test.tsx +1158 -0
- package/src/components/Form/Form.tsx +166 -0
- package/src/components/Form/FormErrorSummary.tsx +113 -0
- package/src/components/Form/FormField.tsx +249 -0
- package/src/components/Form/FormFieldset.tsx +127 -0
- package/src/components/Form/FormLiveRegion.tsx +198 -0
- package/src/components/Form/index.ts +26 -0
- package/src/components/Header/Header.test.tsx +582 -0
- package/src/components/Header/Header.tsx +301 -0
- package/src/components/Header/index.ts +4 -0
- package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +489 -0
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +164 -0
- package/src/components/InactivityWarningModal/index.ts +9 -0
- package/src/components/Input/Input.test.tsx +466 -0
- package/src/components/Input/Input.tsx +201 -0
- package/src/components/Input/__mocks__/Input.tsx +2 -0
- package/src/components/Input/index.ts +9 -0
- package/src/components/Label/Label.tsx +186 -0
- package/src/components/Label/index.ts +2 -0
- package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +450 -0
- package/src/components/LoadingSpinner/LoadingSpinner.tsx +98 -0
- package/src/components/LoadingSpinner/index.ts +3 -0
- package/src/components/LoginForm/LoginForm.test.tsx +816 -0
- package/src/components/LoginForm/LoginForm.tsx +273 -0
- package/src/components/LoginForm/index.ts +3 -0
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +883 -0
- package/src/components/NavigationMenu/NavigationMenu.tsx +698 -0
- package/src/components/NavigationMenu/index.ts +10 -0
- package/src/components/NavigationMenu/types.ts +85 -0
- package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +748 -0
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +304 -0
- package/src/components/OrganisationSelector/index.ts +9 -0
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +891 -0
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +699 -0
- package/src/components/PaceAppLayout/README.md +278 -0
- package/src/components/PaceAppLayout/index.ts +1 -0
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +475 -0
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +221 -0
- package/src/components/PaceLoginPage/index.ts +1 -0
- package/src/components/PasswordReset/PasswordChangeForm.test.tsx +621 -0
- package/src/components/PasswordReset/PasswordChangeForm.tsx +186 -0
- package/src/components/PasswordReset/PasswordResetForm.test.tsx +605 -0
- package/src/components/PasswordReset/PasswordResetForm.tsx +201 -0
- package/src/components/PasswordReset/index.ts +4 -0
- package/src/components/PrintButton/PrintButton.tsx +321 -0
- package/src/components/PrintButton/PrintButtonGroup.tsx +84 -0
- package/src/components/PrintButton/PrintToolbar.tsx +94 -0
- package/src/components/PrintButton/examples/PrintButtonShowcase.tsx +438 -0
- package/src/components/PrintButton/index.ts +33 -0
- package/src/components/PrintButton/types.ts +173 -0
- package/src/components/PrintCard/PrintCard.tsx +154 -0
- package/src/components/PrintCard/PrintCardContent.tsx +57 -0
- package/src/components/PrintCard/PrintCardFooter.tsx +60 -0
- package/src/components/PrintCard/PrintCardGrid.tsx +91 -0
- package/src/components/PrintCard/PrintCardHeader.tsx +78 -0
- package/src/components/PrintCard/PrintCardImage.tsx +81 -0
- package/src/components/PrintCard/examples/PrintCardShowcase.tsx +239 -0
- package/src/components/PrintCard/index.ts +34 -0
- package/src/components/PrintCard/types.ts +171 -0
- package/src/components/PrintDataTable/PrintDataTable.tsx +215 -0
- package/src/components/PrintDataTable/PrintTableGroup.tsx +90 -0
- package/src/components/PrintDataTable/PrintTableRow.tsx +76 -0
- package/src/components/PrintDataTable/index.ts +25 -0
- package/src/components/PrintDataTable/types.ts +67 -0
- package/src/components/PrintFooter/PrintFooter.tsx +183 -0
- package/src/components/PrintFooter/PrintFooterContent.tsx +71 -0
- package/src/components/PrintFooter/PrintFooterInfo.tsx +86 -0
- package/src/components/PrintFooter/PrintPageNumber.tsx +90 -0
- package/src/components/PrintFooter/examples/PrintFooterShowcase.tsx +390 -0
- package/src/components/PrintFooter/index.ts +30 -0
- package/src/components/PrintFooter/types.ts +149 -0
- package/src/components/PrintGrid/PrintGrid.tsx +180 -0
- package/src/components/PrintGrid/PrintGridBreakpoint.tsx +109 -0
- package/src/components/PrintGrid/PrintGridContainer.tsx +128 -0
- package/src/components/PrintGrid/PrintGridItem.tsx +220 -0
- package/src/components/PrintGrid/examples/PrintGridShowcase.tsx +359 -0
- package/src/components/PrintGrid/index.ts +31 -0
- package/src/components/PrintGrid/types.ts +159 -0
- package/src/components/PrintHeader/PrintCoverHeader.tsx +230 -0
- package/src/components/PrintHeader/PrintHeader.tsx +150 -0
- package/src/components/PrintHeader/index.ts +17 -0
- package/src/components/PrintHeader/types.ts +42 -0
- package/src/components/PrintLayout/PrintLayout.tsx +122 -0
- package/src/components/PrintLayout/PrintLayoutContext.tsx +66 -0
- package/src/components/PrintLayout/PrintPageBreak.tsx +52 -0
- package/src/components/PrintLayout/examples/PrintShowcase.tsx +230 -0
- package/src/components/PrintLayout/index.ts +19 -0
- package/src/components/PrintLayout/types.ts +37 -0
- package/src/components/PrintPageBreak/PrintPageBreak.tsx +120 -0
- package/src/components/PrintPageBreak/PrintPageBreakGroup.tsx +90 -0
- package/src/components/PrintPageBreak/PrintPageBreakIndicator.tsx +112 -0
- package/src/components/PrintPageBreak/examples/PrintPageBreakShowcase.tsx +279 -0
- package/src/components/PrintPageBreak/index.ts +23 -0
- package/src/components/PrintPageBreak/types.ts +94 -0
- package/src/components/PrintSection/PrintColumn.tsx +104 -0
- package/src/components/PrintSection/PrintDivider.tsx +101 -0
- package/src/components/PrintSection/PrintSection.tsx +129 -0
- package/src/components/PrintSection/PrintSectionContent.tsx +75 -0
- package/src/components/PrintSection/PrintSectionHeader.tsx +97 -0
- package/src/components/PrintSection/examples/PrintSectionShowcase.tsx +258 -0
- package/src/components/PrintSection/index.ts +33 -0
- package/src/components/PrintSection/types.ts +155 -0
- package/src/components/PrintText/PrintText.tsx +116 -0
- package/src/components/PrintText/index.ts +16 -0
- package/src/components/PrintText/types.ts +24 -0
- package/src/components/Progress/Progress.tsx +116 -0
- package/src/components/Progress/index.ts +3 -0
- package/src/components/PublicLayout/EventLogo.tsx +287 -0
- package/src/components/PublicLayout/PublicErrorBoundary.tsx +279 -0
- package/src/components/PublicLayout/PublicLoadingSpinner.tsx +208 -0
- package/src/components/PublicLayout/PublicPageContextChecker.tsx +130 -0
- package/src/components/PublicLayout/PublicPageDebugger.tsx +104 -0
- package/src/components/PublicLayout/PublicPageDiagnostic.tsx +162 -0
- package/src/components/PublicLayout/PublicPageFooter.tsx +124 -0
- package/src/components/PublicLayout/PublicPageHeader.tsx +178 -0
- package/src/components/PublicLayout/PublicPageLayout.tsx +232 -0
- package/src/components/PublicLayout/PublicPageProvider.tsx +137 -0
- package/src/components/PublicLayout/index.ts +51 -0
- package/src/components/Select/Select.test.tsx +948 -0
- package/src/components/Select/Select.tsx +660 -0
- package/src/components/Select/index.ts +1 -0
- package/src/components/SuperAdminGuard.tsx +116 -0
- package/src/components/Table/Table.tsx +222 -0
- package/src/components/Table/index.ts +11 -0
- package/src/components/Toast/Toast.test.tsx +586 -0
- package/src/components/Toast/Toast.tsx +339 -0
- package/src/components/Toast/index.ts +14 -0
- package/src/components/Tooltip/Tooltip.test.tsx +852 -0
- package/src/components/Tooltip/Tooltip.tsx +167 -0
- package/src/components/Tooltip/index.ts +7 -0
- package/src/components/UserMenu/UserMenu.test.tsx +702 -0
- package/src/components/UserMenu/UserMenu.tsx +243 -0
- package/src/components/UserMenu/index.ts +3 -0
- package/src/components/examples/PermissionExample.tsx +150 -0
- package/src/components/index.ts +434 -0
- package/src/components.ts +19 -0
- package/src/constants/performance.ts +14 -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/index.ts +56 -0
- package/src/hooks/public/index.ts +34 -0
- package/src/hooks/public/usePublicEvent.ts +261 -0
- package/src/hooks/public/usePublicEventLogo.ts +285 -0
- package/src/hooks/public/usePublicRouteParams.ts +259 -0
- package/src/hooks/useAppConfig.ts +94 -0
- package/src/hooks/useComponentPerformance.ts +39 -0
- package/src/hooks/useCounter.test.ts +135 -0
- package/src/hooks/useDataTablePerformance.ts +387 -0
- package/src/hooks/useDataTableState.ts +110 -0
- package/src/hooks/useDebounce.test.ts +375 -0
- package/src/hooks/useDebounce.ts +18 -0
- package/src/hooks/useFocusManagement.ts +161 -0
- package/src/hooks/useFocusTrap.ts +155 -0
- package/src/hooks/useInactivityTracker.ts +372 -0
- package/src/hooks/useIsMobile.ts +42 -0
- package/src/hooks/useKeyboardShortcuts.ts +237 -0
- package/src/hooks/useOrganisationPermissions.test.ts +528 -0
- package/src/hooks/useOrganisationPermissions.ts +208 -0
- package/src/hooks/useOrganisationSecurity.test.ts +734 -0
- package/src/hooks/useOrganisationSecurity.ts +262 -0
- package/src/hooks/usePerformanceMonitor.ts +128 -0
- package/src/hooks/usePermissionCache.test.ts +542 -0
- package/src/hooks/usePermissionCache.ts +455 -0
- package/src/hooks/useSecureDataAccess.ts +586 -0
- package/src/hooks/useStorage.ts +274 -0
- package/src/hooks/useToast.ts +242 -0
- package/src/hooks/useZodForm.ts +28 -0
- package/src/index.ts +199 -0
- package/src/providers/AuthProvider.tsx +369 -0
- package/src/providers/EventProvider.tsx +324 -0
- package/src/providers/InactivityProvider.tsx +238 -0
- package/src/providers/OrganisationProvider.tsx +588 -0
- package/src/providers/UnifiedAuthProvider.tsx +327 -0
- package/src/providers/index.ts +17 -0
- package/src/rbac/README.md +885 -0
- package/src/rbac/__tests__/integration.test.tsx +218 -0
- package/src/rbac/adapters.tsx +726 -0
- package/src/rbac/api.test.ts +441 -0
- package/src/rbac/api.ts +339 -0
- package/src/rbac/audit-enhanced.ts +339 -0
- package/src/rbac/audit.ts +338 -0
- package/src/rbac/cache.ts +215 -0
- package/src/rbac/components/EnhancedNavigationMenu.tsx +294 -0
- package/src/rbac/components/NavigationGuard.tsx +294 -0
- package/src/rbac/components/NavigationProvider.tsx +314 -0
- package/src/rbac/components/PagePermissionGuard.tsx +430 -0
- package/src/rbac/components/PagePermissionProvider.tsx +274 -0
- package/src/rbac/components/PermissionEnforcer.tsx +307 -0
- package/src/rbac/components/RoleBasedRouter.tsx +425 -0
- package/src/rbac/components/SecureDataProvider.tsx +319 -0
- package/src/rbac/components/index.ts +64 -0
- package/src/rbac/config.ts +133 -0
- package/src/rbac/docs/event-based-apps.md +285 -0
- package/src/rbac/engine.ts +1026 -0
- package/src/rbac/eslint-rules.js +285 -0
- package/src/rbac/examples/CompleteRBACExample.tsx +323 -0
- package/src/rbac/examples/EventBasedApp.tsx +238 -0
- package/src/rbac/hooks/index.ts +21 -0
- package/src/rbac/hooks/useCan.test.ts +461 -0
- package/src/rbac/hooks/usePermissions.test.ts +359 -0
- package/src/rbac/hooks/usePermissions.ts +567 -0
- package/src/rbac/hooks/useRBAC.simple.test.ts +90 -0
- package/src/rbac/hooks/useRBAC.test.ts +503 -0
- package/src/rbac/hooks/useRBAC.ts +262 -0
- package/src/rbac/index.ts +109 -0
- package/src/rbac/permissions.ts +293 -0
- package/src/rbac/providers/RBACProvider.tsx +634 -0
- package/src/rbac/providers/__tests__/RBACProvider.test.tsx +687 -0
- package/src/rbac/providers/index.ts +11 -0
- package/src/rbac/secureClient.ts +244 -0
- package/src/rbac/security.ts +346 -0
- package/src/rbac/testing/index.tsx +340 -0
- package/src/rbac/types.ts +343 -0
- package/src/rbac/utils/eventContext.ts +83 -0
- package/src/styles/core.css +364 -0
- package/src/styles/index.ts +51 -0
- package/src/theming/runtime.ts +187 -0
- package/src/types/database.ts +472 -0
- package/src/types/guards.ts +30 -0
- package/src/types/index.ts +25 -0
- package/src/types/organisation.ts +184 -0
- package/src/types/security.ts +70 -0
- package/src/types/supabase.ts +166 -0
- package/src/types/theme.ts +6 -0
- package/src/types/unified.ts +262 -0
- package/src/types/validation.ts +164 -0
- package/src/types/vitest-globals.d.ts +43 -0
- package/src/utils/__mocks__/supabaseMock.ts +75 -0
- package/src/utils/__mocks__/supabaseMock.tsx +198 -0
- package/src/utils/appConfig.ts +47 -0
- package/src/utils/appIdResolver.ts +130 -0
- package/src/utils/appNameResolver.ts +190 -0
- package/src/utils/audit.ts +127 -0
- package/src/utils/auth-utils.ts +96 -0
- package/src/utils/bundleAnalysis.ts +129 -0
- package/src/utils/cn.ts +7 -0
- package/src/utils/debugLogger.ts +46 -0
- package/src/utils/deviceFingerprint.ts +215 -0
- package/src/utils/dynamicUtils.ts +105 -0
- package/src/utils/formatDate.test.ts +241 -0
- package/src/utils/formatting.ts +77 -0
- package/src/utils/index.ts +145 -0
- package/src/utils/lazyLoad.tsx +44 -0
- package/src/utils/organisationContext.ts +135 -0
- package/src/utils/performanceBenchmark.ts +64 -0
- package/src/utils/performanceBudgets.ts +111 -0
- package/src/utils/permissionTypes.ts +37 -0
- package/src/utils/permissionUtils.ts +31 -0
- package/src/utils/print/PrintDataProcessor.ts +390 -0
- package/src/utils/print/examples/PrintUtilitiesShowcase.tsx +397 -0
- package/src/utils/print/index.ts +29 -0
- package/src/utils/print/types.ts +196 -0
- package/src/utils/print/usePrintOptimization.ts +272 -0
- package/src/utils/sanitization.ts +264 -0
- package/src/utils/schemaUtils.ts +37 -0
- package/src/utils/secureDataAccess.ts +361 -0
- package/src/utils/secureErrors.ts +79 -0
- package/src/utils/secureStorage.ts +244 -0
- package/src/utils/security.ts +156 -0
- package/src/utils/securityMonitor.ts +45 -0
- package/src/utils/sessionTracking.ts +170 -0
- package/src/utils/storage/README.md +348 -0
- package/src/utils/storage/config.ts +100 -0
- package/src/utils/storage/helpers.ts +359 -0
- package/src/utils/storage/index.ts +36 -0
- package/src/utils/storage/types.ts +90 -0
- package/src/utils/validation.ts +111 -0
- package/src/utils/validationUtils.ts +120 -0
- package/src/validation/common.ts +53 -0
- package/src/validation/csrf.ts +214 -0
- package/src/validation/index.ts +43 -0
- package/src/validation/passwordSchema.ts +125 -0
- package/src/validation/sanitization.ts +96 -0
- package/src/validation/schemaUtils.ts +42 -0
- package/src/validation/sqlInjectionProtection.ts +242 -0
- package/src/validation/user.ts +34 -0
- package/dist/chunk-4MCJAK7J.js.map +0 -1
- package/dist/chunk-4ZTIEYU2.js.map +0 -1
- package/dist/chunk-H4PZ4B3Y.js.map +0 -1
- package/dist/chunk-IOX76PSM.js.map +0 -1
- package/dist/chunk-JUUNUW3O.js.map +0 -1
- package/dist/chunk-KK6WIDK6.js +0 -63
- package/dist/chunk-KK6WIDK6.js.map +0 -1
- package/dist/chunk-U7DY5T33.js +0 -11
- package/dist/chunk-U7DY5T33.js.map +0 -1
- package/dist/chunk-WHLSWC6W.js.map +0 -1
- package/dist/chunk-XI7QFSSC.js +0 -790
- package/dist/chunk-XI7QFSSC.js.map +0 -1
- package/dist/chunk-XIJMMBDD.js +0 -73
- package/dist/chunk-XIJMMBDD.js.map +0 -1
- package/dist/chunk-YNU5QJ4S.js.map +0 -1
- package/dist/chunk-YWYCNGWH.js +0 -2070
- package/dist/chunk-YWYCNGWH.js.map +0 -1
- package/dist/chunk-ZJ3UKPIW.js +0 -952
- package/dist/chunk-ZJ3UKPIW.js.map +0 -1
- package/dist/useAppConfig-CZNJJsT_.d.ts +0 -148
- package/dist/{DataTable-2LB6HI6V.js.map → DataTable-ZQDRE46Q.js.map} +0 -0
- package/dist/{api-AIJ3IJX3.js.map → api-H5A3H4IR.js.map} +0 -0
- package/dist/{audit-PD5L5ZSC.js.map → appNameResolver-7GHF5ED2.js.map} +0 -0
- package/dist/{chunk-DC5AMYBS.js.map → audit-BUW3LMJB.js.map} +0 -0
- package/dist/{validation-D2-NNCCE.d.ts → validation-PM_iOaTI.d.ts} +6 -6
|
@@ -1,338 +1,316 @@
|
|
|
1
1
|
# RBAC Troubleshooting Guide
|
|
2
2
|
|
|
3
|
+
> **📚 Quick Start**: If you're new to RBAC, start with the [Quick Start Guide](./quick-start.md) first.
|
|
4
|
+
|
|
3
5
|
This guide helps you resolve common issues when using the PACE Core RBAC system.
|
|
4
6
|
|
|
5
|
-
##
|
|
7
|
+
## 🚨 Critical Issues (Fix Immediately)
|
|
6
8
|
|
|
7
|
-
### 1. "
|
|
9
|
+
### 1. "Access Denied" on All Pages - Missing App ID
|
|
8
10
|
|
|
9
|
-
**
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
**Symptoms:**
|
|
12
|
+
- Users see "Access Denied" on every page
|
|
13
|
+
- Console shows `[PagePermissionGuard] STRICT MODE VIOLATION` errors
|
|
14
|
+
- Console shows `scope: { organisationId: "...", eventId: "..." }` (missing `appId`)
|
|
15
|
+
- All permission checks return `false`
|
|
13
16
|
|
|
14
|
-
**Cause:**
|
|
17
|
+
**Root Cause:** App name not being set globally for RBAC resolution
|
|
15
18
|
|
|
16
|
-
**
|
|
19
|
+
**Fix:**
|
|
17
20
|
```typescript
|
|
18
|
-
|
|
19
|
-
import {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
**Solutions:**
|
|
43
|
-
|
|
44
|
-
**Option 1: Pass userId explicitly**
|
|
45
|
-
```tsx
|
|
46
|
-
<PermissionGuard
|
|
47
|
-
userId="user-123"
|
|
48
|
-
permission="admin:read"
|
|
49
|
-
scope={{ organisationId: 'org-456' }}
|
|
50
|
-
>
|
|
51
|
-
<AdminPanel />
|
|
52
|
-
</PermissionGuard>
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
**Option 2: Set up auth context**
|
|
56
|
-
```tsx
|
|
57
|
-
// Set user in global context
|
|
58
|
-
window.__PACE_USER__ = { id: 'user-123' };
|
|
59
|
-
|
|
60
|
-
// Or use your auth provider
|
|
61
|
-
const { user } = useAuth();
|
|
62
|
-
<PermissionGuard
|
|
63
|
-
userId={user.id}
|
|
64
|
-
permission="admin:read"
|
|
65
|
-
scope={{ organisationId: 'org-456' }}
|
|
66
|
-
>
|
|
67
|
-
<AdminPanel />
|
|
68
|
-
</PermissionGuard>
|
|
21
|
+
// ❌ WRONG - Missing setRBACAppName call
|
|
22
|
+
import { UnifiedAuthProvider } from '@jmruthers/pace-core/providers'
|
|
23
|
+
|
|
24
|
+
function App() {
|
|
25
|
+
return (
|
|
26
|
+
<UnifiedAuthProvider supabaseClient={supabase}>
|
|
27
|
+
{/* Your app */}
|
|
28
|
+
</UnifiedAuthProvider>
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// ✅ CORRECT - Set app name globally
|
|
33
|
+
import { setRBACAppName } from '@jmruthers/pace-core/utils'
|
|
34
|
+
|
|
35
|
+
const APP_NAME = import.meta.env.VITE_APP_NAME
|
|
36
|
+
setRBACAppName(APP_NAME) // CRITICAL: This must be called
|
|
37
|
+
|
|
38
|
+
function App() {
|
|
39
|
+
return (
|
|
40
|
+
<UnifiedAuthProvider supabaseClient={supabase}>
|
|
41
|
+
{/* Your app */}
|
|
42
|
+
</UnifiedAuthProvider>
|
|
43
|
+
)
|
|
44
|
+
}
|
|
69
45
|
```
|
|
70
46
|
|
|
71
|
-
###
|
|
47
|
+
### 2. "Access Denied" on All Pages - Wrong Permission Check
|
|
72
48
|
|
|
73
49
|
**Symptoms:**
|
|
74
|
-
-
|
|
75
|
-
- `
|
|
76
|
-
|
|
77
|
-
**Possible Causes:**
|
|
78
|
-
|
|
79
|
-
**A. Missing Organisation Context**
|
|
80
|
-
```tsx
|
|
81
|
-
// ❌ Wrong - missing organisationId
|
|
82
|
-
<PermissionGuard
|
|
83
|
-
permission="admin:read"
|
|
84
|
-
scope={{}} // Missing organisationId
|
|
85
|
-
>
|
|
86
|
-
<AdminPanel />
|
|
87
|
-
</PermissionGuard>
|
|
50
|
+
- Users see "Access Denied" on every page
|
|
51
|
+
- Console shows `[PagePermissionGuard] STRICT MODE VIOLATION` errors
|
|
52
|
+
- All permission checks return `false`
|
|
88
53
|
|
|
89
|
-
|
|
90
|
-
<PermissionGuard
|
|
91
|
-
permission="admin:read"
|
|
92
|
-
scope={{ organisationId: 'org-123' }}
|
|
93
|
-
>
|
|
94
|
-
<AdminPanel />
|
|
95
|
-
</PermissionGuard>
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
**B. Wrong Permission Format**
|
|
99
|
-
```tsx
|
|
100
|
-
// ❌ Wrong - invalid permission format
|
|
101
|
-
<PermissionGuard
|
|
102
|
-
permission="admin" // Missing operation
|
|
103
|
-
scope={{ organisationId: 'org-123' }}
|
|
104
|
-
>
|
|
105
|
-
<AdminPanel />
|
|
106
|
-
</PermissionGuard>
|
|
54
|
+
**Root Cause:** Using manual permission checks instead of PagePermissionGuard
|
|
107
55
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
56
|
+
**Fix:**
|
|
57
|
+
```typescript
|
|
58
|
+
// ❌ WRONG - This causes the issue
|
|
59
|
+
const { hasPermission } = useRBAC();
|
|
60
|
+
|
|
61
|
+
// ✅ CORRECT - Use PagePermissionGuard instead
|
|
62
|
+
<PagePermissionGuard
|
|
63
|
+
pageName="dashboard"
|
|
64
|
+
operation="read"
|
|
65
|
+
fallback={<div>Access Denied</div>}
|
|
112
66
|
>
|
|
113
|
-
<
|
|
114
|
-
</
|
|
67
|
+
<Dashboard />
|
|
68
|
+
</PagePermissionGuard>
|
|
115
69
|
```
|
|
116
70
|
|
|
117
|
-
**
|
|
118
|
-
Check if the user exists in your RBAC tables:
|
|
71
|
+
**Database Check:**
|
|
119
72
|
```sql
|
|
120
|
-
--
|
|
121
|
-
SELECT * FROM
|
|
122
|
-
|
|
123
|
-
|
|
73
|
+
-- Verify your app exists and is active
|
|
74
|
+
SELECT * FROM rbac_apps WHERE name = 'your-app-name' AND is_active = true;
|
|
75
|
+
|
|
76
|
+
-- Check if pages exist for your app
|
|
77
|
+
SELECT ap.*, a.name as app_name
|
|
78
|
+
FROM rbac_app_pages ap
|
|
79
|
+
JOIN rbac_apps a ON ap.app_id = a.id
|
|
80
|
+
WHERE a.name = 'your-app-name';
|
|
124
81
|
```
|
|
125
82
|
|
|
126
|
-
###
|
|
83
|
+
### 2. 400/406 Database Errors
|
|
127
84
|
|
|
128
85
|
**Symptoms:**
|
|
129
|
-
-
|
|
130
|
-
-
|
|
86
|
+
- Console shows `XHR GET` requests failing with 400/406 status codes
|
|
87
|
+
- Errors like `id=eq.CAKE&is_active=eq.true` in network tab
|
|
88
|
+
- Permission checks fail silently
|
|
131
89
|
|
|
132
|
-
**
|
|
90
|
+
**Root Cause:** App is querying `rbac_apps` with `id=eq.CAKE` instead of `name=eq.CAKE`
|
|
133
91
|
|
|
134
|
-
**
|
|
92
|
+
**Fix:**
|
|
135
93
|
```typescript
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
94
|
+
// ❌ WRONG - Don't make direct database queries
|
|
95
|
+
const { data } = await supabase
|
|
96
|
+
.from('rbac_apps')
|
|
97
|
+
.select('*')
|
|
98
|
+
.eq('id', 'CAKE'); // This causes 400 error
|
|
99
|
+
|
|
100
|
+
// ✅ CORRECT - Use the providers and hooks
|
|
101
|
+
const { user, selectedOrganisationId } = useUnifiedAuth();
|
|
102
|
+
// The providers handle app ID resolution automatically
|
|
142
103
|
```
|
|
143
104
|
|
|
144
|
-
**
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
Verify that Supabase requests are being made and returning data.
|
|
149
|
-
|
|
150
|
-
### 5. TypeScript Errors
|
|
105
|
+
**Prevention:**
|
|
106
|
+
- Never make direct queries to `rbac_apps`, `rbac_global_roles`, or other RBAC tables
|
|
107
|
+
- Always use the provided hooks and components
|
|
108
|
+
- Let the core library handle all RBAC database operations
|
|
151
109
|
|
|
152
|
-
|
|
110
|
+
### 3. App ID Resolution Failures
|
|
153
111
|
|
|
154
|
-
**
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
112
|
+
**Symptoms:**
|
|
113
|
+
- Console shows "App not found or inactive" warnings
|
|
114
|
+
- Permission checks return `false` even for valid users
|
|
115
|
+
- App configuration not loading
|
|
158
116
|
|
|
159
|
-
|
|
160
|
-
import { PermissionGuard, Permission, Scope } from '@jmruthers/pace-core/rbac';
|
|
161
|
-
```
|
|
117
|
+
**Root Cause:** App name mismatch between environment variable and database
|
|
162
118
|
|
|
163
|
-
**
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
|
|
119
|
+
**Fix:**
|
|
120
|
+
```bash
|
|
121
|
+
# Check your environment variable
|
|
122
|
+
echo $VITE_APP_NAME
|
|
167
123
|
|
|
168
|
-
|
|
169
|
-
|
|
124
|
+
# Check your database
|
|
125
|
+
SELECT name, is_active FROM rbac_apps WHERE name = 'your-app-name';
|
|
170
126
|
```
|
|
171
127
|
|
|
172
|
-
**
|
|
128
|
+
**Ensure exact match:**
|
|
173
129
|
```typescript
|
|
174
|
-
//
|
|
175
|
-
|
|
130
|
+
// .env.local
|
|
131
|
+
VITE_APP_NAME=my-app
|
|
176
132
|
|
|
177
|
-
//
|
|
178
|
-
|
|
133
|
+
// Database
|
|
134
|
+
INSERT INTO rbac_apps (name, is_active) VALUES ('my-app', true);
|
|
135
|
+
// Must match exactly - case sensitive!
|
|
179
136
|
```
|
|
180
137
|
|
|
181
|
-
###
|
|
138
|
+
### 4. Permission Checks Always Return False
|
|
182
139
|
|
|
183
140
|
**Symptoms:**
|
|
184
|
-
-
|
|
185
|
-
-
|
|
186
|
-
-
|
|
141
|
+
- All `useCan` calls return `false`
|
|
142
|
+
- All `PagePermissionGuard` components show fallback content
|
|
143
|
+
- Users can't access anything
|
|
187
144
|
|
|
188
|
-
**
|
|
145
|
+
**Root Cause:** Missing or incorrect page permissions in database
|
|
189
146
|
|
|
190
|
-
**
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
147
|
+
**Fix:**
|
|
148
|
+
```sql
|
|
149
|
+
-- Check if page permissions exist
|
|
150
|
+
SELECT pp.*, ap.page_name, a.name as app_name
|
|
151
|
+
FROM rbac_page_permissions pp
|
|
152
|
+
JOIN rbac_app_pages ap ON pp.app_page_id = ap.id
|
|
153
|
+
JOIN rbac_apps a ON ap.app_id = a.id
|
|
154
|
+
WHERE a.name = 'your-app-name';
|
|
155
|
+
|
|
156
|
+
-- If no permissions exist, create them
|
|
157
|
+
WITH app_pages AS (
|
|
158
|
+
SELECT ap.id as page_id, ap.page_name, a.id as app_id
|
|
159
|
+
FROM rbac_app_pages ap
|
|
160
|
+
JOIN rbac_apps a ON ap.app_id = a.id
|
|
161
|
+
WHERE a.name = 'your-app-name'
|
|
162
|
+
)
|
|
163
|
+
INSERT INTO rbac_page_permissions (app_page_id, operation, role_name, allowed, organisation_id)
|
|
164
|
+
SELECT
|
|
165
|
+
ap.page_id,
|
|
166
|
+
'read',
|
|
167
|
+
'org_admin',
|
|
168
|
+
true,
|
|
169
|
+
'your-organisation-id'::uuid
|
|
170
|
+
FROM app_pages ap;
|
|
197
171
|
```
|
|
198
172
|
|
|
199
|
-
|
|
200
|
-
Make sure your database has the required RBAC tables:
|
|
201
|
-
- `rbac_global_roles`
|
|
202
|
-
- `rbac_organisation_roles`
|
|
203
|
-
- `rbac_event_app_roles`
|
|
204
|
-
- `rbac_page_permissions`
|
|
173
|
+
## 🔧 Setup Issues
|
|
205
174
|
|
|
206
|
-
|
|
207
|
-
Verify that Row Level Security policies are properly configured.
|
|
208
|
-
|
|
209
|
-
### 7. Performance Issues
|
|
175
|
+
### 5. Missing Provider Setup
|
|
210
176
|
|
|
211
177
|
**Symptoms:**
|
|
212
|
-
-
|
|
213
|
-
-
|
|
214
|
-
-
|
|
215
|
-
|
|
216
|
-
**Solutions:**
|
|
178
|
+
- "Provider not found" errors
|
|
179
|
+
- Hooks return undefined values
|
|
180
|
+
- App crashes on load
|
|
217
181
|
|
|
218
|
-
**
|
|
182
|
+
**Fix:**
|
|
219
183
|
```typescript
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
184
|
+
// ❌ WRONG - Missing providers
|
|
185
|
+
function App() {
|
|
186
|
+
return (
|
|
187
|
+
<div>
|
|
188
|
+
<MyComponent />
|
|
189
|
+
</div>
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// ✅ CORRECT - Proper provider setup
|
|
194
|
+
function App() {
|
|
195
|
+
return (
|
|
196
|
+
<UnifiedAuthProvider
|
|
197
|
+
supabaseClient={supabase}
|
|
198
|
+
appName={APP_NAME}
|
|
199
|
+
>
|
|
200
|
+
<OrganisationProvider>
|
|
201
|
+
<EventProvider>
|
|
202
|
+
<MyComponent />
|
|
203
|
+
</EventProvider>
|
|
204
|
+
</OrganisationProvider>
|
|
205
|
+
</UnifiedAuthProvider>
|
|
206
|
+
);
|
|
207
|
+
}
|
|
226
208
|
```
|
|
227
209
|
|
|
228
|
-
|
|
229
|
-
```tsx
|
|
230
|
-
// Use cached versions when possible
|
|
231
|
-
import { useCanCached } from '@jmruthers/pace-core/rbac';
|
|
210
|
+
### 6. Wrong App Context Type
|
|
232
211
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
Make sure you have proper indexes on frequently queried columns.
|
|
238
|
-
|
|
239
|
-
## Debug Mode
|
|
240
|
-
|
|
241
|
-
Enable debug mode to get detailed logging:
|
|
212
|
+
**Symptoms:**
|
|
213
|
+
- "Invalid context requirements" errors
|
|
214
|
+
- Permission checks fail with context errors
|
|
215
|
+
- Organisation not resolved from event
|
|
242
216
|
|
|
217
|
+
**Fix:**
|
|
243
218
|
```typescript
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
}
|
|
219
|
+
// Check your app configuration
|
|
220
|
+
const appConfig = await getAppConfig(appId);
|
|
221
|
+
|
|
222
|
+
if (appConfig?.requires_event) {
|
|
223
|
+
// Event-based app - requires eventId
|
|
224
|
+
const scope = { eventId: selectedEventId, appId };
|
|
225
|
+
} else {
|
|
226
|
+
// Organisation-based app - requires organisationId
|
|
227
|
+
const scope = { organisationId: selectedOrganisationId, appId };
|
|
228
|
+
}
|
|
251
229
|
```
|
|
252
230
|
|
|
253
|
-
|
|
254
|
-
- Permission check attempts
|
|
255
|
-
- Database queries
|
|
256
|
-
- Cache hits/misses
|
|
257
|
-
- Error details
|
|
231
|
+
### 7. User Not in Database
|
|
258
232
|
|
|
259
|
-
|
|
233
|
+
**Symptoms:**
|
|
234
|
+
- User can log in but has no permissions
|
|
235
|
+
- All permission checks return false
|
|
236
|
+
- No roles found for user
|
|
260
237
|
|
|
261
|
-
|
|
238
|
+
**Fix:**
|
|
239
|
+
```sql
|
|
240
|
+
-- Check if user has any roles
|
|
241
|
+
SELECT * FROM rbac_organisation_roles WHERE user_id = 'your-user-id';
|
|
242
|
+
SELECT * FROM rbac_global_roles WHERE user_id = 'your-user-id';
|
|
262
243
|
|
|
263
|
-
|
|
244
|
+
-- If no roles exist, create them
|
|
245
|
+
INSERT INTO rbac_organisation_roles (user_id, organisation_id, role, status)
|
|
246
|
+
VALUES ('your-user-id'::uuid, 'your-organisation-id'::uuid, 'org_admin', 'active');
|
|
247
|
+
```
|
|
264
248
|
|
|
265
|
-
|
|
266
|
-
import { createMockRBACProvider, TestScenarios } from '@jmruthers/pace-core/rbac/testing';
|
|
249
|
+
## 🚀 Quick Fixes
|
|
267
250
|
|
|
268
|
-
|
|
251
|
+
### Fix 1: Reset App Configuration
|
|
269
252
|
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
);
|
|
253
|
+
```sql
|
|
254
|
+
-- Delete and recreate your app
|
|
255
|
+
DELETE FROM rbac_apps WHERE name = 'your-app-name';
|
|
256
|
+
INSERT INTO rbac_apps (name, display_name, requires_event, is_active)
|
|
257
|
+
VALUES ('your-app-name', 'Your App', false, true);
|
|
275
258
|
```
|
|
276
259
|
|
|
277
|
-
### 2
|
|
260
|
+
### Fix 2: Grant Admin Role
|
|
278
261
|
|
|
279
|
-
```
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
const mockSupabase = createMockSupabaseClient();
|
|
288
|
-
const testScope = createTestScope({ organisationId: 'test-org' });
|
|
289
|
-
const testUser = createTestUser({ id: 'test-user' });
|
|
290
|
-
const permissions = mockPermissions({ admin: true });
|
|
262
|
+
```sql
|
|
263
|
+
-- Give user org_admin role
|
|
264
|
+
INSERT INTO rbac_organisation_roles (user_id, organisation_id, role, status)
|
|
265
|
+
VALUES ('your-user-id'::uuid, 'your-organisation-id'::uuid, 'org_admin', 'active')
|
|
266
|
+
ON CONFLICT (user_id, organisation_id) DO UPDATE SET
|
|
267
|
+
role = 'org_admin',
|
|
268
|
+
status = 'active',
|
|
269
|
+
updated_at = NOW();
|
|
291
270
|
```
|
|
292
271
|
|
|
293
|
-
|
|
272
|
+
### Fix 3: Create Basic Page Permissions
|
|
294
273
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
274
|
+
```sql
|
|
275
|
+
-- Create basic permissions for all pages
|
|
276
|
+
WITH app_pages AS (
|
|
277
|
+
SELECT ap.id as page_id, a.id as app_id
|
|
278
|
+
FROM rbac_app_pages ap
|
|
279
|
+
JOIN rbac_apps a ON ap.app_id = a.id
|
|
280
|
+
WHERE a.name = 'your-app-name'
|
|
281
|
+
)
|
|
282
|
+
INSERT INTO rbac_page_permissions (app_page_id, operation, role_name, allowed, organisation_id)
|
|
283
|
+
SELECT
|
|
284
|
+
ap.page_id,
|
|
285
|
+
op.operation,
|
|
286
|
+
'org_admin',
|
|
287
|
+
true,
|
|
288
|
+
'your-organisation-id'::uuid
|
|
289
|
+
FROM app_pages ap
|
|
290
|
+
CROSS JOIN (SELECT unnest(ARRAY['read', 'create', 'update', 'delete']) as operation) op;
|
|
291
|
+
```
|
|
308
292
|
|
|
309
|
-
|
|
310
|
-
- Check your Supabase connection
|
|
311
|
-
- Verify your database schema
|
|
312
|
-
- Check your RLS policies
|
|
313
|
-
- Look at the Supabase logs
|
|
293
|
+
## ✅ Verification Checklist
|
|
314
294
|
|
|
315
|
-
|
|
295
|
+
After applying fixes, verify:
|
|
316
296
|
|
|
317
|
-
|
|
318
|
-
-
|
|
319
|
-
-
|
|
320
|
-
-
|
|
297
|
+
- [ ] App name in environment variable matches database exactly
|
|
298
|
+
- [ ] User has at least one role in the database
|
|
299
|
+
- [ ] Page permissions exist for the pages you're trying to access
|
|
300
|
+
- [ ] You're using `PagePermissionGuard` instead of manual permission checks
|
|
301
|
+
- [ ] You're not making direct database queries to RBAC tables
|
|
302
|
+
- [ ] All providers are properly set up
|
|
303
|
+
- [ ] No 400/406 errors in the console
|
|
304
|
+
- [ ] Permission checks return `true` for admin users
|
|
321
305
|
|
|
322
|
-
##
|
|
306
|
+
## 🆘 Still Having Issues?
|
|
323
307
|
|
|
324
|
-
|
|
325
|
-
|------------|-------------|----------|
|
|
326
|
-
| `RBAC_NOT_INITIALIZED` | RBAC system not set up | Call `setupRBAC(supabase)` |
|
|
327
|
-
| `MISSING_USER_CONTEXT` | No user ID available | Pass `userId` prop or set up auth context |
|
|
328
|
-
| `INVALID_SCOPE` | Invalid scope provided | Check scope object has required fields |
|
|
329
|
-
| `ORGANISATION_CONTEXT_REQUIRED` | Missing organisation context | Provide `organisationId` in scope |
|
|
330
|
-
| `PERMISSION_DENIED` | User doesn't have permission | Check user's roles and permissions |
|
|
308
|
+
If you're still having problems:
|
|
331
309
|
|
|
332
|
-
|
|
310
|
+
1. **Check the [Quick Start Guide](./quick-start.md)** - Follow it exactly
|
|
311
|
+
2. **Enable debug mode** and check console logs
|
|
312
|
+
3. **Verify your database setup** matches the examples exactly
|
|
313
|
+
4. **Test with a super admin user** to bypass permission checks
|
|
314
|
+
5. **Check the [API Reference](./api-reference.md)** for correct usage patterns
|
|
333
315
|
|
|
334
|
-
|
|
335
|
-
2. **Batch Permission Checks**: Use `useMultiplePermissions` for multiple checks
|
|
336
|
-
3. **Optimize Database**: Add proper indexes to your RBAC tables
|
|
337
|
-
4. **Use Development Mode**: Disable caching in development for easier debugging
|
|
338
|
-
5. **Monitor Performance**: Use debug mode to identify slow queries
|
|
316
|
+
Remember: The RBAC system is designed to be secure by default. If permissions are being denied, it's usually because the setup isn't quite right. Follow this guide step by step, and your RBAC system will work perfectly.
|
package/docs/security/README.md
CHANGED
|
@@ -12,6 +12,7 @@ PACE Core is designed with security as a first-class concern, providing:
|
|
|
12
12
|
- **Audit logging** for compliance and monitoring
|
|
13
13
|
- **Input validation** and sanitization
|
|
14
14
|
- **XSS protection** and secure coding practices
|
|
15
|
+
- **Auto-logout on inactivity** for enhanced security
|
|
15
16
|
|
|
16
17
|
## Authentication Security
|
|
17
18
|
|
|
@@ -51,6 +52,7 @@ Sessions are automatically managed by PACE Core:
|
|
|
51
52
|
- **Secure session storage** using HTTP-only cookies
|
|
52
53
|
- **Session validation** on every request
|
|
53
54
|
- **Automatic logout** on token expiration
|
|
55
|
+
- **Inactivity auto-logout** after 30 minutes of inactivity (configurable)
|
|
54
56
|
|
|
55
57
|
```tsx
|
|
56
58
|
import { useUnifiedAuth } from '@jmruthers/pace-core';
|
|
@@ -70,7 +72,54 @@ function ProtectedComponent() {
|
|
|
70
72
|
}
|
|
71
73
|
```
|
|
72
74
|
|
|
73
|
-
### 3.
|
|
75
|
+
### 3. Inactivity Auto-Logout
|
|
76
|
+
|
|
77
|
+
PACE Core includes built-in inactivity tracking for enhanced security:
|
|
78
|
+
|
|
79
|
+
- **Automatic logout** after 30 minutes of inactivity (configurable)
|
|
80
|
+
- **Warning modal** appears 60 seconds before logout
|
|
81
|
+
- **Cross-tab synchronization** - activity in any tab resets the timer
|
|
82
|
+
- **Persistence** - survives page reloads and browser restarts
|
|
83
|
+
- **Production-safe** - cannot be disabled in production builds
|
|
84
|
+
|
|
85
|
+
```tsx
|
|
86
|
+
import { UnifiedAuthProvider } from '@jmruthers/pace-core';
|
|
87
|
+
|
|
88
|
+
function App() {
|
|
89
|
+
return (
|
|
90
|
+
<UnifiedAuthProvider
|
|
91
|
+
supabaseClient={supabaseClient}
|
|
92
|
+
appName="my-app"
|
|
93
|
+
idleTimeoutMs={30 * 60 * 1000} // 30 minutes
|
|
94
|
+
warnBeforeMs={60 * 1000} // 60 seconds warning
|
|
95
|
+
onIdleLogout={() => {
|
|
96
|
+
// Handle redirect to login page
|
|
97
|
+
window.location.href = '/login';
|
|
98
|
+
}}
|
|
99
|
+
>
|
|
100
|
+
<YourApp />
|
|
101
|
+
</UnifiedAuthProvider>
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
#### Monitored Events
|
|
107
|
+
|
|
108
|
+
The inactivity tracker monitors:
|
|
109
|
+
- Mouse events (click, move, scroll, wheel)
|
|
110
|
+
- Touch events (start, move, end)
|
|
111
|
+
- Keyboard events (keydown, keyup, keypress)
|
|
112
|
+
- Focus events (focus, blur)
|
|
113
|
+
- Page visibility changes
|
|
114
|
+
|
|
115
|
+
#### Security Benefits
|
|
116
|
+
|
|
117
|
+
- **Prevents unauthorized access** if user leaves device unattended
|
|
118
|
+
- **Reduces session hijacking risk** by limiting session duration
|
|
119
|
+
- **Compliance support** for security requirements
|
|
120
|
+
- **Cross-tab protection** ensures consistent security across all tabs
|
|
121
|
+
|
|
122
|
+
### 4. Password Security
|
|
74
123
|
|
|
75
124
|
Password security is handled by Supabase:
|
|
76
125
|
|