@jmruthers/pace-core 0.5.191 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/README.md +7 -1
- package/cursor-rules/00-pace-core-compliance.mdc +372 -0
- package/cursor-rules/01-standards-compliance.mdc +275 -0
- package/cursor-rules/02-project-structure.mdc +200 -0
- package/cursor-rules/03-solid-principles.mdc +341 -0
- package/cursor-rules/04-testing-standards.mdc +315 -0
- package/cursor-rules/05-bug-reports-and-features.mdc +246 -0
- package/cursor-rules/06-code-quality.mdc +392 -0
- package/cursor-rules/07-tech-stack-compliance.mdc +309 -0
- package/cursor-rules/CHANGELOG.md +101 -0
- package/cursor-rules/README.md +191 -0
- package/dist/{AuthService-CbP_utw2.d.ts → AuthService-DjnJHDtC.d.ts} +1 -0
- package/dist/{DataTable-Be6dH_dR.d.ts → DataTable-CH1U5Tpy.d.ts} +1 -1
- package/dist/{DataTable-WKRZD47S.js → DataTable-DQ7RSOHE.js} +8 -7
- package/dist/{PublicPageProvider-ULXC_u6U.d.ts → PublicPageProvider-ce4xlHYA.d.ts} +37 -156
- package/dist/{UnifiedAuthProvider-BYA9qB-o.d.ts → UnifiedAuthProvider-185Ih4dj.d.ts} +2 -0
- package/dist/{UnifiedAuthProvider-FTSG5XH7.js → UnifiedAuthProvider-ATAP5UTR.js} +3 -3
- package/dist/{api-IHKALJZD.js → api-N774RPUA.js} +2 -2
- package/dist/{chunk-6C4YBBJM.js → chunk-3QRJFVBR.js} +1 -1
- package/dist/chunk-3QRJFVBR.js.map +1 -0
- package/dist/{chunk-OETXORNB.js → chunk-3XTALGJF.js} +211 -136
- package/dist/chunk-3XTALGJF.js.map +1 -0
- package/dist/{chunk-6TQDD426.js → chunk-4N5C5XZU.js} +47 -228
- package/dist/chunk-4N5C5XZU.js.map +1 -0
- package/dist/{chunk-LOMZXPSN.js → chunk-4ZC4GX36.js} +47 -74
- package/dist/chunk-4ZC4GX36.js.map +1 -0
- package/dist/{chunk-6LTQQAT6.js → chunk-BYFSK72L.js} +357 -158
- package/dist/chunk-BYFSK72L.js.map +1 -0
- package/dist/{chunk-XYXSXPUK.js → chunk-EXUD6RNJ.js} +50 -10
- package/dist/chunk-EXUD6RNJ.js.map +1 -0
- package/dist/{chunk-VKB2CO4Z.js → chunk-GLK6VM3F.js} +244 -249
- package/dist/chunk-GLK6VM3F.js.map +1 -0
- package/dist/{chunk-HW3OVDUF.js → chunk-J36DSWQK.js} +1 -1
- package/dist/{chunk-HW3OVDUF.js.map → chunk-J36DSWQK.js.map} +1 -1
- package/dist/{chunk-XNYQOL3Z.js → chunk-JBKQ3SAO.js} +9 -18
- package/dist/chunk-JBKQ3SAO.js.map +1 -0
- package/dist/{chunk-ROXMHMY2.js → chunk-KNC55RTG.js} +13 -3
- package/dist/{chunk-ROXMHMY2.js.map → chunk-KNC55RTG.js.map} +1 -1
- package/dist/{chunk-QWWZ5CAQ.js → chunk-LXQLPRQ2.js} +2 -2
- package/dist/{chunk-ULHIJK66.js → chunk-T33XF5ZC.js} +255 -140
- package/dist/chunk-T33XF5ZC.js.map +1 -0
- package/dist/{chunk-VRGWKHDB.js → chunk-XM25TVIE.js} +100 -33
- package/dist/chunk-XM25TVIE.js.map +1 -0
- package/dist/components.d.ts +4 -4
- package/dist/components.js +9 -9
- package/dist/hooks.d.ts +6 -6
- package/dist/hooks.js +20 -25
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +11 -11
- package/dist/index.js +18 -21
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +3 -3
- package/dist/providers.js +2 -2
- package/dist/rbac/index.d.ts +2 -20
- package/dist/rbac/index.js +7 -9
- package/dist/{usePublicRouteParams-TZe0gy-4.d.ts → usePublicRouteParams-BJAlWfuJ.d.ts} +3 -3
- package/dist/{useToast-C8gR5ir4.d.ts → useToast-AyaT-x7p.d.ts} +2 -2
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +3 -3
- package/docs/api/classes/ColumnFactory.md +1 -1
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/InvalidScopeError.md +1 -1
- package/docs/api/classes/Logger.md +1 -1
- package/docs/api/classes/MissingUserContextError.md +1 -1
- package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
- package/docs/api/classes/PermissionDeniedError.md +2 -2
- package/docs/api/classes/RBACAuditManager.md +2 -2
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +2 -2
- package/docs/api/classes/RBACError.md +1 -1
- package/docs/api/classes/RBACNotInitializedError.md +1 -1
- package/docs/api/classes/SecureSupabaseClient.md +10 -10
- package/docs/api/classes/StorageUtils.md +1 -1
- package/docs/api/enums/FileCategory.md +1 -1
- package/docs/api/enums/LogLevel.md +1 -1
- package/docs/api/enums/RBACErrorCode.md +1 -1
- package/docs/api/enums/RPCFunction.md +1 -1
- package/docs/api/interfaces/AddressFieldProps.md +1 -1
- package/docs/api/interfaces/AddressFieldRef.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +1 -1
- package/docs/api/interfaces/AutocompleteOptions.md +1 -1
- package/docs/api/interfaces/AvatarProps.md +1 -1
- package/docs/api/interfaces/BadgeProps.md +1 -1
- package/docs/api/interfaces/ButtonProps.md +1 -1
- package/docs/api/interfaces/CalendarProps.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/ComplianceResult.md +1 -1
- package/docs/api/interfaces/DataAccessRecord.md +1 -1
- package/docs/api/interfaces/DataRecord.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +1 -1
- package/docs/api/interfaces/DataTableColumn.md +1 -1
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
- package/docs/api/interfaces/DatabaseComplianceResult.md +1 -1
- package/docs/api/interfaces/DatabaseIssue.md +1 -1
- package/docs/api/interfaces/EmptyStateConfig.md +1 -1
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
- package/docs/api/interfaces/EventAppRoleData.md +1 -1
- package/docs/api/interfaces/ExportColumn.md +1 -1
- package/docs/api/interfaces/ExportOptions.md +1 -1
- package/docs/api/interfaces/FileDisplayProps.md +24 -11
- 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/FormFieldProps.md +1 -1
- package/docs/api/interfaces/FormProps.md +1 -1
- package/docs/api/interfaces/GrantEventAppRoleParams.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/LoggerConfig.md +1 -1
- package/docs/api/interfaces/LoginFormProps.md +1 -1
- package/docs/api/interfaces/NavigationAccessRecord.md +2 -2
- package/docs/api/interfaces/NavigationContextType.md +1 -1
- 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 +1 -1
- 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 +1 -1
- 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/ParsedAddress.md +1 -1
- package/docs/api/interfaces/PermissionEnforcerProps.md +4 -4
- package/docs/api/interfaces/ProgressProps.md +1 -1
- package/docs/api/interfaces/ProtectedRouteProps.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/QuickFix.md +1 -1
- package/docs/api/interfaces/RBACAccessValidateParams.md +1 -1
- package/docs/api/interfaces/RBACAccessValidateResult.md +1 -1
- package/docs/api/interfaces/RBACAuditLogParams.md +1 -1
- package/docs/api/interfaces/RBACAuditLogResult.md +1 -1
- package/docs/api/interfaces/RBACConfig.md +2 -2
- package/docs/api/interfaces/RBACContext.md +1 -1
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RBACPageAccessCheckParams.md +1 -1
- package/docs/api/interfaces/RBACPerformanceMetrics.md +1 -1
- package/docs/api/interfaces/RBACPermissionCheckParams.md +1 -1
- package/docs/api/interfaces/RBACPermissionCheckResult.md +2 -2
- package/docs/api/interfaces/RBACPermissionsGetParams.md +1 -1
- package/docs/api/interfaces/RBACPermissionsGetResult.md +1 -1
- package/docs/api/interfaces/RBACResult.md +1 -1
- package/docs/api/interfaces/RBACRoleGrantParams.md +2 -2
- package/docs/api/interfaces/RBACRoleGrantResult.md +1 -1
- package/docs/api/interfaces/RBACRoleRevokeParams.md +2 -2
- package/docs/api/interfaces/RBACRoleRevokeResult.md +1 -1
- package/docs/api/interfaces/RBACRoleValidateParams.md +2 -2
- package/docs/api/interfaces/RBACRoleValidateResult.md +1 -1
- package/docs/api/interfaces/RBACRolesListParams.md +1 -1
- package/docs/api/interfaces/RBACRolesListResult.md +2 -2
- package/docs/api/interfaces/RBACSessionTrackParams.md +1 -1
- package/docs/api/interfaces/RBACSessionTrackResult.md +1 -1
- package/docs/api/interfaces/ResourcePermissions.md +1 -1
- package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
- package/docs/api/interfaces/RoleManagementResult.md +1 -1
- package/docs/api/interfaces/RouteAccessRecord.md +2 -2
- package/docs/api/interfaces/RouteConfig.md +2 -2
- package/docs/api/interfaces/RuntimeComplianceResult.md +1 -1
- package/docs/api/interfaces/SecureDataContextType.md +1 -1
- package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
- package/docs/api/interfaces/SessionRestorationLoaderProps.md +1 -1
- package/docs/api/interfaces/SetupIssue.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/TabsContentProps.md +1 -1
- package/docs/api/interfaces/TabsListProps.md +1 -1
- package/docs/api/interfaces/TabsProps.md +1 -1
- package/docs/api/interfaces/TabsTriggerProps.md +1 -1
- package/docs/api/interfaces/TextareaProps.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 +60 -38
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
- package/docs/api/interfaces/UseFormDialogOptions.md +1 -1
- package/docs/api/interfaces/UseFormDialogReturn.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +2 -2
- 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/UsePublicFileDisplayOptions.md +2 -2
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeOptions.md +2 -2
- package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
- package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
- package/docs/api/interfaces/UserEventAccess.md +1 -1
- package/docs/api/interfaces/UserMenuProps.md +1 -1
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +194 -209
- package/docs/getting-started/cursor-rules.md +262 -0
- package/docs/getting-started/installation-guide.md +6 -1
- package/docs/getting-started/quick-start.md +6 -1
- package/docs/migration/MIGRATION_GUIDE.md +4 -4
- package/docs/migration/REACT_19_MIGRATION.md +227 -0
- package/docs/migration/database-changes-december-2025.md +2 -1
- package/docs/rbac/event-based-apps.md +124 -6
- package/docs/standards/README.md +39 -0
- package/docs/troubleshooting/migration.md +4 -4
- package/examples/PublicPages/PublicEventPage.tsx +1 -1
- package/package.json +11 -6
- package/scripts/audit-consuming-app.cjs +961 -0
- package/scripts/check-pace-core-compliance.cjs +315 -61
- package/scripts/install-cursor-rules.cjs +236 -0
- package/src/__tests__/helpers/test-providers.tsx +1 -1
- package/src/__tests__/helpers/test-utils.tsx +1 -1
- package/src/__tests__/rls-policies.test.ts +3 -1
- package/src/components/Badge/Badge.tsx +2 -4
- package/src/components/Button/Button.tsx +5 -4
- package/src/components/Calendar/Calendar.tsx +1 -1
- package/src/components/DataTable/DataTable.test.tsx +57 -93
- package/src/components/DataTable/DataTable.tsx +2 -2
- package/src/components/DataTable/__tests__/DataTable.default-state.test.tsx +172 -45
- package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +121 -28
- package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +9 -8
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +20 -52
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +170 -34
- package/src/components/DataTable/__tests__/keyboard.test.tsx +75 -12
- package/src/components/DataTable/__tests__/pagination.modes.test.tsx +88 -16
- package/src/components/DataTable/__tests__/ssr.strict-mode.test.tsx +12 -12
- package/src/components/DataTable/components/AccessDeniedPage.tsx +1 -1
- package/src/components/DataTable/components/BulkOperationsDropdown.tsx +1 -1
- package/src/components/DataTable/components/DataTableCore.tsx +4 -7
- package/src/components/DataTable/components/DataTableModals.tsx +1 -1
- package/src/components/DataTable/components/EditableRow.tsx +1 -1
- package/src/components/DataTable/components/UnifiedTableBody.tsx +86 -17
- package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +23 -23
- package/src/components/DataTable/components/__tests__/EditableRow.test.tsx +11 -11
- package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +36 -36
- package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +27 -27
- package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +39 -39
- package/src/components/DataTable/components/__tests__/UnifiedTableBody.test.tsx +33 -33
- package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +29 -29
- package/src/components/DataTable/hooks/useColumnReordering.ts +2 -2
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +75 -10
- package/src/components/DataTable/hooks/useKeyboardNavigation.ts +2 -2
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +8 -14
- package/src/components/Dialog/Dialog.tsx +6 -5
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +1 -1
- package/src/components/EventSelector/EventSelector.tsx +1 -1
- package/src/components/FileDisplay/FileDisplay.test.tsx +4 -3
- package/src/components/FileDisplay/FileDisplay.tsx +16 -4
- package/src/components/Footer/Footer.tsx +1 -1
- package/src/components/Form/Form.test.tsx +36 -15
- package/src/components/Form/Form.tsx +30 -26
- package/src/components/Header/Header.tsx +1 -1
- package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +40 -40
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +1 -1
- package/src/components/Input/Input.tsx +28 -30
- package/src/components/Label/Label.tsx +1 -1
- package/src/components/LoadingSpinner/LoadingSpinner.tsx +1 -1
- package/src/components/LoginForm/LoginForm.test.tsx +42 -42
- package/src/components/LoginForm/LoginForm.tsx +8 -8
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +6 -4
- package/src/components/NavigationMenu/NavigationMenu.tsx +2 -11
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +0 -1
- package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +1 -1
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +75 -52
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +98 -69
- package/src/components/PaceAppLayout/README.md +1 -1
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +1 -8
- package/src/components/PasswordChange/PasswordChangeForm.test.tsx +33 -33
- package/src/components/PasswordChange/PasswordChangeForm.tsx +1 -1
- package/src/components/Progress/Progress.tsx +1 -1
- package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +5 -9
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +0 -1
- package/src/components/PublicLayout/PublicPageLayout.tsx +1 -1
- package/src/components/PublicLayout/PublicPageProvider.tsx +0 -1
- package/src/components/Select/Select.tsx +33 -22
- package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +1 -1
- package/src/components/Table/Table.tsx +1 -1
- package/src/components/Textarea/Textarea.tsx +27 -29
- package/src/components/Toast/Toast.tsx +1 -1
- package/src/components/Tooltip/Tooltip.tsx +1 -1
- package/src/components/UserMenu/UserMenu.tsx +1 -1
- package/src/hooks/__tests__/hooks.integration.test.tsx +80 -55
- package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +14 -7
- package/src/hooks/__tests__/useStorage.unit.test.ts +36 -36
- package/src/hooks/public/usePublicEvent.ts +1 -1
- package/src/hooks/public/usePublicEventLogo.ts +1 -1
- package/src/hooks/public/usePublicRouteParams.ts +1 -1
- package/src/hooks/services/useAuthService.ts +21 -3
- package/src/hooks/services/useEventService.ts +21 -3
- package/src/hooks/services/useInactivityService.ts +21 -3
- package/src/hooks/services/useOrganisationService.ts +21 -3
- package/src/hooks/useDataTableState.ts +8 -18
- package/src/hooks/useFileDisplay.ts +10 -17
- package/src/hooks/useFocusManagement.ts +2 -2
- package/src/hooks/useFocusTrap.ts +4 -4
- package/src/hooks/useFormDialog.ts +8 -7
- package/src/hooks/useInactivityTracker.ts +1 -1
- package/src/hooks/usePermissionCache.ts +1 -1
- package/src/hooks/useSecureDataAccess.test.ts +16 -9
- package/src/hooks/useSecureDataAccess.ts +22 -6
- package/src/hooks/useToast.ts +2 -2
- package/src/providers/__tests__/OrganisationProvider.test.tsx +57 -13
- package/src/providers/__tests__/ProviderLifecycle.test.tsx +21 -6
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +10 -10
- package/src/providers/services/EventServiceProvider.tsx +0 -8
- package/src/providers/services/UnifiedAuthProvider.tsx +196 -46
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +13 -3
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +34 -40
- package/src/rbac/__tests__/isSuperAdmin.real.test.ts +82 -0
- package/src/rbac/adapters.tsx +3 -22
- package/src/rbac/api.test.ts +2 -2
- package/src/rbac/api.ts +7 -1
- package/src/rbac/components/EnhancedNavigationMenu.tsx +3 -16
- package/src/rbac/components/NavigationGuard.tsx +2 -11
- package/src/rbac/components/NavigationProvider.tsx +1 -2
- package/src/rbac/components/PagePermissionGuard.tsx +1 -1
- package/src/rbac/components/PagePermissionProvider.tsx +1 -1
- package/src/rbac/components/PermissionEnforcer.tsx +46 -13
- package/src/rbac/components/RoleBasedRouter.tsx +1 -1
- package/src/rbac/components/SecureDataProvider.tsx +1 -2
- package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +7 -43
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +4 -11
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +3 -3
- package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +1 -1
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +1 -1
- package/src/rbac/engine.ts +14 -2
- package/src/rbac/hooks/index.ts +0 -3
- package/src/rbac/hooks/usePermissions.ts +51 -11
- package/src/rbac/hooks/useRBAC.ts +3 -13
- package/src/rbac/hooks/useResolvedScope.test.ts +75 -54
- package/src/rbac/hooks/useResolvedScope.ts +58 -33
- package/src/rbac/hooks/useSecureSupabase.ts +4 -9
- package/src/rbac/secureClient.ts +43 -0
- package/src/services/EventService.ts +4 -57
- package/src/services/InactivityService.ts +127 -34
- package/src/services/OrganisationService.ts +68 -10
- package/src/utils/security/secureDataAccess.test.ts +31 -20
- package/src/utils/security/secureDataAccess.ts +4 -3
- package/dist/chunk-6C4YBBJM.js.map +0 -1
- package/dist/chunk-6LTQQAT6.js.map +0 -1
- package/dist/chunk-6TQDD426.js.map +0 -1
- package/dist/chunk-LOMZXPSN.js.map +0 -1
- package/dist/chunk-OETXORNB.js.map +0 -1
- package/dist/chunk-ULHIJK66.js.map +0 -1
- package/dist/chunk-VKB2CO4Z.js.map +0 -1
- package/dist/chunk-VRGWKHDB.js.map +0 -1
- package/dist/chunk-XNYQOL3Z.js.map +0 -1
- package/dist/chunk-XYXSXPUK.js.map +0 -1
- package/scripts/check-pace-core-compliance.js +0 -512
- package/src/rbac/hooks/useSuperAdminBypass.ts +0 -126
- package/src/utils/context/superAdminOverride.ts +0 -58
- /package/dist/{DataTable-WKRZD47S.js.map → DataTable-DQ7RSOHE.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-FTSG5XH7.js.map → UnifiedAuthProvider-ATAP5UTR.js.map} +0 -0
- /package/dist/{api-IHKALJZD.js.map → api-N774RPUA.js.map} +0 -0
- /package/dist/{chunk-QWWZ5CAQ.js.map → chunk-LXQLPRQ2.js.map} +0 -0
- /package/examples/{rbac → RBAC}/CompleteRBACExample.tsx +0 -0
- /package/examples/{rbac → RBAC}/EventBasedApp.tsx +0 -0
- /package/examples/{rbac → RBAC}/PermissionExample.tsx +0 -0
- /package/examples/{rbac → RBAC}/index.ts +0 -0
|
@@ -273,7 +273,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
273
273
|
);
|
|
274
274
|
|
|
275
275
|
describe('PaceAppLayout Component', () => {
|
|
276
|
-
const
|
|
276
|
+
const baseProps = {
|
|
277
277
|
appName: 'Test App',
|
|
278
278
|
};
|
|
279
279
|
|
|
@@ -296,7 +296,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
296
296
|
it('renders with default props', () => {
|
|
297
297
|
renderWithProviders(
|
|
298
298
|
<TestWrapper>
|
|
299
|
-
<PaceAppLayout {...
|
|
299
|
+
<PaceAppLayout {...baseProps} />
|
|
300
300
|
</TestWrapper>,
|
|
301
301
|
{ withRouter: false }
|
|
302
302
|
);
|
|
@@ -309,7 +309,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
309
309
|
it('renders with custom app name', () => {
|
|
310
310
|
renderWithProviders(
|
|
311
311
|
<TestWrapper>
|
|
312
|
-
<PaceAppLayout {...
|
|
312
|
+
<PaceAppLayout {...baseProps} appName="Custom App" />
|
|
313
313
|
</TestWrapper>,
|
|
314
314
|
{ withRouter: false }
|
|
315
315
|
);
|
|
@@ -325,7 +325,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
325
325
|
|
|
326
326
|
renderWithProviders(
|
|
327
327
|
<TestWrapper>
|
|
328
|
-
<PaceAppLayout {...
|
|
328
|
+
<PaceAppLayout {...baseProps} navItems={customNavItems} />
|
|
329
329
|
</TestWrapper>,
|
|
330
330
|
{ withRouter: false }
|
|
331
331
|
);
|
|
@@ -337,7 +337,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
337
337
|
it('renders with default navigation items when none provided', () => {
|
|
338
338
|
renderWithProviders(
|
|
339
339
|
<TestWrapper>
|
|
340
|
-
<PaceAppLayout {...
|
|
340
|
+
<PaceAppLayout {...baseProps} />
|
|
341
341
|
</TestWrapper>,
|
|
342
342
|
{ withRouter: false }
|
|
343
343
|
);
|
|
@@ -352,7 +352,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
352
352
|
|
|
353
353
|
renderWithProviders(
|
|
354
354
|
<TestWrapper>
|
|
355
|
-
<PaceAppLayout {...
|
|
355
|
+
<PaceAppLayout {...baseProps} headerActions={headerActions} />
|
|
356
356
|
</TestWrapper>,
|
|
357
357
|
{ withRouter: false }
|
|
358
358
|
);
|
|
@@ -365,7 +365,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
365
365
|
|
|
366
366
|
renderWithProviders(
|
|
367
367
|
<TestWrapper>
|
|
368
|
-
<PaceAppLayout {...
|
|
368
|
+
<PaceAppLayout {...baseProps} customLogo={customLogo} />
|
|
369
369
|
</TestWrapper>,
|
|
370
370
|
{ withRouter: false }
|
|
371
371
|
);
|
|
@@ -378,7 +378,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
378
378
|
|
|
379
379
|
renderWithProviders(
|
|
380
380
|
<TestWrapper>
|
|
381
|
-
<PaceAppLayout {...
|
|
381
|
+
<PaceAppLayout {...baseProps} customUserMenu={customUserMenu} />
|
|
382
382
|
</TestWrapper>,
|
|
383
383
|
{ withRouter: false }
|
|
384
384
|
);
|
|
@@ -389,7 +389,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
389
389
|
it('renders with custom header className', () => {
|
|
390
390
|
renderWithProviders(
|
|
391
391
|
<TestWrapper>
|
|
392
|
-
<PaceAppLayout {...
|
|
392
|
+
<PaceAppLayout {...baseProps} headerClassName="custom-header" />
|
|
393
393
|
</TestWrapper>,
|
|
394
394
|
{ withRouter: false }
|
|
395
395
|
);
|
|
@@ -402,7 +402,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
402
402
|
it('uses default header className when not provided', () => {
|
|
403
403
|
renderWithProviders(
|
|
404
404
|
<TestWrapper>
|
|
405
|
-
<PaceAppLayout {...
|
|
405
|
+
<PaceAppLayout {...baseProps} />
|
|
406
406
|
</TestWrapper>,
|
|
407
407
|
{ withRouter: false }
|
|
408
408
|
);
|
|
@@ -416,7 +416,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
416
416
|
it('shows event selector by default', () => {
|
|
417
417
|
renderWithProviders(
|
|
418
418
|
<TestWrapper>
|
|
419
|
-
<PaceAppLayout {...
|
|
419
|
+
<PaceAppLayout {...baseProps} />
|
|
420
420
|
</TestWrapper>,
|
|
421
421
|
{ withRouter: false }
|
|
422
422
|
);
|
|
@@ -427,7 +427,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
427
427
|
it('hides event selector when showEventSelector is false', () => {
|
|
428
428
|
renderWithProviders(
|
|
429
429
|
<TestWrapper>
|
|
430
|
-
<PaceAppLayout {...
|
|
430
|
+
<PaceAppLayout {...baseProps} showEventSelector={false} />
|
|
431
431
|
</TestWrapper>,
|
|
432
432
|
{ withRouter: false }
|
|
433
433
|
);
|
|
@@ -438,7 +438,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
438
438
|
it('shows event selector when showEventSelector is explicitly true', () => {
|
|
439
439
|
renderWithProviders(
|
|
440
440
|
<TestWrapper>
|
|
441
|
-
<PaceAppLayout {...
|
|
441
|
+
<PaceAppLayout {...baseProps} showEventSelector={true} />
|
|
442
442
|
</TestWrapper>,
|
|
443
443
|
{ withRouter: false }
|
|
444
444
|
);
|
|
@@ -451,7 +451,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
451
451
|
it('shows user menu by default', () => {
|
|
452
452
|
renderWithProviders(
|
|
453
453
|
<TestWrapper>
|
|
454
|
-
<PaceAppLayout {...
|
|
454
|
+
<PaceAppLayout {...baseProps} />
|
|
455
455
|
</TestWrapper>,
|
|
456
456
|
{ withRouter: false }
|
|
457
457
|
);
|
|
@@ -462,7 +462,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
462
462
|
it('hides user menu when showUserMenu is false', () => {
|
|
463
463
|
renderWithProviders(
|
|
464
464
|
<TestWrapper>
|
|
465
|
-
<PaceAppLayout {...
|
|
465
|
+
<PaceAppLayout {...baseProps} showUserMenu={false} />
|
|
466
466
|
</TestWrapper>,
|
|
467
467
|
{ withRouter: false }
|
|
468
468
|
);
|
|
@@ -476,7 +476,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
476
476
|
const user = userEvent.setup();
|
|
477
477
|
renderWithProviders(
|
|
478
478
|
<TestWrapper>
|
|
479
|
-
<PaceAppLayout {...
|
|
479
|
+
<PaceAppLayout {...baseProps} />
|
|
480
480
|
</TestWrapper>,
|
|
481
481
|
{ withRouter: false }
|
|
482
482
|
);
|
|
@@ -489,7 +489,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
489
489
|
const user = userEvent.setup();
|
|
490
490
|
renderWithProviders(
|
|
491
491
|
<TestWrapper>
|
|
492
|
-
<PaceAppLayout {...
|
|
492
|
+
<PaceAppLayout {...baseProps} />
|
|
493
493
|
</TestWrapper>,
|
|
494
494
|
{ withRouter: false }
|
|
495
495
|
);
|
|
@@ -507,7 +507,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
507
507
|
|
|
508
508
|
renderWithProviders(
|
|
509
509
|
<TestWrapper>
|
|
510
|
-
<PaceAppLayout {...
|
|
510
|
+
<PaceAppLayout {...baseProps} navItems={customNavItems} />
|
|
511
511
|
</TestWrapper>,
|
|
512
512
|
{ withRouter: false }
|
|
513
513
|
);
|
|
@@ -522,7 +522,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
522
522
|
it('passes current path to header', () => {
|
|
523
523
|
renderWithProviders(
|
|
524
524
|
<TestWrapper>
|
|
525
|
-
<PaceAppLayout {...
|
|
525
|
+
<PaceAppLayout {...baseProps} />
|
|
526
526
|
</TestWrapper>,
|
|
527
527
|
{ withRouter: false }
|
|
528
528
|
);
|
|
@@ -536,7 +536,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
536
536
|
it('renders normally when enforcePermissions is false', () => {
|
|
537
537
|
renderWithProviders(
|
|
538
538
|
<TestWrapper>
|
|
539
|
-
<PaceAppLayout {...
|
|
539
|
+
<PaceAppLayout {...baseProps} enforcePermissions={false} />
|
|
540
540
|
</TestWrapper>,
|
|
541
541
|
{ withRouter: false }
|
|
542
542
|
);
|
|
@@ -547,7 +547,26 @@ describe('PaceAppLayout Component', () => {
|
|
|
547
547
|
|
|
548
548
|
it('shows loading state when checking permissions', async () => {
|
|
549
549
|
// Mock useCan to return loading state
|
|
550
|
-
|
|
550
|
+
// Need to ensure currentPageId is set so permission checking happens
|
|
551
|
+
// Use a path that will result in a valid pageId (e.g., '/dashboard' -> 'dashboard')
|
|
552
|
+
mockLocation.pathname = '/dashboard';
|
|
553
|
+
|
|
554
|
+
// Mock useRBAC to return non-super-admin so permission check isn't bypassed
|
|
555
|
+
// Also ensure isSuperAdminDirect check returns false
|
|
556
|
+
mockIsSuperAdminAPI.mockResolvedValue(false);
|
|
557
|
+
mockUseRBAC.mockReturnValue({
|
|
558
|
+
isSuperAdmin: false,
|
|
559
|
+
isLoading: false,
|
|
560
|
+
hasPermission: vi.fn(),
|
|
561
|
+
hasAnyPermission: vi.fn(),
|
|
562
|
+
hasRole: vi.fn(),
|
|
563
|
+
hasAnyRole: vi.fn(),
|
|
564
|
+
permissionMap: {},
|
|
565
|
+
roleMap: {},
|
|
566
|
+
});
|
|
567
|
+
|
|
568
|
+
// Mock useCan to return loading state - use mockReturnValue to ensure it persists
|
|
569
|
+
mockUseCan.mockReturnValue({
|
|
551
570
|
can: false,
|
|
552
571
|
isLoading: true,
|
|
553
572
|
error: null,
|
|
@@ -556,12 +575,16 @@ describe('PaceAppLayout Component', () => {
|
|
|
556
575
|
|
|
557
576
|
renderWithProviders(
|
|
558
577
|
<TestWrapper>
|
|
559
|
-
<PaceAppLayout {...
|
|
578
|
+
<PaceAppLayout {...baseProps} enforcePermissions={true} />
|
|
560
579
|
</TestWrapper>,
|
|
561
580
|
{ withRouter: false }
|
|
562
581
|
);
|
|
563
582
|
|
|
564
|
-
|
|
583
|
+
// Wait for loading state to appear
|
|
584
|
+
// The component should show loading state when isCheckingPermission is true
|
|
585
|
+
await waitFor(() => {
|
|
586
|
+
expect(screen.getByText('Checking permissions...')).toBeInTheDocument();
|
|
587
|
+
}, { timeout: 2000 });
|
|
565
588
|
expect(screen.queryByTestId('header')).not.toBeInTheDocument();
|
|
566
589
|
});
|
|
567
590
|
|
|
@@ -579,7 +602,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
579
602
|
|
|
580
603
|
renderWithProviders(
|
|
581
604
|
<TestWrapper>
|
|
582
|
-
<PaceAppLayout {...
|
|
605
|
+
<PaceAppLayout {...baseProps} enforcePermissions={true} />
|
|
583
606
|
</TestWrapper>,
|
|
584
607
|
{ withRouter: false }
|
|
585
608
|
);
|
|
@@ -612,7 +635,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
612
635
|
|
|
613
636
|
renderWithProviders(
|
|
614
637
|
<TestWrapper>
|
|
615
|
-
<PaceAppLayout {...
|
|
638
|
+
<PaceAppLayout {...baseProps} enforcePermissions={true} />
|
|
616
639
|
</TestWrapper>,
|
|
617
640
|
{ withRouter: false }
|
|
618
641
|
);
|
|
@@ -644,7 +667,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
644
667
|
|
|
645
668
|
renderWithProviders(
|
|
646
669
|
<TestWrapper>
|
|
647
|
-
<PaceAppLayout {...
|
|
670
|
+
<PaceAppLayout {...baseProps} enforcePermissions={true} />
|
|
648
671
|
</TestWrapper>,
|
|
649
672
|
{ withRouter: false }
|
|
650
673
|
);
|
|
@@ -681,7 +704,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
681
704
|
|
|
682
705
|
renderWithProviders(
|
|
683
706
|
<TestWrapper>
|
|
684
|
-
<PaceAppLayout {...
|
|
707
|
+
<PaceAppLayout {...baseProps} enforcePermissions={true} />
|
|
685
708
|
</TestWrapper>,
|
|
686
709
|
{ withRouter: false }
|
|
687
710
|
);
|
|
@@ -719,7 +742,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
719
742
|
renderWithProviders(
|
|
720
743
|
<TestWrapper>
|
|
721
744
|
<PaceAppLayout
|
|
722
|
-
{...
|
|
745
|
+
{...baseProps}
|
|
723
746
|
enforcePermissions={true}
|
|
724
747
|
permissionFallback={customFallback}
|
|
725
748
|
/>
|
|
@@ -755,7 +778,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
755
778
|
renderWithProviders(
|
|
756
779
|
<TestWrapper>
|
|
757
780
|
<PaceAppLayout
|
|
758
|
-
{...
|
|
781
|
+
{...baseProps}
|
|
759
782
|
enforcePermissions={true}
|
|
760
783
|
enforcePagePermissions={true}
|
|
761
784
|
pagePermissionFallback={pageFallback}
|
|
@@ -791,7 +814,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
791
814
|
renderWithProviders(
|
|
792
815
|
<TestWrapper>
|
|
793
816
|
<PaceAppLayout
|
|
794
|
-
{...
|
|
817
|
+
{...baseProps}
|
|
795
818
|
navItems={customNavItems}
|
|
796
819
|
enforcePermissions={true}
|
|
797
820
|
routePermissions={{
|
|
@@ -827,7 +850,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
827
850
|
renderWithProviders(
|
|
828
851
|
<TestWrapper>
|
|
829
852
|
<PaceAppLayout
|
|
830
|
-
{...
|
|
853
|
+
{...baseProps}
|
|
831
854
|
navItems={customNavItems}
|
|
832
855
|
enforcePermissions={false}
|
|
833
856
|
routePermissions={{
|
|
@@ -852,7 +875,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
852
875
|
renderWithProviders(
|
|
853
876
|
<TestWrapper>
|
|
854
877
|
<PaceAppLayout
|
|
855
|
-
{...
|
|
878
|
+
{...baseProps}
|
|
856
879
|
enforcePermissions={true}
|
|
857
880
|
routePermissions={{
|
|
858
881
|
'/dashboard': 'update',
|
|
@@ -886,7 +909,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
886
909
|
renderWithProviders(
|
|
887
910
|
<TestWrapper>
|
|
888
911
|
<PaceAppLayout
|
|
889
|
-
{...
|
|
912
|
+
{...baseProps}
|
|
890
913
|
enforcePermissions={true}
|
|
891
914
|
defaultPermission="create"
|
|
892
915
|
routePermissions={{
|
|
@@ -924,7 +947,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
924
947
|
renderWithProviders(
|
|
925
948
|
<TestWrapper>
|
|
926
949
|
<PaceAppLayout
|
|
927
|
-
{...
|
|
950
|
+
{...baseProps}
|
|
928
951
|
enforcePermissions={true}
|
|
929
952
|
/>
|
|
930
953
|
</TestWrapper>,
|
|
@@ -953,7 +976,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
953
976
|
renderWithProviders(
|
|
954
977
|
<TestWrapper>
|
|
955
978
|
<PaceAppLayout
|
|
956
|
-
{...
|
|
979
|
+
{...baseProps}
|
|
957
980
|
enforcePermissions={true}
|
|
958
981
|
onPageAccessDenied={onPageAccessDenied}
|
|
959
982
|
/>
|
|
@@ -981,7 +1004,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
981
1004
|
renderWithProviders(
|
|
982
1005
|
<TestWrapper>
|
|
983
1006
|
<PaceAppLayout
|
|
984
|
-
{...
|
|
1007
|
+
{...baseProps}
|
|
985
1008
|
enforcePermissions={true}
|
|
986
1009
|
strictMode={true}
|
|
987
1010
|
onStrictModeViolation={onStrictModeViolation}
|
|
@@ -1013,7 +1036,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
1013
1036
|
renderWithProviders(
|
|
1014
1037
|
<TestWrapper>
|
|
1015
1038
|
<PaceAppLayout
|
|
1016
|
-
{...
|
|
1039
|
+
{...baseProps}
|
|
1017
1040
|
roleBasedRouting={true}
|
|
1018
1041
|
routeConfig={routeConfig}
|
|
1019
1042
|
onRouteAccessDenied={onRouteAccessDenied}
|
|
@@ -1042,7 +1065,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
1042
1065
|
renderWithProviders(
|
|
1043
1066
|
<TestWrapper>
|
|
1044
1067
|
<PaceAppLayout
|
|
1045
|
-
{...
|
|
1068
|
+
{...baseProps}
|
|
1046
1069
|
roleBasedRouting={true}
|
|
1047
1070
|
routeConfig={routeConfig}
|
|
1048
1071
|
strictMode={true}
|
|
@@ -1084,7 +1107,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
1084
1107
|
renderWithProviders(
|
|
1085
1108
|
<FallbackWrapper>
|
|
1086
1109
|
<PaceAppLayout
|
|
1087
|
-
{...
|
|
1110
|
+
{...baseProps}
|
|
1088
1111
|
roleBasedRouting={true}
|
|
1089
1112
|
strictMode={true}
|
|
1090
1113
|
fallbackRoute="/no-access"
|
|
@@ -1128,7 +1151,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
1128
1151
|
renderWithProviders(
|
|
1129
1152
|
<TestWrapper>
|
|
1130
1153
|
<PaceAppLayout
|
|
1131
|
-
{...
|
|
1154
|
+
{...baseProps}
|
|
1132
1155
|
enforcePermissions={true}
|
|
1133
1156
|
/>
|
|
1134
1157
|
</TestWrapper>,
|
|
@@ -1170,7 +1193,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
1170
1193
|
renderWithProviders(
|
|
1171
1194
|
<TestWrapper>
|
|
1172
1195
|
<PaceAppLayout
|
|
1173
|
-
{...
|
|
1196
|
+
{...baseProps}
|
|
1174
1197
|
enforcePermissions={true}
|
|
1175
1198
|
/>
|
|
1176
1199
|
</TestWrapper>,
|
|
@@ -1194,7 +1217,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
1194
1217
|
it('renders with proper semantic HTML elements', () => {
|
|
1195
1218
|
renderWithProviders(
|
|
1196
1219
|
<TestWrapper>
|
|
1197
|
-
<PaceAppLayout {...
|
|
1220
|
+
<PaceAppLayout {...baseProps} />
|
|
1198
1221
|
</TestWrapper>,
|
|
1199
1222
|
{ withRouter: false }
|
|
1200
1223
|
);
|
|
@@ -1207,7 +1230,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
1207
1230
|
it('provides proper main content area', () => {
|
|
1208
1231
|
renderWithProviders(
|
|
1209
1232
|
<TestWrapper>
|
|
1210
|
-
<PaceAppLayout {...
|
|
1233
|
+
<PaceAppLayout {...baseProps} />
|
|
1211
1234
|
</TestWrapper>,
|
|
1212
1235
|
{ withRouter: false }
|
|
1213
1236
|
);
|
|
@@ -1220,7 +1243,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
1220
1243
|
it('renders main content area with proper styling', () => {
|
|
1221
1244
|
renderWithProviders(
|
|
1222
1245
|
<TestWrapper>
|
|
1223
|
-
<PaceAppLayout {...
|
|
1246
|
+
<PaceAppLayout {...baseProps} />
|
|
1224
1247
|
</TestWrapper>,
|
|
1225
1248
|
{ withRouter: false }
|
|
1226
1249
|
);
|
|
@@ -1234,7 +1257,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
1234
1257
|
it('has accessible navigation', () => {
|
|
1235
1258
|
renderWithProviders(
|
|
1236
1259
|
<TestWrapper>
|
|
1237
|
-
<PaceAppLayout {...
|
|
1260
|
+
<PaceAppLayout {...baseProps} />
|
|
1238
1261
|
</TestWrapper>,
|
|
1239
1262
|
{ withRouter: false }
|
|
1240
1263
|
);
|
|
@@ -1246,7 +1269,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
1246
1269
|
it('has accessible user menu', () => {
|
|
1247
1270
|
renderWithProviders(
|
|
1248
1271
|
<TestWrapper>
|
|
1249
|
-
<PaceAppLayout {...
|
|
1272
|
+
<PaceAppLayout {...baseProps} />
|
|
1250
1273
|
</TestWrapper>,
|
|
1251
1274
|
{ withRouter: false }
|
|
1252
1275
|
);
|
|
@@ -1260,7 +1283,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
1260
1283
|
it('provides meaningful text for screen readers', () => {
|
|
1261
1284
|
renderWithProviders(
|
|
1262
1285
|
<TestWrapper>
|
|
1263
|
-
<PaceAppLayout {...
|
|
1286
|
+
<PaceAppLayout {...baseProps} />
|
|
1264
1287
|
</TestWrapper>,
|
|
1265
1288
|
{ withRouter: false }
|
|
1266
1289
|
);
|
|
@@ -1275,7 +1298,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
1275
1298
|
const user = userEvent.setup();
|
|
1276
1299
|
renderWithProviders(
|
|
1277
1300
|
<TestWrapper>
|
|
1278
|
-
<PaceAppLayout {...
|
|
1301
|
+
<PaceAppLayout {...baseProps} />
|
|
1279
1302
|
</TestWrapper>,
|
|
1280
1303
|
{ withRouter: false }
|
|
1281
1304
|
);
|
|
@@ -1291,7 +1314,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
1291
1314
|
it('handles empty navigation items array', () => {
|
|
1292
1315
|
renderWithProviders(
|
|
1293
1316
|
<TestWrapper>
|
|
1294
|
-
<PaceAppLayout {...
|
|
1317
|
+
<PaceAppLayout {...baseProps} navItems={[]} />
|
|
1295
1318
|
</TestWrapper>,
|
|
1296
1319
|
{ withRouter: false }
|
|
1297
1320
|
);
|
|
@@ -1309,7 +1332,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
1309
1332
|
renderWithProviders(
|
|
1310
1333
|
<TestWrapper>
|
|
1311
1334
|
<PaceAppLayout
|
|
1312
|
-
{...
|
|
1335
|
+
{...baseProps}
|
|
1313
1336
|
navItems={navItemsWithoutHref}
|
|
1314
1337
|
enforcePermissions={false}
|
|
1315
1338
|
/>
|
|
@@ -1326,7 +1349,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
1326
1349
|
// without breaking. We don't enforce permissions to simplify the test.
|
|
1327
1350
|
const { rerender } = renderWithProviders(
|
|
1328
1351
|
<TestWrapper>
|
|
1329
|
-
<PaceAppLayout {...
|
|
1352
|
+
<PaceAppLayout {...baseProps} enforcePermissions={false} />
|
|
1330
1353
|
</TestWrapper>,
|
|
1331
1354
|
{ withRouter: false }
|
|
1332
1355
|
);
|
|
@@ -1340,7 +1363,7 @@ describe('PaceAppLayout Component', () => {
|
|
|
1340
1363
|
mockLocation.pathname = '/settings';
|
|
1341
1364
|
rerender(
|
|
1342
1365
|
<TestWrapper>
|
|
1343
|
-
<PaceAppLayout {...
|
|
1366
|
+
<PaceAppLayout {...baseProps} enforcePermissions={false} />
|
|
1344
1367
|
</TestWrapper>
|
|
1345
1368
|
);
|
|
1346
1369
|
|