@jmruthers/pace-core 0.5.181 → 0.5.182
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 +1 -1
- package/README.md +16 -2
- package/dist/{AuthService-DYuQPJj6.d.ts → AuthService-B-cd2MA4.d.ts} +9 -11
- package/dist/{DataTable-CWAZZcXC.d.ts → DataTable-Bz8ffqyA.d.ts} +1 -1
- package/dist/{DataTable-UA6CL4JI.js → DataTable-QAB34V6K.js} +14 -15
- package/dist/UnifiedAuthProvider-7F6T4B6K.js +13 -0
- package/dist/{UnifiedAuthProvider-DJxGTftH.d.ts → UnifiedAuthProvider-F86d7dSi.d.ts} +5 -6
- package/dist/{api-45XYYO2A.js → api-ROMBCNKU.js} +5 -5
- package/dist/{audit-64X3VJXB.js → audit-WRS3KJKI.js} +4 -4
- package/dist/auth-BZOJqrdd.d.ts +49 -0
- package/dist/{chunk-CX5M4ZAG.js → chunk-5DRSZLL2.js} +1 -1
- package/dist/chunk-5DRSZLL2.js.map +1 -0
- package/dist/{chunk-BESYRHQM.js → chunk-6C4YBBJM.js} +10 -7
- package/dist/chunk-6C4YBBJM.js.map +1 -0
- package/dist/{chunk-PLDDJCW6.js → chunk-7D4SUZUM.js} +2 -13
- package/dist/{chunk-HRO5HWN2.js → chunk-CSOFYHAG.js} +55 -162
- package/dist/chunk-CSOFYHAG.js.map +1 -0
- package/dist/{chunk-ANBQRTPX.js → chunk-E66EQZE6.js} +3 -5
- package/dist/{chunk-ANBQRTPX.js.map → chunk-E66EQZE6.js.map} +1 -1
- package/dist/{chunk-Q5QRDWKI.js → chunk-F2IMUDXZ.js} +4 -6
- package/dist/chunk-F2IMUDXZ.js.map +1 -0
- package/dist/{chunk-SBVILCCA.js → chunk-FSFQFJCU.js} +28 -6
- package/dist/chunk-FSFQFJCU.js.map +1 -0
- package/dist/chunk-FUEYYMX5.js +2296 -0
- package/dist/chunk-FUEYYMX5.js.map +1 -0
- package/dist/{chunk-FFKNH6U5.js → chunk-HKIT6O7W.js} +3 -5
- package/dist/{chunk-FFKNH6U5.js.map → chunk-HKIT6O7W.js.map} +1 -1
- package/dist/chunk-KQCRWDSA.js +1 -0
- package/dist/{chunk-S5OFRT4M.js → chunk-KUEN3HFB.js} +6 -6
- package/dist/chunk-KUEN3HFB.js.map +1 -0
- package/dist/chunk-LMC26NLJ.js +84 -0
- package/dist/chunk-LMC26NLJ.js.map +1 -0
- package/dist/{chunk-BVYWGZVV.js → chunk-M7W4CP3M.js} +52 -19
- package/dist/chunk-M7W4CP3M.js.map +1 -0
- package/dist/{chunk-HZLDFOE4.js → chunk-MI7HBHN3.js} +164 -243
- package/dist/chunk-MI7HBHN3.js.map +1 -0
- package/dist/{chunk-PPMP5J6T.js → chunk-PWAHJW4G.js} +180 -29
- package/dist/chunk-PWAHJW4G.js.map +1 -0
- package/dist/chunk-PWLANIRT.js +127 -0
- package/dist/{chunk-XDNLUEXI.js.map → chunk-PWLANIRT.js.map} +1 -1
- package/dist/chunk-QCDXODCA.js +75 -0
- package/dist/chunk-QCDXODCA.js.map +1 -0
- package/dist/{chunk-D7LCGMVS.js → chunk-QETLRQI6.js} +526 -887
- package/dist/chunk-QETLRQI6.js.map +1 -0
- package/dist/{chunk-5MT24GKJ.js → chunk-QUVSNGIP.js} +264 -262
- package/dist/chunk-QUVSNGIP.js.map +1 -0
- package/dist/chunk-QXHPKYJV.js +113 -0
- package/dist/chunk-QXHPKYJV.js.map +1 -0
- package/dist/{chunk-OWAG3GSU.js → chunk-R77UEZ4E.js} +11 -1
- package/dist/chunk-R77UEZ4E.js.map +1 -0
- package/dist/{chunk-ZYTYSTO5.js → chunk-RA3JUFMW.js} +314 -161
- package/dist/chunk-RA3JUFMW.js.map +1 -0
- package/dist/{chunk-ERISIBYU.js → chunk-SQGMNID3.js} +3 -8
- package/dist/chunk-SQGMNID3.js.map +1 -0
- package/dist/{chunk-XJ2HZOBU.js → chunk-UHNYIBXL.js} +1 -1
- package/dist/chunk-UHNYIBXL.js.map +1 -0
- package/{src/utils/secureStorage.ts → dist/chunk-VBXEHIUJ.js} +113 -88
- package/dist/{chunk-7QCC6MCP.js.map → chunk-VBXEHIUJ.js.map} +1 -1
- package/dist/{chunk-VZ4VDGTB.js → chunk-W22JP75J.js} +5 -13
- package/dist/{chunk-VZ4VDGTB.js.map → chunk-W22JP75J.js.map} +1 -1
- package/dist/components.d.ts +12 -93
- package/dist/components.js +23 -106
- package/dist/components.js.map +1 -1
- package/dist/core-CUElvH_C.d.ts +164 -0
- package/dist/database.generated-CBmg2950.d.ts +8284 -0
- package/dist/event-CW5YB_2p.d.ts +239 -0
- package/dist/{file-reference-C6Gkn77H.d.ts → file-reference-D06mEEWW.d.ts} +7 -5
- package/dist/functions-D_kgHktt.d.ts +208 -0
- package/dist/hooks.d.ts +54 -7
- package/dist/hooks.js +204 -17
- package/dist/hooks.js.map +1 -1
- package/dist/{EventLogo-B3V3otev.d.ts → index-Bl--n7-T.d.ts} +387 -397
- package/dist/index.d.ts +94 -261
- package/dist/index.js +314 -126
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +7 -8
- package/dist/providers.js +6 -13
- package/dist/rbac/index.d.ts +171 -101
- package/dist/rbac/index.js +23 -17
- package/dist/styles/index.d.ts +1 -3
- package/dist/styles/index.js +2 -17
- package/dist/theming/runtime.js +3 -3
- package/dist/types-UU913iLA.d.ts +102 -0
- package/dist/{types-Dfz9dmVH.d.ts → types-_x1f4QBF.d.ts} +6 -6
- package/dist/types.d.ts +88 -227
- package/dist/types.js +64 -112
- package/dist/types.js.map +1 -1
- package/dist/{usePublicRouteParams-B7PabvuH.d.ts → usePublicRouteParams-JJczomYq.d.ts} +203 -6
- package/dist/utils.d.ts +299 -13
- package/dist/utils.js +481 -55
- package/dist/utils.js.map +1 -1
- package/dist/validation-643vUDZW.d.ts +177 -0
- package/docs/DOCUMENTATION_REVIEW_TRACKER.md +511 -0
- package/docs/README.md +9 -8
- package/docs/api/README.md +16 -2
- package/docs/api/classes/ColumnFactory.md +1 -1
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/InvalidScopeError.md +4 -4
- package/docs/api/classes/MissingUserContextError.md +4 -4
- package/docs/api/classes/OrganisationContextRequiredError.md +4 -4
- package/docs/api/classes/PermissionDeniedError.md +4 -4
- package/docs/api/classes/RBACAuditManager.md +14 -14
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +2 -2
- package/docs/api/classes/RBACError.md +4 -4
- package/docs/api/classes/RBACNotInitializedError.md +4 -4
- package/docs/api/classes/SecureSupabaseClient.md +29 -9
- package/docs/api/classes/StorageUtils.md +1 -1
- package/docs/api/enums/FileCategory.md +17 -17
- package/docs/api/enums/RBACErrorCode.md +228 -0
- package/docs/api/enums/RPCFunction.md +118 -0
- package/docs/api/interfaces/AggregateConfig.md +1 -1
- package/docs/api/interfaces/BadgeProps.md +1 -1
- package/docs/api/interfaces/ButtonProps.md +2 -2
- package/docs/api/interfaces/CalendarProps.md +1 -1
- package/docs/api/interfaces/CardProps.md +29 -3
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +1 -1
- package/docs/api/interfaces/DataAccessRecord.md +1 -1
- package/docs/api/interfaces/DataRecord.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +2 -2
- package/docs/api/interfaces/DataTableColumn.md +6 -6
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +2 -2
- 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 +5 -5
- package/docs/api/interfaces/ExportOptions.md +4 -4
- package/docs/api/interfaces/FileDisplayProps.md +1 -1
- package/docs/api/interfaces/FileMetadata.md +13 -13
- package/docs/api/interfaces/FileReference.md +12 -12
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadOptions.md +10 -10
- package/docs/api/interfaces/FileUploadProps.md +19 -19
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/FormFieldProps.md +166 -0
- package/docs/api/interfaces/FormProps.md +113 -0
- package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +8 -8
- package/docs/api/interfaces/InputProps.md +2 -2
- package/docs/api/interfaces/LabelProps.md +8 -8
- package/docs/api/interfaces/LoginFormProps.md +1 -1
- 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 +17 -73
- package/docs/api/interfaces/NavigationMenuProps.md +38 -53
- package/docs/api/interfaces/NavigationProviderProps.md +1 -1
- package/docs/api/interfaces/Organisation.md +13 -13
- package/docs/api/interfaces/OrganisationContextType.md +21 -21
- package/docs/api/interfaces/OrganisationMembership.md +15 -15
- package/docs/api/interfaces/OrganisationProviderProps.md +59 -2
- package/docs/api/interfaces/OrganisationSecurityError.md +5 -5
- package/docs/api/interfaces/PaceAppLayoutProps.md +26 -39
- 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 +1 -1
- package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
- package/docs/api/interfaces/ProgressProps.md +50 -0
- package/docs/api/interfaces/ProtectedRouteProps.md +1 -1
- package/docs/api/interfaces/PublicPageFooterProps.md +9 -9
- package/docs/api/interfaces/PublicPageHeaderProps.md +10 -10
- package/docs/api/interfaces/PublicPageLayoutProps.md +15 -15
- package/docs/api/interfaces/RBACAccessValidateParams.md +52 -0
- package/docs/api/interfaces/RBACAccessValidateResult.md +41 -0
- package/docs/api/interfaces/RBACAuditLogParams.md +85 -0
- package/docs/api/interfaces/RBACAuditLogResult.md +52 -0
- package/docs/api/interfaces/RBACConfig.md +2 -2
- package/docs/api/interfaces/RBACContext.md +52 -0
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RBACPageAccessCheckParams.md +74 -0
- package/docs/api/interfaces/RBACPermissionCheckParams.md +74 -0
- package/docs/api/interfaces/RBACPermissionCheckResult.md +52 -0
- package/docs/api/interfaces/RBACPermissionsGetParams.md +63 -0
- package/docs/api/interfaces/RBACPermissionsGetResult.md +63 -0
- package/docs/api/interfaces/RBACResult.md +58 -0
- package/docs/api/interfaces/RBACRoleGrantParams.md +63 -0
- package/docs/api/interfaces/RBACRoleGrantResult.md +52 -0
- package/docs/api/interfaces/RBACRoleRevokeParams.md +63 -0
- package/docs/api/interfaces/RBACRoleRevokeResult.md +52 -0
- package/docs/api/interfaces/RBACRoleValidateParams.md +52 -0
- package/docs/api/interfaces/RBACRoleValidateResult.md +63 -0
- package/docs/api/interfaces/RBACRolesListParams.md +52 -0
- package/docs/api/interfaces/RBACRolesListResult.md +74 -0
- package/docs/api/interfaces/RBACSessionTrackParams.md +74 -0
- package/docs/api/interfaces/RBACSessionTrackResult.md +52 -0
- 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/SecureDataContextType.md +1 -1
- package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
- package/docs/api/interfaces/SessionRestorationLoaderProps.md +15 -2
- 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 +43 -2
- package/docs/api/interfaces/TextareaProps.md +2 -2
- package/docs/api/interfaces/ToastActionElement.md +1 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +61 -61
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +87 -0
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +81 -0
- package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
- package/docs/api/interfaces/UsePublicEventReturn.md +5 -5
- 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 +4 -4
- package/docs/api/interfaces/UserProfile.md +7 -7
- package/docs/api/modules.md +484 -462
- package/docs/api-reference/components.md +186 -15
- package/docs/api-reference/deprecated.md +376 -0
- package/docs/api-reference/hooks.md +149 -19
- package/docs/api-reference/providers.md +61 -6
- package/docs/api-reference/rpc-functions.md +397 -0
- package/docs/api-reference/types.md +135 -78
- package/docs/api-reference/utilities.md +51 -380
- package/docs/architecture/README.md +49 -3
- package/docs/architecture/database-schema-requirements.md +40 -3
- package/docs/architecture/rbac-security-architecture.md +41 -4
- package/docs/architecture/services.md +127 -42
- package/docs/best-practices/README.md +51 -5
- package/docs/best-practices/accessibility.md +32 -3
- package/docs/best-practices/common-patterns.md +50 -3
- package/docs/best-practices/deployment.md +50 -4
- package/docs/best-practices/performance.md +50 -3
- package/docs/best-practices/security.md +94 -41
- package/docs/best-practices/testing.md +33 -4
- package/docs/core-concepts/authentication.md +5 -5
- package/docs/core-concepts/events.md +3 -3
- package/docs/core-concepts/organisations.md +3 -3
- package/docs/core-concepts/permissions.md +3 -3
- package/docs/core-concepts/rbac-system.md +5 -5
- package/docs/documentation-index.md +30 -8
- package/docs/getting-started/documentation-index.md +1 -1
- package/docs/getting-started/examples/README.md +7 -5
- package/docs/getting-started/examples/basic-auth-app.md +3 -0
- package/docs/getting-started/examples/full-featured-app.md +5 -3
- package/docs/getting-started/faq.md +6 -6
- package/docs/getting-started/installation-guide.md +192 -13
- package/docs/getting-started/local-development.md +303 -0
- package/docs/getting-started/quick-reference.md +3 -3
- package/docs/getting-started/quick-start.md +517 -0
- package/docs/implementation-guides/app-layout.md +45 -3
- package/docs/implementation-guides/authentication.md +66 -7
- package/docs/implementation-guides/component-styling.md +53 -3
- package/docs/implementation-guides/data-tables.md +76 -7
- package/docs/implementation-guides/datatable-filtering.md +1 -2
- package/docs/implementation-guides/datatable-rbac-usage.md +0 -1
- package/docs/implementation-guides/dynamic-colors.md +155 -4
- package/docs/implementation-guides/file-reference-system.md +72 -3
- package/docs/implementation-guides/file-upload-storage.md +72 -3
- package/docs/implementation-guides/forms.md +53 -3
- package/docs/implementation-guides/inactivity-tracking.md +53 -3
- package/docs/implementation-guides/large-datasets.md +1 -1
- package/docs/implementation-guides/navigation.md +55 -5
- package/docs/implementation-guides/organisation-security.md +72 -3
- package/docs/implementation-guides/performance.md +57 -1
- package/docs/implementation-guides/permission-enforcement.md +81 -8
- package/docs/implementation-guides/public-pages.md +560 -14
- package/docs/migration/MIGRATION_GUIDE.md +409 -50
- package/docs/migration/README.md +37 -3
- package/docs/migration/organisation-context-timing-fix.md +39 -4
- package/docs/migration/quick-migration-guide.md +41 -5
- package/docs/migration/rbac-migration.md +59 -3
- package/docs/migration/service-architecture.md +77 -14
- package/docs/rbac/README.md +79 -3
- package/docs/rbac/advanced-patterns.md +47 -3
- package/docs/rbac/api-reference.md +77 -8
- package/docs/rbac/event-based-apps.md +50 -5
- package/docs/rbac/examples/rbac-rls-integration-example.md +3 -3
- package/docs/rbac/examples.md +39 -3
- package/docs/rbac/getting-started.md +63 -4
- package/docs/rbac/quick-start.md +57 -5
- package/docs/rbac/rbac-rls-integration.md +68 -6
- package/docs/rbac/super-admin-guide.md +47 -3
- package/docs/rbac/troubleshooting.md +3 -3
- package/docs/security/README.md +68 -3
- package/docs/security/checklist.md +50 -3
- package/docs/standards/01-architecture-standard.md +39 -0
- package/docs/standards/02-api-and-rpc-standard.md +39 -0
- package/docs/standards/03-component-standard.md +32 -0
- package/docs/standards/04-code-style-standard.md +32 -0
- package/docs/standards/05-security-standard.md +30 -0
- package/docs/standards/06-testing-and-docs-standard.md +29 -0
- package/docs/standards/README.md +35 -0
- package/docs/styles/README.md +89 -8
- package/docs/testing/README.md +175 -24
- package/docs/troubleshooting/README.md +50 -3
- package/docs/troubleshooting/common-issues.md +271 -5
- package/docs/troubleshooting/debugging.md +54 -1
- package/docs/troubleshooting/migration.md +54 -1
- package/docs/troubleshooting/organisation-context-setup.md +29 -3
- package/docs/troubleshooting/styling-issues.md +246 -4
- package/{src/components/DataTable/examples → examples/DataTable}/GroupingAggregationExample.tsx +1 -1
- package/examples/{components 2/DataTable/HierarchicalActionsExample.tsx → DataTable/HierarchicalActionsExample.tsx} +7 -6
- package/{src/components/DataTable/examples → examples/DataTable}/HierarchicalExample.tsx +8 -6
- package/examples/{components 2/DataTable/PerformanceExample.tsx → DataTable/PerformanceExample.tsx} +2 -2
- package/examples/{components 2/DataTable/index.ts → DataTable/index.ts} +1 -0
- package/{src/components/Dialog/examples → examples/Dialog}/HtmlDialogExample.tsx +3 -3
- package/examples/{components 2/Dialog/ScrollableDialogExample.tsx → Dialog/ScrollableDialogExample.tsx} +1 -1
- package/{src/components/Dialog/examples → examples/Dialog}/SmartDialogExample.tsx +1 -1
- package/examples/{components 2/Dialog/index.ts → Dialog/index.ts} +0 -3
- package/examples/{features/public-pages → PublicPages}/CorrectPublicPageImplementation.tsx +52 -17
- package/examples/{features/public-pages → PublicPages}/PublicEventPage.tsx +65 -35
- package/examples/{features/public-pages → PublicPages}/PublicPageApp.tsx +52 -18
- package/examples/{features/public-pages → PublicPages}/PublicPageUsageExample.tsx +28 -15
- package/examples/README.md +81 -33
- package/examples/index.ts +14 -12
- package/examples/{RBAC → rbac}/CompleteRBACExample.tsx +1 -1
- package/examples/{features/rbac → rbac}/EventBasedApp.tsx +4 -4
- package/examples/{features/rbac → rbac}/PermissionExample.tsx +5 -3
- package/package.json +21 -27
- package/src/__tests__/helpers/test-utils.tsx +29 -3
- package/src/__tests__/rbac/PagePermissionGuard.test.tsx +7 -5
- package/src/components/Alert/Alert.test.tsx +2 -2
- package/src/components/Alert/Alert.tsx +4 -4
- package/src/components/Avatar/Avatar.test.tsx +17 -6
- package/src/components/Badge/Badge.test.tsx +1 -1
- package/src/components/Badge/Badge.tsx +2 -2
- package/src/components/Button/Button.test.tsx +2 -2
- package/src/components/Button/Button.tsx +11 -7
- package/src/components/Calendar/Calendar.test.tsx +41 -8
- package/src/components/Calendar/Calendar.tsx +39 -36
- package/src/components/Card/Card.tsx +51 -13
- package/src/components/Checkbox/Checkbox.test.tsx +36 -12
- package/src/components/DataTable/DataTable.test.tsx +1 -1
- package/src/components/DataTable/__tests__/DataTable.comprehensive.test.tsx +13 -7
- package/src/components/DataTable/__tests__/DataTable.default-state.test.tsx +14 -42
- package/src/components/DataTable/__tests__/DataTable.export.test.tsx +13 -10
- package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +14 -11
- package/src/components/DataTable/__tests__/DataTable.hooks.test.tsx +4 -2
- package/src/components/DataTable/__tests__/DataTable.test.tsx +13 -7
- package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +13 -10
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +15 -11
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +12 -6
- package/src/components/DataTable/__tests__/keyboard.test.tsx +12 -6
- package/src/components/DataTable/__tests__/pagination.modes.test.tsx +10 -6
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +1 -1
- package/src/components/DataTable/components/DataTableBody.tsx +10 -25
- package/src/components/DataTable/components/DataTableCore.tsx +1 -1
- package/src/components/DataTable/components/FilterRow.tsx +3 -1
- package/src/components/DataTable/components/ImportModal.tsx +1 -1
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +9 -9
- package/src/components/DataTable/core/ColumnFactory.ts +6 -6
- package/src/components/DataTable/core/DataTableContext.tsx +14 -10
- package/src/components/DataTable/core/LocalDataAdapter.ts +2 -1
- package/src/components/DataTable/core/PluginRegistry.ts +3 -3
- package/src/components/DataTable/core/StateManager.ts +12 -11
- package/src/components/DataTable/core/__tests__/ActionManager.test.ts +104 -0
- package/src/components/DataTable/core/__tests__/DataManager.test.ts +101 -0
- package/src/components/DataTable/core/__tests__/LocalDataAdapter.test.ts +84 -0
- package/src/components/DataTable/core/__tests__/PluginRegistry.test.ts +102 -0
- package/src/components/DataTable/core/__tests__/StateManager.test.ts +104 -0
- package/src/components/DataTable/core/interfaces.ts +17 -17
- package/src/components/DataTable/hooks/__tests__/useDataTableConfiguration.test.ts +124 -0
- package/src/components/DataTable/hooks/__tests__/useDataTableDataPipeline.test.ts +117 -0
- package/src/components/DataTable/hooks/__tests__/useDataTablePermissions.test.ts +102 -0
- package/src/components/DataTable/hooks/__tests__/useEffectiveColumnOrder.test.ts +53 -0
- package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +0 -2
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +9 -8
- package/src/components/DataTable/types.ts +5 -5
- package/src/components/DataTable/utils/aggregationUtils.ts +4 -4
- package/src/components/DataTable/utils/columnUtils.ts +3 -2
- package/src/components/DataTable/utils/debugTools.ts +1 -1
- package/src/components/DataTable/utils/exportUtils.ts +6 -6
- package/src/components/DataTable/utils/hierarchicalSorting.ts +6 -6
- package/src/components/DataTable/utils/hierarchicalUtils.ts +0 -8
- package/src/components/DataTable/utils/index.ts +0 -1
- package/src/components/DataTable/utils/performanceUtils.ts +9 -4
- package/src/components/Dialog/Dialog.test.tsx +49 -27
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +13 -8
- package/src/components/EventSelector/EventSelector.test.tsx +60 -12
- package/src/components/EventSelector/EventSelector.tsx +38 -15
- package/src/components/EventSelector/index.ts +2 -2
- package/src/components/FileDisplay/FileDisplay.test.tsx +143 -85
- package/src/components/FileDisplay/FileDisplay.tsx +1 -0
- package/src/components/FileUpload/FileUpload.test.tsx +532 -152
- package/src/components/FileUpload/FileUpload.tsx +43 -8
- package/src/components/Footer/Footer.test.tsx +19 -14
- package/src/components/Form/Form.test.tsx +96 -14
- package/src/components/Form/Form.tsx +210 -1
- package/src/components/Form/index.ts +3 -7
- package/src/components/Header/Header.test.tsx +24 -17
- package/src/components/Header/Header.tsx +3 -1
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +2 -4
- package/src/components/Input/Input.test.tsx +61 -36
- package/src/components/Label/{__tests__/Label.test.tsx → Label.test.tsx} +2 -2
- package/src/components/Label/Label.tsx +2 -3
- package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +6 -5
- package/src/components/LoadingSpinner/LoadingSpinner.tsx +6 -2
- package/src/components/LoginForm/LoginForm.test.tsx +14 -13
- package/src/components/LoginForm/LoginForm.tsx +1 -1
- package/src/components/LoginForm/index.ts +7 -0
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +233 -20
- package/src/components/NavigationMenu/NavigationMenu.tsx +191 -55
- package/src/components/NavigationMenu/index.ts +1 -1
- package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +20 -11
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +1 -1
- package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.integration.test.tsx → PaceAppLayout.integration.test.tsx} +272 -79
- package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.performance.test.tsx → PaceAppLayout.performance.test.tsx} +155 -32
- package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.security.test.tsx → PaceAppLayout.security.test.tsx} +211 -65
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +498 -210
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +63 -64
- package/src/components/PaceAppLayout/test-setup.tsx +192 -0
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +193 -39
- package/src/components/{PasswordReset → PasswordChange}/PasswordChangeForm.test.tsx +2 -2
- package/src/components/{PasswordReset → PasswordChange}/PasswordChangeForm.tsx +10 -4
- package/src/components/PasswordChange/index.ts +2 -0
- package/src/components/Progress/Progress.test.tsx +11 -0
- package/src/components/Progress/Progress.tsx +1 -1
- package/src/components/Progress/index.ts +10 -0
- package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +2 -1
- package/src/components/PublicLayout/PublicLayout.test.tsx +1210 -0
- package/src/components/PublicLayout/PublicPageLayout.tsx +190 -36
- package/src/components/PublicLayout/PublicPageProvider.tsx +8 -7
- package/src/components/PublicLayout/index.ts +10 -28
- package/src/components/Select/Select.test.tsx +7 -7
- package/src/components/Select/Select.tsx +277 -11
- package/src/components/Select/index.ts +1 -2
- package/src/components/SessionRestorationLoader/SessionRestorationLoader.test.tsx +232 -0
- package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +40 -19
- package/src/components/Table/{__tests__/Table.test.tsx → Table.test.tsx} +94 -41
- package/src/components/Tabs/Tabs.test.tsx +10 -9
- package/src/components/Tabs/Tabs.tsx +61 -33
- package/src/components/Textarea/Textarea.test.tsx +31 -18
- package/src/components/Toast/Toast.tsx +2 -2
- package/src/components/Tooltip/Tooltip.test.tsx +1 -1
- package/src/components/UserMenu/UserMenu.test.tsx +7 -6
- package/src/components/UserMenu/UserMenu.tsx +2 -2
- package/src/components/index.ts +5 -4
- package/src/constants/performance.ts +19 -8
- package/src/hooks/__tests__/useAppConfig.unit.test.ts +21 -22
- package/src/hooks/__tests__/useEvents.unit.test.ts +5 -4
- package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +2 -2
- package/src/hooks/__tests__/usePermissionCache.simple.test.ts +17 -0
- package/src/hooks/__tests__/usePermissionCache.unit.test.ts +16 -11
- package/src/hooks/__tests__/usePublicEvent.simple.test.ts +1 -3
- package/src/hooks/__tests__/usePublicEvent.unit.test.ts +1 -3
- package/src/hooks/__tests__/useRBAC.unit.test.ts +24 -2
- package/src/hooks/index.ts +4 -0
- package/src/hooks/public/index.ts +2 -0
- package/src/hooks/public/usePublicEvent.ts +4 -6
- package/src/hooks/public/usePublicRouteParams.ts +1 -1
- package/src/hooks/services/useAuth.ts +2 -4
- package/src/hooks/services/useCurrentEvent.ts +1 -1
- package/src/hooks/useAppConfig.ts +1 -1
- package/src/hooks/useDataTablePerformance.ts +2 -2
- package/src/hooks/useEventTheme.ts +1 -1
- package/src/hooks/useEvents.ts +51 -10
- package/src/hooks/useOrganisationPermissions.test.ts +3 -3
- package/src/hooks/useOrganisationPermissions.ts +1 -1
- package/src/hooks/useOrganisationSecurity.ts +2 -2
- package/src/hooks/usePermissionCache.test.ts +9 -9
- package/src/hooks/usePermissionCache.ts +2 -2
- package/src/index.ts +19 -12
- package/src/providers/OrganisationProvider.tsx +73 -9
- package/src/providers/UnifiedAuthProvider.smoke.test.tsx +113 -13
- package/src/providers/__tests__/AuthProvider.test.tsx +2 -1
- package/src/providers/__tests__/EventProvider.test.tsx +24 -15
- package/src/providers/__tests__/OrganisationProvider.test.tsx +87 -36
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +80 -24
- package/src/providers/index.ts +0 -3
- package/src/providers/services/AuthServiceProvider.tsx +2 -17
- package/src/providers/services/EventServiceProvider.tsx +11 -16
- package/src/providers/services/InactivityServiceProvider.tsx +9 -12
- package/src/providers/services/OrganisationServiceProvider.tsx +9 -12
- package/src/providers/services/UnifiedAuthProvider.tsx +85 -18
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +11 -4
- package/src/rbac/__tests__/scenarios.user-role.test.tsx +105 -21
- package/src/rbac/adapters.tsx +1 -1
- package/src/rbac/api.ts +20 -4
- package/src/rbac/audit-enhanced.ts +47 -2
- package/src/rbac/audit.ts +47 -2
- package/src/rbac/components/NavigationGuard.tsx +1 -1
- package/src/rbac/components/NavigationProvider.test.tsx +7 -6
- package/src/rbac/components/NavigationProvider.tsx +1 -1
- package/src/rbac/components/PagePermissionGuard.tsx +1 -1
- package/src/rbac/components/PagePermissionProvider.test.tsx +7 -6
- package/src/rbac/components/PagePermissionProvider.tsx +1 -1
- package/src/rbac/components/PermissionEnforcer.tsx +1 -1
- package/src/rbac/components/RoleBasedRouter.tsx +1 -1
- package/src/rbac/components/SecureDataProvider.test.tsx +7 -6
- package/src/rbac/components/SecureDataProvider.tsx +1 -1
- package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +6 -6
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +11 -10
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +10 -11
- package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +19 -15
- package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +13 -12
- package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +19 -15
- package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +18 -18
- package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +11 -10
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +8 -7
- package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +10 -11
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +48 -19
- package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +476 -0
- package/src/rbac/hooks/index.ts +3 -0
- package/src/rbac/hooks/usePermissions.ts +31 -85
- package/src/rbac/hooks/useRBAC.test.ts +13 -1
- package/src/rbac/hooks/useRBAC.ts +13 -67
- package/src/rbac/hooks/useResolvedScope.ts +11 -0
- package/src/rbac/hooks/useSecureSupabase.ts +308 -0
- package/src/rbac/index.ts +3 -0
- package/src/rbac/secureClient.ts +53 -6
- package/src/rbac/security.ts +37 -1
- package/src/{types/rbac-functions.ts → rbac/types/functions.ts} +30 -30
- package/src/rbac/types.ts +3 -2
- package/src/services/AuthService.ts +33 -25
- package/src/services/EventService.ts +56 -44
- package/src/services/InactivityService.ts +33 -53
- package/src/services/OrganisationService.ts +36 -40
- package/src/services/__tests__/AuthService.restoreSession.test.ts +6 -2
- package/src/services/__tests__/EventService.test.ts +67 -33
- package/src/services/interfaces/IEventService.ts +1 -1
- package/src/styles/core.css +2 -2
- package/src/styles/index.ts +1 -5
- package/src/types/__tests__/guards.test.ts +1 -1
- package/src/types/__tests__/type-validation.test.ts +0 -1
- package/src/types/auth.ts +42 -2
- package/src/types/core.ts +251 -0
- package/src/types/database.ts +11 -496
- package/src/types/event.ts +102 -0
- package/src/types/file-reference.ts +6 -4
- package/src/types/guards.ts +2 -1
- package/src/types/index.ts +48 -14
- package/src/types/lodash.debounce.d.ts +15 -0
- package/src/types/organisation.ts +14 -10
- package/src/types/supabase.ts +15 -17
- package/src/utils/__tests__/secureErrors.unit.test.ts +1 -1
- package/src/utils/__tests__/validationUtils.unit.test.ts +0 -29
- package/src/utils/app/appNameResolver.ts +1 -1
- package/src/utils/dynamic/dynamicUtils.ts +3 -2
- package/src/utils/file-reference/index.ts +25 -6
- package/src/utils/security/secureErrors.ts +1 -1
- package/src/utils/validation/index.ts +6 -12
- package/src/utils/validation/validationUtils.ts +0 -13
- package/dist/UnifiedAuthProvider-B37ATQHE.js +0 -16
- package/dist/auth-DReDSLq9.d.ts +0 -16
- package/dist/chunk-3JI76CYK.js +0 -2444
- package/dist/chunk-3JI76CYK.js.map +0 -1
- package/dist/chunk-56XJ3TU6.js +0 -11
- package/dist/chunk-56XJ3TU6.js.map +0 -1
- package/dist/chunk-5MT24GKJ.js.map +0 -1
- package/dist/chunk-7QCC6MCP.js +0 -288
- package/dist/chunk-BESYRHQM.js.map +0 -1
- package/dist/chunk-BJPBT3CU.js +0 -21
- package/dist/chunk-BJPBT3CU.js.map +0 -1
- package/dist/chunk-BVYWGZVV.js.map +0 -1
- package/dist/chunk-CX5M4ZAG.js.map +0 -1
- package/dist/chunk-D7LCGMVS.js.map +0 -1
- package/dist/chunk-EGI6MUL6.js +0 -27
- package/dist/chunk-EGI6MUL6.js.map +0 -1
- package/dist/chunk-ERISIBYU.js.map +0 -1
- package/dist/chunk-HRO5HWN2.js.map +0 -1
- package/dist/chunk-HZLDFOE4.js.map +0 -1
- package/dist/chunk-JISYG63F.js +0 -70
- package/dist/chunk-JISYG63F.js.map +0 -1
- package/dist/chunk-LIMSTKYD.js +0 -61
- package/dist/chunk-LIMSTKYD.js.map +0 -1
- package/dist/chunk-OWAG3GSU.js.map +0 -1
- package/dist/chunk-PPMP5J6T.js.map +0 -1
- package/dist/chunk-Q5QRDWKI.js.map +0 -1
- package/dist/chunk-S5OFRT4M.js.map +0 -1
- package/dist/chunk-SBVILCCA.js.map +0 -1
- package/dist/chunk-TUMEWN34.js +0 -15
- package/dist/chunk-TUMEWN34.js.map +0 -1
- package/dist/chunk-XDNLUEXI.js +0 -138
- package/dist/chunk-XJ2HZOBU.js.map +0 -1
- package/dist/chunk-ZYTYSTO5.js.map +0 -1
- package/dist/chunk-ZZ2SS7NI.js +0 -237
- package/dist/chunk-ZZ2SS7NI.js.map +0 -1
- package/dist/database-C6jy7EOu.d.ts +0 -500
- package/dist/organisation-D6qRDtbF.d.ts +0 -93
- package/dist/schema-DTDZQe2u.d.ts +0 -28
- package/dist/unified-DQ4VcT7H.d.ts +0 -198
- package/dist/useInactivityTracker-TO6ZOF35.js +0 -11
- package/dist/validation.d.ts +0 -47
- package/dist/validation.js +0 -24
- package/dist/validation.js.map +0 -1
- package/docs/DOCUMENTATION_AUDIT.md +0 -172
- package/docs/DOCUMENTATION_STANDARD.md +0 -137
- package/docs/api/classes/PublicErrorBoundary.md +0 -132
- package/docs/api/interfaces/EventLogoProps.md +0 -152
- package/docs/api/interfaces/PublicErrorBoundaryProps.md +0 -94
- package/docs/api/interfaces/PublicErrorBoundaryState.md +0 -68
- package/docs/api/interfaces/PublicLoadingSpinnerProps.md +0 -86
- package/docs/architecture/rpc-function-standards.md +0 -1106
- package/docs/getting-started/consuming-app-vite-config.md +0 -239
- package/docs/implementation-guides/event-theming-summary.md +0 -226
- package/docs/implementation-guides/public-pages-advanced.md +0 -1038
- package/docs/migration/v0.4.15-tailwind-scanning.md +0 -278
- package/docs/migration/v0.4.16-css-first-approach.md +0 -312
- package/docs/migration/v0.4.17-source-path-fix.md +0 -235
- package/docs/rbac/RBAC_EVENT_CONTEXT_LOADING.md +0 -222
- package/docs/rbac/RBAC_LOGIN_SAFETY_FIX.md +0 -95
- package/docs/rbac/RBAC_V0.5.147_FIX.md +0 -117
- package/docs/rbac/README-rbac-rls-integration.md +0 -374
- package/docs/styles/usage.md +0 -227
- package/docs/testing/visual-testing.md +0 -120
- package/docs/troubleshooting/DEBUG_NETWORK_ERROR.md +0 -152
- package/docs/troubleshooting/FIX_SUPABASE_CORS.md +0 -184
- package/docs/troubleshooting/cake-page-permission-guard-issue-summary.md +0 -193
- package/docs/troubleshooting/database-view-compatibility.md +0 -125
- package/docs/troubleshooting/react-hooks-issue-analysis.md +0 -172
- package/docs/troubleshooting/tailwind-content-scanning.md +0 -219
- package/examples/RBAC/EventBasedApp.tsx +0 -239
- package/examples/RBAC/PermissionExample.tsx +0 -151
- package/examples/STRUCTURE.md +0 -125
- package/examples/components 2/DataTable/HierarchicalExample.tsx +0 -475
- package/examples/components 2/Dialog/BasicHtmlTest.tsx +0 -55
- package/examples/components 2/Dialog/DebugHtmlExample.tsx +0 -68
- package/examples/components 2/Dialog/HtmlDialogExample.tsx +0 -202
- package/examples/components 2/Dialog/SimpleHtmlTest.tsx +0 -61
- package/examples/components 2/Dialog/SmartDialogExample.tsx +0 -322
- package/examples/components 2/index.ts +0 -11
- package/examples/features/index.ts +0 -12
- package/examples/features/rbac/CompleteRBACExample.tsx +0 -324
- package/examples/features/rbac/index.ts +0 -13
- package/examples/public-pages/CorrectPublicPageImplementation.tsx +0 -301
- package/examples/public-pages/PublicEventPage.tsx +0 -274
- package/examples/public-pages/PublicPageApp.tsx +0 -308
- package/examples/public-pages/PublicPageUsageExample.tsx +0 -216
- package/examples/public-pages/index.ts +0 -14
- package/src/__tests__/TEST_STANDARD.md +0 -1008
- package/src/components/Checkbox/__mocks__/Checkbox.tsx +0 -2
- package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +0 -421
- package/src/components/DataTable/examples/InitialPageSizeExample.tsx +0 -177
- package/src/components/DataTable/examples/PerformanceExample.tsx +0 -506
- package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +0 -316
- package/src/components/DataTable/examples/__tests__/HierarchicalExample.test.tsx +0 -45
- package/src/components/DataTable/examples/__tests__/InitialPageSizeExample.test.tsx +0 -211
- package/src/components/DataTable/examples/__tests__/PerformanceExample.test.tsx +0 -126
- package/src/components/Dialog/README.md +0 -804
- package/src/components/Dialog/examples/BasicHtmlTest.tsx +0 -55
- package/src/components/Dialog/examples/DebugHtmlExample.tsx +0 -68
- package/src/components/Dialog/examples/ScrollableDialogExample.tsx +0 -290
- package/src/components/Dialog/examples/SimpleHtmlTest.tsx +0 -61
- package/src/components/Dialog/examples/__tests__/HtmlDialogExample.test.tsx +0 -71
- package/src/components/Dialog/examples/__tests__/SimpleHtmlTest.test.tsx +0 -122
- package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +0 -147
- package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +0 -611
- package/src/components/Dialog/utils/safeHtml.ts +0 -185
- package/src/components/EventSelector/types.ts +0 -79
- package/src/components/Form/FormErrorSummary.tsx +0 -113
- package/src/components/Form/FormField.tsx +0 -249
- package/src/components/Form/FormFieldset.tsx +0 -127
- package/src/components/Form/FormLiveRegion.tsx +0 -198
- package/src/components/Input/__mocks__/Input.tsx +0 -2
- package/src/components/NavigationMenu/types.ts +0 -85
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +0 -326
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -1078
- package/src/components/PasswordReset/PasswordResetForm.test.tsx +0 -597
- package/src/components/PasswordReset/PasswordResetForm.tsx +0 -201
- package/src/components/PasswordReset/index.ts +0 -2
- package/src/components/ProtectedRoute/README.md +0 -164
- package/src/components/PublicLayout/EventLogo.tsx +0 -175
- package/src/components/PublicLayout/PublicErrorBoundary.tsx +0 -282
- package/src/components/PublicLayout/PublicLoadingSpinner.tsx +0 -216
- package/src/components/PublicLayout/PublicPageContextChecker.tsx +0 -131
- package/src/components/PublicLayout/PublicPageDebugger.tsx +0 -104
- package/src/components/PublicLayout/PublicPageDiagnostic.tsx +0 -162
- package/src/components/PublicLayout/PublicPageFooter.tsx +0 -124
- package/src/components/PublicLayout/PublicPageHeader.tsx +0 -209
- package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +0 -449
- package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +0 -393
- package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +0 -192
- package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +0 -351
- package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +0 -402
- package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +0 -460
- package/src/components/PublicLayout/__tests__/PublicPageProvider.test.tsx +0 -313
- package/src/components/Select/hooks.ts +0 -289
- package/src/hooks/useCounter.test.ts +0 -131
- package/src/hooks/useDebounce.test.ts +0 -375
- package/src/providers/AuthProvider.tsx +0 -15
- package/src/providers/EventProvider.tsx +0 -16
- package/src/providers/InactivityProvider.tsx +0 -15
- package/src/providers/OrganisationProvider.context.test.tsx +0 -169
- package/src/providers/UnifiedAuthProvider.tsx +0 -15
- package/src/types/theme.ts +0 -6
- package/src/types/unified.ts +0 -265
- package/src/utils/appConfig.ts +0 -47
- package/src/utils/appIdResolver.test.ts +0 -499
- package/src/utils/appIdResolver.ts +0 -130
- package/src/utils/appNameResolver.simple.test.ts +0 -212
- package/src/utils/appNameResolver.test.ts +0 -121
- package/src/utils/appNameResolver.ts +0 -191
- package/src/utils/audit.ts +0 -127
- package/src/utils/auth-utils.ts +0 -96
- package/src/utils/bundleAnalysis.ts +0 -129
- package/src/utils/debugLogger.ts +0 -67
- package/src/utils/deviceFingerprint.ts +0 -215
- package/src/utils/dynamicUtils.ts +0 -105
- package/src/utils/file-reference.test.ts +0 -788
- package/src/utils/file-reference.ts +0 -519
- package/src/utils/formatDate.test.ts +0 -237
- package/src/utils/formatting.ts +0 -170
- package/src/utils/lazyLoad.tsx +0 -44
- package/src/utils/logger.ts +0 -179
- package/src/utils/organisationContext.test.ts +0 -322
- package/src/utils/organisationContext.ts +0 -153
- package/src/utils/performanceBenchmark.ts +0 -64
- package/src/utils/performanceBudgets.ts +0 -110
- package/src/utils/permissionTypes.ts +0 -37
- package/src/utils/permissionUtils.test.ts +0 -393
- package/src/utils/permissionUtils.ts +0 -34
- package/src/utils/sanitization.ts +0 -264
- package/src/utils/schemaUtils.ts +0 -37
- package/src/utils/secureDataAccess.test.ts +0 -711
- package/src/utils/secureDataAccess.ts +0 -377
- package/src/utils/secureErrors.ts +0 -79
- package/src/utils/security.ts +0 -156
- package/src/utils/securityMonitor.ts +0 -45
- package/src/utils/sessionTracking.ts +0 -126
- package/src/utils/validation.ts +0 -111
- package/src/utils/validationUtils.ts +0 -120
- package/src/validation/index.ts +0 -12
- /package/dist/{DataTable-UA6CL4JI.js.map → DataTable-QAB34V6K.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-B37ATQHE.js.map → UnifiedAuthProvider-7F6T4B6K.js.map} +0 -0
- /package/dist/{api-45XYYO2A.js.map → api-ROMBCNKU.js.map} +0 -0
- /package/dist/{audit-64X3VJXB.js.map → audit-WRS3KJKI.js.map} +0 -0
- /package/dist/{chunk-PLDDJCW6.js.map → chunk-7D4SUZUM.js.map} +0 -0
- /package/dist/{useInactivityTracker-TO6ZOF35.js.map → chunk-KQCRWDSA.js.map} +0 -0
- /package/examples/{components 2/DataTable → DataTable}/InitialPageSizeExample.tsx +0 -0
- /package/examples/{features/public-pages → PublicPages}/index.ts +0 -0
- /package/examples/{RBAC → rbac}/index.ts +0 -0
|
@@ -7,9 +7,12 @@ import React from 'react';
|
|
|
7
7
|
import { screen, waitFor } from '@testing-library/react';
|
|
8
8
|
import userEvent from '@testing-library/user-event';
|
|
9
9
|
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
10
|
+
import type { AuthError } from '@supabase/supabase-js';
|
|
10
11
|
import { PaceLoginPage } from './PaceLoginPage';
|
|
11
12
|
import { renderWithProviders } from '../../__tests__/helpers/test-utils';
|
|
12
13
|
import { Logger, LogLevel } from '../../utils/core/logger';
|
|
14
|
+
import { clearPalette } from '../../theming/runtime';
|
|
15
|
+
import { EventServiceContext } from '../../providers/services/EventServiceProvider';
|
|
13
16
|
|
|
14
17
|
// Mock React Router
|
|
15
18
|
const mockNavigate = vi.fn();
|
|
@@ -73,6 +76,10 @@ vi.mock('../../providers', () => ({
|
|
|
73
76
|
UnifiedAuthProvider: ({ children }: { children: React.ReactNode }) => <>{children}</>,
|
|
74
77
|
}));
|
|
75
78
|
|
|
79
|
+
vi.mock('../../theming/runtime', () => ({
|
|
80
|
+
clearPalette: vi.fn(),
|
|
81
|
+
}));
|
|
82
|
+
|
|
76
83
|
// Mock isSuperAdmin from RBAC API
|
|
77
84
|
vi.mock('../../rbac/api', () => ({
|
|
78
85
|
isSuperAdmin: vi.fn().mockResolvedValue(false)
|
|
@@ -83,14 +90,31 @@ import { isSuperAdmin } from '../../rbac/api';
|
|
|
83
90
|
// Mock console methods to avoid noise in tests
|
|
84
91
|
const originalConsoleError = console.error;
|
|
85
92
|
|
|
93
|
+
const resetAuthContext = () => {
|
|
94
|
+
mockAuthContext.user = null;
|
|
95
|
+
mockAuthContext.isAuthenticated = false;
|
|
96
|
+
mockAuthContext.isLoading = false;
|
|
97
|
+
mockAuthContext.authError = null;
|
|
98
|
+
mockAuthContext.hasRole = vi.fn();
|
|
99
|
+
mockAuthContext.getUserRole = vi.fn();
|
|
100
|
+
mockAuthContext.signIn = vi.fn();
|
|
101
|
+
mockAuthContext.signOut = vi.fn();
|
|
102
|
+
mockAuthContext.refreshSession = vi.fn();
|
|
103
|
+
mockAuthContext.supabase = mockSupabase;
|
|
104
|
+
};
|
|
105
|
+
|
|
86
106
|
describe('PaceLoginPage Component', () => {
|
|
87
107
|
let originalMode: string | undefined;
|
|
88
108
|
|
|
89
109
|
beforeEach(() => {
|
|
110
|
+
resetAuthContext();
|
|
111
|
+
mockNavigate.mockReset();
|
|
112
|
+
vi.mocked(clearPalette).mockClear();
|
|
113
|
+
vi.mocked(isSuperAdmin).mockClear();
|
|
90
114
|
// Ensure logger is enabled by setting MODE to development
|
|
91
115
|
originalMode = import.meta.env.MODE;
|
|
92
116
|
(import.meta.env as any).MODE = 'development';
|
|
93
|
-
|
|
117
|
+
|
|
94
118
|
// Configure logger to ensure it logs in test environment
|
|
95
119
|
Logger.configure({
|
|
96
120
|
level: LogLevel.DEBUG,
|
|
@@ -109,16 +133,39 @@ describe('PaceLoginPage Component', () => {
|
|
|
109
133
|
}
|
|
110
134
|
});
|
|
111
135
|
|
|
136
|
+
describe('Side Effects', () => {
|
|
137
|
+
it('clears theme palette on mount and when login route is active', () => {
|
|
138
|
+
renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
|
|
139
|
+
|
|
140
|
+
expect(clearPalette).toHaveBeenCalled();
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it('restores persisted events when event service context is provided', async () => {
|
|
144
|
+
const restorePersistedEvent = vi.fn().mockResolvedValue(undefined);
|
|
145
|
+
window.history.pushState({}, '', '/login');
|
|
146
|
+
|
|
147
|
+
renderWithProviders(
|
|
148
|
+
<EventServiceContext.Provider value={{ eventService: { restorePersistedEvent } as any }}>
|
|
149
|
+
<PaceLoginPage appName="Test App" />
|
|
150
|
+
</EventServiceContext.Provider>
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
await waitFor(() => {
|
|
154
|
+
expect(restorePersistedEvent).toHaveBeenCalled();
|
|
155
|
+
}, { timeout: 2000 });
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
|
|
112
159
|
// Basic rendering tests
|
|
113
160
|
describe('Rendering', () => {
|
|
114
161
|
it('renders with default props', () => {
|
|
115
|
-
renderWithProviders(<PaceLoginPage appName="Test App"
|
|
162
|
+
renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
|
|
116
163
|
|
|
117
164
|
expect(screen.getByLabelText('Test App Login Page')).toBeInTheDocument();
|
|
118
165
|
});
|
|
119
166
|
|
|
120
167
|
it('renders with custom app name', () => {
|
|
121
|
-
renderWithProviders(<PaceLoginPage appName="My Application"
|
|
168
|
+
renderWithProviders(<PaceLoginPage appName="My Application" />, { withRouter: false });
|
|
122
169
|
|
|
123
170
|
expect(screen.getByLabelText('My Application Login Page')).toBeInTheDocument();
|
|
124
171
|
});
|
|
@@ -135,7 +182,7 @@ describe('PaceLoginPage Component', () => {
|
|
|
135
182
|
});
|
|
136
183
|
|
|
137
184
|
it('renders app logo with correct attributes', () => {
|
|
138
|
-
renderWithProviders(<PaceLoginPage appName="TestApp"
|
|
185
|
+
renderWithProviders(<PaceLoginPage appName="TestApp" />, { withRouter: false });
|
|
139
186
|
|
|
140
187
|
const logo = screen.getByAltText('TestApp logo');
|
|
141
188
|
expect(logo).toBeInTheDocument();
|
|
@@ -144,13 +191,13 @@ describe('PaceLoginPage Component', () => {
|
|
|
144
191
|
});
|
|
145
192
|
|
|
146
193
|
it('renders LoginForm component', () => {
|
|
147
|
-
renderWithProviders(<PaceLoginPage appName="Test App"
|
|
194
|
+
renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
|
|
148
195
|
|
|
149
196
|
expect(screen.getByTestId('login-form')).toBeInTheDocument();
|
|
150
197
|
});
|
|
151
198
|
|
|
152
199
|
it('passes correct props to LoginForm', () => {
|
|
153
|
-
renderWithProviders(<PaceLoginPage appName="Test App"
|
|
200
|
+
renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
|
|
154
201
|
|
|
155
202
|
// Check that LoginForm receives the app name
|
|
156
203
|
expect(screen.getByText('Sign in to Test App')).toBeInTheDocument();
|
|
@@ -162,7 +209,7 @@ describe('PaceLoginPage Component', () => {
|
|
|
162
209
|
it('handles loading state', () => {
|
|
163
210
|
mockAuthContext.isLoading = true;
|
|
164
211
|
|
|
165
|
-
renderWithProviders(<PaceLoginPage appName="Test App"
|
|
212
|
+
renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
|
|
166
213
|
|
|
167
214
|
expect(screen.getByLabelText('Test App Login Page')).toBeInTheDocument();
|
|
168
215
|
});
|
|
@@ -172,7 +219,7 @@ describe('PaceLoginPage Component', () => {
|
|
|
172
219
|
mockAuthContext.isLoading = false;
|
|
173
220
|
mockAuthContext.hasRole.mockReturnValue(false);
|
|
174
221
|
|
|
175
|
-
renderWithProviders(<PaceLoginPage appName="Test App"
|
|
222
|
+
renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
|
|
176
223
|
|
|
177
224
|
expect(screen.getByLabelText('Test App Login Page')).toBeInTheDocument();
|
|
178
225
|
});
|
|
@@ -180,7 +227,7 @@ describe('PaceLoginPage Component', () => {
|
|
|
180
227
|
it('handles authentication error', () => {
|
|
181
228
|
mockAuthContext.authError = new Error('Authentication failed');
|
|
182
229
|
|
|
183
|
-
renderWithProviders(<PaceLoginPage appName="Test App"
|
|
230
|
+
renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
|
|
184
231
|
|
|
185
232
|
expect(screen.getByText('Authentication failed')).toBeInTheDocument();
|
|
186
233
|
expect(screen.getByText('Authentication failed')).toHaveClass('text-destructive');
|
|
@@ -190,7 +237,7 @@ describe('PaceLoginPage Component', () => {
|
|
|
190
237
|
const errorMessage = 'Invalid credentials';
|
|
191
238
|
mockAuthContext.authError = new Error(errorMessage);
|
|
192
239
|
|
|
193
|
-
renderWithProviders(<PaceLoginPage appName="Test App"
|
|
240
|
+
renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
|
|
194
241
|
|
|
195
242
|
const errorElement = screen.getByText(errorMessage);
|
|
196
243
|
expect(errorElement).toBeInTheDocument();
|
|
@@ -199,11 +246,14 @@ describe('PaceLoginPage Component', () => {
|
|
|
199
246
|
});
|
|
200
247
|
|
|
201
248
|
it('does not show benign AuthSessionMissingError on login page', () => {
|
|
202
|
-
const authErr =
|
|
203
|
-
|
|
204
|
-
|
|
249
|
+
const authErr: AuthError = {
|
|
250
|
+
name: 'AuthSessionMissingError',
|
|
251
|
+
message: 'Auth session missing!',
|
|
252
|
+
status: 400
|
|
253
|
+
};
|
|
254
|
+
mockAuthContext.authError = authErr;
|
|
205
255
|
|
|
206
|
-
renderWithProviders(<PaceLoginPage appName="Test App"
|
|
256
|
+
renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
|
|
207
257
|
|
|
208
258
|
expect(screen.queryByText(/Auth session missing/i)).toBeNull();
|
|
209
259
|
});
|
|
@@ -238,7 +288,7 @@ describe('PaceLoginPage Component', () => {
|
|
|
238
288
|
mockAuthContext.isLoading = false;
|
|
239
289
|
mockAuthContext.hasRole.mockReturnValue(false);
|
|
240
290
|
|
|
241
|
-
renderWithProviders(<PaceLoginPage appName="Test App"
|
|
291
|
+
renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
|
|
242
292
|
|
|
243
293
|
await waitFor(() => {
|
|
244
294
|
expect(mockNavigate).not.toHaveBeenCalled();
|
|
@@ -312,7 +362,7 @@ describe('PaceLoginPage Component', () => {
|
|
|
312
362
|
const signInError = new Error('Invalid credentials');
|
|
313
363
|
mockAuthContext.signIn.mockResolvedValue({ error: signInError });
|
|
314
364
|
|
|
315
|
-
renderWithProviders(<PaceLoginPage appName="Test App"
|
|
365
|
+
renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
|
|
316
366
|
|
|
317
367
|
const emailInput = screen.getByLabelText('Email');
|
|
318
368
|
const passwordInput = screen.getByLabelText('Password');
|
|
@@ -340,7 +390,7 @@ describe('PaceLoginPage Component', () => {
|
|
|
340
390
|
throw new Error('Navigation failed');
|
|
341
391
|
});
|
|
342
392
|
|
|
343
|
-
renderWithProviders(<PaceLoginPage appName="Test App"
|
|
393
|
+
renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
|
|
344
394
|
|
|
345
395
|
const emailInput = screen.getByLabelText('Email');
|
|
346
396
|
const passwordInput = screen.getByLabelText('Password');
|
|
@@ -361,13 +411,13 @@ describe('PaceLoginPage Component', () => {
|
|
|
361
411
|
|
|
362
412
|
it('manages loading state during form submission', async () => {
|
|
363
413
|
const user = userEvent.setup();
|
|
364
|
-
let resolveSignIn: (value:
|
|
365
|
-
const signInPromise = new Promise((resolve) => {
|
|
414
|
+
let resolveSignIn: (value: { error: AuthError | null }) => void;
|
|
415
|
+
const signInPromise = new Promise<{ error: AuthError | null }>((resolve) => {
|
|
366
416
|
resolveSignIn = resolve;
|
|
367
417
|
});
|
|
368
418
|
mockAuthContext.signIn.mockReturnValue(signInPromise);
|
|
369
419
|
|
|
370
|
-
renderWithProviders(<PaceLoginPage appName="Test App"
|
|
420
|
+
renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
|
|
371
421
|
|
|
372
422
|
const emailInput = screen.getByLabelText('Email');
|
|
373
423
|
const passwordInput = screen.getByLabelText('Password');
|
|
@@ -396,14 +446,14 @@ describe('PaceLoginPage Component', () => {
|
|
|
396
446
|
// Error handling tests
|
|
397
447
|
describe('Error Handling', () => {
|
|
398
448
|
it('handles missing app name gracefully', () => {
|
|
399
|
-
renderWithProviders(<PaceLoginPage appName=""
|
|
449
|
+
renderWithProviders(<PaceLoginPage appName="" />, { withRouter: false });
|
|
400
450
|
|
|
401
451
|
// Check that the component renders even with empty app name
|
|
402
452
|
expect(screen.getByTestId('login-form')).toBeInTheDocument();
|
|
403
453
|
});
|
|
404
454
|
|
|
405
455
|
it('handles undefined redirect path', () => {
|
|
406
|
-
renderWithProviders(<PaceLoginPage appName="Test App" onSuccessRedirectPath={undefined}
|
|
456
|
+
renderWithProviders(<PaceLoginPage appName="Test App" onSuccessRedirectPath={undefined} />, { withRouter: false });
|
|
407
457
|
|
|
408
458
|
expect(screen.getByLabelText('Test App Login Page')).toBeInTheDocument();
|
|
409
459
|
});
|
|
@@ -415,7 +465,7 @@ describe('PaceLoginPage Component', () => {
|
|
|
415
465
|
// Mock console.error to catch the error
|
|
416
466
|
console.error = vi.fn();
|
|
417
467
|
|
|
418
|
-
renderWithProviders(<PaceLoginPage appName="Test App"
|
|
468
|
+
renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
|
|
419
469
|
|
|
420
470
|
const emailInput = screen.getByLabelText('Email');
|
|
421
471
|
const passwordInput = screen.getByLabelText('Password');
|
|
@@ -438,14 +488,14 @@ describe('PaceLoginPage Component', () => {
|
|
|
438
488
|
// Accessibility tests
|
|
439
489
|
describe('Accessibility', () => {
|
|
440
490
|
it('has proper ARIA attributes', () => {
|
|
441
|
-
renderWithProviders(<PaceLoginPage appName="Test App"
|
|
491
|
+
renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
|
|
442
492
|
|
|
443
493
|
const main = screen.getByLabelText('Test App Login Page');
|
|
444
494
|
expect(main).toHaveAttribute('aria-label', 'Test App Login Page');
|
|
445
495
|
});
|
|
446
496
|
|
|
447
497
|
it('has proper semantic structure', () => {
|
|
448
|
-
renderWithProviders(<PaceLoginPage appName="Test App"
|
|
498
|
+
renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
|
|
449
499
|
|
|
450
500
|
expect(screen.getByLabelText('Test App Login Page')).toBeInTheDocument();
|
|
451
501
|
expect(screen.getByRole('img')).toBeInTheDocument();
|
|
@@ -453,7 +503,7 @@ describe('PaceLoginPage Component', () => {
|
|
|
453
503
|
});
|
|
454
504
|
|
|
455
505
|
it('has accessible form elements', () => {
|
|
456
|
-
renderWithProviders(<PaceLoginPage appName="Test App"
|
|
506
|
+
renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
|
|
457
507
|
|
|
458
508
|
expect(screen.getByLabelText('Email')).toBeInTheDocument();
|
|
459
509
|
expect(screen.getByLabelText('Password')).toBeInTheDocument();
|
|
@@ -463,7 +513,7 @@ describe('PaceLoginPage Component', () => {
|
|
|
463
513
|
it('announces errors to screen readers', () => {
|
|
464
514
|
mockAuthContext.authError = new Error('Authentication failed');
|
|
465
515
|
|
|
466
|
-
renderWithProviders(<PaceLoginPage appName="Test App"
|
|
516
|
+
renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
|
|
467
517
|
|
|
468
518
|
const errorElement = screen.getByText('Authentication failed');
|
|
469
519
|
expect(errorElement).toBeInTheDocument();
|
|
@@ -473,7 +523,7 @@ describe('PaceLoginPage Component', () => {
|
|
|
473
523
|
// Integration tests
|
|
474
524
|
describe('Integration', () => {
|
|
475
525
|
it('integrates with LoginForm component', () => {
|
|
476
|
-
renderWithProviders(<PaceLoginPage appName="Test App"
|
|
526
|
+
renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
|
|
477
527
|
|
|
478
528
|
// Check that LoginForm is rendered with correct props
|
|
479
529
|
expect(screen.getByTestId('login-form')).toBeInTheDocument();
|
|
@@ -482,13 +532,13 @@ describe('PaceLoginPage Component', () => {
|
|
|
482
532
|
|
|
483
533
|
it('passes loading state to LoginForm', async () => {
|
|
484
534
|
const user = userEvent.setup();
|
|
485
|
-
let resolveSignIn: (value:
|
|
486
|
-
const signInPromise = new Promise((resolve) => {
|
|
535
|
+
let resolveSignIn: (value: { error: AuthError | null }) => void;
|
|
536
|
+
const signInPromise = new Promise<{ error: AuthError | null }>((resolve) => {
|
|
487
537
|
resolveSignIn = resolve;
|
|
488
538
|
});
|
|
489
539
|
mockAuthContext.signIn.mockReturnValue(signInPromise);
|
|
490
540
|
|
|
491
|
-
renderWithProviders(<PaceLoginPage appName="Test App"
|
|
541
|
+
renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
|
|
492
542
|
|
|
493
543
|
const emailInput = screen.getByLabelText('Email');
|
|
494
544
|
const passwordInput = screen.getByLabelText('Password');
|
|
@@ -510,21 +560,21 @@ describe('PaceLoginPage Component', () => {
|
|
|
510
560
|
// Layout and styling tests
|
|
511
561
|
describe('Layout and Styling', () => {
|
|
512
562
|
it('has correct main container classes', () => {
|
|
513
|
-
renderWithProviders(<PaceLoginPage appName="Test App"
|
|
563
|
+
renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
|
|
514
564
|
|
|
515
565
|
const main = screen.getByLabelText('Test App Login Page');
|
|
516
566
|
expect(main).toHaveClass('min-h-screen', 'grid', 'mx-auto', 'w-fit', 'content-center', 'justify-items-center', 'gap-y-8');
|
|
517
567
|
});
|
|
518
568
|
|
|
519
569
|
it('renders logo with correct styling', () => {
|
|
520
|
-
renderWithProviders(<PaceLoginPage appName="TestApp"
|
|
570
|
+
renderWithProviders(<PaceLoginPage appName="TestApp" />, { withRouter: false });
|
|
521
571
|
|
|
522
572
|
const logo = screen.getByAltText('TestApp logo');
|
|
523
573
|
expect(logo).toHaveClass('h-48');
|
|
524
574
|
});
|
|
525
575
|
|
|
526
576
|
it('renders LoginForm with correct width class', () => {
|
|
527
|
-
renderWithProviders(<PaceLoginPage appName="Test App"
|
|
577
|
+
renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
|
|
528
578
|
|
|
529
579
|
const form = screen.getByTestId('login-form');
|
|
530
580
|
expect(form.closest('.w-md')).toBeInTheDocument();
|
|
@@ -536,7 +586,7 @@ describe('PaceLoginPage Component', () => {
|
|
|
536
586
|
it('handles empty form submission', async () => {
|
|
537
587
|
const user = userEvent.setup();
|
|
538
588
|
|
|
539
|
-
renderWithProviders(<PaceLoginPage appName="Test App"
|
|
589
|
+
renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
|
|
540
590
|
|
|
541
591
|
const submitButton = screen.getByRole('button', { name: /sign in/i });
|
|
542
592
|
await user.click(submitButton);
|
|
@@ -548,17 +598,121 @@ describe('PaceLoginPage Component', () => {
|
|
|
548
598
|
it('handles very long app names', () => {
|
|
549
599
|
const longAppName = 'A'.repeat(100);
|
|
550
600
|
|
|
551
|
-
renderWithProviders(<PaceLoginPage appName={longAppName}
|
|
601
|
+
renderWithProviders(<PaceLoginPage appName={longAppName} />, { withRouter: false });
|
|
552
602
|
|
|
553
603
|
expect(screen.getByLabelText(`${longAppName} Login Page`)).toBeInTheDocument();
|
|
554
604
|
});
|
|
555
605
|
|
|
556
606
|
it('handles special characters in app name', () => {
|
|
557
607
|
const specialAppName = 'Test & Co. (Ltd.)';
|
|
558
|
-
|
|
559
|
-
renderWithProviders(<PaceLoginPage appName={specialAppName}
|
|
560
|
-
|
|
608
|
+
|
|
609
|
+
renderWithProviders(<PaceLoginPage appName={specialAppName} />, { withRouter: false });
|
|
610
|
+
|
|
561
611
|
expect(screen.getByLabelText(`${specialAppName} Login Page`)).toBeInTheDocument();
|
|
562
612
|
});
|
|
613
|
+
|
|
614
|
+
it('shows access error when required app configuration is missing', async () => {
|
|
615
|
+
mockAuthContext.isAuthenticated = true;
|
|
616
|
+
mockAuthContext.user = { id: 'user-1' };
|
|
617
|
+
const missingAppSupabase = {
|
|
618
|
+
from: vi.fn((table: string) => {
|
|
619
|
+
if (table === 'rbac_apps') {
|
|
620
|
+
return {
|
|
621
|
+
select: vi.fn(() => ({
|
|
622
|
+
eq: vi.fn(() => ({
|
|
623
|
+
eq: vi.fn(() => ({
|
|
624
|
+
single: vi.fn(() => Promise.resolve({ data: null, error: new Error('missing') })),
|
|
625
|
+
})),
|
|
626
|
+
})),
|
|
627
|
+
})),
|
|
628
|
+
};
|
|
629
|
+
}
|
|
630
|
+
return {
|
|
631
|
+
select: vi.fn(() => ({
|
|
632
|
+
eq: vi.fn(() => ({
|
|
633
|
+
eq: vi.fn(() => ({
|
|
634
|
+
single: vi.fn(() => Promise.resolve({ data: null, error: null })),
|
|
635
|
+
})),
|
|
636
|
+
})),
|
|
637
|
+
})),
|
|
638
|
+
};
|
|
639
|
+
}),
|
|
640
|
+
rpc: vi.fn(() => Promise.resolve({ data: false, error: null })),
|
|
641
|
+
};
|
|
642
|
+
mockAuthContext.supabase = missingAppSupabase as any;
|
|
643
|
+
|
|
644
|
+
renderWithProviders(
|
|
645
|
+
<PaceLoginPage appName="Test App" requireAppAccess />
|
|
646
|
+
);
|
|
647
|
+
|
|
648
|
+
await waitFor(() => {
|
|
649
|
+
expect(screen.getByText(/is not configured/i)).toBeInTheDocument();
|
|
650
|
+
});
|
|
651
|
+
});
|
|
652
|
+
|
|
653
|
+
it('shows organisation access error when user lacks active organisations', async () => {
|
|
654
|
+
mockAuthContext.isAuthenticated = true;
|
|
655
|
+
mockAuthContext.user = { id: 'user-2' };
|
|
656
|
+
const supabaseWithNoOrg = {
|
|
657
|
+
from: vi.fn((table: string) => {
|
|
658
|
+
if (table === 'rbac_apps') {
|
|
659
|
+
return {
|
|
660
|
+
select: vi.fn(() => ({
|
|
661
|
+
eq: vi.fn(() => ({
|
|
662
|
+
eq: vi.fn(() => ({
|
|
663
|
+
single: vi.fn(() => Promise.resolve({ data: { id: 'app-1', name: 'Test App' }, error: null })),
|
|
664
|
+
})),
|
|
665
|
+
})),
|
|
666
|
+
})),
|
|
667
|
+
};
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
if (table === 'rbac_app_pages') {
|
|
671
|
+
return {
|
|
672
|
+
select: vi.fn(() => ({
|
|
673
|
+
eq: vi.fn(() => Promise.resolve({ data: [{ id: 'page-1', page_name: 'dashboard' }], error: null })),
|
|
674
|
+
})),
|
|
675
|
+
};
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
if (table === 'rbac_organisation_roles') {
|
|
679
|
+
return {
|
|
680
|
+
select: vi.fn(() => ({
|
|
681
|
+
eq: vi.fn(() => ({
|
|
682
|
+
eq: vi.fn(() => ({
|
|
683
|
+
is: vi.fn(() => ({
|
|
684
|
+
limit: vi.fn(() => ({
|
|
685
|
+
single: vi.fn(() => Promise.resolve({ data: null, error: null })),
|
|
686
|
+
})),
|
|
687
|
+
})),
|
|
688
|
+
})),
|
|
689
|
+
})),
|
|
690
|
+
})),
|
|
691
|
+
};
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
return {
|
|
695
|
+
select: vi.fn(() => ({
|
|
696
|
+
eq: vi.fn(() => ({
|
|
697
|
+
eq: vi.fn(() => ({
|
|
698
|
+
single: vi.fn(() => Promise.resolve({ data: null, error: null })),
|
|
699
|
+
})),
|
|
700
|
+
})),
|
|
701
|
+
})),
|
|
702
|
+
};
|
|
703
|
+
}),
|
|
704
|
+
rpc: vi.fn(() => Promise.resolve({ data: false, error: null })),
|
|
705
|
+
};
|
|
706
|
+
|
|
707
|
+
mockAuthContext.supabase = supabaseWithNoOrg as any;
|
|
708
|
+
|
|
709
|
+
renderWithProviders(
|
|
710
|
+
<PaceLoginPage appName="Test App" requireAppAccess />
|
|
711
|
+
);
|
|
712
|
+
|
|
713
|
+
await waitFor(() => {
|
|
714
|
+
expect(screen.getByText(/not assigned to any organisation/i)).toBeInTheDocument();
|
|
715
|
+
});
|
|
716
|
+
});
|
|
563
717
|
});
|
|
564
718
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @file PasswordChangeForm Component Tests
|
|
3
3
|
* @package @jmruthers/pace-core
|
|
4
|
-
* @module Components/
|
|
4
|
+
* @module Components/PasswordChange
|
|
5
5
|
* @since 0.1.0
|
|
6
6
|
*
|
|
7
7
|
* Comprehensive test suite for the PasswordChangeForm component.
|
|
@@ -404,7 +404,7 @@ describe('PasswordChangeForm', () => {
|
|
|
404
404
|
await user.click(submitButton);
|
|
405
405
|
|
|
406
406
|
await waitFor(() => {
|
|
407
|
-
expect(screen.getByText('An unexpected error occurred
|
|
407
|
+
expect(screen.getByText('An unexpected error occurred')).toBeInTheDocument();
|
|
408
408
|
});
|
|
409
409
|
});
|
|
410
410
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @file Password Change Form Component
|
|
3
3
|
* @package @jmruthers/pace-core
|
|
4
|
-
* @module Components/
|
|
4
|
+
* @module Components/PasswordChange
|
|
5
5
|
* @since 0.1.0
|
|
6
6
|
*
|
|
7
7
|
* A secure password change form component with validation, confirmation matching,
|
|
@@ -108,8 +108,13 @@ export interface PasswordChangeFormValues {
|
|
|
108
108
|
confirmPassword: string;
|
|
109
109
|
}
|
|
110
110
|
|
|
111
|
+
export interface PasswordChangeFormError {
|
|
112
|
+
message?: string;
|
|
113
|
+
code?: string;
|
|
114
|
+
}
|
|
115
|
+
|
|
111
116
|
export interface PasswordChangeFormProps {
|
|
112
|
-
onSubmit: (values: PasswordChangeFormValues) => Promise<{ error?:
|
|
117
|
+
onSubmit: (values: PasswordChangeFormValues) => Promise<{ error?: PasswordChangeFormError }>;
|
|
113
118
|
className?: string;
|
|
114
119
|
}
|
|
115
120
|
|
|
@@ -138,8 +143,9 @@ export function PasswordChangeForm({ onSubmit, className }: PasswordChangeFormPr
|
|
|
138
143
|
if (result && result.error) {
|
|
139
144
|
setError(result.error.message || 'Failed to change password.');
|
|
140
145
|
}
|
|
141
|
-
} catch (err
|
|
142
|
-
|
|
146
|
+
} catch (err) {
|
|
147
|
+
const errorObj = err instanceof Error ? err : new Error('An unexpected error occurred');
|
|
148
|
+
setError(errorObj.message);
|
|
143
149
|
} finally {
|
|
144
150
|
setIsSubmitting(false);
|
|
145
151
|
}
|
|
@@ -28,6 +28,17 @@ describe('[component] Progress', () => {
|
|
|
28
28
|
expect(indicator.style.transform).toContain('translateX(-20%)');
|
|
29
29
|
});
|
|
30
30
|
|
|
31
|
+
it('calculates transform correctly with custom max value', () => {
|
|
32
|
+
const { rerender } = renderWithProviders(<Progress value={40} max={200} />);
|
|
33
|
+
// 40/200 = 20%, so transform should be translateX(-80%)
|
|
34
|
+
const indicator = screen.getByRole('progressbar').firstElementChild as HTMLElement;
|
|
35
|
+
expect(indicator.style.transform).toContain('translateX(-80%)');
|
|
36
|
+
|
|
37
|
+
rerender(<Progress value={150} max={200} />);
|
|
38
|
+
// 150/200 = 75%, so transform should be translateX(-25%)
|
|
39
|
+
expect(indicator.style.transform).toContain('translateX(-25%)');
|
|
40
|
+
});
|
|
41
|
+
|
|
31
42
|
it('supports indeterminate state when no value is provided (no aria-valuenow)', () => {
|
|
32
43
|
renderWithProviders(<Progress />);
|
|
33
44
|
const progressbar = screen.getByRole('progressbar');
|
|
@@ -106,7 +106,7 @@ const Progress = React.forwardRef<
|
|
|
106
106
|
>
|
|
107
107
|
<ProgressPrimitive.Indicator
|
|
108
108
|
className="h-full w-full flex-1 bg-primary transition-all"
|
|
109
|
-
style={{ transform: `translateX(-${100 - (value || 0)}%)` }}
|
|
109
|
+
style={{ transform: `translateX(-${100 - ((value || 0) / max * 100)}%)` }}
|
|
110
110
|
/>
|
|
111
111
|
</ProgressPrimitive.Root>
|
|
112
112
|
));
|
|
@@ -458,7 +458,8 @@ describe('ProtectedRoute Component', () => {
|
|
|
458
458
|
it('handles null events array', () => {
|
|
459
459
|
mockUseEvents.mockReturnValue({
|
|
460
460
|
selectedEvent: null,
|
|
461
|
-
|
|
461
|
+
// @ts-expect-error - Testing runtime null case that component handles
|
|
462
|
+
events: null,
|
|
462
463
|
isLoading: false,
|
|
463
464
|
});
|
|
464
465
|
|