@jmruthers/pace-core 0.5.76 → 0.5.78
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/dist/{RBACService-C4udt_Zp.d.ts → AuthService-Df3IozMG.d.ts} +10 -118
- package/dist/{DataTable-ntgmhO2W.d.ts → DataTable-BE0OXZKQ.d.ts} +9 -2
- package/dist/{DataTable-4GAVPIEG.js → DataTable-ETGVF4Y5.js} +50 -13
- package/dist/{PublicLoadingSpinner-BiNER8F5.d.ts → PublicLoadingSpinner-CnUaz0vG.d.ts} +5 -2
- package/dist/{UnifiedAuthProvider-Bj6YCf7c.d.ts → UnifiedAuthProvider-B391Aqum.d.ts} +42 -45
- package/dist/{UnifiedAuthProvider-3NKDOSOK.js → UnifiedAuthProvider-P5SOJAQ6.js} +4 -5
- package/dist/{api-DDMUKIUD.js → api-KG4A2X7P.js} +9 -3
- package/dist/{audit-6TOCAMKO.js → audit-65VNHEV2.js} +2 -2
- package/dist/{chunk-K34IM5CT.js → chunk-2OGV6IRV.js} +196 -626
- package/dist/chunk-2OGV6IRV.js.map +1 -0
- package/dist/{chunk-NTNILOBC.js → chunk-5BO3MI5Y.js} +4 -4
- package/dist/{chunk-XLZ7U46Z.js → chunk-CVMVPYAL.js} +9 -60
- package/dist/chunk-CVMVPYAL.js.map +1 -0
- package/dist/{chunk-URUTVZ7N.js → chunk-FL4ZCQLD.js} +2 -2
- package/dist/{chunk-LW7MMEAQ.js → chunk-FT2M4R4F.js} +2 -2
- package/dist/{chunk-5BSLGBYI.js → chunk-JCQZ6LA7.js} +2 -8
- package/dist/{chunk-5BSLGBYI.js.map → chunk-JCQZ6LA7.js.map} +1 -1
- package/dist/{chunk-KHJS6VIA.js → chunk-LRQ6RBJC.js} +157 -112
- package/dist/chunk-LRQ6RBJC.js.map +1 -0
- package/dist/{chunk-WN6XJWOS.js → chunk-MNJXXD6C.js} +274 -743
- package/dist/chunk-MNJXXD6C.js.map +1 -0
- package/dist/{chunk-KK73ZB4E.js → chunk-PTR5PMPE.js} +153 -132
- package/dist/chunk-PTR5PMPE.js.map +1 -0
- package/dist/{chunk-B2WTCLCV.js → chunk-Q7APDV6H.js} +18 -8
- package/dist/chunk-Q7APDV6H.js.map +1 -0
- package/dist/{chunk-A4FUBC7B.js → chunk-QGVSOUJ2.js} +2 -4
- package/dist/{chunk-A4FUBC7B.js.map → chunk-QGVSOUJ2.js.map} +1 -1
- package/dist/{chunk-FGMFQSHX.js → chunk-S63MFSY6.js} +500 -551
- package/dist/chunk-S63MFSY6.js.map +1 -0
- package/dist/{chunk-AFGTSUAD.js → chunk-VSOKOFRF.js} +4 -4
- package/dist/chunk-WUXCWRL6.js +20 -0
- package/dist/chunk-WUXCWRL6.js.map +1 -0
- package/dist/{chunk-Y6TXWPJO.js → chunk-YVVGHRGI.js} +105 -31
- package/dist/chunk-YVVGHRGI.js.map +1 -0
- package/dist/{chunk-M5IWZRBT.js → chunk-ZMNXIJP4.js} +2187 -981
- package/dist/chunk-ZMNXIJP4.js.map +1 -0
- package/dist/components.d.ts +6 -6
- package/dist/components.js +14 -18
- package/dist/components.js.map +1 -1
- package/dist/{database-C3Szpi5J.d.ts → database-BXAfr2Y_.d.ts} +18 -0
- package/dist/hooks.d.ts +5 -5
- package/dist/hooks.js +8 -9
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +19 -27
- package/dist/index.js +21 -29
- package/dist/index.js.map +1 -1
- package/dist/{organisation-BtshODVF.d.ts → organisation-D6qRDtbF.d.ts} +1 -1
- package/dist/providers.d.ts +7 -21
- package/dist/providers.js +3 -10
- package/dist/rbac/index.d.ts +71 -221
- package/dist/rbac/index.js +15 -16
- package/dist/{types-CGX9Vyf5.d.ts → types-BDg1mAGG.d.ts} +36 -6
- package/dist/types.d.ts +3 -3
- package/dist/types.js +61 -18
- package/dist/types.js.map +1 -1
- package/dist/{unified-CM7T0aTK.d.ts → unified-DQ4VcT7H.d.ts} +1 -1
- package/dist/{usePublicRouteParams-B-CumWRc.d.ts → usePublicRouteParams-BlgwXweB.d.ts} +3 -3
- package/dist/utils.d.ts +2 -2
- package/dist/utils.js +52 -9
- package/dist/utils.js.map +1 -1
- package/docs/CONTENT_AUDIT_REPORT.md +253 -0
- package/docs/DOCUMENTATION_AUDIT.md +172 -0
- package/docs/README.md +142 -147
- package/docs/STYLE_GUIDE.md +37 -0
- package/docs/api/classes/ColumnFactory.md +17 -17
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/InvalidScopeError.md +4 -4
- package/docs/api/classes/MissingUserContextError.md +4 -4
- package/docs/api/classes/OrganisationContextRequiredError.md +4 -4
- package/docs/api/classes/PermissionDeniedError.md +5 -5
- package/docs/api/classes/PublicErrorBoundary.md +1 -1
- package/docs/api/classes/RBACAuditManager.md +8 -8
- package/docs/api/classes/RBACCache.md +35 -5
- package/docs/api/classes/RBACEngine.md +49 -20
- package/docs/api/classes/RBACError.md +4 -4
- package/docs/api/classes/RBACNotInitializedError.md +4 -4
- package/docs/api/classes/SecureSupabaseClient.md +1 -1
- package/docs/api/classes/StorageUtils.md +1 -1
- package/docs/api/enums/FileCategory.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +4 -4
- package/docs/api/interfaces/ButtonProps.md +1 -1
- package/docs/api/interfaces/CardProps.md +1 -1
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +1 -1
- package/docs/api/interfaces/DataAccessRecord.md +1 -1
- package/docs/api/interfaces/DataRecord.md +11 -0
- package/docs/api/interfaces/DataTableAction.md +65 -29
- package/docs/api/interfaces/DataTableColumn.md +36 -23
- package/docs/api/interfaces/DataTableProps.md +80 -38
- package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
- package/docs/api/interfaces/EmptyStateConfig.md +5 -5
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
- package/docs/api/interfaces/EventLogoProps.md +1 -1
- package/docs/api/interfaces/FileDisplayProps.md +1 -1
- package/docs/api/interfaces/FileMetadata.md +1 -1
- package/docs/api/interfaces/FileReference.md +1 -1
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadOptions.md +1 -1
- package/docs/api/interfaces/FileUploadProps.md +1 -1
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
- package/docs/api/interfaces/InputProps.md +1 -1
- package/docs/api/interfaces/LabelProps.md +1 -1
- package/docs/api/interfaces/LoginFormProps.md +1 -1
- package/docs/api/interfaces/NavigationAccessRecord.md +11 -11
- package/docs/api/interfaces/NavigationContextType.md +9 -9
- package/docs/api/interfaces/NavigationGuardProps.md +1 -1
- package/docs/api/interfaces/NavigationItem.md +1 -1
- package/docs/api/interfaces/NavigationMenuProps.md +1 -1
- package/docs/api/interfaces/NavigationProviderProps.md +7 -7
- package/docs/api/interfaces/Organisation.md +1 -1
- package/docs/api/interfaces/OrganisationContextType.md +1 -1
- package/docs/api/interfaces/OrganisationMembership.md +1 -1
- package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
- package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
- package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
- package/docs/api/interfaces/PaceLoginPageProps.md +16 -3
- package/docs/api/interfaces/PageAccessRecord.md +1 -1
- package/docs/api/interfaces/PagePermissionContextType.md +1 -1
- package/docs/api/interfaces/PagePermissionGuardProps.md +2 -2
- package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/PermissionEnforcerProps.md +4 -4
- package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
- package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
- package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
- package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
- package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
- package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
- package/docs/api/interfaces/RBACConfig.md +1 -1
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
- package/docs/api/interfaces/RouteAccessRecord.md +2 -2
- package/docs/api/interfaces/RouteConfig.md +2 -2
- package/docs/api/interfaces/SecureDataContextType.md +1 -1
- package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
- package/docs/api/interfaces/StorageConfig.md +1 -1
- package/docs/api/interfaces/StorageFileInfo.md +1 -1
- package/docs/api/interfaces/StorageFileMetadata.md +1 -1
- package/docs/api/interfaces/StorageListOptions.md +1 -1
- package/docs/api/interfaces/StorageListResult.md +1 -1
- package/docs/api/interfaces/StorageUploadOptions.md +1 -1
- package/docs/api/interfaces/StorageUploadResult.md +1 -1
- package/docs/api/interfaces/StorageUrlOptions.md +1 -1
- package/docs/api/interfaces/StyleImport.md +1 -1
- package/docs/api/interfaces/SwitchProps.md +1 -1
- package/docs/api/interfaces/ToastActionElement.md +1 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +94 -521
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +16 -16
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeOptions.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
- package/docs/api/interfaces/UserEventAccess.md +11 -11
- package/docs/api/interfaces/UserMenuProps.md +1 -1
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +251 -269
- package/docs/api-reference/components.md +193 -0
- package/docs/api-reference/hooks.md +265 -0
- package/docs/api-reference/providers.md +6 -0
- package/docs/api-reference/types.md +6 -0
- package/docs/api-reference/utilities.md +207 -0
- package/docs/architecture/README.md +6 -0
- package/docs/{database-schema-requirements.md → architecture/database-schema-requirements.md} +6 -0
- package/docs/architecture/rbac-security-architecture.md +258 -0
- package/docs/architecture/services.md +9 -1
- package/docs/best-practices/README.md +6 -0
- package/docs/best-practices/accessibility.md +6 -0
- package/docs/{common-patterns.md → best-practices/common-patterns.md} +6 -0
- package/docs/best-practices/deployment.md +6 -0
- package/docs/best-practices/performance.md +475 -2
- package/docs/best-practices/security.md +6 -0
- package/docs/best-practices/testing.md +6 -0
- package/docs/core-concepts/authentication.md +6 -0
- package/docs/core-concepts/events.md +6 -0
- package/docs/core-concepts/organisations.md +6 -0
- package/docs/core-concepts/permissions.md +6 -0
- package/docs/core-concepts/rbac-system.md +8 -0
- package/docs/documentation-index.md +121 -182
- package/docs/{consuming-app-vite-config.md → getting-started/consuming-app-vite-config.md} +6 -0
- package/docs/getting-started/documentation-index.md +40 -0
- package/docs/getting-started/examples/README.md +878 -35
- package/docs/{faq.md → getting-started/faq.md} +7 -1
- package/docs/getting-started/installation-guide.md +6 -0
- package/docs/{quick-reference.md → getting-started/quick-reference.md} +6 -0
- package/docs/implementation-guides/app-layout.md +6 -0
- package/docs/implementation-guides/authentication.md +1021 -0
- package/docs/implementation-guides/component-styling.md +6 -0
- package/docs/implementation-guides/data-tables.md +1264 -2076
- package/docs/implementation-guides/dynamic-colors.md +6 -0
- package/docs/implementation-guides/event-theming-summary.md +6 -0
- package/docs/{file-reference-system.md → implementation-guides/file-reference-system.md} +6 -0
- package/docs/implementation-guides/file-upload-storage.md +6 -0
- package/docs/implementation-guides/forms.md +6 -0
- package/docs/implementation-guides/inactivity-tracking.md +6 -0
- package/docs/implementation-guides/navigation.md +6 -0
- package/docs/implementation-guides/organisation-security.md +6 -0
- package/docs/implementation-guides/permission-enforcement.md +6 -0
- package/docs/implementation-guides/public-pages-advanced.md +6 -0
- package/docs/implementation-guides/public-pages.md +6 -0
- package/docs/migration/MIGRATION_GUIDE.md +827 -351
- package/docs/migration/README.md +7 -1
- package/docs/migration/organisation-context-timing-fix.md +6 -0
- package/docs/migration/rbac-migration.md +44 -1
- package/docs/migration/service-architecture.md +6 -0
- package/docs/migration/v0.4.15-tailwind-scanning.md +6 -0
- package/docs/migration/v0.4.16-css-first-approach.md +6 -0
- package/docs/migration/v0.4.17-source-path-fix.md +6 -0
- package/docs/rbac/README-rbac-rls-integration.md +6 -0
- package/docs/rbac/README.md +6 -0
- package/docs/rbac/advanced-patterns.md +6 -0
- package/docs/rbac/api-reference.md +7 -1
- package/docs/rbac/breaking-changes-v3.md +222 -0
- package/docs/rbac/examples/rbac-rls-integration-example.md +6 -0
- package/docs/rbac/examples.md +6 -0
- package/docs/rbac/getting-started.md +6 -0
- package/docs/rbac/migration-guide.md +260 -0
- package/docs/rbac/quick-start.md +70 -13
- package/docs/rbac/rbac-rls-integration.md +6 -0
- package/docs/rbac/super-admin-guide.md +6 -0
- package/docs/rbac/troubleshooting.md +6 -0
- package/docs/security/README.md +6 -0
- package/docs/security/checklist.md +6 -0
- package/docs/styles/README.md +7 -1
- package/docs/{usage.md → styles/usage.md} +6 -0
- package/docs/testing/README.md +6 -0
- package/docs/{visual-testing.md → testing/visual-testing.md} +6 -0
- package/docs/troubleshooting/README.md +387 -5
- package/docs/troubleshooting/cake-page-permission-guard-issue-summary.md +6 -0
- package/docs/troubleshooting/common-issues.md +6 -0
- package/docs/troubleshooting/database-view-compatibility.md +6 -0
- package/docs/troubleshooting/organisation-context-setup.md +6 -0
- package/docs/troubleshooting/react-hooks-issue-analysis.md +6 -0
- package/docs/troubleshooting/styling-issues.md +6 -0
- package/docs/troubleshooting/tailwind-content-scanning.md +6 -0
- package/package.json +1 -1
- package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -1
- package/src/__tests__/helpers/test-providers.tsx +3 -53
- package/src/components/DataTable/DataTable.test.tsx +319 -0
- package/src/components/DataTable/DataTable.tsx +32 -11
- package/src/components/DataTable/__tests__/{DataTable.comprehensive.test.tsx → DataTable.comprehensive.test.tsx.skip} +6 -4
- package/src/components/DataTable/__tests__/{DataTable.test.tsx → DataTable.test.tsx.skip} +6 -4
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +31 -9
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +601 -0
- package/src/components/DataTable/__tests__/keyboard.test.tsx +615 -0
- package/src/components/DataTable/__tests__/pagination.modes.test.tsx +639 -0
- package/src/components/DataTable/__tests__/ssr.strict-mode.test.tsx.skip +330 -0
- package/src/components/DataTable/components/AccessDeniedPage.tsx +2 -2
- package/src/components/DataTable/components/ActionButtons.tsx +88 -104
- package/src/components/DataTable/components/DataTableCore.tsx +309 -337
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +4 -2
- package/src/components/DataTable/components/DataTableModals.tsx +22 -1
- package/src/components/DataTable/components/EditableRow.tsx +69 -84
- package/src/components/DataTable/components/EmptyState.tsx +5 -1
- package/src/components/DataTable/components/ImportModal.tsx +65 -36
- package/src/components/DataTable/components/PaginationControls.tsx +40 -100
- package/src/components/DataTable/components/UnifiedTableBody.tsx +125 -148
- package/src/components/DataTable/context/DataTableContext.tsx +1 -1
- package/src/components/DataTable/core/ColumnFactory.ts +5 -0
- package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +12 -10
- package/src/components/DataTable/examples/HierarchicalExample.tsx +1 -1
- package/src/components/DataTable/examples/InitialPageSizeExample.tsx +1 -0
- package/src/components/DataTable/examples/PerformanceExample.tsx +1 -0
- package/src/components/DataTable/hooks/__tests__/useColumnOrderPersistence.test.ts +1 -5
- package/src/components/DataTable/hooks/__tests__/useColumnVisibilityPersistence.test.ts +167 -0
- package/src/components/DataTable/hooks/index.ts +7 -0
- package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +32 -15
- package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +102 -0
- package/src/components/DataTable/hooks/useDataTableConfiguration.ts +89 -0
- package/src/components/DataTable/hooks/useDataTableDataPipeline.ts +117 -0
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +71 -27
- package/src/components/DataTable/hooks/useDataTableState.ts +39 -11
- package/src/components/DataTable/hooks/useEffectiveColumnOrder.ts +33 -0
- package/src/components/DataTable/hooks/useHierarchicalState.ts +15 -1
- package/src/components/DataTable/hooks/useKeyboardNavigation.ts +447 -0
- package/src/components/DataTable/hooks/useServerSideDataEffect.ts +94 -0
- package/src/components/DataTable/hooks/useTableColumns.ts +10 -7
- package/src/components/DataTable/hooks/useTableHandlers.ts +174 -0
- package/src/components/DataTable/index.ts +12 -3
- package/src/components/DataTable/types.ts +129 -9
- package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +159 -22
- package/src/components/DataTable/utils/__tests__/flexibleImport.test.ts +111 -0
- package/src/components/DataTable/utils/__tests__/rowUtils.test.ts +15 -29
- package/src/components/DataTable/utils/a11yUtils.ts +244 -0
- package/src/components/DataTable/utils/debugTools.ts +609 -0
- package/src/components/DataTable/utils/exportUtils.ts +114 -16
- package/src/components/DataTable/utils/flexibleImport.ts +202 -32
- package/src/components/DataTable/utils/hierarchicalUtils.ts +1 -1
- package/src/components/DataTable/utils/index.ts +2 -0
- package/src/components/DataTable/utils/paginationUtils.ts +350 -0
- package/src/components/DataTable/utils/rowUtils.ts +6 -5
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +19 -24
- package/src/components/NavigationMenu/NavigationMenu.tsx +19 -8
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +1 -23
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +56 -6
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +137 -13
- package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +1 -1
- package/src/components/Select/Select.tsx +1 -0
- package/src/components/examples/PermissionExample.tsx +173 -0
- package/src/examples/CorrectPublicPageImplementation.tsx +301 -0
- package/src/examples/PublicEventPage.tsx +274 -0
- package/src/examples/PublicPageApp.tsx +308 -0
- package/src/examples/PublicPageUsageExample.tsx +216 -0
- package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +12 -1
- package/src/hooks/__tests__/useOrganisationSecurity.unit.test.tsx +129 -17
- package/src/hooks/__tests__/useRBAC.unit.test.ts +151 -846
- package/src/hooks/useOrganisationPermissions.test.ts +42 -18
- package/src/hooks/useOrganisationPermissions.ts +12 -6
- package/src/hooks/useOrganisationSecurity.test.ts +138 -85
- package/src/hooks/useOrganisationSecurity.ts +41 -10
- package/src/index.ts +0 -1
- package/src/providers/AuthProvider.simplified.tsx +880 -0
- package/src/providers/UnifiedAuthProvider.test.simple.tsx +8 -8
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +29 -19
- package/src/providers/index.ts +0 -1
- package/src/providers/services/EventServiceProvider.tsx +19 -15
- package/src/providers/services/InactivityServiceProvider.tsx +19 -15
- package/src/providers/services/OrganisationServiceProvider.tsx +19 -15
- package/src/providers/services/UnifiedAuthProvider.tsx +156 -127
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +1 -1
- package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +3 -3
- package/src/rbac/README.md +1 -1
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +25 -27
- package/src/rbac/__tests__/auth-rbac-security.integration.test.tsx +313 -0
- package/src/rbac/__tests__/engine.comprehensive.test.ts +114 -348
- package/src/rbac/__tests__/rbac-engine-core-logic.test.ts +28 -110
- package/src/rbac/__tests__/rbac-engine-simplified.test.ts +33 -85
- package/src/rbac/__tests__/scenarios.user-role.test.tsx +2 -2
- package/src/rbac/adapters.tsx +26 -69
- package/src/rbac/api.test.ts +90 -27
- package/src/rbac/api.ts +61 -10
- package/src/rbac/audit.test.ts +33 -38
- package/src/rbac/audit.ts +21 -6
- package/src/rbac/cache.ts +33 -1
- package/src/rbac/components/NavigationGuard.tsx +11 -11
- package/src/rbac/components/NavigationProvider.test.tsx +11 -5
- package/src/rbac/components/NavigationProvider.tsx +37 -13
- package/src/rbac/components/PagePermissionGuard.tsx +111 -50
- package/src/rbac/components/PagePermissionProvider.tsx +5 -5
- package/src/rbac/components/PermissionEnforcer.tsx +11 -11
- package/src/rbac/components/RoleBasedRouter.tsx +5 -5
- package/src/rbac/components/SecureDataProvider.tsx +5 -5
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +8 -8
- package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +14 -14
- package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +12 -12
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +6 -6
- package/src/rbac/engine.test.simple.ts +19 -13
- package/src/rbac/engine.test.ts +1 -0
- package/src/rbac/engine.ts +330 -766
- package/src/rbac/errors.ts +156 -0
- package/src/rbac/hooks/usePermissions.ts +32 -10
- package/src/rbac/hooks/useRBAC.test.ts +126 -512
- package/src/rbac/hooks/useRBAC.ts +147 -193
- package/src/rbac/hooks/useResolvedScope.ts +12 -0
- package/src/rbac/index.ts +7 -4
- package/src/rbac/security.ts +109 -18
- package/src/rbac/types.ts +12 -1
- package/src/services/AuthService.ts +2 -15
- package/src/services/EventService.ts +43 -46
- package/src/services/OrganisationService.ts +51 -31
- package/src/services/__tests__/AuthService.test.ts +1 -1
- package/src/services/__tests__/EventService.test.ts +1 -1
- package/src/services/__tests__/OrganisationService.test.ts +1 -1
- package/src/services/base/BaseService.ts +8 -0
- package/src/styles/base.css +208 -0
- package/src/styles/semantic.css +24 -0
- package/src/types/database.generated.ts +7347 -0
- package/src/types/database.ts +20 -0
- package/src/utils/logger.ts +179 -0
- package/src/utils/organisationContext.ts +11 -4
- package/src/utils/storage/__tests__/helpers.unit.test.ts +6 -2
- package/dist/appNameResolver-UURKN7NF.js +0 -22
- package/dist/audit-6TOCAMKO.js.map +0 -1
- package/dist/chunk-B2WTCLCV.js.map +0 -1
- package/dist/chunk-FGMFQSHX.js.map +0 -1
- package/dist/chunk-K34IM5CT.js.map +0 -1
- package/dist/chunk-KHJS6VIA.js.map +0 -1
- package/dist/chunk-KK73ZB4E.js.map +0 -1
- package/dist/chunk-M5IWZRBT.js.map +0 -1
- package/dist/chunk-ULBI5JGB.js +0 -109
- package/dist/chunk-ULBI5JGB.js.map +0 -1
- package/dist/chunk-WN6XJWOS.js.map +0 -1
- package/dist/chunk-XLZ7U46Z.js.map +0 -1
- package/dist/chunk-Y6TXWPJO.js.map +0 -1
- package/docs/DOCUMENTATION_CHECKLIST.md +0 -281
- package/docs/TERMINOLOGY.md +0 -231
- package/docs/api/interfaces/RBACContextType.md +0 -468
- package/docs/api/interfaces/RBACProviderProps.md +0 -107
- package/docs/best-practices/performance-expansion.md +0 -473
- package/docs/breaking-changes.md +0 -179
- package/docs/consuming-app-example.md +0 -290
- package/docs/documentation-templates.md +0 -539
- package/docs/examples/navigation-menu-auth-fix.md +0 -344
- package/docs/getting-started/examples/basic-auth-app.md +0 -520
- package/docs/getting-started/examples/full-featured-app.md +0 -616
- package/docs/getting-started/quick-start.md +0 -376
- package/docs/implementation-guides/datatable-filtering.md +0 -313
- package/docs/implementation-guides/datatable-rbac-usage.md +0 -317
- package/docs/implementation-guides/hierarchical-datatable.md +0 -850
- package/docs/implementation-guides/large-datasets.md +0 -281
- package/docs/implementation-guides/performance.md +0 -403
- package/docs/migration/quick-migration-guide.md +0 -320
- package/docs/migration-guide.md +0 -193
- package/docs/migration-guides/unified-auth-provider-mandatory-timeouts.md +0 -226
- package/docs/performance/README.md +0 -551
- package/docs/style-guide.md +0 -964
- package/docs/troubleshooting/authentication-issues.md +0 -334
- package/docs/troubleshooting/debugging.md +0 -1117
- package/docs/troubleshooting/migration.md +0 -918
- package/src/__tests__/hooks/usePermissions.test.ts +0 -261
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.rbac.test.tsx +0 -574
- package/src/hooks/__tests__/ServiceHooks.test.tsx +0 -613
- package/src/hooks/services/__tests__/useServiceHooks.test.tsx +0 -137
- package/src/hooks/services/usePermissions.ts +0 -70
- package/src/hooks/services/useRBACService.ts +0 -30
- package/src/hooks/usePermissionCheck.ts +0 -150
- package/src/providers/__tests__/ServiceProviders.test.tsx +0 -477
- package/src/providers/services/RBACServiceProvider.tsx +0 -79
- package/src/rbac/__tests__/integration.authflow.test.tsx +0 -119
- package/src/rbac/__tests__/integration.navigation.test.tsx +0 -69
- package/src/rbac/__tests__/integration.securedata.test.tsx +0 -92
- package/src/rbac/__tests__/integration.smoke.test.tsx +0 -73
- package/src/rbac/providers/RBACProvider.tsx +0 -645
- package/src/rbac/providers/__tests__/RBACProvider.integration.test.tsx +0 -688
- package/src/rbac/providers/__tests__/RBACProvider.test.tsx +0 -1186
- package/src/rbac/providers/index.ts +0 -11
- package/src/services/RBACService.ts +0 -522
- package/src/services/__tests__/RBACService.test.ts +0 -492
- package/src/services/interfaces/IRBACService.ts +0 -62
- package/src/utils/appNameResolver.test 2.ts +0 -494
- /package/dist/{DataTable-4GAVPIEG.js.map → DataTable-ETGVF4Y5.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-3NKDOSOK.js.map → UnifiedAuthProvider-P5SOJAQ6.js.map} +0 -0
- /package/dist/{api-DDMUKIUD.js.map → api-KG4A2X7P.js.map} +0 -0
- /package/dist/{appNameResolver-UURKN7NF.js.map → audit-65VNHEV2.js.map} +0 -0
- /package/dist/{chunk-NTNILOBC.js.map → chunk-5BO3MI5Y.js.map} +0 -0
- /package/dist/{chunk-URUTVZ7N.js.map → chunk-FL4ZCQLD.js.map} +0 -0
- /package/dist/{chunk-LW7MMEAQ.js.map → chunk-FT2M4R4F.js.map} +0 -0
- /package/dist/{chunk-AFGTSUAD.js.map → chunk-VSOKOFRF.js.map} +0 -0
- /package/docs/{app.css.example → styles/app.css.example} +0 -0
|
@@ -1,520 +0,0 @@
|
|
|
1
|
-
# Basic Authentication App
|
|
2
|
-
|
|
3
|
-
> **🎯 Perfect for**: Learning the basics, simple apps, prototypes
|
|
4
|
-
> **⏱️ Build Time**: ~15 minutes
|
|
5
|
-
> **Prerequisites**: Node.js 18+, basic React knowledge
|
|
6
|
-
|
|
7
|
-
A minimal PACE Core application demonstrating authentication, basic UI components, and responsive design.
|
|
8
|
-
|
|
9
|
-
## 🎯 What You'll Build
|
|
10
|
-
|
|
11
|
-
A simple dashboard app with:
|
|
12
|
-
- User login/logout functionality
|
|
13
|
-
- Basic dashboard with user info
|
|
14
|
-
- Simple navigation
|
|
15
|
-
- Responsive design
|
|
16
|
-
- Permission-based content
|
|
17
|
-
|
|
18
|
-
## 🚀 Step-by-Step Implementation
|
|
19
|
-
|
|
20
|
-
### 1. Project Setup
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
# Create new React app
|
|
24
|
-
npx create-react-app basic-auth-app --template typescript
|
|
25
|
-
cd basic-auth-app
|
|
26
|
-
|
|
27
|
-
# Install PACE Core
|
|
28
|
-
npm install @jmruthers/pace-core
|
|
29
|
-
|
|
30
|
-
# Install additional dependencies
|
|
31
|
-
npm install @supabase/supabase-js react-router-dom
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
### 2. Environment Configuration
|
|
35
|
-
|
|
36
|
-
Create `.env.local`:
|
|
37
|
-
```env
|
|
38
|
-
VITE_SUPABASE_URL=your_supabase_url
|
|
39
|
-
VITE_SUPABASE_ANON_KEY=your_supabase_anon_key
|
|
40
|
-
VITE_APP_NAME=Basic Auth App
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
### 3. Supabase Setup
|
|
44
|
-
|
|
45
|
-
Create a new Supabase project and set up the database:
|
|
46
|
-
|
|
47
|
-
```sql
|
|
48
|
-
-- Create users table
|
|
49
|
-
CREATE TABLE users (
|
|
50
|
-
id UUID REFERENCES auth.users(id) PRIMARY KEY,
|
|
51
|
-
email TEXT UNIQUE NOT NULL,
|
|
52
|
-
name TEXT,
|
|
53
|
-
role TEXT DEFAULT 'user',
|
|
54
|
-
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
-- Enable RLS
|
|
58
|
-
ALTER TABLE users ENABLE ROW LEVEL SECURITY;
|
|
59
|
-
|
|
60
|
-
-- Create policy
|
|
61
|
-
CREATE POLICY "Users can view their own data" ON users
|
|
62
|
-
FOR SELECT USING (auth.uid() = id);
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
### 4. App Structure
|
|
66
|
-
|
|
67
|
-
```
|
|
68
|
-
src/
|
|
69
|
-
├── components/
|
|
70
|
-
│ ├── Dashboard.tsx
|
|
71
|
-
│ ├── LoginForm.tsx
|
|
72
|
-
│ └── Navigation.tsx
|
|
73
|
-
├── hooks/
|
|
74
|
-
│ └── useSupabase.ts
|
|
75
|
-
├── types/
|
|
76
|
-
│ └── index.ts
|
|
77
|
-
├── App.tsx
|
|
78
|
-
├── main.tsx
|
|
79
|
-
└── index.css
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
### 5. Supabase Client Setup
|
|
83
|
-
|
|
84
|
-
`src/hooks/useSupabase.ts`:
|
|
85
|
-
```tsx
|
|
86
|
-
import { createClient } from '@supabase/supabase-js';
|
|
87
|
-
|
|
88
|
-
const supabaseUrl = import.meta.env.VITE_SUPABASE_URL;
|
|
89
|
-
const supabaseKey = import.meta.env.VITE_SUPABASE_ANON_KEY;
|
|
90
|
-
|
|
91
|
-
export const supabase = createClient(supabaseUrl, supabaseKey);
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
### 6. Types Definition
|
|
95
|
-
|
|
96
|
-
`src/types/index.ts`:
|
|
97
|
-
```tsx
|
|
98
|
-
export interface User {
|
|
99
|
-
id: string;
|
|
100
|
-
email: string;
|
|
101
|
-
name: string;
|
|
102
|
-
role: 'admin' | 'user';
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
export interface AuthState {
|
|
106
|
-
user: User | null;
|
|
107
|
-
loading: boolean;
|
|
108
|
-
error: string | null;
|
|
109
|
-
}
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
### 7. Main App Component
|
|
113
|
-
|
|
114
|
-
`src/App.tsx`:
|
|
115
|
-
```tsx
|
|
116
|
-
import React from 'react';
|
|
117
|
-
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
|
|
118
|
-
import { UnifiedAuthProvider } from '@jmruthers/pace-core';
|
|
119
|
-
import { supabase } from './hooks/useSupabase';
|
|
120
|
-
import LoginForm from './components/LoginForm';
|
|
121
|
-
import Dashboard from './components/Dashboard';
|
|
122
|
-
import '@jmruthers/pace-core/src/styles/core.css';
|
|
123
|
-
|
|
124
|
-
function App() {
|
|
125
|
-
return (
|
|
126
|
-
<UnifiedAuthProvider
|
|
127
|
-
supabaseClient={supabase}
|
|
128
|
-
appName="Basic Auth App"
|
|
129
|
-
>
|
|
130
|
-
<Router>
|
|
131
|
-
<div className="min-h-screen bg-gray-50">
|
|
132
|
-
<Routes>
|
|
133
|
-
<Route path="/login" element={<LoginForm />} />
|
|
134
|
-
<Route path="/" element={<Dashboard />} />
|
|
135
|
-
<Route path="/dashboard" element={<Dashboard />} />
|
|
136
|
-
</Routes>
|
|
137
|
-
</div>
|
|
138
|
-
</Router>
|
|
139
|
-
</UnifiedAuthProvider>
|
|
140
|
-
);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
export default App;
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
### 8. Login Form Component
|
|
147
|
-
|
|
148
|
-
`src/components/LoginForm.tsx`:
|
|
149
|
-
```tsx
|
|
150
|
-
import React, { useState } from 'react';
|
|
151
|
-
import { useNavigate } from 'react-router-dom';
|
|
152
|
-
import { Button, Card, Input, Alert } from '@jmruthers/pace-core';
|
|
153
|
-
import { useUnifiedAuth } from '@jmruthers/pace-core';
|
|
154
|
-
|
|
155
|
-
const LoginForm: React.FC = () => {
|
|
156
|
-
const [email, setEmail] = useState('');
|
|
157
|
-
const [password, setPassword] = useState('');
|
|
158
|
-
const [loading, setLoading] = useState(false);
|
|
159
|
-
const [error, setError] = useState('');
|
|
160
|
-
const navigate = useNavigate();
|
|
161
|
-
const { signIn } = useUnifiedAuth();
|
|
162
|
-
|
|
163
|
-
const handleSubmit = async (e: React.FormEvent) => {
|
|
164
|
-
e.preventDefault();
|
|
165
|
-
setLoading(true);
|
|
166
|
-
setError('');
|
|
167
|
-
|
|
168
|
-
try {
|
|
169
|
-
await signIn({ email, password });
|
|
170
|
-
navigate('/dashboard');
|
|
171
|
-
} catch (err) {
|
|
172
|
-
setError(err instanceof Error ? err.message : 'Login failed');
|
|
173
|
-
} finally {
|
|
174
|
-
setLoading(false);
|
|
175
|
-
}
|
|
176
|
-
};
|
|
177
|
-
|
|
178
|
-
return (
|
|
179
|
-
<div className="min-h-screen flex items-center justify-center bg-gray-50 py-12 px-4 sm:px-6 lg:px-8">
|
|
180
|
-
<div className="max-w-md w-full space-y-8">
|
|
181
|
-
<div>
|
|
182
|
-
<h2 className="mt-6 text-center text-3xl font-extrabold text-gray-900">
|
|
183
|
-
Sign in to your account
|
|
184
|
-
</h2>
|
|
185
|
-
</div>
|
|
186
|
-
|
|
187
|
-
<Card className="mt-8 space-y-6 p-8">
|
|
188
|
-
<form onSubmit={handleSubmit} className="space-y-6">
|
|
189
|
-
{error && (
|
|
190
|
-
<Alert variant="destructive">
|
|
191
|
-
{error}
|
|
192
|
-
</Alert>
|
|
193
|
-
)}
|
|
194
|
-
|
|
195
|
-
<div>
|
|
196
|
-
<Input
|
|
197
|
-
label="Email address"
|
|
198
|
-
type="email"
|
|
199
|
-
value={email}
|
|
200
|
-
onChange={(e) => setEmail(e.target.value)}
|
|
201
|
-
required
|
|
202
|
-
placeholder="Enter your email"
|
|
203
|
-
/>
|
|
204
|
-
</div>
|
|
205
|
-
|
|
206
|
-
<div>
|
|
207
|
-
<Input
|
|
208
|
-
label="Password"
|
|
209
|
-
type="password"
|
|
210
|
-
value={password}
|
|
211
|
-
onChange={(e) => setPassword(e.target.value)}
|
|
212
|
-
required
|
|
213
|
-
placeholder="Enter your password"
|
|
214
|
-
/>
|
|
215
|
-
</div>
|
|
216
|
-
|
|
217
|
-
<Button
|
|
218
|
-
type="submit"
|
|
219
|
-
className="w-full"
|
|
220
|
-
disabled={loading}
|
|
221
|
-
>
|
|
222
|
-
{loading ? 'Signing in...' : 'Sign in'}
|
|
223
|
-
</Button>
|
|
224
|
-
</form>
|
|
225
|
-
</Card>
|
|
226
|
-
</div>
|
|
227
|
-
</div>
|
|
228
|
-
);
|
|
229
|
-
};
|
|
230
|
-
|
|
231
|
-
export default LoginForm;
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
### 9. Dashboard Component
|
|
235
|
-
|
|
236
|
-
`src/components/Dashboard.tsx`:
|
|
237
|
-
```tsx
|
|
238
|
-
import React from 'react';
|
|
239
|
-
import { useNavigate } from 'react-router-dom';
|
|
240
|
-
import {
|
|
241
|
-
Card,
|
|
242
|
-
Button,
|
|
243
|
-
Alert,
|
|
244
|
-
PaceAppLayout,
|
|
245
|
-
Header,
|
|
246
|
-
UserMenu
|
|
247
|
-
} from '@jmruthers/pace-core';
|
|
248
|
-
import { useUnifiedAuth } from '@jmruthers/pace-core';
|
|
249
|
-
|
|
250
|
-
const Dashboard: React.FC = () => {
|
|
251
|
-
const { user, signOut, loading } = useUnifiedAuth();
|
|
252
|
-
const navigate = useNavigate();
|
|
253
|
-
|
|
254
|
-
if (loading) {
|
|
255
|
-
return (
|
|
256
|
-
<div className="min-h-screen flex items-center justify-center">
|
|
257
|
-
<div className="text-center">
|
|
258
|
-
<div className="animate-spin rounded-full h-32 w-32 border-b-2 border-blue-600 mx-auto"></div>
|
|
259
|
-
<p className="mt-4 text-gray-600">Loading...</p>
|
|
260
|
-
</div>
|
|
261
|
-
</div>
|
|
262
|
-
);
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
if (!user) {
|
|
266
|
-
navigate('/login');
|
|
267
|
-
return null;
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
const handleLogout = async () => {
|
|
271
|
-
await signOut();
|
|
272
|
-
navigate('/login');
|
|
273
|
-
};
|
|
274
|
-
|
|
275
|
-
const navigationItems = [
|
|
276
|
-
{ label: 'Dashboard', href: '/dashboard', icon: 'Home' },
|
|
277
|
-
{ label: 'Profile', href: '/profile', icon: 'User' },
|
|
278
|
-
{ label: 'Settings', href: '/settings', icon: 'Settings' }
|
|
279
|
-
];
|
|
280
|
-
|
|
281
|
-
return (
|
|
282
|
-
<PaceAppLayout
|
|
283
|
-
title="Basic Auth App"
|
|
284
|
-
user={user}
|
|
285
|
-
onLogout={handleLogout}
|
|
286
|
-
navigation={navigationItems}
|
|
287
|
-
>
|
|
288
|
-
<div className="p-6">
|
|
289
|
-
<div className="mb-6">
|
|
290
|
-
<h1 className="text-3xl font-bold text-gray-900">Welcome, {user.name || user.email}!</h1>
|
|
291
|
-
<p className="text-gray-600">This is your basic dashboard.</p>
|
|
292
|
-
</div>
|
|
293
|
-
|
|
294
|
-
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
|
|
295
|
-
<Card>
|
|
296
|
-
<div className="p-6">
|
|
297
|
-
<h3 className="text-lg font-semibold text-gray-900 mb-2">User Info</h3>
|
|
298
|
-
<p className="text-gray-600 mb-4">Your account details</p>
|
|
299
|
-
<div className="space-y-2">
|
|
300
|
-
<p><strong>Email:</strong> {user.email}</p>
|
|
301
|
-
<p><strong>Role:</strong> {user.role}</p>
|
|
302
|
-
<p><strong>ID:</strong> {user.id}</p>
|
|
303
|
-
</div>
|
|
304
|
-
</div>
|
|
305
|
-
</Card>
|
|
306
|
-
|
|
307
|
-
<Card>
|
|
308
|
-
<div className="p-6">
|
|
309
|
-
<h3 className="text-lg font-semibold text-gray-900 mb-2">Quick Actions</h3>
|
|
310
|
-
<p className="text-gray-600 mb-4">Common tasks</p>
|
|
311
|
-
<div className="space-y-2">
|
|
312
|
-
<Button variant="outline" className="w-full justify-start">
|
|
313
|
-
Edit Profile
|
|
314
|
-
</Button>
|
|
315
|
-
<Button variant="outline" className="w-full justify-start">
|
|
316
|
-
Change Password
|
|
317
|
-
</Button>
|
|
318
|
-
<Button variant="outline" className="w-full justify-start">
|
|
319
|
-
View Settings
|
|
320
|
-
</Button>
|
|
321
|
-
</div>
|
|
322
|
-
</div>
|
|
323
|
-
</Card>
|
|
324
|
-
|
|
325
|
-
<Card>
|
|
326
|
-
<div className="p-6">
|
|
327
|
-
<h3 className="text-lg font-semibold text-gray-900 mb-2">System Status</h3>
|
|
328
|
-
<p className="text-gray-600 mb-4">Application health</p>
|
|
329
|
-
<Alert>
|
|
330
|
-
<div className="flex items-center">
|
|
331
|
-
<div className="w-2 h-2 bg-green-500 rounded-full mr-2"></div>
|
|
332
|
-
All systems operational
|
|
333
|
-
</div>
|
|
334
|
-
</Alert>
|
|
335
|
-
</div>
|
|
336
|
-
</Card>
|
|
337
|
-
</div>
|
|
338
|
-
|
|
339
|
-
<div className="mt-8">
|
|
340
|
-
<Card>
|
|
341
|
-
<div className="p-6">
|
|
342
|
-
<h3 className="text-lg font-semibold text-gray-900 mb-4">Recent Activity</h3>
|
|
343
|
-
<div className="space-y-3">
|
|
344
|
-
<div className="flex items-center justify-between py-2 border-b border-gray-200">
|
|
345
|
-
<span className="text-gray-600">Logged in successfully</span>
|
|
346
|
-
<span className="text-sm text-gray-500">Just now</span>
|
|
347
|
-
</div>
|
|
348
|
-
<div className="flex items-center justify-between py-2 border-b border-gray-200">
|
|
349
|
-
<span className="text-gray-600">Account created</span>
|
|
350
|
-
<span className="text-sm text-gray-500">2 days ago</span>
|
|
351
|
-
</div>
|
|
352
|
-
</div>
|
|
353
|
-
</div>
|
|
354
|
-
</Card>
|
|
355
|
-
</div>
|
|
356
|
-
</div>
|
|
357
|
-
</PaceAppLayout>
|
|
358
|
-
);
|
|
359
|
-
};
|
|
360
|
-
|
|
361
|
-
export default Dashboard;
|
|
362
|
-
```
|
|
363
|
-
|
|
364
|
-
### 10. Navigation Component
|
|
365
|
-
|
|
366
|
-
`src/components/Navigation.tsx`:
|
|
367
|
-
```tsx
|
|
368
|
-
import React from 'react';
|
|
369
|
-
import { Link, useLocation } from 'react-router-dom';
|
|
370
|
-
import { NavigationMenu } from '@jmruthers/pace-core';
|
|
371
|
-
|
|
372
|
-
const Navigation: React.FC = () => {
|
|
373
|
-
const location = useLocation();
|
|
374
|
-
|
|
375
|
-
const navigationItems = [
|
|
376
|
-
{ label: 'Dashboard', href: '/dashboard', icon: 'Home' },
|
|
377
|
-
{ label: 'Profile', href: '/profile', icon: 'User' },
|
|
378
|
-
{ label: 'Settings', href: '/settings', icon: 'Settings' }
|
|
379
|
-
];
|
|
380
|
-
|
|
381
|
-
return (
|
|
382
|
-
<NavigationMenu
|
|
383
|
-
items={navigationItems}
|
|
384
|
-
currentPath={location.pathname}
|
|
385
|
-
onNavigate={(href) => {
|
|
386
|
-
// Navigation is handled by React Router
|
|
387
|
-
window.location.href = href;
|
|
388
|
-
}}
|
|
389
|
-
/>
|
|
390
|
-
);
|
|
391
|
-
};
|
|
392
|
-
|
|
393
|
-
export default Navigation;
|
|
394
|
-
```
|
|
395
|
-
|
|
396
|
-
### 11. Vite Configuration
|
|
397
|
-
|
|
398
|
-
`vite.config.ts`:
|
|
399
|
-
```ts
|
|
400
|
-
import { defineConfig } from 'vite';
|
|
401
|
-
import react from '@vitejs/plugin-react';
|
|
402
|
-
import tailwindcss from '@tailwindcss/vite';
|
|
403
|
-
|
|
404
|
-
export default defineConfig({
|
|
405
|
-
plugins: [
|
|
406
|
-
react(),
|
|
407
|
-
tailwindcss({
|
|
408
|
-
content: [
|
|
409
|
-
'./src/**/*.{js,ts,jsx,tsx}',
|
|
410
|
-
'./node_modules/@jmruthers/pace-core/**/*.{js,ts,jsx,tsx}'
|
|
411
|
-
]
|
|
412
|
-
})
|
|
413
|
-
],
|
|
414
|
-
server: {
|
|
415
|
-
port: 3000,
|
|
416
|
-
open: true
|
|
417
|
-
}
|
|
418
|
-
});
|
|
419
|
-
```
|
|
420
|
-
|
|
421
|
-
### 12. Package.json Scripts
|
|
422
|
-
|
|
423
|
-
```json
|
|
424
|
-
{
|
|
425
|
-
"scripts": {
|
|
426
|
-
"dev": "vite",
|
|
427
|
-
"build": "tsc && vite build",
|
|
428
|
-
"preview": "vite preview",
|
|
429
|
-
"type-check": "tsc --noEmit"
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
```
|
|
433
|
-
|
|
434
|
-
## 🚀 Running the App
|
|
435
|
-
|
|
436
|
-
```bash
|
|
437
|
-
# Start development server
|
|
438
|
-
npm run dev
|
|
439
|
-
|
|
440
|
-
# Build for production
|
|
441
|
-
npm run build
|
|
442
|
-
|
|
443
|
-
# Preview production build
|
|
444
|
-
npm run preview
|
|
445
|
-
```
|
|
446
|
-
|
|
447
|
-
## 🎯 Features Demonstrated
|
|
448
|
-
|
|
449
|
-
### Authentication
|
|
450
|
-
- ✅ User login with email/password
|
|
451
|
-
- ✅ Session management
|
|
452
|
-
- ✅ Automatic redirects
|
|
453
|
-
- ✅ Loading states
|
|
454
|
-
- ✅ Error handling
|
|
455
|
-
|
|
456
|
-
### UI Components
|
|
457
|
-
- ✅ Card layouts
|
|
458
|
-
- ✅ Form inputs
|
|
459
|
-
- ✅ Buttons with variants
|
|
460
|
-
- ✅ Alerts and notifications
|
|
461
|
-
- ✅ Responsive design
|
|
462
|
-
|
|
463
|
-
### Layout
|
|
464
|
-
- ✅ App layout with header
|
|
465
|
-
- ✅ Navigation menu
|
|
466
|
-
- ✅ User menu
|
|
467
|
-
- ✅ Responsive sidebar
|
|
468
|
-
|
|
469
|
-
### State Management
|
|
470
|
-
- ✅ Authentication state
|
|
471
|
-
- ✅ User data
|
|
472
|
-
- ✅ Loading states
|
|
473
|
-
- ✅ Error states
|
|
474
|
-
|
|
475
|
-
## 🔧 Customization
|
|
476
|
-
|
|
477
|
-
### Adding New Pages
|
|
478
|
-
|
|
479
|
-
1. Create new component in `src/components/`
|
|
480
|
-
2. Add route in `App.tsx`
|
|
481
|
-
3. Add navigation item in `Navigation.tsx`
|
|
482
|
-
|
|
483
|
-
### Styling
|
|
484
|
-
|
|
485
|
-
The app uses PACE Core's design system. You can customize:
|
|
486
|
-
- Colors via CSS variables
|
|
487
|
-
- Typography via Tailwind classes
|
|
488
|
-
- Component variants via props
|
|
489
|
-
|
|
490
|
-
### Adding Features
|
|
491
|
-
|
|
492
|
-
- **Forms**: Use PACE Core's Form components
|
|
493
|
-
- **Data Tables**: Add DataTable for data management
|
|
494
|
-
- **Permissions**: Implement RBAC with useCan hook
|
|
495
|
-
|
|
496
|
-
## 📚 Next Steps
|
|
497
|
-
|
|
498
|
-
- **[Full-Featured App](./full-featured-app.md)** - Complete application with all features
|
|
499
|
-
- **[Data Tables Guide](../implementation-guides/data-tables.md)** - Advanced data management
|
|
500
|
-
- **[Forms Guide](../implementation-guides/forms.md)** - Form handling and validation
|
|
501
|
-
- **[RBAC Guide](../../rbac/README.md)** - Role-based access control
|
|
502
|
-
|
|
503
|
-
## 🐛 Troubleshooting
|
|
504
|
-
|
|
505
|
-
### Common Issues
|
|
506
|
-
|
|
507
|
-
**Styling not working:**
|
|
508
|
-
- Ensure CSS import is first: `import '@jmruthers/pace-core/src/styles/core.css';`
|
|
509
|
-
- Check Vite configuration for content scanning
|
|
510
|
-
|
|
511
|
-
**Authentication not working:**
|
|
512
|
-
- Verify Supabase credentials in `.env.local`
|
|
513
|
-
- Check database setup and RLS policies
|
|
514
|
-
|
|
515
|
-
**Build errors:**
|
|
516
|
-
- Clear node_modules and reinstall
|
|
517
|
-
- Check TypeScript configuration
|
|
518
|
-
- Verify all imports are correct
|
|
519
|
-
|
|
520
|
-
For more help, see the [Troubleshooting Guide](../../troubleshooting/README.md).
|