@jmruthers/pace-core 0.2.4
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 +202 -0
- package/README.md +299 -0
- package/dist/DataTable-BHlzyKZP.d.ts +116 -0
- package/dist/DataTable-GEY5U7OI.js +100 -0
- package/dist/DataTable-GEY5U7OI.js.map +1 -0
- package/dist/PublicLoadingSpinner-DztrzuJr.d.ts +3430 -0
- package/dist/UnifiedAuthProvider-w66zSCUf.d.ts +160 -0
- package/dist/api-GZHIDA4X.js +41 -0
- package/dist/api-GZHIDA4X.js.map +1 -0
- package/dist/appConfig-BVGyuvI7.d.ts +71 -0
- package/dist/appNameResolver-7GHF5ED2.js +22 -0
- package/dist/appNameResolver-7GHF5ED2.js.map +1 -0
- package/dist/audit-BUW3LMJB.js +16 -0
- package/dist/audit-BUW3LMJB.js.map +1 -0
- package/dist/chunk-22KLBHPS.js +29 -0
- package/dist/chunk-22KLBHPS.js.map +1 -0
- package/dist/chunk-24MKLB7U.js +81 -0
- package/dist/chunk-24MKLB7U.js.map +1 -0
- package/dist/chunk-2MKP6IYD.js +388 -0
- package/dist/chunk-2MKP6IYD.js.map +1 -0
- package/dist/chunk-2V3Y6YBC.js +114 -0
- package/dist/chunk-2V3Y6YBC.js.map +1 -0
- package/dist/chunk-5CDJCTOO.js +190 -0
- package/dist/chunk-5CDJCTOO.js.map +1 -0
- package/dist/chunk-6ZQVSHKL.js +1345 -0
- package/dist/chunk-6ZQVSHKL.js.map +1 -0
- package/dist/chunk-74C6SNEC.js +77 -0
- package/dist/chunk-74C6SNEC.js.map +1 -0
- package/dist/chunk-7BNPOCLL.js +178 -0
- package/dist/chunk-7BNPOCLL.js.map +1 -0
- package/dist/chunk-7JL3T7BO.js +3344 -0
- package/dist/chunk-7JL3T7BO.js.map +1 -0
- package/dist/chunk-CDQ3PX7L.js +18 -0
- package/dist/chunk-CDQ3PX7L.js.map +1 -0
- package/dist/chunk-DY5E3AT7.js +1734 -0
- package/dist/chunk-DY5E3AT7.js.map +1 -0
- package/dist/chunk-ETEJVKYK.js +6032 -0
- package/dist/chunk-ETEJVKYK.js.map +1 -0
- package/dist/chunk-I5Z3QH5X.js +32 -0
- package/dist/chunk-I5Z3QH5X.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-OHXGNT3K.js +21 -0
- package/dist/chunk-OHXGNT3K.js.map +1 -0
- package/dist/chunk-OKXMUYIB.js +522 -0
- package/dist/chunk-OKXMUYIB.js.map +1 -0
- package/dist/chunk-PFRRIDYA.js +382 -0
- package/dist/chunk-PFRRIDYA.js.map +1 -0
- package/dist/chunk-PLDDJCW6.js +49 -0
- package/dist/chunk-PLDDJCW6.js.map +1 -0
- package/dist/chunk-SS3E6QLB.js +695 -0
- package/dist/chunk-SS3E6QLB.js.map +1 -0
- package/dist/chunk-TMRLB2LA.js +326 -0
- package/dist/chunk-TMRLB2LA.js.map +1 -0
- package/dist/chunk-WYB6MBZA.js +5533 -0
- package/dist/chunk-WYB6MBZA.js.map +1 -0
- package/dist/chunk-YDJW5XTN.js +84 -0
- package/dist/chunk-YDJW5XTN.js.map +1 -0
- package/dist/components.d.ts +1308 -0
- package/dist/components.js +3759 -0
- package/dist/components.js.map +1 -0
- package/dist/database-C3Szpi5J.d.ts +470 -0
- package/dist/hooks.d.ts +449 -0
- package/dist/hooks.js +612 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +385 -0
- package/dist/index.js +569 -0
- package/dist/index.js.map +1 -0
- package/dist/organisation-CO3Sh3_D.d.ts +99 -0
- package/dist/providers.d.ts +45 -0
- package/dist/providers.js +36 -0
- package/dist/providers.js.map +1 -0
- package/dist/rbac/eslint-rules.d.ts +52 -0
- package/dist/rbac/eslint-rules.js +252 -0
- package/dist/rbac/eslint-rules.js.map +1 -0
- package/dist/rbac/index.d.ts +1918 -0
- package/dist/rbac/index.js +2212 -0
- package/dist/rbac/index.js.map +1 -0
- package/dist/styles/core.css +401 -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-CInEi-ng.d.ts +316 -0
- package/dist/types.d.ts +196 -0
- package/dist/types.js +83 -0
- package/dist/types.js.map +1 -0
- package/dist/unified-CM7T0aTK.d.ts +198 -0
- package/dist/useComponentPerformance-DE9l5RkL.d.ts +11 -0
- package/dist/usePublicRouteParams-B6i0KtXW.d.ts +477 -0
- package/dist/utils.d.ts +639 -0
- package/dist/utils.js +1103 -0
- package/dist/utils.js.map +1 -0
- package/dist/validation-PM_iOaTI.d.ts +159 -0
- package/dist/validation.d.ts +138 -0
- package/dist/validation.js +477 -0
- package/dist/validation.js.map +1 -0
- package/docs/INDEX.md +192 -0
- package/docs/README.md +165 -0
- package/docs/api/.nojekyll +1 -0
- package/docs/api/README.md +301 -0
- package/docs/api/classes/ErrorBoundary.md +144 -0
- package/docs/api/classes/PublicErrorBoundary.md +132 -0
- package/docs/api/interfaces/AggregateConfig.md +43 -0
- package/docs/api/interfaces/ButtonProps.md +53 -0
- package/docs/api/interfaces/CardProps.md +40 -0
- package/docs/api/interfaces/ColorPalette.md +7 -0
- package/docs/api/interfaces/ColorShade.md +41 -0
- package/docs/api/interfaces/DataTableAction.md +200 -0
- package/docs/api/interfaces/DataTableColumn.md +300 -0
- package/docs/api/interfaces/DataTableProps.md +517 -0
- package/docs/api/interfaces/DataTableToolbarButton.md +96 -0
- package/docs/api/interfaces/EmptyStateConfig.md +61 -0
- package/docs/api/interfaces/EventContextType.md +96 -0
- package/docs/api/interfaces/EventLogoProps.md +152 -0
- package/docs/api/interfaces/EventProviderProps.md +19 -0
- package/docs/api/interfaces/FileSizeLimits.md +7 -0
- package/docs/api/interfaces/FileUploadProps.md +154 -0
- package/docs/api/interfaces/FooterProps.md +105 -0
- package/docs/api/interfaces/InactivityWarningModalProps.md +115 -0
- package/docs/api/interfaces/InputProps.md +53 -0
- package/docs/api/interfaces/LabelProps.md +107 -0
- package/docs/api/interfaces/LoginFormProps.md +184 -0
- package/docs/api/interfaces/NavigationItem.md +176 -0
- package/docs/api/interfaces/NavigationMenuProps.md +236 -0
- package/docs/api/interfaces/Organisation.md +140 -0
- package/docs/api/interfaces/OrganisationContextType.md +377 -0
- package/docs/api/interfaces/OrganisationMembership.md +140 -0
- package/docs/api/interfaces/OrganisationProviderProps.md +19 -0
- package/docs/api/interfaces/OrganisationSecurityError.md +62 -0
- package/docs/api/interfaces/PaceAppLayoutProps.md +393 -0
- package/docs/api/interfaces/PaceLoginPageProps.md +34 -0
- package/docs/api/interfaces/PaletteData.md +41 -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/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 +19 -0
- package/docs/api/interfaces/ToastActionElement.md +9 -0
- package/docs/api/interfaces/ToastProps.md +9 -0
- package/docs/api/interfaces/UnifiedAuthContextType.md +1108 -0
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +171 -0
- 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 +118 -0
- package/docs/api/interfaces/UserMenuProps.md +86 -0
- package/docs/api/interfaces/UserProfile.md +63 -0
- package/docs/api/modules.md +4153 -0
- package/docs/api-reference/components.md +1623 -0
- package/docs/api-reference/hooks.md +627 -0
- package/docs/api-reference/providers.md +487 -0
- package/docs/api-reference/types.md +1005 -0
- package/docs/api-reference/utilities.md +1104 -0
- package/docs/app.css.example +53 -0
- package/docs/architecture/README.md +577 -0
- package/docs/best-practices/README.md +400 -0
- package/docs/best-practices/deployment.md +1042 -0
- package/docs/best-practices/performance.md +789 -0
- package/docs/best-practices/security.md +881 -0
- package/docs/best-practices/testing.md +981 -0
- package/docs/consuming-app-example.md +290 -0
- package/docs/consuming-app-vite-config.md +233 -0
- package/docs/core-concepts/authentication.md +98 -0
- package/docs/core-concepts/events.md +756 -0
- package/docs/core-concepts/organisations.md +790 -0
- package/docs/core-concepts/permissions.md +729 -0
- package/docs/core-concepts/rbac-system.md +233 -0
- package/docs/database-schema-requirements.md +172 -0
- package/docs/documentation-style-checklist.md +294 -0
- package/docs/examples/navigation-menu-auth-fix.md +344 -0
- package/docs/getting-started/examples/README.md +106 -0
- package/docs/getting-started/examples/basic-auth-app.md +521 -0
- package/docs/getting-started/examples/full-featured-app.md +616 -0
- package/docs/getting-started/installation.md +269 -0
- package/docs/getting-started/quick-start.md +401 -0
- package/docs/implementation-guides/app-layout.md +983 -0
- package/docs/implementation-guides/data-tables.md +1898 -0
- package/docs/implementation-guides/dynamic-colors.md +195 -0
- package/docs/implementation-guides/forms.md +578 -0
- package/docs/implementation-guides/hierarchical-datatable.md +850 -0
- package/docs/implementation-guides/large-datasets.md +281 -0
- package/docs/implementation-guides/navigation.md +844 -0
- package/docs/implementation-guides/performance.md +403 -0
- package/docs/implementation-guides/permission-enforcement.md +764 -0
- package/docs/implementation-guides/public-pages.md +752 -0
- package/docs/migration/README.md +493 -0
- package/docs/migration/organisation-context-timing-fix.md +217 -0
- package/docs/migration/quick-migration-guide.md +320 -0
- package/docs/migration/rbac-migration.md +571 -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 +168 -0
- package/docs/performance/README.md +551 -0
- 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 +576 -0
- package/docs/rbac/README.md +265 -0
- package/docs/rbac/advanced-patterns.md +776 -0
- package/docs/rbac/api-reference.md +1033 -0
- package/docs/rbac/examples.md +883 -0
- package/docs/rbac/getting-started.md +679 -0
- package/docs/rbac/quick-start.md +619 -0
- package/docs/rbac/super-admin-guide.md +592 -0
- package/docs/rbac/troubleshooting.md +316 -0
- package/docs/security/README.md +680 -0
- package/docs/security/checklist.md +343 -0
- package/docs/style-guide.md +522 -0
- package/docs/styles/README.md +319 -0
- package/docs/testing/README.md +874 -0
- package/docs/troubleshooting/README.md +497 -0
- package/docs/troubleshooting/common-issues.md +1563 -0
- package/docs/troubleshooting/database-view-compatibility.md +119 -0
- package/docs/troubleshooting/debugging.md +1117 -0
- package/docs/troubleshooting/migration.md +918 -0
- package/docs/troubleshooting/organisation-context-setup.md +277 -0
- package/docs/troubleshooting/react-hooks-issue-analysis.md +166 -0
- package/docs/troubleshooting/styling-issues.md +219 -0
- package/docs/troubleshooting/tailwind-content-scanning.md +213 -0
- package/docs/usage.md +175 -0
- package/docs/visual-testing.md +114 -0
- package/package.json +211 -0
- package/src/__mocks__/lucide-react.ts +181 -0
- package/src/__tests__/README.md +404 -0
- package/src/__tests__/debug-provider.unit.test.tsx +67 -0
- package/src/__tests__/e2e/workflows.test.tsx +373 -0
- package/src/__tests__/hybridPermissions.unit.test.tsx +474 -0
- package/src/__tests__/index.integration.test.ts +491 -0
- package/src/__tests__/mocks/MockAuthProvider-standalone.tsx +47 -0
- package/src/__tests__/mocks/MockAuthProvider.tsx +63 -0
- package/src/__tests__/mocks/enhancedSupabaseMock.ts +252 -0
- package/src/__tests__/mocks/index.test.ts +23 -0
- package/src/__tests__/mocks/index.ts +16 -0
- package/src/__tests__/mocks/mockAuth.ts +155 -0
- package/src/__tests__/mocks/mockSupabase.ts +83 -0
- package/src/__tests__/mocks/mockSupabaseClient.ts +63 -0
- package/src/__tests__/mocks/providers.tsx +22 -0
- package/src/__tests__/patterns/__tests__/testPatterns.test.ts +394 -0
- package/src/__tests__/patterns/testPatterns.ts +124 -0
- package/src/__tests__/performance/componentPerformance.performance.test.ts +27 -0
- package/src/__tests__/performance/index.ts +24 -0
- package/src/__tests__/performance/performanceValidation.performance.test.ts +15 -0
- package/src/__tests__/security/security.unit.test.tsx +7 -0
- package/src/__tests__/security/securityValidation.security.test.tsx +153 -0
- package/src/__tests__/setup.ts +259 -0
- package/src/__tests__/setupTests.d.ts +1 -0
- package/src/__tests__/shared/componentTestUtils.tsx +475 -0
- package/src/__tests__/shared/errorHandlingTestUtils.ts +107 -0
- package/src/__tests__/shared/index.ts +81 -0
- package/src/__tests__/shared/integrationTestUtils.tsx +375 -0
- package/src/__tests__/shared/performanceTestUtils.tsx +476 -0
- package/src/__tests__/shared/testUtils.optimized.tsx +627 -0
- package/src/__tests__/simple.test.tsx +20 -0
- package/src/__tests__/templates/accessibility.test.template.tsx +279 -0
- package/src/__tests__/templates/component.test.template.tsx +122 -0
- package/src/__tests__/templates/integration.test.template.tsx +199 -0
- package/src/__tests__/test-utils/dataFactories.ts +60 -0
- package/src/__tests__/test-utils/index.ts +6 -0
- package/src/__tests__/typeSafety.unit.test.ts +65 -0
- package/src/__tests__/unifiedAuth.unit.test.tsx +151 -0
- package/src/__tests__/utils/accessibilityHelpers.ts +254 -0
- package/src/__tests__/utils/assertions.ts +50 -0
- package/src/__tests__/utils/deterministicHelpers.ts +31 -0
- package/src/__tests__/utils/edgeCaseConfig.test.ts +75 -0
- package/src/__tests__/utils/edgeCaseConfig.ts +98 -0
- package/src/__tests__/utils/mockHelpers.ts +149 -0
- package/src/__tests__/utils/mockLoader.ts +101 -0
- package/src/__tests__/utils/performanceHelpers.ts +55 -0
- package/src/__tests__/utils/performanceTestHelpers.ts +68 -0
- package/src/__tests__/utils/testDataFactories.ts +28 -0
- package/src/__tests__/utils/testIsolation.ts +67 -0
- package/src/__tests__/utils/visualTestHelpers.ts +20 -0
- package/src/__tests__/visual/__snapshots__/componentSnapshots.visual.test.tsx.snap +68 -0
- package/src/__tests__/visual/__snapshots__/componentVisuals.visual.test.tsx.snap +14 -0
- package/src/__tests__/visual/__snapshots__/visualRegression.test.tsx.snap +217 -0
- package/src/__tests__/visual/__snapshots__/visualRegression.visual.test.tsx.snap +24 -0
- package/src/__tests__/visual/componentSnapshots.visual.test.tsx +33 -0
- package/src/__tests__/visual/componentVisuals.visual.test.tsx +12 -0
- package/src/__tests__/visual/visualRegression.visual.test.tsx +20 -0
- package/src/components/Alert/Alert.tsx +134 -0
- package/src/components/Alert/__tests__/Alert.unit.test.tsx +381 -0
- package/src/components/Alert/index.ts +2 -0
- package/src/components/Avatar/Avatar.tsx +84 -0
- package/src/components/Avatar/__tests__/Avatar.unit.test.tsx +232 -0
- package/src/components/Avatar/index.ts +2 -0
- package/src/components/Button/Button.tsx +270 -0
- package/src/components/Button/__tests__/Button.accessibility.test.tsx +131 -0
- package/src/components/Button/__tests__/Button.comprehensive.test.tsx +721 -0
- package/src/components/Button/__tests__/Button.unit.test.tsx +189 -0
- package/src/components/Button/__tests__/EventSelector.integration.test.tsx +285 -0
- package/src/components/Button/index.ts +2 -0
- package/src/components/Card/Card.tsx +271 -0
- package/src/components/Card/__tests__/Card.accessibility.test.tsx +394 -0
- package/src/components/Card/__tests__/Card.comprehensive.test.tsx +599 -0
- package/src/components/Card/__tests__/Card.integration.test.tsx +673 -0
- package/src/components/Card/__tests__/Card.performance.test.tsx +546 -0
- package/src/components/Card/__tests__/Card.unit.test.tsx +330 -0
- package/src/components/Card/__tests__/Card.visual.test.tsx +599 -0
- package/src/components/Card/__tests__/README.md +211 -0
- package/src/components/Card/index.ts +1 -0
- package/src/components/Checkbox/Checkbox.tsx +75 -0
- package/src/components/Checkbox/__mocks__/Checkbox.tsx +2 -0
- package/src/components/Checkbox/__tests__/Checkbox.unit.test.tsx +520 -0
- package/src/components/Checkbox/index.ts +2 -0
- package/src/components/DataTable/DataTable.tsx +440 -0
- package/src/components/DataTable/__tests__/DataTable.autoSizing.test.tsx +526 -0
- package/src/components/DataTable/__tests__/DataTable.errorHandling.test.tsx +259 -0
- package/src/components/DataTable/__tests__/DataTable.hierarchical.test.tsx +675 -0
- package/src/components/DataTable/__tests__/DataTable.infinite-loop.test.tsx +324 -0
- package/src/components/DataTable/__tests__/DataTable.integration.test.tsx +724 -0
- package/src/components/DataTable/__tests__/DataTable.performance.test.tsx +597 -0
- package/src/components/DataTable/__tests__/DataTable.permissions.test.tsx +306 -0
- package/src/components/DataTable/__tests__/DataTable.regressionFixes.test.tsx +546 -0
- package/src/components/DataTable/__tests__/DataTable.selection.controlled.test.tsx +386 -0
- package/src/components/DataTable/__tests__/DataTable.selection.test.tsx +338 -0
- package/src/components/DataTable/__tests__/DataTable.userWorkflows.test.tsx +310 -0
- package/src/components/DataTable/__tests__/DataTable.workflowValidation.test.tsx +489 -0
- package/src/components/DataTable/__tests__/DataTable.workflows.test.tsx +701 -0
- package/src/components/DataTable/__tests__/README.md +136 -0
- package/src/components/DataTable/__tests__/mocks/MockRBACProvider.tsx +66 -0
- package/src/components/DataTable/__tests__/performance-regression.test.tsx +788 -0
- package/src/components/DataTable/__tests__/performance.test.tsx +365 -0
- package/src/components/DataTable/__tests__/test-utils/dataFactories.ts +103 -0
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +382 -0
- package/src/components/DataTable/__tests__/test-utils.ts +94 -0
- package/src/components/DataTable/components/ActionButtons.tsx +177 -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 +462 -0
- package/src/components/DataTable/components/DataTableCore.tsx +869 -0
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +214 -0
- package/src/components/DataTable/components/DataTableHeader.tsx +31 -0
- package/src/components/DataTable/components/DataTableModals.tsx +87 -0
- package/src/components/DataTable/components/DataTableToolbar.tsx +251 -0
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +148 -0
- package/src/components/DataTable/components/EditableRow.tsx +160 -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 +101 -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 +911 -0
- package/src/components/DataTable/components/ViewRowModal.tsx +68 -0
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +593 -0
- package/src/components/DataTable/components/__tests__/ActionButtons.unit.test.tsx +150 -0
- package/src/components/DataTable/components/__tests__/BulkOperationsDropdown.test.tsx +224 -0
- package/src/components/DataTable/components/__tests__/ColumnVisibilityDropdown.unit.test.tsx +244 -0
- package/src/components/DataTable/components/__tests__/DataTable.accessibility.test.tsx +523 -0
- package/src/components/DataTable/components/__tests__/DataTable.integration.test.tsx +401 -0
- package/src/components/DataTable/components/__tests__/DataTable.performance.test.tsx +161 -0
- package/src/components/DataTable/components/__tests__/DataTable.real.test.tsx +251 -0
- package/src/components/DataTable/components/__tests__/DataTable.security.test.tsx +172 -0
- package/src/components/DataTable/components/__tests__/DataTable.unit.test.tsx +290 -0
- package/src/components/DataTable/components/__tests__/DataTableBody.unit.test.tsx +147 -0
- package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.unit.test.tsx +182 -0
- package/src/components/DataTable/components/__tests__/DataTableHeader.unit.test.tsx +143 -0
- package/src/components/DataTable/components/__tests__/DataTableModals.unit.test.tsx +123 -0
- package/src/components/DataTable/components/__tests__/EditableRow.unit.test.tsx +660 -0
- package/src/components/DataTable/components/__tests__/EmptyState.unit.test.tsx +256 -0
- package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +498 -0
- package/src/components/DataTable/components/__tests__/FilterRow.unit.test.tsx +112 -0
- package/src/components/DataTable/components/__tests__/FilteringToggle.unit.test.tsx +130 -0
- package/src/components/DataTable/components/__tests__/GroupHeader.unit.test.tsx +172 -0
- package/src/components/DataTable/components/__tests__/GroupingDropdown.unit.test.tsx +222 -0
- package/src/components/DataTable/components/__tests__/ImportModal.unit.test.tsx +780 -0
- package/src/components/DataTable/components/__tests__/LoadingState.unit.test.tsx +65 -0
- package/src/components/DataTable/components/__tests__/PaginationControls.unit.test.tsx +634 -0
- package/src/components/DataTable/components/__tests__/StateComponents.unit.test.tsx +48 -0
- package/src/components/DataTable/components/__tests__/UnifiedTableBody.hierarchical.test.tsx +541 -0
- package/src/components/DataTable/components/__tests__/ViewRowModal.unit.test.tsx +228 -0
- package/src/components/DataTable/components/__tests__/VirtualizedDataTable.unit.test.tsx +568 -0
- package/src/components/DataTable/components/index.ts +17 -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 +182 -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/__tests__/ActionManager.unit.test.ts +405 -0
- package/src/components/DataTable/core/__tests__/ArchitectureIntegration.unit.test.tsx +445 -0
- package/src/components/DataTable/core/__tests__/ColumnFactory.unit.test.ts +288 -0
- package/src/components/DataTable/core/__tests__/ColumnManager.unit.test.ts +623 -0
- package/src/components/DataTable/core/__tests__/DataManager.unit.test.ts +431 -0
- package/src/components/DataTable/core/__tests__/DataTableContext.unit.test.tsx +433 -0
- package/src/components/DataTable/core/__tests__/LocalDataAdapter.unit.test.ts +422 -0
- package/src/components/DataTable/core/__tests__/PluginRegistry.unit.test.tsx +207 -0
- package/src/components/DataTable/core/__tests__/StateManager.unit.test.ts +278 -0
- package/src/components/DataTable/core/index.ts +8 -0
- package/src/components/DataTable/core/interfaces.ts +338 -0
- package/src/components/DataTable/examples/AutoSizingExample.tsx +180 -0
- package/src/components/DataTable/examples/ColumnSizingComparison.tsx +235 -0
- package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +418 -0
- package/src/components/DataTable/examples/HierarchicalExample.tsx +472 -0
- package/src/components/DataTable/examples/InitialPageSizeExample.tsx +173 -0
- package/src/components/DataTable/examples/PerformanceExample.tsx +502 -0
- package/src/components/DataTable/examples/__tests__/PerformanceExample.unit.test.tsx +281 -0
- package/src/components/DataTable/hooks/__tests__/useColumnOrderPersistence.unit.test.ts +407 -0
- package/src/components/DataTable/hooks/__tests__/useColumnReordering.unit.test.ts +679 -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 +70 -0
- package/src/components/DataTable/styles.ts +171 -0
- package/src/components/DataTable/types.ts +475 -0
- package/src/components/DataTable/utils/__tests__/columnSizing.test.ts +237 -0
- package/src/components/DataTable/utils/__tests__/debugTools.unit.test.ts +267 -0
- package/src/components/DataTable/utils/__tests__/errorHandling.unit.test.ts +467 -0
- package/src/components/DataTable/utils/__tests__/exportUtils.unit.test.ts +380 -0
- package/src/components/DataTable/utils/__tests__/flexibleImport.unit.test.ts +233 -0
- package/src/components/DataTable/utils/__tests__/performanceUtils.unit.test.ts +414 -0
- package/src/components/DataTable/utils/columnSizing.ts +125 -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.tsx +782 -0
- package/src/components/Dialog/README.md +804 -0
- package/src/components/Dialog/__tests__/Dialog.accessibility.test.tsx +521 -0
- package/src/components/Dialog/__tests__/Dialog.auto-size.example.tsx +157 -0
- package/src/components/Dialog/__tests__/Dialog.enhanced.test.tsx +538 -0
- package/src/components/Dialog/__tests__/Dialog.unit.test.tsx +1373 -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/examples/__tests__/SmartDialogExample.unit.test.tsx +151 -0
- package/src/components/Dialog/index.ts +12 -0
- package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +611 -0
- package/src/components/Dialog/utils/safeHtml.ts +185 -0
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +312 -0
- package/src/components/ErrorBoundary/__tests__/ErrorBoundary.accessibility.test.tsx +517 -0
- package/src/components/ErrorBoundary/__tests__/ErrorBoundary.integration.test.tsx +572 -0
- package/src/components/ErrorBoundary/__tests__/ErrorBoundary.unit.test.tsx +579 -0
- package/src/components/ErrorBoundary/index.ts +8 -0
- package/src/components/EventSelector/EventSelector.tsx +360 -0
- package/src/components/EventSelector/__tests__/EventSelector.test.tsx +528 -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.tsx +237 -0
- package/src/components/FileUpload/__tests__/FileUpload.integration.test.tsx +992 -0
- package/src/components/FileUpload/__tests__/FileUpload.real.test.tsx +927 -0
- package/src/components/FileUpload/__tests__/FileUpload.test.tsx +855 -0
- package/src/components/FileUpload/__tests__/FileUpload.unit.test.tsx +1311 -0
- package/src/components/FileUpload/__tests__/FileUpload.unmocked.test.tsx +937 -0
- package/src/components/FileUpload/index.ts +6 -0
- package/src/components/Footer/Footer.tsx +197 -0
- package/src/components/Footer/__tests__/Footer.accessibility.test.tsx +359 -0
- package/src/components/Footer/__tests__/Footer.integration.test.tsx +353 -0
- package/src/components/Footer/__tests__/Footer.performance.test.tsx +309 -0
- package/src/components/Footer/__tests__/Footer.unit.test.tsx +309 -0
- package/src/components/Footer/__tests__/Footer.visual.test.tsx +335 -0
- package/src/components/Footer/index.ts +17 -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/__tests__/Form.accessibility.test.tsx +820 -0
- package/src/components/Form/__tests__/Form.unit.test.tsx +305 -0
- package/src/components/Form/__tests__/FormErrorSummary.unit.test.tsx +285 -0
- package/src/components/Form/__tests__/FormFieldset.unit.test.tsx +241 -0
- package/src/components/Form/index.ts +26 -0
- package/src/components/Header/Header.tsx +301 -0
- package/src/components/Header/__tests__/Header.accessibility.test.tsx +382 -0
- package/src/components/Header/__tests__/Header.comprehensive.test.tsx +509 -0
- package/src/components/Header/__tests__/Header.unit.test.tsx +335 -0
- package/src/components/Header/index.ts +4 -0
- package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +196 -0
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +164 -0
- package/src/components/InactivityWarningModal/__tests__/InactivityWarningModal.unit.test.tsx +224 -0
- package/src/components/InactivityWarningModal/index.ts +9 -0
- package/src/components/Input/Input.tsx +201 -0
- package/src/components/Input/__mocks__/Input.tsx +2 -0
- package/src/components/Input/__tests__/Input.accessibility.test.tsx +632 -0
- package/src/components/Input/__tests__/Input.unit.test.tsx +1121 -0
- package/src/components/Input/index.ts +9 -0
- package/src/components/Label/Label.tsx +186 -0
- package/src/components/Label/__tests__/Label.accessibility.test.tsx +239 -0
- package/src/components/Label/__tests__/Label.unit.test.tsx +331 -0
- package/src/components/Label/index.ts +2 -0
- package/src/components/LoadingSpinner/LoadingSpinner.tsx +98 -0
- package/src/components/LoadingSpinner/__tests__/LoadingSpinner.accessibility.test.tsx +116 -0
- package/src/components/LoadingSpinner/__tests__/LoadingSpinner.unit.test.tsx +144 -0
- package/src/components/LoadingSpinner/index.ts +3 -0
- package/src/components/LoginForm/LoginForm.tsx +273 -0
- package/src/components/LoginForm/__tests__/LoginForm.accessibility.test.tsx +201 -0
- package/src/components/LoginForm/__tests__/LoginForm.unit.test.tsx +119 -0
- package/src/components/LoginForm/index.ts +3 -0
- package/src/components/NavigationMenu/NavigationMenu.tsx +698 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.accessibility.test.tsx +378 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.enhanced.test.tsx +768 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.integration.test.tsx +576 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.performance.test.tsx +585 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.real.component.test.tsx +783 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.security.enhanced.test.tsx +810 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.security.test.tsx +494 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.unit.test.tsx +331 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.userWorkflows.test.tsx +347 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.workflows.test.tsx +584 -0
- package/src/components/NavigationMenu/index.ts +10 -0
- package/src/components/NavigationMenu/types.ts +85 -0
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +304 -0
- package/src/components/OrganisationSelector/__tests__/OrganisationSelector.unit.test.tsx +664 -0
- package/src/components/OrganisationSelector/index.ts +9 -0
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +699 -0
- package/src/components/PaceAppLayout/README.md +278 -0
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +288 -0
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +889 -0
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +629 -0
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +782 -0
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +904 -0
- package/src/components/PaceAppLayout/index.ts +1 -0
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +221 -0
- package/src/components/PaceLoginPage/__tests__/PaceLoginPage.accessibility.test.tsx +463 -0
- package/src/components/PaceLoginPage/__tests__/PaceLoginPage.integration.test.tsx +586 -0
- package/src/components/PaceLoginPage/__tests__/PaceLoginPage.unit.test.tsx +533 -0
- package/src/components/PaceLoginPage/index.ts +1 -0
- package/src/components/PasswordReset/PasswordChangeForm.tsx +186 -0
- package/src/components/PasswordReset/PasswordResetForm.tsx +201 -0
- package/src/components/PasswordReset/__tests__/PasswordChangeForm.accessibility.test.tsx +408 -0
- package/src/components/PasswordReset/__tests__/PasswordChangeForm.unit.test.tsx +561 -0
- package/src/components/PasswordReset/__tests__/PasswordReset.integration.test.tsx +304 -0
- package/src/components/PasswordReset/__tests__/PasswordResetForm.accessibility.test.tsx +20 -0
- package/src/components/PasswordReset/__tests__/PasswordResetForm.unit.test.tsx +523 -0
- package/src/components/PasswordReset/__tests__/__mocks__/UnifiedAuthProvider.ts +29 -0
- package/src/components/PasswordReset/index.ts +4 -0
- package/src/components/Print/__tests__/Print.comprehensive.test.tsx +331 -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/__tests__/PrintButton.unit.test.tsx +429 -0
- package/src/components/PrintButton/__tests__/PrintButtonGroup.unit.test.tsx +277 -0
- package/src/components/PrintButton/__tests__/PrintToolbar.unit.test.tsx +264 -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/__tests__/PrintCard.unit.test.tsx +233 -0
- package/src/components/PrintCard/__tests__/PrintCardContent.test.tsx +284 -0
- package/src/components/PrintCard/__tests__/PrintCardGrid.unit.test.tsx +214 -0
- package/src/components/PrintCard/__tests__/PrintCardImage.unit.test.tsx +264 -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/__tests__/PrintDataTable.unit.test.tsx +361 -0
- package/src/components/PrintDataTable/__tests__/PrintTableGroup.unit.test.tsx +314 -0
- package/src/components/PrintDataTable/__tests__/PrintTableRow.unit.test.tsx +362 -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/__tests__/PrintFooter.unit.test.tsx +500 -0
- package/src/components/PrintFooter/__tests__/PrintFooterContent.unit.test.tsx +321 -0
- package/src/components/PrintFooter/__tests__/PrintFooterInfo.unit.test.tsx +335 -0
- package/src/components/PrintFooter/__tests__/PrintPageNumber.unit.test.tsx +340 -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/__tests__/PrintGrid.unit.test.tsx +340 -0
- package/src/components/PrintGrid/__tests__/PrintGridBreakpoint.unit.test.tsx +261 -0
- package/src/components/PrintGrid/__tests__/PrintGridContainer.unit.test.tsx +338 -0
- package/src/components/PrintGrid/__tests__/PrintGridItem.unit.test.tsx +338 -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/__tests__/PrintCoverHeader.unit.test.tsx +309 -0
- package/src/components/PrintHeader/__tests__/PrintHeader.unit.test.tsx +202 -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/__tests__/PrintLayout.unit.test.tsx +238 -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/__tests__/PrintPageBreak.unit.test.tsx +263 -0
- package/src/components/PrintPageBreak/__tests__/PrintPageBreakGroup.unit.test.tsx +239 -0
- package/src/components/PrintPageBreak/__tests__/PrintPageBreakIndicator.unit.test.tsx +235 -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/__tests__/PrintColumn.unit.test.tsx +385 -0
- package/src/components/PrintSection/__tests__/PrintDivider.unit.test.tsx +373 -0
- package/src/components/PrintSection/__tests__/PrintSection.unit.test.tsx +390 -0
- package/src/components/PrintSection/__tests__/PrintSectionContent.unit.test.tsx +321 -0
- package/src/components/PrintSection/__tests__/PrintSectionHeader.unit.test.tsx +334 -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/__tests__/PrintText.unit.test.tsx +351 -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/__tests__/Progress.accessibility.test.tsx +240 -0
- package/src/components/Progress/__tests__/Progress.unit.test.tsx +242 -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/__tests__/EventLogo.test.tsx +761 -0
- package/src/components/PublicLayout/__tests__/PublicErrorBoundary.simplified.test.tsx +228 -0
- package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +228 -0
- package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +459 -0
- package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +362 -0
- package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +522 -0
- package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +599 -0
- package/src/components/PublicLayout/__tests__/PublicPageProvider.test.tsx +513 -0
- package/src/components/PublicLayout/index.ts +51 -0
- package/src/components/RBAC/PagePermissionGuard.tsx +274 -0
- package/src/components/RBAC/RBACGuard.tsx +143 -0
- package/src/components/RBAC/RBACProvider.tsx +186 -0
- package/src/components/RBAC/RoleBasedContent.tsx +129 -0
- package/src/components/RBAC/__tests__/PagePermissionGuard.unit.test.tsx +674 -0
- package/src/components/RBAC/__tests__/RBAC.integration.test.tsx +573 -0
- package/src/components/RBAC/__tests__/RBACGuard.unit.test.tsx +467 -0
- package/src/components/RBAC/__tests__/RBACProvider.accessibility.test.tsx +475 -0
- package/src/components/RBAC/__tests__/RBACProvider.advanced.test.tsx +569 -0
- package/src/components/RBAC/__tests__/RBACProvider.integration.test.tsx +352 -0
- package/src/components/RBAC/__tests__/RBACProvider.unit.test.tsx +128 -0
- package/src/components/RBAC/__tests__/RoleBasedContent.unit.test.tsx +657 -0
- package/src/components/RBAC/index.ts +23 -0
- package/src/components/Select/Select.tsx +654 -0
- package/src/components/Select/__tests__/SearchableSelect.unit.test.tsx +437 -0
- package/src/components/Select/__tests__/Select.accessibility.test.tsx +1202 -0
- package/src/components/Select/__tests__/Select.actual.test.tsx +774 -0
- package/src/components/Select/__tests__/Select.comprehensive.test.tsx +837 -0
- package/src/components/Select/__tests__/Select.enhanced.test.tsx +1101 -0
- package/src/components/Select/__tests__/Select.integration.test.tsx +772 -0
- package/src/components/Select/__tests__/Select.performance.test.tsx +695 -0
- package/src/components/Select/__tests__/Select.real-world.test.tsx +1046 -0
- package/src/components/Select/__tests__/Select.search-algorithms.test.tsx +968 -0
- package/src/components/Select/__tests__/Select.unit.test.tsx +647 -0
- package/src/components/Select/__tests__/Select.utils.test.tsx +890 -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/__tests__/Table.accessibility.test.tsx +233 -0
- package/src/components/Table/__tests__/Table.unit.test.tsx +235 -0
- package/src/components/Table/index.ts +11 -0
- package/src/components/Toast/Toast.tsx +339 -0
- package/src/components/Toast/__tests__/Toast.accessibility.test.tsx +238 -0
- package/src/components/Toast/__tests__/Toast.integration.test.tsx +699 -0
- package/src/components/Toast/__tests__/Toast.unit.test.tsx +750 -0
- package/src/components/Toast/index.ts +14 -0
- package/src/components/Tooltip/Tooltip.tsx +167 -0
- package/src/components/Tooltip/__tests__/Tooltip.accessibility.test.tsx +121 -0
- package/src/components/Tooltip/__tests__/Tooltip.unit.test.tsx +185 -0
- package/src/components/Tooltip/index.ts +7 -0
- package/src/components/UserMenu/UserMenu.tsx +243 -0
- package/src/components/UserMenu/__tests__/UserMenu.accessibility.test.tsx +139 -0
- package/src/components/UserMenu/__tests__/UserMenu.integration.test.tsx +188 -0
- package/src/components/UserMenu/__tests__/UserMenu.unit.test.tsx +458 -0
- package/src/components/UserMenu/index.ts +3 -0
- package/src/components/__tests__/EdgeCaseTesting.enhanced.test.tsx +523 -0
- package/src/components/__tests__/ErrorTesting.enhanced.test.tsx +455 -0
- package/src/components/__tests__/SuperAdminGuard.test.tsx +456 -0
- package/src/components/__tests__/SuperAdminGuard.unit.test.tsx +456 -0
- package/src/components/examples/PermissionExample.tsx +150 -0
- package/src/components/examples/__tests__/PermissionExample.unit.test.tsx +360 -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/fonts/georama-italic.woff2 +0 -0
- package/src/fonts/georama.woff2 +0 -0
- package/src/fonts/open-sans-italic.woff2 +0 -0
- package/src/fonts/open-sans.woff2 +0 -0
- package/src/fonts/reddit-mono.woff2 +0 -0
- package/src/hooks/__tests__/hooks.integration.test.tsx +575 -0
- package/src/hooks/__tests__/useApiFetch.unit.test.ts +115 -0
- package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +133 -0
- package/src/hooks/__tests__/useDebounce.unit.test.ts +82 -0
- package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +293 -0
- package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +385 -0
- package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +286 -0
- package/src/hooks/__tests__/useOrganisationSecurity.unit.test.tsx +838 -0
- package/src/hooks/__tests__/usePermissionCache.unit.test.ts +627 -0
- package/src/hooks/__tests__/useRBAC.unit.test.ts +903 -0
- package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +537 -0
- package/src/hooks/__tests__/useToast.unit.test.tsx +62 -0
- package/src/hooks/__tests__/useZodForm.unit.test.tsx +37 -0
- package/src/hooks/index.ts +56 -0
- package/src/hooks/public/__tests__/usePublicEvent.test.tsx +397 -0
- package/src/hooks/public/__tests__/usePublicEventLogo.test.tsx +690 -0
- package/src/hooks/public/__tests__/usePublicRouteParams.test.tsx +449 -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/useDataTablePerformance.ts +387 -0
- package/src/hooks/useDataTableState.ts +110 -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.ts +208 -0
- package/src/hooks/useOrganisationSecurity.ts +262 -0
- package/src/hooks/usePerformanceMonitor.ts +128 -0
- package/src/hooks/usePermissionCache.ts +455 -0
- package/src/hooks/useRBAC.ts +262 -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 +200 -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/RBACProvider.tsx +622 -0
- package/src/providers/UnifiedAuthProvider.tsx +327 -0
- package/src/providers/__tests__/EventProvider.unit.test.tsx +768 -0
- package/src/providers/__tests__/OrganisationProvider.basic.test.tsx +116 -0
- package/src/providers/__tests__/OrganisationProvider.unit.test.tsx +1312 -0
- package/src/providers/__tests__/UnifiedAuthProvider.inactivity.test.tsx +601 -0
- package/src/providers/__tests__/UnifiedAuthProvider.unit.test.tsx +675 -0
- package/src/providers/__tests__/index.unit.test.ts +78 -0
- package/src/providers/index.ts +15 -0
- package/src/rbac/README.md +885 -0
- package/src/rbac/__tests__/PagePermissionGuard.test.tsx +673 -0
- package/src/rbac/__tests__/README.md +170 -0
- package/src/rbac/__tests__/RoleBasedRouter.test.tsx +709 -0
- package/src/rbac/__tests__/TestContext.tsx +72 -0
- package/src/rbac/__tests__/__mocks__/cache.ts +144 -0
- package/src/rbac/__tests__/__mocks__/supabase.ts +152 -0
- package/src/rbac/__tests__/adapters-hooks-comprehensive.test.tsx +782 -0
- package/src/rbac/__tests__/adapters-hooks.test.tsx +561 -0
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +963 -0
- package/src/rbac/__tests__/adapters.test.tsx +444 -0
- package/src/rbac/__tests__/api.test.ts +620 -0
- package/src/rbac/__tests__/audit-observability-comprehensive.test.ts +792 -0
- package/src/rbac/__tests__/audit-observability.test.ts +549 -0
- package/src/rbac/__tests__/audit.test.ts +616 -0
- package/src/rbac/__tests__/build-contract-compliance-simple.test.ts +230 -0
- package/src/rbac/__tests__/cache-invalidation-comprehensive.test.ts +889 -0
- package/src/rbac/__tests__/cache-invalidation.test.ts +457 -0
- package/src/rbac/__tests__/cache.test.ts +458 -0
- package/src/rbac/__tests__/components-navigation-guard.enhanced.test.tsx +859 -0
- package/src/rbac/__tests__/components-navigation-guard.test.tsx +895 -0
- package/src/rbac/__tests__/components-navigation-provider.test.tsx +692 -0
- package/src/rbac/__tests__/components-page-permission-guard.test.tsx +673 -0
- package/src/rbac/__tests__/components-page-permission-provider.test.tsx +614 -0
- package/src/rbac/__tests__/components-permission-enforcer.enhanced.fixed.test.tsx +836 -0
- package/src/rbac/__tests__/components-permission-enforcer.enhanced.test.tsx +837 -0
- package/src/rbac/__tests__/components-permission-enforcer.test.tsx +825 -0
- package/src/rbac/__tests__/components-role-based-router.test.tsx +709 -0
- package/src/rbac/__tests__/components-secure-data-provider.test.tsx +607 -0
- package/src/rbac/__tests__/config.test.ts +583 -0
- package/src/rbac/__tests__/core-logic-unit.test.ts +190 -0
- package/src/rbac/__tests__/core-permission-logic-comprehensive.test.ts +1467 -0
- package/src/rbac/__tests__/core-permission-logic-fixed.test.ts +151 -0
- package/src/rbac/__tests__/core-permission-logic-simple.test.ts +968 -0
- package/src/rbac/__tests__/core-permission-logic.test.ts +966 -0
- package/src/rbac/__tests__/edge-cases-comprehensive.test.ts +988 -0
- package/src/rbac/__tests__/edge-cases.test.ts +654 -0
- package/src/rbac/__tests__/engine.test.ts +361 -0
- package/src/rbac/__tests__/engine.unit.test.ts +361 -0
- package/src/rbac/__tests__/hooks.enhanced.test.tsx +979 -0
- package/src/rbac/__tests__/hooks.fixed.test.tsx +475 -0
- package/src/rbac/__tests__/hooks.test.tsx +385 -0
- package/src/rbac/__tests__/index.test.ts +269 -0
- package/src/rbac/__tests__/integration.enhanced.test.tsx +824 -0
- package/src/rbac/__tests__/page-permission-guard-super-admin.test.tsx +261 -0
- package/src/rbac/__tests__/performance.enhanced.test.tsx +724 -0
- package/src/rbac/__tests__/permissions.test.ts +383 -0
- package/src/rbac/__tests__/requires-event.test.ts +330 -0
- package/src/rbac/__tests__/scope-isolation-comprehensive.test.ts +1349 -0
- package/src/rbac/__tests__/scope-isolation.test.ts +755 -0
- package/src/rbac/__tests__/secure-client-rls-comprehensive.test.ts +592 -0
- package/src/rbac/__tests__/secure-client-rls.test.ts +377 -0
- package/src/rbac/__tests__/security.test.ts +296 -0
- package/src/rbac/__tests__/setup.ts +228 -0
- package/src/rbac/__tests__/test-utils-enhanced.tsx +400 -0
- package/src/rbac/__tests__/types.test.ts +685 -0
- package/src/rbac/adapters.tsx +726 -0
- package/src/rbac/api.ts +337 -0
- package/src/rbac/audit-enhanced.ts +339 -0
- package/src/rbac/audit.ts +338 -0
- package/src/rbac/cache.ts +213 -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/__tests__/EnhancedNavigationMenu.test.tsx +631 -0
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +667 -0
- package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +647 -0
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +496 -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.ts +555 -0
- package/src/rbac/index.ts +114 -0
- package/src/rbac/permissions.ts +293 -0
- package/src/rbac/secureClient.ts +244 -0
- package/src/rbac/security.ts +346 -0
- package/src/rbac/testing/__tests__/index.test.tsx +342 -0
- package/src/rbac/testing/index.tsx +340 -0
- package/src/rbac/types.ts +341 -0
- package/src/rbac/utils/__tests__/eventContext.test.ts +428 -0
- package/src/rbac/utils/__tests__/eventContext.unit.test.ts +428 -0
- package/src/rbac/utils/eventContext.ts +83 -0
- package/src/styles/__tests__/styles.unit.test.ts +164 -0
- package/src/styles/core.css +401 -0
- package/src/styles/index.ts +51 -0
- package/src/test-dom-cleanup.test.tsx +38 -0
- package/src/theming/__tests__/README.md +335 -0
- package/src/theming/__tests__/runtime.accessibility.test.ts +474 -0
- package/src/theming/__tests__/runtime.error.test.ts +616 -0
- package/src/theming/__tests__/runtime.integration.test.ts +376 -0
- package/src/theming/__tests__/runtime.performance.test.ts +411 -0
- package/src/theming/__tests__/runtime.unit.test.ts +470 -0
- package/src/theming/runtime.ts +187 -0
- package/src/types/__tests__/database.unit.test.ts +489 -0
- package/src/types/__tests__/guards.unit.test.ts +146 -0
- package/src/types/__tests__/index.unit.test.ts +77 -0
- package/src/types/__tests__/organisation.unit.test.ts +713 -0
- package/src/types/__tests__/rbac.unit.test.ts +621 -0
- package/src/types/__tests__/security.unit.test.ts +347 -0
- package/src/types/__tests__/supabase.unit.test.ts +658 -0
- package/src/types/__tests__/theme.unit.test.ts +218 -0
- package/src/types/__tests__/unified.unit.test.ts +537 -0
- package/src/types/__tests__/validation.unit.test.ts +616 -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/__tests__/appConfig.unit.test.ts +55 -0
- package/src/utils/__tests__/appNameResolver.unit.test.ts +137 -0
- package/src/utils/__tests__/audit.unit.test.ts +69 -0
- package/src/utils/__tests__/auth-utils.unit.test.ts +70 -0
- package/src/utils/__tests__/bundleAnalysis.unit.test.ts +317 -0
- package/src/utils/__tests__/cn.unit.test.ts +34 -0
- package/src/utils/__tests__/deviceFingerprint.unit.test.ts +480 -0
- package/src/utils/__tests__/dynamicUtils.unit.test.ts +322 -0
- package/src/utils/__tests__/formatDate.unit.test.ts +109 -0
- package/src/utils/__tests__/formatting.unit.test.ts +66 -0
- package/src/utils/__tests__/index.unit.test.ts +251 -0
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +309 -0
- package/src/utils/__tests__/organisationContext.unit.test.ts +192 -0
- package/src/utils/__tests__/performanceBudgets.unit.test.ts +259 -0
- package/src/utils/__tests__/permissionTypes.unit.test.ts +250 -0
- package/src/utils/__tests__/permissionUtils.unit.test.ts +362 -0
- package/src/utils/__tests__/sanitization.unit.test.ts +346 -0
- package/src/utils/__tests__/schemaUtils.unit.test.ts +441 -0
- package/src/utils/__tests__/secureDataAccess.unit.test.ts +334 -0
- package/src/utils/__tests__/secureErrors.unit.test.ts +377 -0
- package/src/utils/__tests__/secureStorage.unit.test.ts +293 -0
- package/src/utils/__tests__/security.unit.test.ts +127 -0
- package/src/utils/__tests__/securityMonitor.unit.test.ts +280 -0
- package/src/utils/__tests__/sessionTracking.unit.test.ts +370 -0
- package/src/utils/__tests__/validation.unit.test.ts +84 -0
- package/src/utils/__tests__/validationUtils.unit.test.ts +571 -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/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/__tests__/PrintDataProcessor.unit.test.ts +219 -0
- package/src/utils/print/__tests__/usePrintOptimization.unit.test.tsx +353 -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/__tests__/config.unit.test.ts +206 -0
- package/src/utils/storage/__tests__/helpers.unit.test.ts +646 -0
- package/src/utils/storage/__tests__/index.unit.test.ts +167 -0
- package/src/utils/storage/__tests__/types.unit.test.ts +441 -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/__tests__/common.unit.test.ts +101 -0
- package/src/validation/__tests__/csrf.unit.test.ts +302 -0
- package/src/validation/__tests__/passwordSchema.unit.test.ts +98 -0
- package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +466 -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
|
@@ -0,0 +1,1563 @@
|
|
|
1
|
+
# Common Issues
|
|
2
|
+
|
|
3
|
+
This guide provides solutions to the most common issues you may encounter when using `@jmruthers/pace-core`.
|
|
4
|
+
|
|
5
|
+
## Navigation Issues
|
|
6
|
+
|
|
7
|
+
### NavigationMenu Not Receiving Authentication Context
|
|
8
|
+
|
|
9
|
+
**Problem**: `NavigationMenu` shows `permissions: undefined`, `roles: undefined`, `accessLevel: undefined` in console logs.
|
|
10
|
+
|
|
11
|
+
**Root Cause**: The `NavigationMenu` component is not properly connected to the authentication context.
|
|
12
|
+
|
|
13
|
+
**Solution**: Ensure `NavigationMenu` is used within the proper provider hierarchy and enable permission filtering:
|
|
14
|
+
|
|
15
|
+
```tsx
|
|
16
|
+
// ❌ WRONG - NavigationMenu without proper context
|
|
17
|
+
<NavigationMenu
|
|
18
|
+
items={navItems}
|
|
19
|
+
currentPath={location.pathname}
|
|
20
|
+
onNavigate={handleNavigate}
|
|
21
|
+
/>
|
|
22
|
+
|
|
23
|
+
// ✅ CORRECT - NavigationMenu with authentication context
|
|
24
|
+
<UnifiedAuthProvider supabaseClient={supabase} appName="My App">
|
|
25
|
+
<OrganisationProvider>
|
|
26
|
+
<EventProvider>
|
|
27
|
+
<PaceAppLayout
|
|
28
|
+
appName="My App"
|
|
29
|
+
navItems={navItems}
|
|
30
|
+
showEventSelector={true}
|
|
31
|
+
>
|
|
32
|
+
<Routes>
|
|
33
|
+
{/* Your routes */}
|
|
34
|
+
</Routes>
|
|
35
|
+
</PaceAppLayout>
|
|
36
|
+
</EventProvider>
|
|
37
|
+
</OrganisationProvider>
|
|
38
|
+
</UnifiedAuthProvider>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Alternative Solution**: Use `NavigationMenu` directly with permission filtering:
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
import { NavigationMenu } from '@jmruthers/pace-core';
|
|
45
|
+
import { useUnifiedAuth } from '@jmruthers/pace-core/providers';
|
|
46
|
+
|
|
47
|
+
function AuthenticatedNavigation() {
|
|
48
|
+
const { hasPermission, hasRole } = useUnifiedAuth();
|
|
49
|
+
|
|
50
|
+
const navItems = [
|
|
51
|
+
{
|
|
52
|
+
id: 'dashboard',
|
|
53
|
+
label: 'Dashboard',
|
|
54
|
+
href: '/dashboard',
|
|
55
|
+
permissions: ['dashboard:read']
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
id: 'admin',
|
|
59
|
+
label: 'Admin Panel',
|
|
60
|
+
href: '/admin',
|
|
61
|
+
roles: ['admin']
|
|
62
|
+
}
|
|
63
|
+
];
|
|
64
|
+
|
|
65
|
+
return (
|
|
66
|
+
<NavigationMenu
|
|
67
|
+
items={navItems}
|
|
68
|
+
currentPath={location.pathname}
|
|
69
|
+
onNavigate={handleNavigate}
|
|
70
|
+
filterByPermissions={true}
|
|
71
|
+
auditLog={true}
|
|
72
|
+
/>
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### NavigationMenu Items Not Filtering by Permissions
|
|
78
|
+
|
|
79
|
+
**Problem**: All navigation items are shown regardless of user permissions.
|
|
80
|
+
|
|
81
|
+
**Solution**: Enable permission filtering and add permission requirements to navigation items:
|
|
82
|
+
|
|
83
|
+
```tsx
|
|
84
|
+
// Add permissions to navigation items
|
|
85
|
+
const navItems = [
|
|
86
|
+
{
|
|
87
|
+
id: 'dashboard',
|
|
88
|
+
label: 'Dashboard',
|
|
89
|
+
href: '/dashboard',
|
|
90
|
+
permissions: ['dashboard:read'] // Required permission
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
id: 'admin',
|
|
94
|
+
label: 'Admin Panel',
|
|
95
|
+
href: '/admin',
|
|
96
|
+
roles: ['admin', 'super_admin'] // Required roles
|
|
97
|
+
}
|
|
98
|
+
];
|
|
99
|
+
|
|
100
|
+
// Enable filtering
|
|
101
|
+
<NavigationMenu
|
|
102
|
+
items={navItems}
|
|
103
|
+
filterByPermissions={true}
|
|
104
|
+
auditLog={true}
|
|
105
|
+
/>
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### NavigationMenu Console Errors
|
|
109
|
+
|
|
110
|
+
**Problem**: Console shows "useUnifiedAuth not available" warnings.
|
|
111
|
+
|
|
112
|
+
**Solution**: Ensure `NavigationMenu` is used within `UnifiedAuthProvider`:
|
|
113
|
+
|
|
114
|
+
```tsx
|
|
115
|
+
// ❌ WRONG - Outside of auth provider
|
|
116
|
+
<NavigationMenu items={navItems} />
|
|
117
|
+
|
|
118
|
+
// ✅ CORRECT - Inside auth provider
|
|
119
|
+
<UnifiedAuthProvider supabaseClient={supabase} appName="My App">
|
|
120
|
+
<NavigationMenu items={navItems} />
|
|
121
|
+
</UnifiedAuthProvider>
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Authentication Issues
|
|
125
|
+
|
|
126
|
+
### 1. "User not authenticated" Error
|
|
127
|
+
|
|
128
|
+
**Problem**: Users are getting "not authenticated" errors even when they should be logged in.
|
|
129
|
+
|
|
130
|
+
**Solution**:
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
import { useUnifiedAuth } from '@jmruthers/pace-core';
|
|
134
|
+
|
|
135
|
+
function App() {
|
|
136
|
+
const { user, loading, error } = useUnifiedAuth();
|
|
137
|
+
|
|
138
|
+
if (loading) {
|
|
139
|
+
return <div>Loading...</div>;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (error) {
|
|
143
|
+
console.error('Auth error:', error);
|
|
144
|
+
return <div>Authentication error: {error.message}</div>;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (!user) {
|
|
148
|
+
return <LoginForm />;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return <AuthenticatedApp />;
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
**Common Causes**:
|
|
156
|
+
- Session expired
|
|
157
|
+
- Invalid token
|
|
158
|
+
- Network connectivity issues
|
|
159
|
+
- Supabase configuration problems
|
|
160
|
+
|
|
161
|
+
**Debugging**:
|
|
162
|
+
```typescript
|
|
163
|
+
// Check session status
|
|
164
|
+
const { session } = useUnifiedAuth();
|
|
165
|
+
console.log('Session:', session);
|
|
166
|
+
console.log('Session expires:', new Date(session?.expires_at * 1000));
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### 2. Authentication Provider Not Wrapped
|
|
170
|
+
|
|
171
|
+
**Problem**: Components can't access authentication context.
|
|
172
|
+
|
|
173
|
+
**Solution**: Ensure your app is wrapped with the authentication provider:
|
|
174
|
+
|
|
175
|
+
```typescript
|
|
176
|
+
import { UnifiedAuthProvider } from '@jmruthers/pace-core';
|
|
177
|
+
|
|
178
|
+
function App() {
|
|
179
|
+
return (
|
|
180
|
+
<UnifiedAuthProvider>
|
|
181
|
+
<YourApp />
|
|
182
|
+
</UnifiedAuthProvider>
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### 3. Session Refresh Issues
|
|
188
|
+
|
|
189
|
+
**Problem**: Sessions are not refreshing automatically.
|
|
190
|
+
|
|
191
|
+
**Solution**:
|
|
192
|
+
|
|
193
|
+
```typescript
|
|
194
|
+
import { useUnifiedAuth } from '@jmruthers/pace-core';
|
|
195
|
+
|
|
196
|
+
function SessionManager() {
|
|
197
|
+
const { session, refreshSession } = useUnifiedAuth();
|
|
198
|
+
|
|
199
|
+
useEffect(() => {
|
|
200
|
+
if (session && session.expires_at) {
|
|
201
|
+
const timeUntilExpiry = session.expires_at * 1000 - Date.now();
|
|
202
|
+
const refreshTime = Math.max(timeUntilExpiry - 5 * 60 * 1000, 0);
|
|
203
|
+
|
|
204
|
+
const timer = setTimeout(() => {
|
|
205
|
+
refreshSession();
|
|
206
|
+
}, refreshTime);
|
|
207
|
+
|
|
208
|
+
return () => clearTimeout(timer);
|
|
209
|
+
}
|
|
210
|
+
}, [session, refreshSession]);
|
|
211
|
+
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## Permission Issues
|
|
217
|
+
|
|
218
|
+
### 1. "Access denied" Errors
|
|
219
|
+
|
|
220
|
+
**Problem**: Users are getting access denied even when they should have permissions.
|
|
221
|
+
|
|
222
|
+
**Solution**:
|
|
223
|
+
|
|
224
|
+
```typescript
|
|
225
|
+
import { useRBAC } from '@jmruthers/pace-core';
|
|
226
|
+
|
|
227
|
+
function DebugPermissions() {
|
|
228
|
+
const { user, roles, permissions, hasPermission } = useRBAC();
|
|
229
|
+
|
|
230
|
+
console.log('User:', user);
|
|
231
|
+
console.log('Roles:', roles);
|
|
232
|
+
console.log('Permissions:', permissions);
|
|
233
|
+
|
|
234
|
+
// Test specific permissions
|
|
235
|
+
console.log('Can read users:', hasPermission('read:users'));
|
|
236
|
+
console.log('Can create events:', hasPermission('create:events'));
|
|
237
|
+
|
|
238
|
+
return (
|
|
239
|
+
<div>
|
|
240
|
+
<h3>Permission Debug Info</h3>
|
|
241
|
+
<p>User: {user?.email}</p>
|
|
242
|
+
<p>Roles: {roles.map(r => r.name).join(', ')}</p>
|
|
243
|
+
<p>Permissions: {permissions.map(p => p.name).join(', ')}</p>
|
|
244
|
+
</div>
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### 2. Page Permission Not Working
|
|
250
|
+
|
|
251
|
+
**Problem**: Page-level permissions are not being enforced.
|
|
252
|
+
|
|
253
|
+
**Solution**:
|
|
254
|
+
|
|
255
|
+
```typescript
|
|
256
|
+
import { usePagePermission } from '@jmruthers/pace-core';
|
|
257
|
+
|
|
258
|
+
function ProtectedPage() {
|
|
259
|
+
const { hasAccess, loading, error } = usePagePermission('admin');
|
|
260
|
+
|
|
261
|
+
if (loading) {
|
|
262
|
+
return <div>Checking permissions...</div>;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
if (error) {
|
|
266
|
+
console.error('Permission error:', error);
|
|
267
|
+
return <div>Error checking permissions</div>;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
if (!hasAccess) {
|
|
271
|
+
return <div>Access denied</div>;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
return <AdminDashboard />;
|
|
275
|
+
}
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### 3. Organisation Context Missing
|
|
279
|
+
|
|
280
|
+
**Problem**: Organisation-based permissions are not working.
|
|
281
|
+
|
|
282
|
+
**Solution**:
|
|
283
|
+
|
|
284
|
+
```typescript
|
|
285
|
+
import { useOrganisation } from '@jmruthers/pace-core';
|
|
286
|
+
|
|
287
|
+
function OrganisationAwareComponent() {
|
|
288
|
+
const { currentOrganisation, loading, error } = useOrganisation();
|
|
289
|
+
|
|
290
|
+
if (loading) {
|
|
291
|
+
return <div>Loading organisation...</div>;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
if (error) {
|
|
295
|
+
console.error('Organisation error:', error);
|
|
296
|
+
return <div>Error loading organisation</div>;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
if (!currentOrganisation) {
|
|
300
|
+
return <div>Please select an organisation</div>;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
return (
|
|
304
|
+
<div>
|
|
305
|
+
<h1>{currentOrganisation.name}</h1>
|
|
306
|
+
{/* Your component content */}
|
|
307
|
+
</div>
|
|
308
|
+
);
|
|
309
|
+
}
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### 4. Organisation Context Timing Issue (v0.3.44+ Fixed)
|
|
313
|
+
|
|
314
|
+
**Problem**: RLS policies failing on first load, super admin permissions returning false, or database queries not filtering by organisation.
|
|
315
|
+
|
|
316
|
+
**Root Cause**: Race condition where database organisation context wasn't set before other components tried to make queries.
|
|
317
|
+
|
|
318
|
+
**Solution**: This issue was fixed in v0.3.44+. The `OrganisationProvider` now:
|
|
319
|
+
|
|
320
|
+
1. **Sets database context before rendering children**
|
|
321
|
+
2. **Shows loading states during context setup**
|
|
322
|
+
3. **Prevents race conditions with database queries**
|
|
323
|
+
|
|
324
|
+
If you're still experiencing this issue:
|
|
325
|
+
|
|
326
|
+
```typescript
|
|
327
|
+
// ✅ Ensure proper provider hierarchy
|
|
328
|
+
<UnifiedAuthProvider supabaseClient={supabase} appName="my-app">
|
|
329
|
+
<OrganisationProvider> {/* This now handles context timing automatically */}
|
|
330
|
+
<EventProvider>
|
|
331
|
+
<YourAppContent />
|
|
332
|
+
</EventProvider>
|
|
333
|
+
</OrganisationProvider>
|
|
334
|
+
</UnifiedAuthProvider>
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
**For v0.3.43 and earlier**: You may need to implement a local workaround:
|
|
338
|
+
|
|
339
|
+
```typescript
|
|
340
|
+
// Temporary workaround for older versions
|
|
341
|
+
function OrganisationContextGuard({ children }: { children: React.ReactNode }) {
|
|
342
|
+
const { selectedOrganisation } = useOrganisation();
|
|
343
|
+
const { supabase } = useUnifiedAuth();
|
|
344
|
+
const [contextReady, setContextReady] = useState(false);
|
|
345
|
+
|
|
346
|
+
useEffect(() => {
|
|
347
|
+
if (selectedOrganisation && supabase) {
|
|
348
|
+
setOrganisationContext(supabase, selectedOrganisation.id)
|
|
349
|
+
.then(() => setContextReady(true))
|
|
350
|
+
.catch(console.error);
|
|
351
|
+
}
|
|
352
|
+
}, [selectedOrganisation, supabase]);
|
|
353
|
+
|
|
354
|
+
if (!contextReady) {
|
|
355
|
+
return <div>Setting up organisation context...</div>;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
return <>{children}</>;
|
|
359
|
+
}
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
**Detailed Setup**: If you're getting "unrecognized configuration parameter" errors, see the [Organisation Context Setup Guide](./organisation-context-setup.md) for complete database setup instructions.
|
|
363
|
+
|
|
364
|
+
## Styling Issues
|
|
365
|
+
|
|
366
|
+
### 1. App Looks Unstyled (Raw HTML)
|
|
367
|
+
|
|
368
|
+
**Problem**: App appears with default browser styling only - no colors, fonts, or proper layout.
|
|
369
|
+
|
|
370
|
+
**Symptoms**:
|
|
371
|
+
- Default browser styling only
|
|
372
|
+
- No colors, fonts, or layout
|
|
373
|
+
- Components look like plain HTML
|
|
374
|
+
- Header is squashed or too wide
|
|
375
|
+
- Main container stretches full width
|
|
376
|
+
- Missing colored background
|
|
377
|
+
|
|
378
|
+
**Solution**:
|
|
379
|
+
|
|
380
|
+
**CRITICAL**: Use the `PaceAppLayout` component - don't just import CSS files:
|
|
381
|
+
|
|
382
|
+
```tsx
|
|
383
|
+
// ❌ Wrong - just CSS imports
|
|
384
|
+
import '@jmruthers/pace-core/styles/core.css';
|
|
385
|
+
|
|
386
|
+
function App() {
|
|
387
|
+
return (
|
|
388
|
+
<div>
|
|
389
|
+
<h1>My App</h1>
|
|
390
|
+
{/* This won't be styled properly */}
|
|
391
|
+
</div>
|
|
392
|
+
);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// ✅ Correct - use PaceAppLayout
|
|
396
|
+
import { PaceAppLayout } from '@jmruthers/pace-core';
|
|
397
|
+
import './app.css'; // Your app's color palette (must come first)
|
|
398
|
+
import '@jmruthers/pace-core/styles/core.css';
|
|
399
|
+
|
|
400
|
+
function App() {
|
|
401
|
+
return (
|
|
402
|
+
<PaceAppLayout appName="My Application">
|
|
403
|
+
<div className="container mx-auto px-4 py-6">
|
|
404
|
+
<h1 className="text-3xl font-bold text-main-900">My App</h1>
|
|
405
|
+
<p className="text-main-700">This will be properly styled</p>
|
|
406
|
+
</div>
|
|
407
|
+
</PaceAppLayout>
|
|
408
|
+
);
|
|
409
|
+
}
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
**Common Causes**:
|
|
413
|
+
- Missing CSS imports
|
|
414
|
+
- Wrong build tool configuration (using Tailwind v3 instead of v4)
|
|
415
|
+
- Not using PaceAppLayout component
|
|
416
|
+
- Missing app.css with color palette
|
|
417
|
+
- CSS files not being processed
|
|
418
|
+
|
|
419
|
+
**Build Tool Configuration**:
|
|
420
|
+
|
|
421
|
+
**For Vite (Recommended):**
|
|
422
|
+
```js
|
|
423
|
+
// vite.config.js
|
|
424
|
+
import { defineConfig } from 'vite'
|
|
425
|
+
import react from '@vitejs/plugin-react'
|
|
426
|
+
import tailwindcss from '@tailwindcss/vite'
|
|
427
|
+
|
|
428
|
+
export default defineConfig({
|
|
429
|
+
plugins: [
|
|
430
|
+
react(),
|
|
431
|
+
tailwindcss() // Tailwind v4 - no config file needed!
|
|
432
|
+
],
|
|
433
|
+
})
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
**Dependencies:**
|
|
437
|
+
```bash
|
|
438
|
+
npm install -D @tailwindcss/vite tailwindcss@^4.0.0
|
|
439
|
+
# Remove old Tailwind v3 if installed
|
|
440
|
+
npm uninstall tailwindcss@^3.0.0
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
**Create app.css with Color Palette:**
|
|
444
|
+
```css
|
|
445
|
+
/* app.css - Your app's color palette */
|
|
446
|
+
@theme static {
|
|
447
|
+
/* MAIN palette - your primary brand color */
|
|
448
|
+
--color-main-raw: oklch(0.7 0.057 252.02);
|
|
449
|
+
--color-main-50: oklch(0.98 0.001 252.02);
|
|
450
|
+
--color-main-100: oklch(0.96 0.005 252.02);
|
|
451
|
+
--color-main-200: oklch(0.927 0.012 252.02);
|
|
452
|
+
--color-main-300: oklch(0.881 0.021 252.02);
|
|
453
|
+
--color-main-400: oklch(0.822 0.032 252.02);
|
|
454
|
+
--color-main-500: oklch(0.75 0.047 252.02);
|
|
455
|
+
--color-main-600: oklch(0.7 0.057 252.02);
|
|
456
|
+
--color-main-700: oklch(0.567 0.044 252.02);
|
|
457
|
+
--color-main-800: oklch(0.456 0.034 252.02);
|
|
458
|
+
--color-main-900: oklch(0.332 0.024 252.02);
|
|
459
|
+
--color-main-950: oklch(0.195 0.014 252.02);
|
|
460
|
+
|
|
461
|
+
/* SEC palette - your secondary brand color */
|
|
462
|
+
--color-sec-raw: oklch(0.58 0.23 280.75);
|
|
463
|
+
--color-sec-50: oklch(0.98 0.003 280.75);
|
|
464
|
+
--color-sec-100: oklch(0.96 0.014 280.75);
|
|
465
|
+
--color-sec-200: oklch(0.927 0.033 280.75);
|
|
466
|
+
--color-sec-300: oklch(0.881 0.059 280.75);
|
|
467
|
+
--color-sec-400: oklch(0.822 0.093 280.75);
|
|
468
|
+
--color-sec-500: oklch(0.75 0.133 280.75);
|
|
469
|
+
--color-sec-600: oklch(0.665 0.182 280.75);
|
|
470
|
+
--color-sec-700: oklch(0.58 0.23 280.75);
|
|
471
|
+
--color-sec-800: oklch(0.456 0.158 280.75);
|
|
472
|
+
--color-sec-900: oklch(0.332 0.099 280.75);
|
|
473
|
+
--color-sec-950: oklch(0.195 0.047 280.75);
|
|
474
|
+
|
|
475
|
+
/* ACC palette - your accent brand color */
|
|
476
|
+
--color-acc-raw: oklch(0.64 0.21 37.76);
|
|
477
|
+
--color-acc-50: oklch(0.98 0.003 37.76);
|
|
478
|
+
--color-acc-100: oklch(0.96 0.015 37.76);
|
|
479
|
+
--color-acc-200: oklch(0.927 0.035 37.76);
|
|
480
|
+
--color-acc-300: oklch(0.881 0.063 37.76);
|
|
481
|
+
--color-acc-400: oklch(0.822 0.099 37.76);
|
|
482
|
+
--color-acc-500: oklch(0.75 0.143 37.76);
|
|
483
|
+
--color-acc-600: oklch(0.64 0.21 37.76);
|
|
484
|
+
--color-acc-700: oklch(0.567 0.177 37.76);
|
|
485
|
+
--color-acc-800: oklch(0.456 0.13 37.76);
|
|
486
|
+
--color-acc-900: oklch(0.332 0.085 37.76);
|
|
487
|
+
--color-acc-950: oklch(0.195 0.044 37.76);
|
|
488
|
+
}
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
**Debugging Steps**:
|
|
492
|
+
1. Check Browser DevTools for CSS import errors
|
|
493
|
+
2. Verify pace-core CSS files are loading in Network tab
|
|
494
|
+
3. Inspect elements to see if Tailwind classes are applied
|
|
495
|
+
4. Ensure Tailwind v4 is installed and configured
|
|
496
|
+
5. Test CSS imports with temporary rule: `body { background-color: red !important; }`
|
|
497
|
+
|
|
498
|
+
**Quick Checklist**:
|
|
499
|
+
- [ ] CSS files imported in main.tsx/App.tsx
|
|
500
|
+
- [ ] app.css created with color palette
|
|
501
|
+
- [ ] Using PaceAppLayout component
|
|
502
|
+
- [ ] Tailwind v4 configured in build tool
|
|
503
|
+
- [ ] No custom CSS overriding pace-core styles
|
|
504
|
+
- [ ] All required dependencies installed
|
|
505
|
+
- [ ] No build errors in console
|
|
506
|
+
|
|
507
|
+
### 2. App Looks Different from Demo (v0.3.47+ Fixed)
|
|
508
|
+
|
|
509
|
+
**Problem**: Your consuming app looks different from the PACE Core demo app
|
|
510
|
+
|
|
511
|
+
**Symptoms**:
|
|
512
|
+
- Different background colors (gray instead of blue)
|
|
513
|
+
- Different text colors
|
|
514
|
+
- Overall different visual appearance
|
|
515
|
+
|
|
516
|
+
**Root Cause**: The demo app uses a custom CSS configuration, while consuming apps use our theme file. The theme file was using neutral gray colors instead of the blue-tinted scheme from the demo.
|
|
517
|
+
|
|
518
|
+
**Solution**: This issue was fixed in v0.3.47+. The theme file now uses the same blue-tinted color scheme as the demo app:
|
|
519
|
+
|
|
520
|
+
- **Background**: Very light blue (`--color-primary-50`)
|
|
521
|
+
- **Foreground**: Very dark blue (`--color-primary-950`)
|
|
522
|
+
- **Primary**: Blue (`--color-primary-600`)
|
|
523
|
+
- **Borders**: Blue (`--color-primary-500`)
|
|
524
|
+
- **Inputs**: Light purple (`--color-secondary-200`)
|
|
525
|
+
|
|
526
|
+
**Quick Fix**:
|
|
527
|
+
```bash
|
|
528
|
+
npm install @jmruthers/pace-core@latest
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
### 2. Header Layout Issues (v0.3.48+ Fixed)
|
|
532
|
+
|
|
533
|
+
**Problem**: Header elements are stacked vertically instead of being aligned horizontally across the page
|
|
534
|
+
|
|
535
|
+
**Symptoms**:
|
|
536
|
+
- Logo, navigation, and user menu are stacked vertically
|
|
537
|
+
- Header doesn't use the full width properly
|
|
538
|
+
- Layout looks broken compared to demo app
|
|
539
|
+
|
|
540
|
+
**Root Cause**: Missing CSS variables that the header component depends on:
|
|
541
|
+
- `--app-width` (for container width)
|
|
542
|
+
- `--color-main-*` (for header background colors)
|
|
543
|
+
- `--color-sec-*` and `--color-acc-*` (for other header elements)
|
|
544
|
+
|
|
545
|
+
**Solution**: This issue was fixed in v0.3.48+. The theme file now includes all required CSS variables:
|
|
546
|
+
|
|
547
|
+
- **Layout Variables**: `--app-width: 90rem`
|
|
548
|
+
- **App Color Variables**: `--color-main-*`, `--color-sec-*`, `--color-acc-*`
|
|
549
|
+
- **Complete Color Palette**: All color variants (50, 100, 200, etc.) plus `-raw` variants
|
|
550
|
+
|
|
551
|
+
**Quick Fix**:
|
|
552
|
+
```bash
|
|
553
|
+
npm install @jmruthers/pace-core@latest
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
### 3. Missing CSS Variables (v0.3.49+ Fixed)
|
|
557
|
+
|
|
558
|
+
**Problem**: Components not rendering correctly due to missing CSS variables
|
|
559
|
+
|
|
560
|
+
**Symptoms**:
|
|
561
|
+
- Components appear unstyled or broken
|
|
562
|
+
- Console errors about undefined CSS variables
|
|
563
|
+
- Inconsistent appearance across different components
|
|
564
|
+
- DataTable examples not working properly
|
|
565
|
+
|
|
566
|
+
**Root Cause**: The theme file was missing many CSS variables that components depend on:
|
|
567
|
+
- Font variables (--font-sans, --font-serif, --font-mono)
|
|
568
|
+
- Design tokens (--pace-* variables)
|
|
569
|
+
- Event colors (--color-ev-* variables)
|
|
570
|
+
- Radix UI variables (--radix-toast-*)
|
|
571
|
+
|
|
572
|
+
**Solution**: This issue was fixed in v0.3.49+. The theme file now includes comprehensive variable coverage:
|
|
573
|
+
|
|
574
|
+
- **Font Variables**: All typography variables for consistent fonts
|
|
575
|
+
- **Design Tokens**: Complete PACE Core design token system
|
|
576
|
+
- **Event Colors**: Full color palette for DataTable examples
|
|
577
|
+
- **Component Variables**: All variables needed for component styling
|
|
578
|
+
- **Radix UI Variables**: Third-party component library compatibility
|
|
579
|
+
|
|
580
|
+
**Quick Fix**:
|
|
581
|
+
```bash
|
|
582
|
+
npm install @jmruthers/pace-core@latest
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
### 4. Login Page Styling Issues (v0.4.4+ Fixed)
|
|
586
|
+
|
|
587
|
+
**Problem**: Login page looks different from the pace-core demo - unstyled button, wrong background, missing shadows.
|
|
588
|
+
|
|
589
|
+
**Symptoms**:
|
|
590
|
+
- Button appears as plain text instead of styled button
|
|
591
|
+
- Background is white instead of gradient
|
|
592
|
+
- Card has no shadow or wrong styling
|
|
593
|
+
- Input fields are dark instead of white
|
|
594
|
+
- Overall appearance doesn't match the demo
|
|
595
|
+
|
|
596
|
+
**Root Cause**: Missing theme mappings in `styles/core.css` prevented CSS variables from being processed correctly by Tailwind v4.
|
|
597
|
+
|
|
598
|
+
**Solution**: This issue was fixed in v0.4.4+. The theme file now includes complete mappings for all color palettes.
|
|
599
|
+
|
|
600
|
+
**Quick Fix**:
|
|
601
|
+
```bash
|
|
602
|
+
npm install @jmruthers/pace-core@latest
|
|
603
|
+
```
|
|
604
|
+
|
|
605
|
+
**Required Setup** (must be exactly like this):
|
|
606
|
+
|
|
607
|
+
1. **CSS Imports** (in your main.tsx):
|
|
608
|
+
```tsx
|
|
609
|
+
import './app.css'; // Your app's palette definitions (must come first)
|
|
610
|
+
import '@jmruthers/pace-core/styles/core.css';
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
2. **App.css** (complete palette required):
|
|
614
|
+
```css
|
|
615
|
+
@theme static {
|
|
616
|
+
/* MAIN palette - your primary brand color */
|
|
617
|
+
--color-main-50: oklch(0.98 0.001 252.02);
|
|
618
|
+
--color-main-100: oklch(0.96 0.005 252.02);
|
|
619
|
+
/* ... all shades 50-950 + raw */
|
|
620
|
+
|
|
621
|
+
/* SEC palette - your secondary brand color */
|
|
622
|
+
--color-sec-50: oklch(0.98 0.003 280.75);
|
|
623
|
+
/* ... all shades 50-950 + raw */
|
|
624
|
+
|
|
625
|
+
/* ACC palette - your accent brand color */
|
|
626
|
+
--color-acc-50: oklch(0.98 0.003 37.76);
|
|
627
|
+
/* ... all shades 50-950 + raw */
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
@layer base {
|
|
631
|
+
.appGradient {
|
|
632
|
+
background: radial-gradient(var(--color-main-200), oklch(from var(--color-main-200) l c h / 0%) 30%),
|
|
633
|
+
conic-gradient(var(--color-main-200), var(--color-sec-200), var(--color-acc-200), var(--color-main-200));
|
|
634
|
+
background-attachment: fixed;
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
```
|
|
638
|
+
|
|
639
|
+
3. **HTML Structure** (in your index.html):
|
|
640
|
+
```html
|
|
641
|
+
<body class="appGradient">
|
|
642
|
+
<div id="root" class="grid grid-rows-[auto_1fr_auto] min-h-screen"></div>
|
|
643
|
+
</body>
|
|
644
|
+
```
|
|
645
|
+
|
|
646
|
+
4. **Vite Configuration** (Tailwind v4 required):
|
|
647
|
+
```ts
|
|
648
|
+
// vite.config.ts
|
|
649
|
+
import { defineConfig } from 'vite';
|
|
650
|
+
import react from '@vitejs/plugin-react';
|
|
651
|
+
import tailwindcss from '@tailwindcss/vite';
|
|
652
|
+
|
|
653
|
+
export default defineConfig({
|
|
654
|
+
plugins: [
|
|
655
|
+
react(),
|
|
656
|
+
tailwindcss() // Tailwind v4 - no config file needed!
|
|
657
|
+
],
|
|
658
|
+
});
|
|
659
|
+
```
|
|
660
|
+
|
|
661
|
+
**Debugging Steps**:
|
|
662
|
+
1. Check browser dev tools for CSS import errors
|
|
663
|
+
2. Verify `bg-main-600` class resolves to actual color value
|
|
664
|
+
3. Ensure all CSS files are imported in correct order
|
|
665
|
+
4. Confirm Tailwind v4 is installed (not v3)
|
|
666
|
+
5. Test with minimal setup to isolate the issue
|
|
667
|
+
|
|
668
|
+
### 5. Tailwind v4 Theme File Issues (v0.3.45+ Fixed)
|
|
669
|
+
|
|
670
|
+
**Problem**: Build failures when using `@import '@jmruthers/pace-core/styles/core.css'`
|
|
671
|
+
|
|
672
|
+
**Root Cause**: The theme file was missing semantic colors and had circular references in component classes.
|
|
673
|
+
|
|
674
|
+
**Solution**: This issue was fixed in v0.3.45+. The theme file now includes:
|
|
675
|
+
|
|
676
|
+
- **Complete semantic colors** (ring, border, background, foreground, etc.)
|
|
677
|
+
- **Fixed component classes** (no circular @apply references)
|
|
678
|
+
- **All required Tailwind v4 colors**
|
|
679
|
+
|
|
680
|
+
**Quick Fix**:
|
|
681
|
+
```bash
|
|
682
|
+
npm install @jmruthers/pace-core@latest
|
|
683
|
+
```
|
|
684
|
+
|
|
685
|
+
**Usage**:
|
|
686
|
+
```css
|
|
687
|
+
/* index.css */
|
|
688
|
+
@import '@jmruthers/pace-core/styles/core.css';
|
|
689
|
+
```
|
|
690
|
+
|
|
691
|
+
**Vite Configuration**:
|
|
692
|
+
```ts
|
|
693
|
+
// vite.config.ts
|
|
694
|
+
import { defineConfig } from 'vite';
|
|
695
|
+
import react from '@vitejs/plugin-react';
|
|
696
|
+
import tailwindcss from '@tailwindcss/vite';
|
|
697
|
+
|
|
698
|
+
export default defineConfig({
|
|
699
|
+
plugins: [
|
|
700
|
+
react(),
|
|
701
|
+
tailwindcss() // ✅ Simple - theme is in CSS
|
|
702
|
+
],
|
|
703
|
+
});
|
|
704
|
+
```
|
|
705
|
+
|
|
706
|
+
### 2. Missing Semantic Colors
|
|
707
|
+
|
|
708
|
+
**Problem**: Colors like `ring-ring`, `border`, `background` not working
|
|
709
|
+
|
|
710
|
+
**Solution**: The theme file now includes all semantic colors:
|
|
711
|
+
|
|
712
|
+
```css
|
|
713
|
+
/* These are now included in the theme file */
|
|
714
|
+
--color-ring: var(--color-primary-600);
|
|
715
|
+
--color-border: var(--color-neutral-300);
|
|
716
|
+
--color-background: var(--color-neutral-50);
|
|
717
|
+
--color-foreground: var(--color-neutral-950);
|
|
718
|
+
/* ... and more */
|
|
719
|
+
```
|
|
720
|
+
|
|
721
|
+
### 3. Component Classes Not Working
|
|
722
|
+
|
|
723
|
+
**Problem**: `.pace-button`, `.pace-input` classes not applying styles
|
|
724
|
+
|
|
725
|
+
**Solution**: Component classes are now self-contained:
|
|
726
|
+
|
|
727
|
+
```css
|
|
728
|
+
/* ✅ Fixed - no circular references */
|
|
729
|
+
.pace-button-primary {
|
|
730
|
+
@apply inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none ring-offset-background bg-primary-600 text-main-50 hover:bg-primary-700 active:bg-primary-800;
|
|
731
|
+
}
|
|
732
|
+
```
|
|
733
|
+
|
|
734
|
+
## Event Management Issues
|
|
735
|
+
|
|
736
|
+
### 1. Events Not Loading
|
|
737
|
+
|
|
738
|
+
**Problem**: Events are not being fetched or displayed.
|
|
739
|
+
|
|
740
|
+
**Solution**:
|
|
741
|
+
|
|
742
|
+
```typescript
|
|
743
|
+
import { useEvents } from '@jmruthers/pace-core';
|
|
744
|
+
|
|
745
|
+
function EventList() {
|
|
746
|
+
const { events, loading, error, refreshEvents } = useEvents();
|
|
747
|
+
|
|
748
|
+
if (loading) {
|
|
749
|
+
return <div>Loading events...</div>;
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
if (error) {
|
|
753
|
+
console.error('Events error:', error);
|
|
754
|
+
return (
|
|
755
|
+
<div>
|
|
756
|
+
<div>Error loading events: {error}</div>
|
|
757
|
+
<button onClick={refreshEvents}>Retry</button>
|
|
758
|
+
</div>
|
|
759
|
+
);
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
if (!events || events.length === 0) {
|
|
763
|
+
return <div>No events found</div>;
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
return (
|
|
767
|
+
<div>
|
|
768
|
+
{events.map(event => (
|
|
769
|
+
<div key={event.id}>
|
|
770
|
+
<h3>{event.name}</h3>
|
|
771
|
+
<p>{event.description}</p>
|
|
772
|
+
</div>
|
|
773
|
+
))}
|
|
774
|
+
</div>
|
|
775
|
+
);
|
|
776
|
+
}
|
|
777
|
+
```
|
|
778
|
+
|
|
779
|
+
### 2. Event Selection Not Working
|
|
780
|
+
|
|
781
|
+
**Problem**: Users can't select events or the selection is not persisting.
|
|
782
|
+
|
|
783
|
+
**Solution**:
|
|
784
|
+
|
|
785
|
+
```typescript
|
|
786
|
+
import { useEvents } from '@jmruthers/pace-core';
|
|
787
|
+
|
|
788
|
+
function EventSelector() {
|
|
789
|
+
const { events, selectedEvent, setSelectedEvent, hasAccess } = useEvents();
|
|
790
|
+
|
|
791
|
+
const handleEventSelect = (event) => {
|
|
792
|
+
if (hasAccess(event.id)) {
|
|
793
|
+
setSelectedEvent(event);
|
|
794
|
+
} else {
|
|
795
|
+
console.warn('User does not have access to this event');
|
|
796
|
+
}
|
|
797
|
+
};
|
|
798
|
+
|
|
799
|
+
return (
|
|
800
|
+
<div>
|
|
801
|
+
<h2>Select Event</h2>
|
|
802
|
+
{events.map(event => (
|
|
803
|
+
<div key={event.id}>
|
|
804
|
+
<span>{event.name}</span>
|
|
805
|
+
{hasAccess(event.id) ? (
|
|
806
|
+
<button onClick={() => handleEventSelect(event)}>
|
|
807
|
+
{selectedEvent?.id === event.id ? 'Selected' : 'Select'}
|
|
808
|
+
</button>
|
|
809
|
+
) : (
|
|
810
|
+
<span>No access</span>
|
|
811
|
+
)}
|
|
812
|
+
</div>
|
|
813
|
+
))}
|
|
814
|
+
</div>
|
|
815
|
+
);
|
|
816
|
+
}
|
|
817
|
+
```
|
|
818
|
+
|
|
819
|
+
## Form Issues
|
|
820
|
+
|
|
821
|
+
### 1. Form Validation Not Working
|
|
822
|
+
|
|
823
|
+
**Problem**: Form validation is not triggering or showing errors.
|
|
824
|
+
|
|
825
|
+
**Solution**:
|
|
826
|
+
|
|
827
|
+
```typescript
|
|
828
|
+
import { useZodForm } from '@jmruthers/pace-core';
|
|
829
|
+
import { z } from 'zod';
|
|
830
|
+
|
|
831
|
+
const schema = z.object({
|
|
832
|
+
name: z.string().min(1, 'Name is required'),
|
|
833
|
+
email: z.string().email('Invalid email'),
|
|
834
|
+
});
|
|
835
|
+
|
|
836
|
+
function UserForm() {
|
|
837
|
+
const {
|
|
838
|
+
register,
|
|
839
|
+
handleSubmit,
|
|
840
|
+
formState: { errors, isSubmitting },
|
|
841
|
+
reset,
|
|
842
|
+
} = useZodForm(schema);
|
|
843
|
+
|
|
844
|
+
const onSubmit = async (data) => {
|
|
845
|
+
try {
|
|
846
|
+
await createUser(data);
|
|
847
|
+
reset();
|
|
848
|
+
} catch (error) {
|
|
849
|
+
console.error('Form submission error:', error);
|
|
850
|
+
}
|
|
851
|
+
};
|
|
852
|
+
|
|
853
|
+
return (
|
|
854
|
+
<form onSubmit={handleSubmit(onSubmit)}>
|
|
855
|
+
<div>
|
|
856
|
+
<input {...register('name')} placeholder="Name" />
|
|
857
|
+
{errors.name && <span className="error">{errors.name.message}</span>}
|
|
858
|
+
</div>
|
|
859
|
+
|
|
860
|
+
<div>
|
|
861
|
+
<input type="email" {...register('email')} placeholder="Email" />
|
|
862
|
+
{errors.email && <span className="error">{errors.email.message}</span>}
|
|
863
|
+
</div>
|
|
864
|
+
|
|
865
|
+
<button type="submit" disabled={isSubmitting}>
|
|
866
|
+
{isSubmitting ? 'Submitting...' : 'Submit'}
|
|
867
|
+
</button>
|
|
868
|
+
</form>
|
|
869
|
+
);
|
|
870
|
+
}
|
|
871
|
+
```
|
|
872
|
+
|
|
873
|
+
### 2. Form Data Not Saving
|
|
874
|
+
|
|
875
|
+
**Problem**: Form data is not being saved to the database.
|
|
876
|
+
|
|
877
|
+
**Solution**:
|
|
878
|
+
|
|
879
|
+
```typescript
|
|
880
|
+
import { useZodForm } from '@jmruthers/pace-core';
|
|
881
|
+
import { useSupabase } from '@jmruthers/pace-core';
|
|
882
|
+
|
|
883
|
+
function UserForm() {
|
|
884
|
+
const { supabase } = useSupabase();
|
|
885
|
+
const { currentOrganisation } = useOrganisation();
|
|
886
|
+
|
|
887
|
+
const onSubmit = async (data) => {
|
|
888
|
+
try {
|
|
889
|
+
const { error } = await supabase
|
|
890
|
+
.from('users')
|
|
891
|
+
.insert({
|
|
892
|
+
...data,
|
|
893
|
+
organisation_id: currentOrganisation.id,
|
|
894
|
+
});
|
|
895
|
+
|
|
896
|
+
if (error) {
|
|
897
|
+
console.error('Database error:', error);
|
|
898
|
+
throw error;
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
console.log('User created successfully');
|
|
902
|
+
} catch (error) {
|
|
903
|
+
console.error('Form submission error:', error);
|
|
904
|
+
}
|
|
905
|
+
};
|
|
906
|
+
|
|
907
|
+
// ... rest of form component
|
|
908
|
+
}
|
|
909
|
+
```
|
|
910
|
+
|
|
911
|
+
## Component Issues
|
|
912
|
+
|
|
913
|
+
### 1. Components Not Rendering
|
|
914
|
+
|
|
915
|
+
**Problem**: Components are not rendering or showing blank content.
|
|
916
|
+
|
|
917
|
+
**Solution**:
|
|
918
|
+
|
|
919
|
+
```typescript
|
|
920
|
+
import { ErrorBoundary } from '@jmruthers/pace-core';
|
|
921
|
+
|
|
922
|
+
function App() {
|
|
923
|
+
return (
|
|
924
|
+
<ErrorBoundary fallback={<div>Something went wrong</div>}>
|
|
925
|
+
<YourComponents />
|
|
926
|
+
</ErrorBoundary>
|
|
927
|
+
);
|
|
928
|
+
}
|
|
929
|
+
```
|
|
930
|
+
|
|
931
|
+
### 2. Styling Issues
|
|
932
|
+
|
|
933
|
+
**Problem**: Components are not styled correctly or styles are missing.
|
|
934
|
+
|
|
935
|
+
**Solution**:
|
|
936
|
+
|
|
937
|
+
```typescript
|
|
938
|
+
// Ensure Tailwind CSS is imported
|
|
939
|
+
// Import the core CSS file
|
|
940
|
+
import './app.css'; // Your app's color palette (must come first)
|
|
941
|
+
import '@jmruthers/pace-core/styles/core.css';
|
|
942
|
+
|
|
943
|
+
// Check if your app is properly set up
|
|
944
|
+
function App() {
|
|
945
|
+
return (
|
|
946
|
+
<div>
|
|
947
|
+
<YourApp />
|
|
948
|
+
</div>
|
|
949
|
+
);
|
|
950
|
+
}
|
|
951
|
+
```
|
|
952
|
+
|
|
953
|
+
### 3. Component Props Issues
|
|
954
|
+
|
|
955
|
+
**Problem**: Components are not receiving the correct props or props are undefined.
|
|
956
|
+
|
|
957
|
+
**Solution**:
|
|
958
|
+
|
|
959
|
+
```typescript
|
|
960
|
+
import { Button } from '@jmruthers/pace-core';
|
|
961
|
+
|
|
962
|
+
function MyComponent() {
|
|
963
|
+
// Always provide required props
|
|
964
|
+
return (
|
|
965
|
+
<Button
|
|
966
|
+
variant="primary"
|
|
967
|
+
onClick={() => console.log('clicked')}
|
|
968
|
+
>
|
|
969
|
+
Click me
|
|
970
|
+
</Button>
|
|
971
|
+
);
|
|
972
|
+
}
|
|
973
|
+
```
|
|
974
|
+
|
|
975
|
+
## Database Issues
|
|
976
|
+
|
|
977
|
+
### 1. Database Connection Errors
|
|
978
|
+
|
|
979
|
+
**Problem**: Cannot connect to Supabase database.
|
|
980
|
+
|
|
981
|
+
**Solution**:
|
|
982
|
+
|
|
983
|
+
```typescript
|
|
984
|
+
import { createSupabaseClient } from '@jmruthers/pace-core';
|
|
985
|
+
|
|
986
|
+
// Check environment variables
|
|
987
|
+
const supabaseUrl = process.env.SUPABASE_URL;
|
|
988
|
+
const supabaseKey = process.env.SUPABASE_ANON_KEY;
|
|
989
|
+
|
|
990
|
+
if (!supabaseUrl || !supabaseKey) {
|
|
991
|
+
console.error('Missing Supabase environment variables');
|
|
992
|
+
throw new Error('Supabase configuration missing');
|
|
993
|
+
}
|
|
994
|
+
|
|
995
|
+
const supabase = createSupabaseClient(supabaseUrl, supabaseKey);
|
|
996
|
+
|
|
997
|
+
// Test connection
|
|
998
|
+
supabase.from('users').select('count').single()
|
|
999
|
+
.then(() => console.log('Database connected'))
|
|
1000
|
+
.catch(error => console.error('Database connection failed:', error));
|
|
1001
|
+
```
|
|
1002
|
+
|
|
1003
|
+
### 2. RLS Policy Issues
|
|
1004
|
+
|
|
1005
|
+
**Problem**: Row Level Security policies are blocking legitimate access.
|
|
1006
|
+
|
|
1007
|
+
**Solution**:
|
|
1008
|
+
|
|
1009
|
+
```sql
|
|
1010
|
+
-- Check if RLS is enabled
|
|
1011
|
+
SELECT schemaname, tablename, rowsecurity
|
|
1012
|
+
FROM pg_tables
|
|
1013
|
+
WHERE tablename = 'your_table_name';
|
|
1014
|
+
|
|
1015
|
+
-- Check policies
|
|
1016
|
+
SELECT * FROM pg_policies WHERE tablename = 'your_table_name';
|
|
1017
|
+
|
|
1018
|
+
-- Test policy
|
|
1019
|
+
SELECT * FROM your_table_name WHERE organisation_id = 'your_org_id';
|
|
1020
|
+
```
|
|
1021
|
+
|
|
1022
|
+
### 3. Data Not Filtered by Organisation
|
|
1023
|
+
|
|
1024
|
+
**Problem**: Data is not being filtered by the current organisation.
|
|
1025
|
+
|
|
1026
|
+
**Solution**:
|
|
1027
|
+
|
|
1028
|
+
```typescript
|
|
1029
|
+
import { useOrganisation } from '@jmruthers/pace-core';
|
|
1030
|
+
import { useSupabase } from '@jmruthers/pace-core';
|
|
1031
|
+
|
|
1032
|
+
function DataComponent() {
|
|
1033
|
+
const { supabase } = useSupabase();
|
|
1034
|
+
const { currentOrganisation } = useOrganisation();
|
|
1035
|
+
|
|
1036
|
+
const fetchData = async () => {
|
|
1037
|
+
if (!currentOrganisation) {
|
|
1038
|
+
console.warn('No organisation selected');
|
|
1039
|
+
return;
|
|
1040
|
+
}
|
|
1041
|
+
|
|
1042
|
+
const { data, error } = await supabase
|
|
1043
|
+
.from('your_table')
|
|
1044
|
+
.select('*')
|
|
1045
|
+
.eq('organisation_id', currentOrganisation.id);
|
|
1046
|
+
|
|
1047
|
+
if (error) {
|
|
1048
|
+
console.error('Database error:', error);
|
|
1049
|
+
return;
|
|
1050
|
+
}
|
|
1051
|
+
|
|
1052
|
+
console.log('Filtered data:', data);
|
|
1053
|
+
};
|
|
1054
|
+
|
|
1055
|
+
return (
|
|
1056
|
+
<div>
|
|
1057
|
+
<button onClick={fetchData}>Load Data</button>
|
|
1058
|
+
</div>
|
|
1059
|
+
);
|
|
1060
|
+
}
|
|
1061
|
+
```
|
|
1062
|
+
|
|
1063
|
+
## Performance Issues
|
|
1064
|
+
|
|
1065
|
+
### 1. Slow Loading Times
|
|
1066
|
+
|
|
1067
|
+
**Problem**: Components are taking too long to load.
|
|
1068
|
+
|
|
1069
|
+
**Solution**:
|
|
1070
|
+
|
|
1071
|
+
```typescript
|
|
1072
|
+
import { useMemo } from 'react';
|
|
1073
|
+
import { useEvents } from '@jmruthers/pace-core';
|
|
1074
|
+
|
|
1075
|
+
function OptimizedEventList() {
|
|
1076
|
+
const { events, loading } = useEvents();
|
|
1077
|
+
|
|
1078
|
+
// Memoize expensive calculations
|
|
1079
|
+
const sortedEvents = useMemo(() => {
|
|
1080
|
+
return events?.sort((a, b) =>
|
|
1081
|
+
new Date(a.start_date).getTime() - new Date(b.start_date).getTime()
|
|
1082
|
+
) || [];
|
|
1083
|
+
}, [events]);
|
|
1084
|
+
|
|
1085
|
+
if (loading) {
|
|
1086
|
+
return <div>Loading events...</div>;
|
|
1087
|
+
}
|
|
1088
|
+
|
|
1089
|
+
return (
|
|
1090
|
+
<div>
|
|
1091
|
+
{sortedEvents.map(event => (
|
|
1092
|
+
<EventCard key={event.id} event={event} />
|
|
1093
|
+
))}
|
|
1094
|
+
</div>
|
|
1095
|
+
);
|
|
1096
|
+
}
|
|
1097
|
+
```
|
|
1098
|
+
|
|
1099
|
+
### 2. Memory Leaks
|
|
1100
|
+
|
|
1101
|
+
**Problem**: Memory usage is increasing over time.
|
|
1102
|
+
|
|
1103
|
+
**Solution**:
|
|
1104
|
+
|
|
1105
|
+
```typescript
|
|
1106
|
+
import { useEffect, useCallback } from 'react';
|
|
1107
|
+
import { useEvents } from '@jmruthers/pace-core';
|
|
1108
|
+
|
|
1109
|
+
function EventManager() {
|
|
1110
|
+
const { events, refreshEvents } = useEvents();
|
|
1111
|
+
|
|
1112
|
+
// Clean up on unmount
|
|
1113
|
+
useEffect(() => {
|
|
1114
|
+
return () => {
|
|
1115
|
+
// Cleanup function
|
|
1116
|
+
console.log('Component unmounting');
|
|
1117
|
+
};
|
|
1118
|
+
}, []);
|
|
1119
|
+
|
|
1120
|
+
// Memoize callbacks
|
|
1121
|
+
const handleRefresh = useCallback(() => {
|
|
1122
|
+
refreshEvents();
|
|
1123
|
+
}, [refreshEvents]);
|
|
1124
|
+
|
|
1125
|
+
return (
|
|
1126
|
+
<div>
|
|
1127
|
+
<button onClick={handleRefresh}>Refresh Events</button>
|
|
1128
|
+
{/* Event list */}
|
|
1129
|
+
</div>
|
|
1130
|
+
);
|
|
1131
|
+
}
|
|
1132
|
+
```
|
|
1133
|
+
|
|
1134
|
+
## Network Issues
|
|
1135
|
+
|
|
1136
|
+
### 1. API Request Failures
|
|
1137
|
+
|
|
1138
|
+
**Problem**: API requests are failing with network errors.
|
|
1139
|
+
|
|
1140
|
+
**Solution**:
|
|
1141
|
+
|
|
1142
|
+
```typescript
|
|
1143
|
+
import { useUnifiedAuth } from '@jmruthers/pace-core';
|
|
1144
|
+
|
|
1145
|
+
function NetworkAwareComponent() {
|
|
1146
|
+
const { error } = useUnifiedAuth();
|
|
1147
|
+
|
|
1148
|
+
useEffect(() => {
|
|
1149
|
+
if (error) {
|
|
1150
|
+
console.error('Network error:', error);
|
|
1151
|
+
|
|
1152
|
+
// Check if it's a network issue
|
|
1153
|
+
if (error.message.includes('network') || error.message.includes('fetch')) {
|
|
1154
|
+
console.log('Network connectivity issue detected');
|
|
1155
|
+
// Implement retry logic or show offline message
|
|
1156
|
+
}
|
|
1157
|
+
}
|
|
1158
|
+
}, [error]);
|
|
1159
|
+
|
|
1160
|
+
return (
|
|
1161
|
+
<div>
|
|
1162
|
+
{error && (
|
|
1163
|
+
<div className="error">
|
|
1164
|
+
<p>Connection error: {error.message}</p>
|
|
1165
|
+
<button onClick={() => window.location.reload()}>
|
|
1166
|
+
Retry
|
|
1167
|
+
</button>
|
|
1168
|
+
</div>
|
|
1169
|
+
)}
|
|
1170
|
+
</div>
|
|
1171
|
+
);
|
|
1172
|
+
}
|
|
1173
|
+
```
|
|
1174
|
+
|
|
1175
|
+
### 2. CORS Issues
|
|
1176
|
+
|
|
1177
|
+
**Problem**: Getting CORS errors when making requests.
|
|
1178
|
+
|
|
1179
|
+
**Solution**:
|
|
1180
|
+
|
|
1181
|
+
```typescript
|
|
1182
|
+
// Check Supabase configuration
|
|
1183
|
+
const supabase = createSupabaseClient(
|
|
1184
|
+
process.env.SUPABASE_URL!,
|
|
1185
|
+
process.env.SUPABASE_ANON_KEY!,
|
|
1186
|
+
{
|
|
1187
|
+
auth: {
|
|
1188
|
+
autoRefreshToken: true,
|
|
1189
|
+
persistSession: true,
|
|
1190
|
+
detectSessionInUrl: true,
|
|
1191
|
+
},
|
|
1192
|
+
}
|
|
1193
|
+
);
|
|
1194
|
+
```
|
|
1195
|
+
|
|
1196
|
+
## Environment Issues
|
|
1197
|
+
|
|
1198
|
+
### 1. Environment Variables Missing
|
|
1199
|
+
|
|
1200
|
+
**Problem**: Application is failing due to missing environment variables.
|
|
1201
|
+
|
|
1202
|
+
**Solution**:
|
|
1203
|
+
|
|
1204
|
+
```typescript
|
|
1205
|
+
// Validate environment variables
|
|
1206
|
+
const requiredEnvVars = [
|
|
1207
|
+
'SUPABASE_URL',
|
|
1208
|
+
'SUPABASE_ANON_KEY',
|
|
1209
|
+
'NODE_ENV',
|
|
1210
|
+
];
|
|
1211
|
+
|
|
1212
|
+
requiredEnvVars.forEach(varName => {
|
|
1213
|
+
if (!process.env[varName]) {
|
|
1214
|
+
console.error(`Missing environment variable: ${varName}`);
|
|
1215
|
+
throw new Error(`Missing required environment variable: ${varName}`);
|
|
1216
|
+
}
|
|
1217
|
+
});
|
|
1218
|
+
|
|
1219
|
+
console.log('Environment variables validated');
|
|
1220
|
+
```
|
|
1221
|
+
|
|
1222
|
+
### 2. Development vs Production Issues
|
|
1223
|
+
|
|
1224
|
+
**Problem**: Application works in development but not in production.
|
|
1225
|
+
|
|
1226
|
+
**Solution**:
|
|
1227
|
+
|
|
1228
|
+
```typescript
|
|
1229
|
+
// Environment-specific configuration
|
|
1230
|
+
const config = {
|
|
1231
|
+
development: {
|
|
1232
|
+
supabaseUrl: process.env.SUPABASE_URL,
|
|
1233
|
+
supabaseKey: process.env.SUPABASE_ANON_KEY,
|
|
1234
|
+
debug: true,
|
|
1235
|
+
},
|
|
1236
|
+
production: {
|
|
1237
|
+
supabaseUrl: process.env.SUPABASE_URL,
|
|
1238
|
+
supabaseKey: process.env.SUPABASE_ANON_KEY,
|
|
1239
|
+
debug: false,
|
|
1240
|
+
},
|
|
1241
|
+
};
|
|
1242
|
+
|
|
1243
|
+
const currentConfig = config[process.env.NODE_ENV || 'development'];
|
|
1244
|
+
```
|
|
1245
|
+
|
|
1246
|
+
## Debugging Tools
|
|
1247
|
+
|
|
1248
|
+
### 1. Debug Component
|
|
1249
|
+
|
|
1250
|
+
```typescript
|
|
1251
|
+
function DebugPanel() {
|
|
1252
|
+
const { user, session } = useUnifiedAuth();
|
|
1253
|
+
const { currentOrganisation } = useOrganisation();
|
|
1254
|
+
const { events, selectedEvent } = useEvents();
|
|
1255
|
+
|
|
1256
|
+
return (
|
|
1257
|
+
<div className="debug-panel">
|
|
1258
|
+
<h3>Debug Information</h3>
|
|
1259
|
+
<pre>
|
|
1260
|
+
{JSON.stringify({
|
|
1261
|
+
user: user?.email,
|
|
1262
|
+
session: session?.expires_at,
|
|
1263
|
+
organisation: currentOrganisation?.name,
|
|
1264
|
+
events: events?.length,
|
|
1265
|
+
selectedEvent: selectedEvent?.name,
|
|
1266
|
+
}, null, 2)}
|
|
1267
|
+
</pre>
|
|
1268
|
+
</div>
|
|
1269
|
+
);
|
|
1270
|
+
}
|
|
1271
|
+
```
|
|
1272
|
+
|
|
1273
|
+
### 2. Error Boundary with Logging
|
|
1274
|
+
|
|
1275
|
+
```typescript
|
|
1276
|
+
import { ErrorBoundary } from '@jmruthers/pace-core';
|
|
1277
|
+
|
|
1278
|
+
function LoggingErrorBoundary({ children }) {
|
|
1279
|
+
return (
|
|
1280
|
+
<ErrorBoundary
|
|
1281
|
+
fallback={<div>Something went wrong</div>}
|
|
1282
|
+
onError={(error, errorInfo) => {
|
|
1283
|
+
console.error('Error caught by boundary:', error);
|
|
1284
|
+
console.error('Error info:', errorInfo);
|
|
1285
|
+
|
|
1286
|
+
// Send to error reporting service
|
|
1287
|
+
// reportError(error, errorInfo);
|
|
1288
|
+
}}
|
|
1289
|
+
>
|
|
1290
|
+
{children}
|
|
1291
|
+
</ErrorBoundary>
|
|
1292
|
+
);
|
|
1293
|
+
}
|
|
1294
|
+
```
|
|
1295
|
+
|
|
1296
|
+
## 🌐 Public Pages Issues
|
|
1297
|
+
|
|
1298
|
+
### Public Pages Not Working
|
|
1299
|
+
|
|
1300
|
+
**Problem**: Public pages show authentication errors or don't load properly
|
|
1301
|
+
|
|
1302
|
+
**Root Cause**: Public pages are being rendered inside the authentication context
|
|
1303
|
+
|
|
1304
|
+
**Solution**: Public pages MUST be completely separate from your main app
|
|
1305
|
+
|
|
1306
|
+
```tsx
|
|
1307
|
+
// ❌ WRONG - This will break
|
|
1308
|
+
<UnifiedAuthProvider>
|
|
1309
|
+
<Routes>
|
|
1310
|
+
<Route path="/events/:eventCode" element={<PublicPage />} />
|
|
1311
|
+
</Routes>
|
|
1312
|
+
</UnifiedAuthProvider>
|
|
1313
|
+
|
|
1314
|
+
// ✅ CORRECT - Separate applications
|
|
1315
|
+
<BrowserRouter>
|
|
1316
|
+
<Routes>
|
|
1317
|
+
<Route path="/events/*" element={<PublicPageApp />} />
|
|
1318
|
+
<Route path="/*" element={
|
|
1319
|
+
<UnifiedAuthProvider>
|
|
1320
|
+
<AuthenticatedApp />
|
|
1321
|
+
</UnifiedAuthProvider>
|
|
1322
|
+
} />
|
|
1323
|
+
</Routes>
|
|
1324
|
+
</BrowserRouter>
|
|
1325
|
+
```
|
|
1326
|
+
|
|
1327
|
+
**Complete Setup:**
|
|
1328
|
+
```tsx
|
|
1329
|
+
// PublicPageApp.tsx
|
|
1330
|
+
import { PublicPageProvider } from '@jmruthers/pace-core';
|
|
1331
|
+
|
|
1332
|
+
export function PublicPageApp() {
|
|
1333
|
+
return (
|
|
1334
|
+
<PublicPageProvider>
|
|
1335
|
+
<Routes>
|
|
1336
|
+
<Route path="/events/:eventCode" element={<PublicEventPage />} />
|
|
1337
|
+
</Routes>
|
|
1338
|
+
</PublicPageProvider>
|
|
1339
|
+
);
|
|
1340
|
+
}
|
|
1341
|
+
```
|
|
1342
|
+
|
|
1343
|
+
### Public Page Hooks Not Working
|
|
1344
|
+
|
|
1345
|
+
**Problem**: `usePublicEvent` or `usePublicRouteParams` return null/undefined
|
|
1346
|
+
|
|
1347
|
+
**Root Cause**: Not using the hooks inside `PublicPageProvider`
|
|
1348
|
+
|
|
1349
|
+
**Solution**: Ensure all public page components are wrapped in `PublicPageProvider`
|
|
1350
|
+
|
|
1351
|
+
```tsx
|
|
1352
|
+
// ❌ WRONG - Hooks won't work
|
|
1353
|
+
function PublicPage() {
|
|
1354
|
+
const { eventCode } = usePublicRouteParams(); // Returns null
|
|
1355
|
+
// ...
|
|
1356
|
+
}
|
|
1357
|
+
|
|
1358
|
+
// ✅ CORRECT - Hooks work properly
|
|
1359
|
+
<PublicPageProvider>
|
|
1360
|
+
<PublicPage /> {/* Hooks work here */}
|
|
1361
|
+
</PublicPageProvider>
|
|
1362
|
+
```
|
|
1363
|
+
|
|
1364
|
+
### Public Page Loading Forever
|
|
1365
|
+
|
|
1366
|
+
**Problem**: Public pages show loading spinner indefinitely
|
|
1367
|
+
|
|
1368
|
+
**Root Cause**: Event data not found or API errors
|
|
1369
|
+
|
|
1370
|
+
**Solution**: Add proper error handling and fallbacks
|
|
1371
|
+
|
|
1372
|
+
```tsx
|
|
1373
|
+
function PublicEventPage() {
|
|
1374
|
+
const { eventCode } = usePublicRouteParams({ fetchEventData: false });
|
|
1375
|
+
const { event, isLoading, error, refetch } = usePublicEvent(eventCode || '');
|
|
1376
|
+
|
|
1377
|
+
// Handle loading
|
|
1378
|
+
if (isLoading) {
|
|
1379
|
+
return <PublicLoadingSpinner message="Loading event..." />;
|
|
1380
|
+
}
|
|
1381
|
+
|
|
1382
|
+
// Handle error
|
|
1383
|
+
if (error) {
|
|
1384
|
+
return (
|
|
1385
|
+
<div className="min-h-screen bg-white flex items-center justify-center">
|
|
1386
|
+
<div className="text-center">
|
|
1387
|
+
<h1 className="text-2xl font-bold text-gray-900 mb-4">
|
|
1388
|
+
Event Not Found
|
|
1389
|
+
</h1>
|
|
1390
|
+
<p className="text-gray-600 mb-6">
|
|
1391
|
+
The event code "{eventCode}" is invalid or not available for public viewing.
|
|
1392
|
+
</p>
|
|
1393
|
+
<button
|
|
1394
|
+
onClick={refetch}
|
|
1395
|
+
className="px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700"
|
|
1396
|
+
>
|
|
1397
|
+
Try Again
|
|
1398
|
+
</button>
|
|
1399
|
+
</div>
|
|
1400
|
+
</div>
|
|
1401
|
+
);
|
|
1402
|
+
}
|
|
1403
|
+
|
|
1404
|
+
// Handle missing event
|
|
1405
|
+
if (!event) {
|
|
1406
|
+
return <div>Event not found</div>;
|
|
1407
|
+
}
|
|
1408
|
+
|
|
1409
|
+
// Render the page
|
|
1410
|
+
return (
|
|
1411
|
+
<PublicPageLayout eventCode={eventCode || ''} event={event}>
|
|
1412
|
+
{/* Your content */}
|
|
1413
|
+
</PublicPageLayout>
|
|
1414
|
+
);
|
|
1415
|
+
}
|
|
1416
|
+
```
|
|
1417
|
+
|
|
1418
|
+
### Public Page Styling Issues
|
|
1419
|
+
|
|
1420
|
+
**Problem**: Public pages appear unstyled or broken
|
|
1421
|
+
|
|
1422
|
+
**Root Cause**: Missing CSS import or Tailwind configuration
|
|
1423
|
+
|
|
1424
|
+
**Solution**: Ensure CSS is imported and Tailwind is configured
|
|
1425
|
+
|
|
1426
|
+
```tsx
|
|
1427
|
+
// Make sure to import CSS
|
|
1428
|
+
import '@jmruthers/pace-core/styles/core.css';
|
|
1429
|
+
|
|
1430
|
+
// And configure Tailwind properly
|
|
1431
|
+
// vite.config.ts
|
|
1432
|
+
import tailwindcss from '@tailwindcss/vite'
|
|
1433
|
+
export default defineConfig({
|
|
1434
|
+
plugins: [
|
|
1435
|
+
react(),
|
|
1436
|
+
tailwindcss({
|
|
1437
|
+
content: [
|
|
1438
|
+
'./src/**/*.{js,ts,jsx,tsx}',
|
|
1439
|
+
'./node_modules/@jmruthers/pace-core/**/*.{js,ts,jsx,tsx}'
|
|
1440
|
+
]
|
|
1441
|
+
})
|
|
1442
|
+
],
|
|
1443
|
+
})
|
|
1444
|
+
```
|
|
1445
|
+
|
|
1446
|
+
### Public Page Environment Variables
|
|
1447
|
+
|
|
1448
|
+
**Problem**: Public pages can't access Supabase or environment variables
|
|
1449
|
+
|
|
1450
|
+
**Root Cause**: Missing environment variables or incorrect configuration
|
|
1451
|
+
|
|
1452
|
+
**Solution**: Set up environment variables and pass them to `PublicPageProvider`
|
|
1453
|
+
|
|
1454
|
+
```tsx
|
|
1455
|
+
// .env.local
|
|
1456
|
+
VITE_SUPABASE_URL=your_supabase_url
|
|
1457
|
+
VITE_SUPABASE_ANON_KEY=your_supabase_anon_key
|
|
1458
|
+
VITE_APP_NAME=Your App Name
|
|
1459
|
+
|
|
1460
|
+
// PublicPageApp.tsx
|
|
1461
|
+
import { PublicPageProvider } from '@jmruthers/pace-core';
|
|
1462
|
+
|
|
1463
|
+
export function PublicPageApp() {
|
|
1464
|
+
return (
|
|
1465
|
+
<PublicPageProvider
|
|
1466
|
+
environment={{
|
|
1467
|
+
supabaseUrl: import.meta.env.VITE_SUPABASE_URL,
|
|
1468
|
+
supabaseKey: import.meta.env.VITE_SUPABASE_ANON_KEY,
|
|
1469
|
+
}}
|
|
1470
|
+
>
|
|
1471
|
+
<Routes>
|
|
1472
|
+
<Route path="/events/:eventCode" element={<PublicEventPage />} />
|
|
1473
|
+
</Routes>
|
|
1474
|
+
</PublicPageProvider>
|
|
1475
|
+
);
|
|
1476
|
+
}
|
|
1477
|
+
```
|
|
1478
|
+
|
|
1479
|
+
### Public Page "process is not defined" Error
|
|
1480
|
+
|
|
1481
|
+
**Problem**: `ReferenceError: process is not defined` when using `PublicPageProvider` in Vite-based applications
|
|
1482
|
+
|
|
1483
|
+
**Root Cause**: The component is trying to access Node.js globals (`process`) that aren't available in browser environments
|
|
1484
|
+
|
|
1485
|
+
**Solution**: This has been fixed in pace-core v0.4.61+. The `PublicPageProvider` now safely handles both browser and Node.js environments.
|
|
1486
|
+
|
|
1487
|
+
**If you're still seeing this error:**
|
|
1488
|
+
|
|
1489
|
+
1. **Update pace-core** to the latest version:
|
|
1490
|
+
```bash
|
|
1491
|
+
npm update @jmruthers/pace-core
|
|
1492
|
+
```
|
|
1493
|
+
|
|
1494
|
+
2. **Verify your Vite configuration** includes environment variable support:
|
|
1495
|
+
```ts
|
|
1496
|
+
// vite.config.ts
|
|
1497
|
+
export default defineConfig({
|
|
1498
|
+
plugins: [react(), tailwindcss()],
|
|
1499
|
+
envDir: '.', // Look for .env files in root
|
|
1500
|
+
envPrefix: 'VITE_', // Only load VITE_ prefixed variables
|
|
1501
|
+
})
|
|
1502
|
+
```
|
|
1503
|
+
|
|
1504
|
+
3. **Set up environment variables** in your `.env` file:
|
|
1505
|
+
```bash
|
|
1506
|
+
# .env.local
|
|
1507
|
+
VITE_SUPABASE_URL=your_supabase_url
|
|
1508
|
+
VITE_SUPABASE_ANON_KEY=your_supabase_anon_key
|
|
1509
|
+
```
|
|
1510
|
+
|
|
1511
|
+
4. **Use the correct environment variable names**:
|
|
1512
|
+
- ✅ `VITE_SUPABASE_URL` (Vite)
|
|
1513
|
+
- ✅ `NEXT_PUBLIC_SUPABASE_URL` (Next.js)
|
|
1514
|
+
- ❌ `SUPABASE_URL` (not prefixed for Vite)
|
|
1515
|
+
|
|
1516
|
+
**The fix ensures:**
|
|
1517
|
+
- ✅ Safe access to `import.meta.env` (Vite/browser)
|
|
1518
|
+
- ✅ Safe access to `process.env` (Node.js/server)
|
|
1519
|
+
- ✅ Proper fallback handling
|
|
1520
|
+
- ✅ No "process is not defined" errors
|
|
1521
|
+
|
|
1522
|
+
### Public Page Database Access
|
|
1523
|
+
|
|
1524
|
+
**Problem**: Public pages can't access event data from database
|
|
1525
|
+
|
|
1526
|
+
**Root Cause**: Missing RLS policies or incorrect database setup
|
|
1527
|
+
|
|
1528
|
+
**Solution**: Set up proper RLS policies for public access
|
|
1529
|
+
|
|
1530
|
+
```sql
|
|
1531
|
+
-- Enable RLS on events table
|
|
1532
|
+
ALTER TABLE events ENABLE ROW LEVEL SECURITY;
|
|
1533
|
+
|
|
1534
|
+
-- Create policy for public events
|
|
1535
|
+
CREATE POLICY "Public events are viewable by anyone" ON events
|
|
1536
|
+
FOR SELECT USING (is_public = true);
|
|
1537
|
+
|
|
1538
|
+
-- Or allow specific event codes
|
|
1539
|
+
CREATE POLICY "Specific event codes are public" ON events
|
|
1540
|
+
FOR SELECT USING (event_code IN ('EVENT123', 'EVENT456'));
|
|
1541
|
+
```
|
|
1542
|
+
|
|
1543
|
+
## Getting Help
|
|
1544
|
+
|
|
1545
|
+
If you're still experiencing issues:
|
|
1546
|
+
|
|
1547
|
+
1. **Check the console** for error messages
|
|
1548
|
+
2. **Verify your configuration** (environment variables, Supabase setup)
|
|
1549
|
+
3. **Test with minimal setup** to isolate the issue
|
|
1550
|
+
4. **Check the documentation** for specific component usage
|
|
1551
|
+
5. **Search existing issues** in the GitHub repository
|
|
1552
|
+
6. **Create a new issue** with detailed information about your problem
|
|
1553
|
+
|
|
1554
|
+
When reporting an issue, include:
|
|
1555
|
+
|
|
1556
|
+
- **Environment**: Node.js version, package versions
|
|
1557
|
+
- **Steps to reproduce**: Clear steps to recreate the issue
|
|
1558
|
+
- **Expected behavior**: What you expected to happen
|
|
1559
|
+
- **Actual behavior**: What actually happened
|
|
1560
|
+
- **Error messages**: Full error messages from console
|
|
1561
|
+
- **Code example**: Minimal code that reproduces the issue
|
|
1562
|
+
|
|
1563
|
+
For more specific troubleshooting, see the [Debugging Guide](./debugging.md).
|