@jmruthers/pace-core 0.5.193 → 0.6.2
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 +62 -0
- package/README.md +7 -1
- package/cursor-rules/00-pace-core-compliance.mdc +299 -0
- package/cursor-rules/01-standards-compliance.mdc +244 -0
- package/cursor-rules/02-project-structure.mdc +200 -0
- package/cursor-rules/03-solid-principles.mdc +222 -0
- package/cursor-rules/04-testing-standards.mdc +268 -0
- package/cursor-rules/05-bug-reports-and-features.mdc +246 -0
- package/cursor-rules/06-code-quality.mdc +309 -0
- package/cursor-rules/07-tech-stack-compliance.mdc +214 -0
- package/cursor-rules/08-markup-quality.mdc +452 -0
- package/cursor-rules/CHANGELOG.md +119 -0
- package/cursor-rules/README.md +192 -0
- package/dist/{AuthService-DjnJHDtC.d.ts → AuthService-BPvc3Ka0.d.ts} +54 -0
- package/dist/{DataTable-Be6dH_dR.d.ts → DataTable-BMRU8a1j.d.ts} +34 -2
- package/dist/{DataTable-5FU7IESH.js → DataTable-TPTKCX4D.js} +10 -9
- package/dist/{PublicPageProvider-C0Sm_e5k.d.ts → PublicPageProvider-DC6kCaqf.d.ts} +385 -261
- package/dist/{UnifiedAuthProvider-RGJTDE2C.js → UnifiedAuthProvider-CH6Z342H.js} +3 -3
- package/dist/{UnifiedAuthProvider-185Ih4dj.d.ts → UnifiedAuthProvider-CVcTjx-d.d.ts} +29 -0
- package/dist/{api-N774RPUA.js → api-MVVQZLJI.js} +2 -2
- package/dist/{chunk-KNC55RTG.js → chunk-24UVZUZG.js} +90 -54
- package/dist/chunk-24UVZUZG.js.map +1 -0
- package/dist/{chunk-HWIIPPNI.js → chunk-2UOI2FG5.js} +20 -20
- package/dist/chunk-2UOI2FG5.js.map +1 -0
- package/dist/{chunk-E3SPN4VZ 5.js → chunk-3XC4CPTD.js} +4345 -3986
- package/dist/chunk-3XC4CPTD.js.map +1 -0
- package/dist/{chunk-7EQTDTTJ.js → chunk-6J4GEEJR.js} +172 -45
- package/dist/chunk-6J4GEEJR.js.map +1 -0
- package/dist/{chunk-6C4YBBJM 5.js → chunk-6SOIHG6Z.js} +1 -1
- package/dist/chunk-6SOIHG6Z.js.map +1 -0
- package/dist/{chunk-7FLMSG37.js → chunk-EHMR7VYL.js} +25 -25
- package/dist/chunk-EHMR7VYL.js.map +1 -0
- package/dist/{chunk-I7PSE6JW.js → chunk-F2IMUDXZ.js} +2 -75
- package/dist/chunk-F2IMUDXZ.js.map +1 -0
- package/dist/{chunk-QWWZ5CAQ.js → chunk-FFQEQTNW.js} +7 -9
- package/dist/chunk-FFQEQTNW.js.map +1 -0
- package/dist/chunk-FMUCXFII.js +76 -0
- package/dist/chunk-FMUCXFII.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-SQGMNID3.js → chunk-L4OXEN46.js} +4 -5
- package/dist/chunk-L4OXEN46.js.map +1 -0
- package/dist/{chunk-R77UEZ4E 3.js → chunk-M43Y4SSO.js} +1 -1
- package/dist/chunk-M43Y4SSO.js.map +1 -0
- package/dist/{chunk-IIELH4DL.js → chunk-MMZ7JXPU.js} +60 -223
- package/dist/chunk-MMZ7JXPU.js.map +1 -0
- package/dist/{chunk-NOAYCWCX 5.js → chunk-NECFR5MM.js} +394 -312
- package/dist/chunk-NECFR5MM.js.map +1 -0
- package/dist/{chunk-BC4IJKSL.js → chunk-SFZUDBL5.js} +40 -4
- package/dist/chunk-SFZUDBL5.js.map +1 -0
- package/dist/{chunk-XNXXZ43G.js → chunk-XWQCNGTQ.js} +748 -364
- package/dist/chunk-XWQCNGTQ.js.map +1 -0
- package/dist/components.d.ts +6 -6
- package/dist/components.js +15 -12
- package/dist/components.js.map +1 -1
- package/dist/{functions-D_kgHktt.d.ts → functions-DHebl8-F.d.ts} +1 -1
- package/dist/hooks.d.ts +59 -126
- package/dist/hooks.js +19 -28
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +63 -16
- package/dist/index.js +23 -24
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +21 -3
- package/dist/providers.js +2 -2
- package/dist/rbac/index.d.ts +146 -115
- package/dist/rbac/index.js +8 -11
- package/dist/theming/runtime.d.ts +1 -13
- package/dist/theming/runtime.js +1 -1
- package/dist/{timezone-_pgH8qrY.d.ts → timezone-CHhWg6b4.d.ts} +3 -10
- package/dist/{types-UU913iLA.d.ts → types-BeoeWV5I.d.ts} +8 -0
- package/dist/{types-CEpcvwwF.d.ts → types-CkbwOr4Y.d.ts} +6 -0
- package/dist/types.d.ts +2 -2
- package/dist/{usePublicRouteParams-TZe0gy-4.d.ts → usePublicRouteParams-1oMokgLF.d.ts} +34 -4
- package/dist/{useToast-C8gR5ir4.d.ts → useToast-AyaT-x7p.d.ts} +2 -2
- package/dist/utils.d.ts +4 -5
- package/dist/utils.js +15 -15
- package/dist/utils.js.map +1 -1
- package/docs/api/README.md +7 -1
- package/docs/api/classes/ColumnFactory.md +8 -8
- package/docs/api/classes/InvalidScopeError.md +4 -4
- package/docs/api/classes/Logger.md +1 -1
- package/docs/api/classes/MissingUserContextError.md +4 -4
- package/docs/api/classes/OrganisationContextRequiredError.md +4 -4
- package/docs/api/classes/PermissionDeniedError.md +4 -4
- package/docs/api/classes/RBACAuditManager.md +1 -1
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +1 -1
- package/docs/api/classes/RBACError.md +4 -4
- package/docs/api/classes/RBACNotInitializedError.md +4 -4
- package/docs/api/classes/SecureSupabaseClient.md +18 -15
- 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 +4 -4
- package/docs/api/interfaces/AutocompleteOptions.md +1 -1
- package/docs/api/interfaces/AvatarProps.md +1 -1
- package/docs/api/interfaces/BadgeProps.md +9 -2
- package/docs/api/interfaces/ButtonProps.md +7 -4
- package/docs/api/interfaces/CalendarProps.md +8 -5
- package/docs/api/interfaces/CardProps.md +8 -5
- 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 +9 -9
- package/docs/api/interfaces/DataRecord.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +24 -21
- package/docs/api/interfaces/DataTableColumn.md +31 -31
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
- package/docs/api/interfaces/DatabaseComplianceResult.md +1 -1
- package/docs/api/interfaces/DatabaseIssue.md +1 -1
- package/docs/api/interfaces/EmptyStateConfig.md +5 -5
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
- package/docs/api/interfaces/ErrorBoundaryProps.md +147 -0
- package/docs/api/interfaces/ErrorBoundaryProviderProps.md +36 -0
- package/docs/api/interfaces/ErrorBoundaryState.md +75 -0
- package/docs/api/interfaces/EventAppRoleData.md +1 -1
- package/docs/api/interfaces/ExportColumn.md +1 -1
- package/docs/api/interfaces/ExportOptions.md +8 -8
- 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 +26 -23
- package/docs/api/interfaces/FooterProps.md +10 -8
- package/docs/api/interfaces/FormFieldProps.md +10 -10
- 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 +7 -4
- package/docs/api/interfaces/LabelProps.md +1 -1
- package/docs/api/interfaces/LoggerConfig.md +1 -1
- package/docs/api/interfaces/LoginFormProps.md +14 -11
- package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
- package/docs/api/interfaces/NavigationContextType.md +1 -1
- package/docs/api/interfaces/NavigationGuardProps.md +1 -1
- package/docs/api/interfaces/NavigationItem.md +11 -11
- package/docs/api/interfaces/NavigationMenuProps.md +15 -15
- 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 +30 -27
- package/docs/api/interfaces/PaceLoginPageProps.md +6 -4
- package/docs/api/interfaces/PageAccessRecord.md +1 -1
- package/docs/api/interfaces/PagePermissionContextType.md +1 -1
- package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
- 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 +1 -1
- package/docs/api/interfaces/ProgressProps.md +1 -1
- package/docs/api/interfaces/ProtectedRouteProps.md +7 -26
- package/docs/api/interfaces/PublicPageFooterProps.md +9 -9
- package/docs/api/interfaces/PublicPageHeaderProps.md +10 -10
- package/docs/api/interfaces/PublicPageLayoutProps.md +7 -20
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- package/docs/api/interfaces/RBACRoleGrantResult.md +1 -1
- package/docs/api/interfaces/RBACRoleRevokeParams.md +1 -1
- package/docs/api/interfaces/RBACRoleRevokeResult.md +1 -1
- package/docs/api/interfaces/RBACRoleValidateParams.md +1 -1
- package/docs/api/interfaces/RBACRoleValidateResult.md +1 -1
- package/docs/api/interfaces/RBACRolesListParams.md +1 -1
- package/docs/api/interfaces/RBACRolesListResult.md +1 -1
- 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 +1 -1
- package/docs/api/interfaces/RouteConfig.md +1 -1
- package/docs/api/interfaces/RuntimeComplianceResult.md +1 -1
- package/docs/api/interfaces/SecureDataContextType.md +9 -9
- package/docs/api/interfaces/SecureDataProviderProps.md +8 -8
- package/docs/api/interfaces/SessionRestorationLoaderProps.md +3 -3
- 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 +3 -3
- package/docs/api/interfaces/TextareaProps.md +1 -1
- package/docs/api/interfaces/ToastActionElement.md +4 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +58 -55
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +15 -13
- package/docs/api/interfaces/UseFormDialogOptions.md +1 -1
- package/docs/api/interfaces/UseFormDialogReturn.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +11 -9
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +8 -8
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +6 -6
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +9 -6
- package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
- package/docs/api/interfaces/UsePublicEventReturn.md +8 -5
- package/docs/api/interfaces/UsePublicFileDisplayOptions.md +4 -4
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +12 -9
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +10 -7
- package/docs/api/interfaces/UseResolvedScopeOptions.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
- package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
- package/docs/api/interfaces/UserEventAccess.md +14 -11
- package/docs/api/interfaces/UserMenuProps.md +8 -6
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +575 -634
- package/docs/architecture/database-schema-requirements.md +161 -0
- package/docs/core-concepts/rbac-system.md +3 -3
- package/docs/documentation-index.md +2 -4
- package/docs/getting-started/cursor-rules.md +263 -0
- package/docs/getting-started/installation-guide.md +6 -1
- package/docs/getting-started/quick-start.md +6 -1
- package/docs/migration/DOCUMENTATION_STRUCTURE.md +441 -0
- package/docs/migration/MIGRATION_GUIDE.md +6 -28
- package/docs/migration/README.md +52 -6
- package/docs/migration/V0.5.190_TO_V0.6.1_MIGRATION.md +1153 -0
- package/docs/migration/V0.6.0_REACT_19_MIGRATION.md +227 -0
- package/docs/migration/database-changes-december-2025.md +3 -3
- package/docs/rbac/event-based-apps.md +1 -1
- package/docs/rbac/getting-started.md +1 -1
- package/docs/rbac/quick-start.md +1 -1
- package/docs/standards/README.md +40 -0
- package/docs/troubleshooting/migration.md +4 -4
- package/examples/PublicPages/PublicEventPage.tsx +1 -1
- package/package.json +12 -6
- package/scripts/audit/core/checks/accessibility.cjs +197 -0
- package/scripts/audit/core/checks/api-usage.cjs +191 -0
- package/scripts/audit/core/checks/bundle.cjs +142 -0
- package/scripts/{check-pace-core-compliance.cjs → audit/core/checks/compliance.cjs} +737 -691
- package/scripts/audit/core/checks/config.cjs +54 -0
- package/scripts/audit/core/checks/coverage.cjs +84 -0
- package/scripts/audit/core/checks/dependencies.cjs +454 -0
- package/scripts/audit/core/checks/documentation.cjs +203 -0
- package/scripts/audit/core/checks/environment.cjs +128 -0
- package/scripts/audit/core/checks/error-handling.cjs +299 -0
- package/scripts/audit/core/checks/forms.cjs +172 -0
- package/scripts/audit/core/checks/heuristics.cjs +68 -0
- package/scripts/audit/core/checks/hooks.cjs +334 -0
- package/scripts/audit/core/checks/imports.cjs +244 -0
- package/scripts/audit/core/checks/performance.cjs +325 -0
- package/scripts/audit/core/checks/routes.cjs +117 -0
- package/scripts/audit/core/checks/state.cjs +130 -0
- package/scripts/audit/core/checks/structure.cjs +65 -0
- package/scripts/audit/core/checks/style.cjs +584 -0
- package/scripts/audit/core/checks/testing.cjs +122 -0
- package/scripts/audit/core/checks/typescript.cjs +61 -0
- package/scripts/audit/core/scanner.cjs +199 -0
- package/scripts/audit/core/utils.cjs +137 -0
- package/scripts/audit/index.cjs +223 -0
- package/scripts/audit/reporters/console.cjs +151 -0
- package/scripts/audit/reporters/json.cjs +54 -0
- package/scripts/audit/reporters/markdown.cjs +124 -0
- package/scripts/audit-consuming-app.cjs +86 -0
- package/scripts/build-docs/build-decision.js +240 -0
- package/scripts/build-docs/cache-utils.js +105 -0
- package/scripts/build-docs/content-normalization.js +150 -0
- package/scripts/build-docs/file-utils.js +105 -0
- package/scripts/build-docs/git-utils.js +86 -0
- package/scripts/build-docs/hash-utils.js +116 -0
- package/scripts/build-docs/typedoc-runner.js +220 -0
- package/scripts/build-docs-incremental.js +77 -913
- package/scripts/install-cursor-rules.cjs +236 -0
- package/scripts/utils/command-runner.js +16 -11
- package/scripts/validate-formats.js +61 -56
- package/scripts/validate-master.js +74 -69
- package/scripts/validate-pre-publish.js +70 -65
- package/src/__tests__/helpers/test-providers.tsx +1 -1
- package/src/__tests__/helpers/test-utils.tsx +1 -1
- package/src/__tests__/hooks/usePermissions.test.ts +2 -2
- package/src/components/Alert/Alert.test.tsx +12 -18
- package/src/components/Alert/Alert.tsx +5 -7
- package/src/components/Avatar/Avatar.test.tsx +4 -4
- package/src/components/Badge/Badge.tsx +16 -4
- package/src/components/Button/Button.tsx +27 -4
- package/src/components/Calendar/Calendar.tsx +9 -3
- package/src/components/Card/Card.tsx +4 -0
- package/src/components/Checkbox/Checkbox.test.tsx +12 -12
- package/src/components/Checkbox/Checkbox.tsx +2 -2
- package/src/components/DataTable/DataTable.test.tsx +57 -93
- package/src/components/DataTable/DataTable.tsx +40 -6
- package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +5 -6
- package/src/components/DataTable/__tests__/pagination.modes.test.tsx +29 -7
- package/src/components/DataTable/__tests__/ssr.strict-mode.test.tsx +12 -12
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +2 -3
- package/src/components/DataTable/components/AccessDeniedPage.tsx +17 -26
- package/src/components/DataTable/components/ActionButtons.tsx +10 -7
- package/src/components/DataTable/components/BulkOperationsDropdown.tsx +2 -2
- package/src/components/DataTable/components/ColumnFilter.tsx +10 -0
- package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +12 -0
- package/src/components/DataTable/components/DataTableBody.tsx +8 -0
- package/src/components/DataTable/components/DataTableCore.tsx +200 -561
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +11 -0
- package/src/components/DataTable/components/DataTableLayout.tsx +559 -0
- package/src/components/DataTable/components/DataTableModals.tsx +9 -1
- package/src/components/DataTable/components/DataTableToolbar.tsx +8 -0
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +12 -0
- package/src/components/DataTable/components/EditFields.tsx +307 -0
- package/src/components/DataTable/components/EditableRow.tsx +9 -1
- package/src/components/DataTable/components/EmptyState.tsx +10 -0
- package/src/components/DataTable/components/FilterRow.tsx +12 -0
- package/src/components/DataTable/components/GroupHeader.tsx +12 -0
- package/src/components/DataTable/components/GroupingDropdown.tsx +12 -0
- package/src/components/DataTable/components/ImportModal.tsx +7 -0
- package/src/components/DataTable/components/LoadingState.tsx +6 -0
- package/src/components/DataTable/components/PaginationControls.tsx +16 -1
- package/src/components/DataTable/components/RowComponent.tsx +391 -0
- package/src/components/DataTable/components/UnifiedTableBody.tsx +62 -852
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +16 -4
- package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +4 -2
- 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/components/cellValueUtils.ts +40 -0
- package/src/components/DataTable/components/hooks/useImportModalFocus.ts +53 -0
- package/src/components/DataTable/components/hooks/usePermissionTracking.ts +126 -0
- package/src/components/DataTable/context/DataTableContext.tsx +50 -0
- package/src/components/DataTable/core/ColumnFactory.ts +31 -0
- package/src/components/DataTable/core/DataTableContext.tsx +32 -1
- package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +10 -0
- package/src/components/DataTable/hooks/useColumnReordering.ts +14 -2
- package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +10 -0
- package/src/components/DataTable/hooks/useDataTableDataPipeline.ts +16 -0
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +124 -32
- package/src/components/DataTable/hooks/useDataTableState.ts +35 -1
- package/src/components/DataTable/hooks/useEffectiveColumnOrder.ts +12 -0
- package/src/components/DataTable/hooks/useKeyboardNavigation.ts +2 -2
- package/src/components/DataTable/hooks/useServerSideDataEffect.ts +11 -0
- package/src/components/DataTable/hooks/useTableColumns.ts +8 -0
- package/src/components/DataTable/hooks/useTableHandlers.ts +14 -0
- package/src/components/DataTable/styles.ts +6 -6
- package/src/components/DataTable/types.ts +6 -10
- package/src/components/DataTable/utils/a11yUtils.ts +7 -0
- package/src/components/DataTable/utils/debugTools.ts +18 -113
- package/src/components/DataTable/utils/errorHandling.ts +12 -0
- package/src/components/DataTable/utils/exportUtils.ts +9 -0
- package/src/components/DataTable/utils/flexibleImport.ts +12 -48
- package/src/components/DataTable/utils/paginationUtils.ts +8 -0
- package/src/components/DataTable/utils/performanceUtils.ts +5 -1
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +8 -14
- package/src/components/Dialog/Dialog.tsx +8 -7
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +180 -1
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +46 -6
- package/src/components/ErrorBoundary/ErrorBoundaryContext.tsx +129 -0
- package/src/components/ErrorBoundary/index.ts +27 -2
- package/src/components/EventSelector/EventSelector.tsx +4 -1
- package/src/components/FileDisplay/FileDisplay.test.tsx +2 -2
- package/src/components/FileDisplay/FileDisplay.tsx +32 -18
- package/src/components/FileUpload/FileUpload.tsx +22 -2
- package/src/components/Footer/Footer.test.tsx +16 -16
- package/src/components/Footer/Footer.tsx +15 -12
- package/src/components/Form/Form.test.tsx +36 -15
- package/src/components/Form/Form.tsx +31 -26
- package/src/components/Header/Header.tsx +22 -11
- package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +40 -40
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +1 -1
- package/src/components/Input/Input.test.tsx +2 -2
- package/src/components/Input/Input.tsx +36 -34
- package/src/components/Label/Label.tsx +1 -1
- package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +4 -4
- package/src/components/LoadingSpinner/LoadingSpinner.tsx +1 -1
- package/src/components/LoginForm/LoginForm.test.tsx +42 -42
- package/src/components/LoginForm/LoginForm.tsx +12 -8
- package/src/components/NavigationMenu/NavigationMenu.tsx +15 -514
- package/src/components/NavigationMenu/types.ts +56 -0
- package/src/components/NavigationMenu/useNavigationFiltering.ts +390 -0
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +3 -0
- package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +1 -1
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +54 -52
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +33 -12
- package/src/components/PaceAppLayout/README.md +1 -1
- package/src/components/PaceAppLayout/test-setup.tsx +1 -2
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +4 -1
- package/src/components/PasswordChange/PasswordChangeForm.test.tsx +33 -33
- package/src/components/PasswordChange/PasswordChangeForm.tsx +10 -1
- package/src/components/Progress/Progress.tsx +1 -1
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -9
- package/src/components/PublicLayout/PublicPageLayout.tsx +3 -6
- package/src/components/PublicLayout/PublicPageProvider.tsx +4 -0
- package/src/components/Select/Select.tsx +95 -438
- package/src/components/Select/context.ts +23 -0
- package/src/components/Select/hooks/useSelectEvents.ts +87 -0
- package/src/components/Select/hooks/useSelectSearch.ts +91 -0
- package/src/components/Select/hooks/useSelectState.ts +104 -0
- package/src/components/Select/index.ts +9 -1
- package/src/components/Select/types.ts +123 -0
- package/src/components/Select/utils/text.ts +26 -0
- package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +5 -6
- package/src/components/Switch/Switch.tsx +4 -4
- package/src/components/Table/Table.tsx +1 -1
- package/src/components/Tabs/Tabs.tsx +1 -1
- package/src/components/Textarea/Textarea.tsx +27 -29
- package/src/components/Toast/Toast.tsx +5 -1
- package/src/components/Tooltip/Tooltip.tsx +3 -3
- package/src/components/UserMenu/UserMenu.test.tsx +24 -11
- package/src/components/UserMenu/UserMenu.tsx +22 -19
- package/src/components/index.ts +2 -2
- package/src/hooks/__tests__/hooks.integration.test.tsx +80 -55
- package/src/hooks/__tests__/index.unit.test.ts +2 -5
- package/src/hooks/__tests__/useStorage.unit.test.ts +36 -36
- package/src/hooks/index.ts +1 -2
- package/src/hooks/public/usePublicEvent.ts +5 -1
- package/src/hooks/public/usePublicEventLogo.ts +5 -1
- package/src/hooks/public/usePublicFileDisplay.ts +4 -0
- package/src/hooks/public/usePublicRouteParams.ts +5 -1
- package/src/hooks/services/useAuth.ts +32 -0
- package/src/hooks/services/useCurrentEvent.ts +6 -0
- package/src/hooks/services/useCurrentOrganisation.ts +6 -0
- package/src/hooks/useDataTableState.ts +8 -18
- package/src/hooks/useDebounce.ts +9 -0
- package/src/hooks/useEventTheme.ts +6 -0
- package/src/hooks/useFileDisplay.ts +4 -0
- package/src/hooks/useFileReference.ts +25 -7
- package/src/hooks/useFileUrl.ts +11 -1
- package/src/hooks/useFocusManagement.ts +16 -2
- package/src/hooks/useFocusTrap.ts +7 -4
- package/src/hooks/useFormDialog.ts +8 -7
- package/src/hooks/useInactivityTracker.ts +4 -1
- package/src/hooks/useKeyboardShortcuts.ts +4 -0
- package/src/hooks/useOrganisationPermissions.ts +4 -0
- package/src/hooks/useOrganisationSecurity.ts +4 -0
- package/src/hooks/usePerformanceMonitor.ts +4 -0
- package/src/hooks/usePermissionCache.ts +8 -1
- package/src/hooks/useQueryCache.ts +12 -1
- package/src/hooks/useSessionRestoration.ts +4 -0
- package/src/hooks/useStorage.ts +4 -0
- package/src/hooks/useToast.ts +3 -3
- package/src/index.ts +2 -1
- package/src/providers/__tests__/OrganisationProvider.test.tsx +115 -49
- package/src/providers/__tests__/ProviderLifecycle.test.tsx +21 -6
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +10 -10
- package/src/providers/services/AuthServiceProvider.tsx +18 -0
- package/src/providers/services/EventServiceProvider.tsx +18 -0
- package/src/providers/services/InactivityServiceProvider.tsx +18 -0
- package/src/providers/services/OrganisationServiceProvider.tsx +18 -0
- package/src/providers/services/UnifiedAuthProvider.tsx +58 -22
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +33 -7
- package/src/rbac/README.md +1 -1
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +26 -26
- package/src/rbac/__tests__/scenarios.user-role.test.tsx +4 -5
- package/src/rbac/adapters.tsx +14 -5
- package/src/rbac/api.ts +100 -67
- package/src/rbac/components/EnhancedNavigationMenu.tsx +1 -1
- package/src/rbac/components/NavigationGuard.tsx +1 -1
- package/src/rbac/components/NavigationProvider.tsx +5 -2
- package/src/rbac/components/PagePermissionGuard.tsx +158 -18
- package/src/rbac/components/PagePermissionProvider.tsx +1 -1
- package/src/rbac/components/PermissionEnforcer.tsx +1 -1
- package/src/rbac/components/RoleBasedRouter.tsx +6 -2
- package/src/rbac/components/SecureDataProvider.test.tsx +84 -49
- package/src/rbac/components/SecureDataProvider.tsx +21 -6
- package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +24 -14
- package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +7 -0
- package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +14 -6
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +15 -4
- package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +148 -24
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +81 -15
- package/src/rbac/engine.ts +38 -14
- package/src/rbac/hooks/permissions/index.ts +7 -0
- package/src/rbac/hooks/permissions/useAccessLevel.ts +105 -0
- package/src/rbac/hooks/permissions/useCachedPermissions.ts +79 -0
- package/src/rbac/hooks/permissions/useCan.ts +347 -0
- package/src/rbac/hooks/permissions/useHasAllPermissions.ts +90 -0
- package/src/rbac/hooks/permissions/useHasAnyPermission.ts +90 -0
- package/src/rbac/hooks/permissions/useMultiplePermissions.ts +93 -0
- package/src/rbac/hooks/permissions/usePermissions.ts +253 -0
- package/src/rbac/hooks/useCan.test.ts +71 -64
- package/src/rbac/hooks/usePermissions.ts +14 -995
- package/src/rbac/hooks/useResourcePermissions.test.ts +54 -18
- package/src/rbac/hooks/useResourcePermissions.ts +14 -4
- package/src/rbac/hooks/useSecureSupabase.ts +33 -13
- package/src/rbac/permissions.ts +0 -30
- package/src/rbac/secureClient.ts +212 -61
- package/src/rbac/types.ts +8 -0
- package/src/theming/__tests__/parseEventColours.test.ts +6 -9
- package/src/theming/parseEventColours.ts +5 -19
- package/src/types/vitest-globals.d.ts +51 -26
- package/src/utils/__mocks__/supabaseMock.ts +1 -3
- package/src/utils/__tests__/formatting.unit.test.ts +4 -4
- package/src/utils/__tests__/index.unit.test.ts +2 -2
- package/src/utils/audit/audit.ts +0 -3
- package/src/utils/core/cn.ts +1 -1
- package/src/utils/file-reference/index.ts +53 -1
- package/src/utils/formatting/formatting.ts +8 -18
- package/src/utils/index.ts +0 -1
- package/src/utils/security/secureDataAccess.test.ts +31 -20
- package/src/utils/security/secureDataAccess.ts +4 -3
- package/dist/chunk-6C4YBBJM.js +0 -628
- package/dist/chunk-6C4YBBJM.js.map +0 -1
- package/dist/chunk-7D4SUZUM.js 2.map +0 -1
- package/dist/chunk-7EQTDTTJ.js 2.map +0 -1
- package/dist/chunk-7EQTDTTJ.js.map +0 -1
- package/dist/chunk-7FLMSG37.js 2.map +0 -1
- package/dist/chunk-7FLMSG37.js.map +0 -1
- package/dist/chunk-BC4IJKSL.js.map +0 -1
- package/dist/chunk-E3SPN4VZ.js +0 -12917
- package/dist/chunk-E3SPN4VZ.js.map +0 -1
- package/dist/chunk-E66EQZE6 5.js +0 -37
- package/dist/chunk-E66EQZE6.js 2.map +0 -1
- package/dist/chunk-HWIIPPNI.js.map +0 -1
- package/dist/chunk-I7PSE6JW 5.js +0 -191
- package/dist/chunk-I7PSE6JW.js 2.map +0 -1
- package/dist/chunk-I7PSE6JW.js.map +0 -1
- package/dist/chunk-IIELH4DL.js.map +0 -1
- package/dist/chunk-KNC55RTG.js 5.map +0 -1
- package/dist/chunk-KNC55RTG.js.map +0 -1
- package/dist/chunk-KQCRWDSA.js 5.map +0 -1
- package/dist/chunk-LFNCN2SP.js +0 -412
- package/dist/chunk-LFNCN2SP.js 2.map +0 -1
- package/dist/chunk-LFNCN2SP.js.map +0 -1
- package/dist/chunk-LMC26NLJ 2.js +0 -84
- package/dist/chunk-NOAYCWCX.js +0 -4993
- package/dist/chunk-NOAYCWCX.js.map +0 -1
- package/dist/chunk-QWWZ5CAQ.js 3.map +0 -1
- package/dist/chunk-QWWZ5CAQ.js.map +0 -1
- package/dist/chunk-QXHPKYJV 3.js +0 -113
- package/dist/chunk-R77UEZ4E.js +0 -68
- package/dist/chunk-R77UEZ4E.js.map +0 -1
- package/dist/chunk-SQGMNID3.js.map +0 -1
- package/dist/chunk-VBXEHIUJ.js 6.map +0 -1
- package/dist/chunk-XNXXZ43G.js.map +0 -1
- package/dist/chunk-ZSAAAMVR 6.js +0 -25
- package/dist/components.js 5.map +0 -1
- package/dist/styles/index 2.js +0 -12
- package/dist/styles/index.js 5.map +0 -1
- package/dist/theming/runtime 5.js +0 -19
- package/dist/theming/runtime.js 5.map +0 -1
- package/docs/api/classes/ErrorBoundary.md +0 -144
- package/docs/migration/quick-migration-guide.md +0 -356
- package/docs/migration/service-architecture.md +0 -281
- package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +0 -680
- package/src/hooks/useSecureDataAccess.test.ts +0 -559
- package/src/hooks/useSecureDataAccess.ts +0 -666
- /package/dist/{DataTable-5FU7IESH.js.map → DataTable-TPTKCX4D.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-RGJTDE2C.js.map → UnifiedAuthProvider-CH6Z342H.js.map} +0 -0
- /package/dist/{api-N774RPUA.js.map → api-MVVQZLJI.js.map} +0 -0
- /package/docs/migration/{organisation-context-timing-fix.md → V0.3.44_organisation-context-timing-fix.md} +0 -0
- /package/docs/migration/{rbac-migration.md → V0.4.0_rbac-migration.md} +0 -0
- /package/docs/migration/{person-scoped-profiles-migration-guide.md → V0.5.190_person-scoped-profiles-migration-guide.md} +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
|
@@ -55,13 +55,13 @@ vi.mock('../Label', () => ({
|
|
|
55
55
|
|
|
56
56
|
describe('PasswordChangeForm', () => {
|
|
57
57
|
const mockOnSubmit = vi.fn();
|
|
58
|
-
const
|
|
58
|
+
const baseProps: PasswordChangeFormProps = {
|
|
59
59
|
onSubmit: mockOnSubmit
|
|
60
60
|
};
|
|
61
61
|
|
|
62
62
|
describe('Rendering', () => {
|
|
63
63
|
it('renders password change form with all elements', () => {
|
|
64
|
-
render(<PasswordChangeForm {...
|
|
64
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
65
65
|
|
|
66
66
|
expect(screen.getByLabelText('New Password')).toBeInTheDocument();
|
|
67
67
|
expect(screen.getByLabelText('Confirm Password')).toBeInTheDocument();
|
|
@@ -70,14 +70,14 @@ describe('PasswordChangeForm', () => {
|
|
|
70
70
|
|
|
71
71
|
it('renders with custom className', () => {
|
|
72
72
|
const customClass = 'custom-password-change-form';
|
|
73
|
-
const { container } = render(<PasswordChangeForm {...
|
|
73
|
+
const { container } = render(<PasswordChangeForm {...baseProps} className={customClass} />);
|
|
74
74
|
|
|
75
75
|
const form = container.querySelector('form');
|
|
76
76
|
expect(form).toHaveClass(customClass);
|
|
77
77
|
});
|
|
78
78
|
|
|
79
79
|
it('has proper form structure and accessibility', () => {
|
|
80
|
-
render(<PasswordChangeForm {...
|
|
80
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
81
81
|
|
|
82
82
|
const newPasswordInput = screen.getByLabelText('New Password');
|
|
83
83
|
expect(newPasswordInput).toHaveAttribute('type', 'password');
|
|
@@ -97,7 +97,7 @@ describe('PasswordChangeForm', () => {
|
|
|
97
97
|
describe('Form Interaction', () => {
|
|
98
98
|
it('updates new password input value when user types', async () => {
|
|
99
99
|
const user = userEvent.setup();
|
|
100
|
-
render(<PasswordChangeForm {...
|
|
100
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
101
101
|
|
|
102
102
|
const newPasswordInput = screen.getByLabelText('New Password');
|
|
103
103
|
await user.type(newPasswordInput, 'newpassword123');
|
|
@@ -107,7 +107,7 @@ describe('PasswordChangeForm', () => {
|
|
|
107
107
|
|
|
108
108
|
it('updates confirm password input value when user types', async () => {
|
|
109
109
|
const user = userEvent.setup();
|
|
110
|
-
render(<PasswordChangeForm {...
|
|
110
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
111
111
|
|
|
112
112
|
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
113
113
|
await user.type(confirmPasswordInput, 'newpassword123');
|
|
@@ -117,7 +117,7 @@ describe('PasswordChangeForm', () => {
|
|
|
117
117
|
|
|
118
118
|
it('enables submit button when both passwords are provided', async () => {
|
|
119
119
|
const user = userEvent.setup();
|
|
120
|
-
render(<PasswordChangeForm {...
|
|
120
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
121
121
|
|
|
122
122
|
const newPasswordInput = screen.getByLabelText('New Password');
|
|
123
123
|
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
@@ -133,7 +133,7 @@ describe('PasswordChangeForm', () => {
|
|
|
133
133
|
|
|
134
134
|
it('disables submit button when new password is empty', async () => {
|
|
135
135
|
const user = userEvent.setup();
|
|
136
|
-
render(<PasswordChangeForm {...
|
|
136
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
137
137
|
|
|
138
138
|
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
139
139
|
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
@@ -145,7 +145,7 @@ describe('PasswordChangeForm', () => {
|
|
|
145
145
|
|
|
146
146
|
it('disables submit button when confirm password is empty', async () => {
|
|
147
147
|
const user = userEvent.setup();
|
|
148
|
-
render(<PasswordChangeForm {...
|
|
148
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
149
149
|
|
|
150
150
|
const newPasswordInput = screen.getByLabelText('New Password');
|
|
151
151
|
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
@@ -159,7 +159,7 @@ describe('PasswordChangeForm', () => {
|
|
|
159
159
|
describe('Form Validation', () => {
|
|
160
160
|
it('shows error when password is too short', async () => {
|
|
161
161
|
const user = userEvent.setup();
|
|
162
|
-
render(<PasswordChangeForm {...
|
|
162
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
163
163
|
|
|
164
164
|
const newPasswordInput = screen.getByLabelText('New Password');
|
|
165
165
|
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
@@ -175,7 +175,7 @@ describe('PasswordChangeForm', () => {
|
|
|
175
175
|
|
|
176
176
|
it('shows error when passwords do not match', async () => {
|
|
177
177
|
const user = userEvent.setup();
|
|
178
|
-
render(<PasswordChangeForm {...
|
|
178
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
179
179
|
|
|
180
180
|
const newPasswordInput = screen.getByLabelText('New Password');
|
|
181
181
|
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
@@ -191,7 +191,7 @@ describe('PasswordChangeForm', () => {
|
|
|
191
191
|
|
|
192
192
|
it('validates password length before checking match', async () => {
|
|
193
193
|
const user = userEvent.setup();
|
|
194
|
-
render(<PasswordChangeForm {...
|
|
194
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
195
195
|
|
|
196
196
|
const newPasswordInput = screen.getByLabelText('New Password');
|
|
197
197
|
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
@@ -207,7 +207,7 @@ describe('PasswordChangeForm', () => {
|
|
|
207
207
|
|
|
208
208
|
it('clears error when form is resubmitted with valid data', async () => {
|
|
209
209
|
const user = userEvent.setup();
|
|
210
|
-
render(<PasswordChangeForm {...
|
|
210
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
211
211
|
|
|
212
212
|
const newPasswordInput = screen.getByLabelText('New Password');
|
|
213
213
|
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
@@ -236,7 +236,7 @@ describe('PasswordChangeForm', () => {
|
|
|
236
236
|
const user = userEvent.setup();
|
|
237
237
|
mockOnSubmit.mockResolvedValue({});
|
|
238
238
|
|
|
239
|
-
render(<PasswordChangeForm {...
|
|
239
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
240
240
|
|
|
241
241
|
const newPasswordInput = screen.getByLabelText('New Password');
|
|
242
242
|
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
@@ -254,7 +254,7 @@ describe('PasswordChangeForm', () => {
|
|
|
254
254
|
|
|
255
255
|
it('prevents form submission when validation fails', async () => {
|
|
256
256
|
const user = userEvent.setup();
|
|
257
|
-
render(<PasswordChangeForm {...
|
|
257
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
258
258
|
|
|
259
259
|
const newPasswordInput = screen.getByLabelText('New Password');
|
|
260
260
|
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
@@ -273,7 +273,7 @@ describe('PasswordChangeForm', () => {
|
|
|
273
273
|
const user = userEvent.setup();
|
|
274
274
|
mockOnSubmit.mockImplementation(() => new Promise(resolve => setTimeout(resolve, 100)));
|
|
275
275
|
|
|
276
|
-
render(<PasswordChangeForm {...
|
|
276
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
277
277
|
|
|
278
278
|
const newPasswordInput = screen.getByLabelText('New Password');
|
|
279
279
|
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
@@ -291,7 +291,7 @@ describe('PasswordChangeForm', () => {
|
|
|
291
291
|
const user = userEvent.setup();
|
|
292
292
|
mockOnSubmit.mockImplementation(() => new Promise(resolve => setTimeout(resolve, 100)));
|
|
293
293
|
|
|
294
|
-
render(<PasswordChangeForm {...
|
|
294
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
295
295
|
|
|
296
296
|
const newPasswordInput = screen.getByLabelText('New Password');
|
|
297
297
|
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
@@ -309,7 +309,7 @@ describe('PasswordChangeForm', () => {
|
|
|
309
309
|
const user = userEvent.setup();
|
|
310
310
|
mockOnSubmit.mockResolvedValue({});
|
|
311
311
|
|
|
312
|
-
render(<PasswordChangeForm {...
|
|
312
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
313
313
|
|
|
314
314
|
const newPasswordInput = screen.getByLabelText('New Password');
|
|
315
315
|
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
@@ -329,7 +329,7 @@ describe('PasswordChangeForm', () => {
|
|
|
329
329
|
const user = userEvent.setup();
|
|
330
330
|
mockOnSubmit.mockResolvedValue({ error: { message: 'Test error' } });
|
|
331
331
|
|
|
332
|
-
render(<PasswordChangeForm {...
|
|
332
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
333
333
|
|
|
334
334
|
const newPasswordInput = screen.getByLabelText('New Password');
|
|
335
335
|
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
@@ -352,7 +352,7 @@ describe('PasswordChangeForm', () => {
|
|
|
352
352
|
const errorMessage = 'Password change failed';
|
|
353
353
|
mockOnSubmit.mockResolvedValue({ error: { message: errorMessage } });
|
|
354
354
|
|
|
355
|
-
render(<PasswordChangeForm {...
|
|
355
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
356
356
|
|
|
357
357
|
const newPasswordInput = screen.getByLabelText('New Password');
|
|
358
358
|
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
@@ -373,7 +373,7 @@ describe('PasswordChangeForm', () => {
|
|
|
373
373
|
const errorMessage = 'Network error';
|
|
374
374
|
mockOnSubmit.mockRejectedValue(new Error(errorMessage));
|
|
375
375
|
|
|
376
|
-
render(<PasswordChangeForm {...
|
|
376
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
377
377
|
|
|
378
378
|
const newPasswordInput = screen.getByLabelText('New Password');
|
|
379
379
|
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
@@ -393,7 +393,7 @@ describe('PasswordChangeForm', () => {
|
|
|
393
393
|
const user = userEvent.setup();
|
|
394
394
|
mockOnSubmit.mockRejectedValue('String error');
|
|
395
395
|
|
|
396
|
-
render(<PasswordChangeForm {...
|
|
396
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
397
397
|
|
|
398
398
|
const newPasswordInput = screen.getByLabelText('New Password');
|
|
399
399
|
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
@@ -412,7 +412,7 @@ describe('PasswordChangeForm', () => {
|
|
|
412
412
|
const user = userEvent.setup();
|
|
413
413
|
mockOnSubmit.mockResolvedValue({ error: { code: 'INVALID_PASSWORD' } });
|
|
414
414
|
|
|
415
|
-
render(<PasswordChangeForm {...
|
|
415
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
416
416
|
|
|
417
417
|
const newPasswordInput = screen.getByLabelText('New Password');
|
|
418
418
|
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
@@ -433,7 +433,7 @@ describe('PasswordChangeForm', () => {
|
|
|
433
433
|
.mockResolvedValueOnce({ error: { message: 'First error' } })
|
|
434
434
|
.mockResolvedValueOnce({});
|
|
435
435
|
|
|
436
|
-
render(<PasswordChangeForm {...
|
|
436
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
437
437
|
|
|
438
438
|
const newPasswordInput = screen.getByLabelText('New Password');
|
|
439
439
|
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
@@ -457,7 +457,7 @@ describe('PasswordChangeForm', () => {
|
|
|
457
457
|
|
|
458
458
|
describe('Accessibility', () => {
|
|
459
459
|
it('has proper form labels and associations', () => {
|
|
460
|
-
render(<PasswordChangeForm {...
|
|
460
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
461
461
|
|
|
462
462
|
const newPasswordInput = screen.getByLabelText('New Password');
|
|
463
463
|
expect(newPasswordInput).toHaveAttribute('id', 'new-password');
|
|
@@ -472,7 +472,7 @@ describe('PasswordChangeForm', () => {
|
|
|
472
472
|
const user = userEvent.setup();
|
|
473
473
|
mockOnSubmit.mockResolvedValue({ error: { message: 'Test error' } });
|
|
474
474
|
|
|
475
|
-
render(<PasswordChangeForm {...
|
|
475
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
476
476
|
|
|
477
477
|
const newPasswordInput = screen.getByLabelText('New Password');
|
|
478
478
|
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
@@ -492,7 +492,7 @@ describe('PasswordChangeForm', () => {
|
|
|
492
492
|
const user = userEvent.setup();
|
|
493
493
|
mockOnSubmit.mockResolvedValue({});
|
|
494
494
|
|
|
495
|
-
render(<PasswordChangeForm {...
|
|
495
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
496
496
|
|
|
497
497
|
const newPasswordInput = screen.getByLabelText('New Password');
|
|
498
498
|
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
@@ -510,7 +510,7 @@ describe('PasswordChangeForm', () => {
|
|
|
510
510
|
|
|
511
511
|
describe('Edge Cases', () => {
|
|
512
512
|
it('handles empty password values', () => {
|
|
513
|
-
render(<PasswordChangeForm {...
|
|
513
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
514
514
|
|
|
515
515
|
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
516
516
|
|
|
@@ -519,7 +519,7 @@ describe('PasswordChangeForm', () => {
|
|
|
519
519
|
|
|
520
520
|
it('handles whitespace-only passwords', async () => {
|
|
521
521
|
const user = userEvent.setup();
|
|
522
|
-
render(<PasswordChangeForm {...
|
|
522
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
523
523
|
|
|
524
524
|
const newPasswordInput = screen.getByLabelText('New Password');
|
|
525
525
|
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
@@ -538,7 +538,7 @@ describe('PasswordChangeForm', () => {
|
|
|
538
538
|
const longPassword = 'a'.repeat(1000);
|
|
539
539
|
mockOnSubmit.mockResolvedValue({});
|
|
540
540
|
|
|
541
|
-
render(<PasswordChangeForm {...
|
|
541
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
542
542
|
|
|
543
543
|
const newPasswordInput = screen.getByLabelText('New Password');
|
|
544
544
|
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
@@ -559,7 +559,7 @@ describe('PasswordChangeForm', () => {
|
|
|
559
559
|
const specialPassword = 'P@ssw0rd!@#$%^&*()_+-=';
|
|
560
560
|
mockOnSubmit.mockResolvedValue({});
|
|
561
561
|
|
|
562
|
-
render(<PasswordChangeForm {...
|
|
562
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
563
563
|
|
|
564
564
|
const newPasswordInput = screen.getByLabelText('New Password');
|
|
565
565
|
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
@@ -580,7 +580,7 @@ describe('PasswordChangeForm', () => {
|
|
|
580
580
|
const unicodePassword = 'pássw0rd_测试_пароль';
|
|
581
581
|
mockOnSubmit.mockResolvedValue({});
|
|
582
582
|
|
|
583
|
-
render(<PasswordChangeForm {...
|
|
583
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
584
584
|
|
|
585
585
|
const newPasswordInput = screen.getByLabelText('New Password');
|
|
586
586
|
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
@@ -600,7 +600,7 @@ describe('PasswordChangeForm', () => {
|
|
|
600
600
|
describe('Performance', () => {
|
|
601
601
|
it('handles rapid input changes efficiently', async () => {
|
|
602
602
|
const user = userEvent.setup();
|
|
603
|
-
render(<PasswordChangeForm {...
|
|
603
|
+
render(<PasswordChangeForm {...baseProps} />);
|
|
604
604
|
|
|
605
605
|
const newPasswordInput = screen.getByLabelText('New Password');
|
|
606
606
|
|
|
@@ -90,7 +90,7 @@
|
|
|
90
90
|
* - Proper error handling
|
|
91
91
|
*
|
|
92
92
|
* @dependencies
|
|
93
|
-
* - React
|
|
93
|
+
* - React 19+ - Hooks and state
|
|
94
94
|
* - Button component
|
|
95
95
|
* - Input component
|
|
96
96
|
* - Label component
|
|
@@ -103,16 +103,25 @@ import { Input } from '../Input/Input';
|
|
|
103
103
|
import { Label } from '../Label';
|
|
104
104
|
import { cn } from '../../utils/core/cn';
|
|
105
105
|
|
|
106
|
+
/**
|
|
107
|
+
* Form values for password change.
|
|
108
|
+
*/
|
|
106
109
|
export interface PasswordChangeFormValues {
|
|
107
110
|
newPassword: string;
|
|
108
111
|
confirmPassword: string;
|
|
109
112
|
}
|
|
110
113
|
|
|
114
|
+
/**
|
|
115
|
+
* Error structure for password change form.
|
|
116
|
+
*/
|
|
111
117
|
export interface PasswordChangeFormError {
|
|
112
118
|
message?: string;
|
|
113
119
|
code?: string;
|
|
114
120
|
}
|
|
115
121
|
|
|
122
|
+
/**
|
|
123
|
+
* Props for the PasswordChangeForm component.
|
|
124
|
+
*/
|
|
116
125
|
export interface PasswordChangeFormProps {
|
|
117
126
|
onSubmit: (values: PasswordChangeFormValues) => Promise<{ error?: PasswordChangeFormError }>;
|
|
118
127
|
className?: string;
|
|
@@ -79,6 +79,9 @@ import { Alert, AlertDescription, AlertTitle } from '../Alert/Alert';
|
|
|
79
79
|
import { logger } from '../../utils/core/logger';
|
|
80
80
|
import { usePreventTabReload } from '../../hooks/usePreventTabReload';
|
|
81
81
|
|
|
82
|
+
/**
|
|
83
|
+
* Props for the ProtectedRoute component.
|
|
84
|
+
*/
|
|
82
85
|
export interface ProtectedRouteProps {
|
|
83
86
|
/**
|
|
84
87
|
* Whether an event is required for routes inside this component.
|
|
@@ -88,14 +91,6 @@ export interface ProtectedRouteProps {
|
|
|
88
91
|
*/
|
|
89
92
|
requireEvent?: boolean;
|
|
90
93
|
|
|
91
|
-
/**
|
|
92
|
-
* Whether super admins can bypass event requirement.
|
|
93
|
-
* Note: This feature requires additional RBAC setup. For simple bypass, set requireEvent={false} instead.
|
|
94
|
-
* @default false
|
|
95
|
-
* @deprecated Use requireEvent={false} for routes that don't need events
|
|
96
|
-
*/
|
|
97
|
-
allowSuperAdminBypass?: boolean;
|
|
98
|
-
|
|
99
94
|
/**
|
|
100
95
|
* Custom component to render when no events are available.
|
|
101
96
|
* If not provided, a default message is shown.
|
|
@@ -133,7 +128,6 @@ export interface ProtectedRouteProps {
|
|
|
133
128
|
*/
|
|
134
129
|
export function ProtectedRoute({
|
|
135
130
|
requireEvent = false,
|
|
136
|
-
allowSuperAdminBypass = false,
|
|
137
131
|
noEventsFallback,
|
|
138
132
|
loadingFallback,
|
|
139
133
|
loginPath = '/login'
|
|
@@ -35,9 +35,9 @@
|
|
|
35
35
|
* refetch={refetch}
|
|
36
36
|
* >
|
|
37
37
|
* <h1>Event Details</h1>
|
|
38
|
-
* <
|
|
38
|
+
* <main className="content">
|
|
39
39
|
* Your public page content
|
|
40
|
-
* </
|
|
40
|
+
* </main>
|
|
41
41
|
* </PublicPageLayout>
|
|
42
42
|
* );
|
|
43
43
|
* }
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
* - Error handling for invalid routes
|
|
59
59
|
*
|
|
60
60
|
* @dependencies
|
|
61
|
-
* - React
|
|
61
|
+
* - React 19+ - Component framework
|
|
62
62
|
* - React Router - Routing integration
|
|
63
63
|
* - Public hooks - Data access
|
|
64
64
|
* - Tailwind CSS - Styling
|
|
@@ -90,8 +90,6 @@ export interface PublicPageLayoutProps {
|
|
|
90
90
|
refetch?: () => Promise<void> | void;
|
|
91
91
|
/** Whether to show the footer (default: true) */
|
|
92
92
|
showFooter?: boolean;
|
|
93
|
-
/** @deprecated Custom CSS classes for the layout - no longer used as wrapper div was removed */
|
|
94
|
-
className?: string;
|
|
95
93
|
/** Custom error fallback component */
|
|
96
94
|
errorFallback?: React.ComponentType<{ error: Error; retry: () => void }>;
|
|
97
95
|
/** Custom loading fallback component */
|
|
@@ -294,7 +292,6 @@ export function PublicPageLayout({
|
|
|
294
292
|
error = null,
|
|
295
293
|
refetch,
|
|
296
294
|
showFooter = true,
|
|
297
|
-
className = '',
|
|
298
295
|
errorFallback: ErrorFallback,
|
|
299
296
|
loadingFallback: LoadingFallback,
|
|
300
297
|
customHeader,
|
|
@@ -50,6 +50,10 @@ interface PublicPageContextType {
|
|
|
50
50
|
};
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
+
/**
|
|
54
|
+
* Context for public pages.
|
|
55
|
+
* Provides isolated context for public pages without authentication requirements.
|
|
56
|
+
*/
|
|
53
57
|
export const PublicPageContext = createContext<PublicPageContextType | undefined>(undefined);
|
|
54
58
|
|
|
55
59
|
export interface PublicPageProviderProps {
|