@jmruthers/pace-core 0.5.181 → 0.5.183
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/usePublicEventLogo.test.ts +147 -0
- 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.test.ts +21 -0
- package/src/styles/index.ts +1 -5
- package/src/types/__tests__/guards.test.ts +1 -1
- package/src/types/__tests__/organisation.roles.test.ts +55 -0
- 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/audit/audit.test.ts +65 -0
- package/src/utils/device/deviceFingerprint.test.ts +171 -0
- 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/__tests__/validationUtils.test.ts +72 -0
- 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
|
@@ -11,8 +11,9 @@
|
|
|
11
11
|
import { type SupabaseClient, type User, type Session } from '@supabase/supabase-js';
|
|
12
12
|
import { BaseService } from './base/BaseService';
|
|
13
13
|
import { IEventService } from './interfaces/IEventService';
|
|
14
|
-
import { Event } from '../types/
|
|
14
|
+
import { Event } from '../types/event';
|
|
15
15
|
import { Organisation } from '../types/organisation';
|
|
16
|
+
import { assertOrganisationId } from '../types/core';
|
|
16
17
|
import { logger } from '../utils/core/logger';
|
|
17
18
|
import { secureStorage } from '../utils/security/secureStorage';
|
|
18
19
|
|
|
@@ -101,8 +102,12 @@ export class EventService extends BaseService implements IEventService {
|
|
|
101
102
|
this.resetInitialization(); // Reset BaseService's isInitialized flag
|
|
102
103
|
this.isInitializedRef = false;
|
|
103
104
|
this.isFetchingRef = false;
|
|
104
|
-
// Clear events when switching organisations
|
|
105
|
-
if (previousOrgId !== null && newOrgId !== previousOrgId) {
|
|
105
|
+
// Clear events ONLY when switching between different organisations (not when org first becomes available)
|
|
106
|
+
if (previousOrgId !== null && newOrgId !== null && previousOrgId !== newOrgId) {
|
|
107
|
+
this.events = [];
|
|
108
|
+
this.selectedEvent = null;
|
|
109
|
+
} else if (previousOrgId !== null && newOrgId === null) {
|
|
110
|
+
// Organisation was removed - clear events
|
|
106
111
|
this.events = [];
|
|
107
112
|
this.selectedEvent = null;
|
|
108
113
|
}
|
|
@@ -113,7 +118,9 @@ export class EventService extends BaseService implements IEventService {
|
|
|
113
118
|
|
|
114
119
|
// Event state getters
|
|
115
120
|
getEvents(): Event[] {
|
|
116
|
-
|
|
121
|
+
// Return a new array reference so React can detect changes
|
|
122
|
+
// This ensures useMemo dependencies work correctly
|
|
123
|
+
return [...this.events];
|
|
117
124
|
}
|
|
118
125
|
|
|
119
126
|
getSelectedEvent(): Event | null {
|
|
@@ -277,27 +284,9 @@ export class EventService extends BaseService implements IEventService {
|
|
|
277
284
|
|
|
278
285
|
// Lifecycle methods
|
|
279
286
|
async initialize(): Promise<void> {
|
|
287
|
+
// Only call super.initialize() which will call doInitialize() and fetchEvents()
|
|
288
|
+
// Don't call fetchEvents() again here to avoid double-fetching
|
|
280
289
|
await super.initialize();
|
|
281
|
-
|
|
282
|
-
// Clean up old global storage keys (backward compatibility)
|
|
283
|
-
// This ensures old data doesn't leak to new users
|
|
284
|
-
try {
|
|
285
|
-
// Remove old plain storage key
|
|
286
|
-
if (typeof sessionStorage !== 'undefined') {
|
|
287
|
-
sessionStorage.removeItem('pace-core-selected-event');
|
|
288
|
-
}
|
|
289
|
-
if (typeof localStorage !== 'undefined') {
|
|
290
|
-
localStorage.removeItem('pace-core-selected-event');
|
|
291
|
-
// Also remove old encrypted format if it exists
|
|
292
|
-
localStorage.removeItem('_sec_pace-core-selected-event');
|
|
293
|
-
}
|
|
294
|
-
} catch (error) {
|
|
295
|
-
logger.warn('EventService', 'Failed to clean up old storage keys:', error);
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
// Load persisted event during initialization (don't skip)
|
|
299
|
-
// This ensures the last viewed event is restored before auto-selection happens
|
|
300
|
-
await this.fetchEvents(false);
|
|
301
290
|
}
|
|
302
291
|
|
|
303
292
|
cleanup(): void {
|
|
@@ -305,8 +294,32 @@ export class EventService extends BaseService implements IEventService {
|
|
|
305
294
|
}
|
|
306
295
|
|
|
307
296
|
protected async doInitialize(): Promise<void> {
|
|
297
|
+
// Skip if already initialized
|
|
298
|
+
if (this.isInitializedRef) {
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// Skip if already fetching
|
|
303
|
+
if (this.isFetchingRef) {
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// Clean up old storage keys (migration from old key format)
|
|
308
|
+
try {
|
|
309
|
+
sessionStorage.removeItem('pace-core-selected-event');
|
|
310
|
+
localStorage.removeItem('pace-core-selected-event');
|
|
311
|
+
localStorage.removeItem('_sec_pace-core-selected-event');
|
|
312
|
+
} catch (error) {
|
|
313
|
+
logger.warn('EventService', 'Failed to clean up old storage keys:', error);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// Skip if no user or organisation
|
|
317
|
+
if (!this.user || !this.selectedOrganisation) {
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
|
|
308
321
|
// Initial setup - fetch events on initialization
|
|
309
|
-
await this.fetchEvents();
|
|
322
|
+
await this.fetchEvents(false);
|
|
310
323
|
}
|
|
311
324
|
|
|
312
325
|
protected doCleanup(): void {
|
|
@@ -334,25 +347,12 @@ export class EventService extends BaseService implements IEventService {
|
|
|
334
347
|
|
|
335
348
|
try {
|
|
336
349
|
// Call the RPC function following the established pattern
|
|
337
|
-
logger.debug('EventService', 'Fetching events with params:', {
|
|
338
|
-
p_user_id: this.user.id,
|
|
339
|
-
p_organisation_id: this.selectedOrganisation.id,
|
|
340
|
-
p_app_name: this.appName
|
|
341
|
-
});
|
|
342
|
-
|
|
343
350
|
const { data, error: rpcError } = await this.supabaseClient.rpc('data_user_events_get', {
|
|
344
351
|
p_user_id: this.user.id,
|
|
345
352
|
p_organisation_id: this.selectedOrganisation.id,
|
|
346
353
|
p_app_name: this.appName
|
|
347
354
|
});
|
|
348
355
|
|
|
349
|
-
logger.debug('EventService', 'RPC call completed:', {
|
|
350
|
-
hasData: !!data,
|
|
351
|
-
dataLength: Array.isArray(data) ? data.length : 0,
|
|
352
|
-
hasError: !!rpcError,
|
|
353
|
-
errorMessage: rpcError?.message || 'No error'
|
|
354
|
-
});
|
|
355
|
-
|
|
356
356
|
if (rpcError) {
|
|
357
357
|
logger.error('EventService', 'RPC error fetching events:', rpcError);
|
|
358
358
|
throw new Error(rpcError.message || 'Failed to fetch events');
|
|
@@ -362,8 +362,21 @@ export class EventService extends BaseService implements IEventService {
|
|
|
362
362
|
const eventsData = data || [];
|
|
363
363
|
|
|
364
364
|
// Transform the data to match our Event interface
|
|
365
|
-
|
|
366
|
-
|
|
365
|
+
// Type for RPC response from data_user_events_get
|
|
366
|
+
interface EventRpcResponse {
|
|
367
|
+
event_id: string;
|
|
368
|
+
event_name: string;
|
|
369
|
+
event_code: string;
|
|
370
|
+
event_date: string | null;
|
|
371
|
+
event_venue: string | null;
|
|
372
|
+
event_participants: number | null;
|
|
373
|
+
event_colours: Record<string, unknown> | null;
|
|
374
|
+
organisation_id: string;
|
|
375
|
+
is_visible: boolean;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
const transformedEvents: Event[] = eventsData.map((event: EventRpcResponse) => ({
|
|
379
|
+
id: event.event_id,
|
|
367
380
|
event_id: event.event_id,
|
|
368
381
|
event_name: event.event_name,
|
|
369
382
|
event_code: event.event_code,
|
|
@@ -372,11 +385,10 @@ export class EventService extends BaseService implements IEventService {
|
|
|
372
385
|
event_participants: event.event_participants,
|
|
373
386
|
event_colours: event.event_colours,
|
|
374
387
|
event_logo: '', // No logo field in event table
|
|
375
|
-
organisation_id: event.organisation_id,
|
|
388
|
+
organisation_id: assertOrganisationId(event.organisation_id),
|
|
376
389
|
is_visible: event.is_visible,
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
start_date: event.event_date
|
|
390
|
+
created_at: new Date().toISOString(),
|
|
391
|
+
updated_at: new Date().toISOString()
|
|
380
392
|
}));
|
|
381
393
|
|
|
382
394
|
this.events = transformedEvents;
|
|
@@ -8,10 +8,22 @@
|
|
|
8
8
|
* Handles inactivity tracking, auto-logout, and warning modals.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
+
import { type SupabaseClient, type User, type Session } from '@supabase/supabase-js';
|
|
11
12
|
import { BaseService } from './base/BaseService';
|
|
12
13
|
import { IInactivityService } from './interfaces/IInactivityService';
|
|
13
14
|
import { logger } from '../utils/core/logger';
|
|
14
15
|
|
|
16
|
+
interface InactivityTracker {
|
|
17
|
+
isIdle: boolean;
|
|
18
|
+
timeRemaining: number;
|
|
19
|
+
showWarning: boolean;
|
|
20
|
+
isTracking: boolean;
|
|
21
|
+
resetActivity: () => void;
|
|
22
|
+
startTracking: () => void;
|
|
23
|
+
stopTracking: () => void;
|
|
24
|
+
cleanup?: () => void;
|
|
25
|
+
}
|
|
26
|
+
|
|
15
27
|
export class InactivityService extends BaseService implements IInactivityService {
|
|
16
28
|
private _showInactivityWarning = false;
|
|
17
29
|
private _inactivityTimeRemaining = 0;
|
|
@@ -21,21 +33,22 @@ export class InactivityService extends BaseService implements IInactivityService
|
|
|
21
33
|
private _isTracking = false;
|
|
22
34
|
|
|
23
35
|
// Dependencies
|
|
24
|
-
private supabaseClient:
|
|
25
|
-
private user:
|
|
26
|
-
private session:
|
|
36
|
+
private supabaseClient: SupabaseClient | null = null;
|
|
37
|
+
private user: User | null = null;
|
|
38
|
+
private session: Session | null = null;
|
|
27
39
|
private idleTimeoutMs = 30 * 60 * 1000; // 30 minutes
|
|
28
40
|
private warnBeforeMs = 60 * 1000; // 60 seconds
|
|
29
41
|
private onIdleLogout: ((reason: 'inactivity') => void) | null = null;
|
|
30
42
|
|
|
31
43
|
// Internal state management
|
|
32
|
-
private inactivityTracker:
|
|
44
|
+
private inactivityTracker: InactivityTracker | null = null;
|
|
33
45
|
private isInactivityEnabled = true;
|
|
46
|
+
private cleanupHandlers: (() => void) | null = null;
|
|
34
47
|
|
|
35
48
|
constructor(
|
|
36
|
-
supabaseClient:
|
|
37
|
-
user:
|
|
38
|
-
session:
|
|
49
|
+
supabaseClient: SupabaseClient | null,
|
|
50
|
+
user: User | null,
|
|
51
|
+
session: Session | null,
|
|
39
52
|
idleTimeoutMs: number = 30 * 60 * 1000,
|
|
40
53
|
warnBeforeMs: number = 60 * 1000,
|
|
41
54
|
onIdleLogout: (reason: 'inactivity') => void
|
|
@@ -111,9 +124,9 @@ export class InactivityService extends BaseService implements IInactivityService
|
|
|
111
124
|
|
|
112
125
|
// Update dependencies
|
|
113
126
|
updateDependencies(
|
|
114
|
-
supabaseClient:
|
|
115
|
-
user:
|
|
116
|
-
session:
|
|
127
|
+
supabaseClient: SupabaseClient | null,
|
|
128
|
+
user: User | null,
|
|
129
|
+
session: Session | null,
|
|
117
130
|
idleTimeoutMs?: number,
|
|
118
131
|
warnBeforeMs?: number,
|
|
119
132
|
onIdleLogout?: (reason: 'inactivity') => void
|
|
@@ -169,7 +182,7 @@ export class InactivityService extends BaseService implements IInactivityService
|
|
|
169
182
|
if (this.supabaseClient) {
|
|
170
183
|
await this.supabaseClient.auth.signOut();
|
|
171
184
|
}
|
|
172
|
-
} catch (error
|
|
185
|
+
} catch (error) {
|
|
173
186
|
logger.error('InactivityService', 'Error during idle logout:', error);
|
|
174
187
|
}
|
|
175
188
|
|
|
@@ -195,7 +208,7 @@ export class InactivityService extends BaseService implements IInactivityService
|
|
|
195
208
|
if (this.supabaseClient) {
|
|
196
209
|
await this.supabaseClient.auth.signOut();
|
|
197
210
|
}
|
|
198
|
-
} catch (error
|
|
211
|
+
} catch (error) {
|
|
199
212
|
logger.error('InactivityService', 'Error during manual sign out:', error);
|
|
200
213
|
}
|
|
201
214
|
|
|
@@ -211,8 +224,11 @@ export class InactivityService extends BaseService implements IInactivityService
|
|
|
211
224
|
}
|
|
212
225
|
|
|
213
226
|
cleanup(): void {
|
|
227
|
+
if (this.cleanupHandlers) {
|
|
228
|
+
this.cleanupHandlers();
|
|
229
|
+
this.cleanupHandlers = null;
|
|
230
|
+
}
|
|
214
231
|
if (this.inactivityTracker) {
|
|
215
|
-
this.inactivityTracker.cleanup?.();
|
|
216
232
|
this.inactivityTracker = null;
|
|
217
233
|
}
|
|
218
234
|
this._isTracking = false;
|
|
@@ -243,50 +259,14 @@ export class InactivityService extends BaseService implements IInactivityService
|
|
|
243
259
|
if (typeof window === 'undefined') return;
|
|
244
260
|
|
|
245
261
|
// Check if inactivity is enabled
|
|
246
|
-
this.isInactivityEnabled = this.user && this.session;
|
|
262
|
+
this.isInactivityEnabled = !!(this.user && this.session);
|
|
247
263
|
|
|
248
264
|
if (!this.isInactivityEnabled) {
|
|
249
265
|
return;
|
|
250
266
|
}
|
|
251
267
|
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
const { useInactivityTracker } = await import('../hooks/useInactivityTracker');
|
|
255
|
-
|
|
256
|
-
// Create a mock implementation since we can't use hooks in services
|
|
257
|
-
// In a real implementation, you'd need to create a non-hook version
|
|
258
|
-
this.inactivityTracker = {
|
|
259
|
-
isIdle: false,
|
|
260
|
-
timeRemaining: 0,
|
|
261
|
-
showWarning: false,
|
|
262
|
-
isTracking: false,
|
|
263
|
-
resetActivity: () => {
|
|
264
|
-
this._isIdle = false;
|
|
265
|
-
this._timeRemaining = 0;
|
|
266
|
-
this._showWarning = false;
|
|
267
|
-
this.notify();
|
|
268
|
-
},
|
|
269
|
-
startTracking: () => {
|
|
270
|
-
this._isTracking = true;
|
|
271
|
-
this.notify();
|
|
272
|
-
},
|
|
273
|
-
stopTracking: () => {
|
|
274
|
-
this._isTracking = false;
|
|
275
|
-
this.notify();
|
|
276
|
-
},
|
|
277
|
-
cleanup: () => {
|
|
278
|
-
this._isTracking = false;
|
|
279
|
-
this._isIdle = false;
|
|
280
|
-
this._showWarning = false;
|
|
281
|
-
this._timeRemaining = 0;
|
|
282
|
-
}
|
|
283
|
-
};
|
|
284
|
-
|
|
285
|
-
// Set up event handlers
|
|
286
|
-
this.setupEventHandlers();
|
|
287
|
-
} catch (error) {
|
|
288
|
-
logger.error('InactivityService', 'Failed to setup inactivity tracker:', error);
|
|
289
|
-
}
|
|
268
|
+
// Set up event handlers directly (no need to import hooks - services are pure TypeScript)
|
|
269
|
+
this.setupEventHandlers();
|
|
290
270
|
}
|
|
291
271
|
|
|
292
272
|
private setupEventHandlers(): void {
|
|
@@ -360,7 +340,7 @@ export class InactivityService extends BaseService implements IInactivityService
|
|
|
360
340
|
startIdleTimer();
|
|
361
341
|
|
|
362
342
|
// Store cleanup function
|
|
363
|
-
this.
|
|
343
|
+
this.cleanupHandlers = () => {
|
|
364
344
|
if (idleTimer) {
|
|
365
345
|
clearTimeout(idleTimer);
|
|
366
346
|
idleTimer = null;
|
|
@@ -19,6 +19,16 @@ import type {
|
|
|
19
19
|
} from '../types/organisation';
|
|
20
20
|
import { setOrganisationContext } from '../utils/context/organisationContext';
|
|
21
21
|
import { logger } from '../utils/core/logger';
|
|
22
|
+
import { assertUserId, assertOrganisationId } from '../types/core';
|
|
23
|
+
|
|
24
|
+
// Type for RPC response from data_user_organisation_roles_get
|
|
25
|
+
interface OrganisationRoleRpcResponse {
|
|
26
|
+
user_id: string;
|
|
27
|
+
organisation_id: string;
|
|
28
|
+
role: 'org_admin' | 'leader' | 'member' | 'supporter';
|
|
29
|
+
status: 'active' | 'inactive' | 'suspended';
|
|
30
|
+
[key: string]: unknown;
|
|
31
|
+
}
|
|
22
32
|
|
|
23
33
|
export class OrganisationService extends BaseService implements IOrganisationService {
|
|
24
34
|
private _selectedOrganisation: Organisation | null = null;
|
|
@@ -112,7 +122,7 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
112
122
|
// If user logs out, allow re-initialization when they log back in
|
|
113
123
|
if (wasAuthenticated && !isAuthenticated) {
|
|
114
124
|
// Reset BaseService initialization state to allow re-initialization
|
|
115
|
-
(
|
|
125
|
+
this.resetInitialization();
|
|
116
126
|
}
|
|
117
127
|
|
|
118
128
|
this.notify();
|
|
@@ -150,7 +160,7 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
150
160
|
}
|
|
151
161
|
|
|
152
162
|
validateOrganisationAccess(orgId: string): boolean {
|
|
153
|
-
return this._userMemberships.some((m
|
|
163
|
+
return this._userMemberships.some((m) =>
|
|
154
164
|
m.organisation_id === orgId &&
|
|
155
165
|
m.status === 'active' &&
|
|
156
166
|
m.revoked_at === null
|
|
@@ -179,12 +189,12 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
179
189
|
|
|
180
190
|
getPrimaryOrganisation(): Organisation | null {
|
|
181
191
|
// Look for org_admin role first, then leader, then member
|
|
182
|
-
const rolePriority = ['org_admin', 'leader', 'member'];
|
|
192
|
+
const rolePriority = ['org_admin', 'leader', 'member'] as const;
|
|
183
193
|
|
|
184
194
|
for (const role of rolePriority) {
|
|
185
|
-
const membership = this._userMemberships.find((m
|
|
195
|
+
const membership = this._userMemberships.find((m) => m.role === role);
|
|
186
196
|
if (membership) {
|
|
187
|
-
return this._organisations.find((org
|
|
197
|
+
return this._organisations.find((org) => org.id === membership.organisation_id) || null;
|
|
188
198
|
}
|
|
189
199
|
}
|
|
190
200
|
|
|
@@ -262,8 +272,6 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
262
272
|
}
|
|
263
273
|
|
|
264
274
|
try {
|
|
265
|
-
logger.debug('OrganisationService', 'Setting database organisation context for:', organisation.id);
|
|
266
|
-
|
|
267
275
|
// Add timeout to prevent hanging
|
|
268
276
|
const timeoutPromise = new Promise((_, reject) => {
|
|
269
277
|
setTimeout(() => reject(new Error('Context setting timeout after 5 seconds')), 5000);
|
|
@@ -273,7 +281,7 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
273
281
|
|
|
274
282
|
await Promise.race([contextPromise, timeoutPromise]);
|
|
275
283
|
|
|
276
|
-
|
|
284
|
+
// Database organisation context set successfully
|
|
277
285
|
this._isContextReady = true;
|
|
278
286
|
this.notify();
|
|
279
287
|
} catch (error) {
|
|
@@ -287,10 +295,6 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
287
295
|
}
|
|
288
296
|
|
|
289
297
|
private async loadUserOrganisations(): Promise<void> {
|
|
290
|
-
// Add call tracking to detect race conditions
|
|
291
|
-
const callId = Math.random().toString(36).substr(2, 9);
|
|
292
|
-
logger.debug('OrganisationService', `Starting loadUserOrganisations call ${callId}`);
|
|
293
|
-
|
|
294
298
|
if (!this.user || !this.session || !this.supabaseClient) {
|
|
295
299
|
// Clear state when no user, session, or supabase client
|
|
296
300
|
this._selectedOrganisation = null;
|
|
@@ -304,7 +308,6 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
304
308
|
|
|
305
309
|
// Additional check to prevent loading during auth state changes
|
|
306
310
|
if (this.isLoadingRef) {
|
|
307
|
-
logger.debug("OrganisationService", "Already loading, skipping duplicate load");
|
|
308
311
|
// Ensure loading state is correct
|
|
309
312
|
this._isLoading = true;
|
|
310
313
|
this.notify();
|
|
@@ -314,7 +317,6 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
314
317
|
// Prevent rapid retries - minimum 2 seconds between attempts
|
|
315
318
|
const now = Date.now();
|
|
316
319
|
if (now - this.lastLoadTimeRef < 2000) {
|
|
317
|
-
logger.debug("OrganisationService", "Too soon since last load, skipping");
|
|
318
320
|
// Ensure loading state is correct
|
|
319
321
|
if (this._organisations.length > 0 || this._selectedOrganisation) {
|
|
320
322
|
this._isLoading = false;
|
|
@@ -341,18 +343,10 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
341
343
|
this.notify();
|
|
342
344
|
|
|
343
345
|
try {
|
|
344
|
-
logger.debug("OrganisationService", "Supabase client ready:", {
|
|
345
|
-
isConnected: !!this.supabaseClient,
|
|
346
|
-
hasAuth: !!this.supabaseClient.auth,
|
|
347
|
-
hasRpc: !!this.supabaseClient.rpc
|
|
348
|
-
});
|
|
349
|
-
|
|
350
346
|
// Get user's organisation memberships using secure RPC function
|
|
351
347
|
// Only get actual members (org_admin, leader, member) - exclude supporters
|
|
352
348
|
let memberships, membershipError;
|
|
353
349
|
try {
|
|
354
|
-
logger.debug("OrganisationService", "Making RPC call to data_user_organisation_roles_get...");
|
|
355
|
-
|
|
356
350
|
// Add timeout and abort signal to prevent hanging RPC calls
|
|
357
351
|
const timeoutPromise = new Promise((_, reject) => {
|
|
358
352
|
const timeoutId = setTimeout(() => reject(new Error('RPC call timeout after 10 seconds')), 10000);
|
|
@@ -372,22 +366,20 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
372
366
|
throw new Error('Request aborted');
|
|
373
367
|
}
|
|
374
368
|
|
|
375
|
-
const result = await Promise.race([rpcPromise, timeoutPromise]) as
|
|
376
|
-
|
|
377
|
-
logger.debug("OrganisationService", "RPC call completed:", {
|
|
378
|
-
hasData: !!result.data,
|
|
379
|
-
hasError: !!result.error,
|
|
380
|
-
dataLength: result.data?.length || 0,
|
|
381
|
-
errorMessage: result.error?.message || 'No error'
|
|
382
|
-
});
|
|
369
|
+
const result = await Promise.race([rpcPromise, timeoutPromise]) as { data: OrganisationRoleRpcResponse[] | null; error: Error | null };
|
|
383
370
|
|
|
384
371
|
// Filter to only actual members (org_admin, leader, member) - exclude supporters
|
|
385
|
-
|
|
372
|
+
// Map to branded types when filtering
|
|
373
|
+
memberships = result.data?.filter((role) =>
|
|
386
374
|
['org_admin', 'leader', 'member'].includes(role.role)
|
|
387
|
-
)
|
|
375
|
+
).map((m) => ({
|
|
376
|
+
...m,
|
|
377
|
+
user_id: assertUserId(m.user_id),
|
|
378
|
+
organisation_id: assertOrganisationId(m.organisation_id),
|
|
379
|
+
})) || [];
|
|
388
380
|
membershipError = result.error;
|
|
389
|
-
} catch (queryError
|
|
390
|
-
membershipError = queryError;
|
|
381
|
+
} catch (queryError) {
|
|
382
|
+
membershipError = queryError instanceof Error ? queryError : new Error(String(queryError));
|
|
391
383
|
}
|
|
392
384
|
|
|
393
385
|
if (membershipError) {
|
|
@@ -395,7 +387,6 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
395
387
|
|
|
396
388
|
// If RPC fails with timeout, try direct database query as fallback
|
|
397
389
|
if (membershipError.message?.includes('timeout')) {
|
|
398
|
-
logger.debug("OrganisationService", "RPC timed out, trying direct database query as fallback...");
|
|
399
390
|
try {
|
|
400
391
|
// Check if request was aborted before making fallback query
|
|
401
392
|
if (abortSignal.aborted) {
|
|
@@ -439,8 +430,12 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
439
430
|
throw membershipError; // Throw original error
|
|
440
431
|
}
|
|
441
432
|
|
|
442
|
-
|
|
443
|
-
memberships = fallbackData
|
|
433
|
+
// Map to branded types
|
|
434
|
+
memberships = fallbackData?.map((m) => ({
|
|
435
|
+
...m,
|
|
436
|
+
user_id: assertUserId(m.user_id),
|
|
437
|
+
organisation_id: assertOrganisationId(m.organisation_id),
|
|
438
|
+
})) || [];
|
|
444
439
|
membershipError = null;
|
|
445
440
|
} catch (fallbackErr) {
|
|
446
441
|
logger.error("OrganisationService", "Fallback query failed:", fallbackErr);
|
|
@@ -457,7 +452,7 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
457
452
|
|
|
458
453
|
// Get organisation details for the memberships
|
|
459
454
|
const organisationIds = memberships
|
|
460
|
-
.map((m
|
|
455
|
+
.map((m) => m.organisation_id)
|
|
461
456
|
.filter((id: string) => {
|
|
462
457
|
// Better validation to prevent empty string UUID errors
|
|
463
458
|
if (!id || typeof id !== 'string') {
|
|
@@ -503,7 +498,7 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
503
498
|
|
|
504
499
|
// Create a map of organisation_id to role from the memberships data
|
|
505
500
|
const roleMap = new Map<string, string>();
|
|
506
|
-
memberships?.forEach((membership
|
|
501
|
+
memberships?.forEach((membership) => {
|
|
507
502
|
roleMap.set(membership.organisation_id, membership.role);
|
|
508
503
|
});
|
|
509
504
|
|
|
@@ -516,6 +511,7 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
516
511
|
}
|
|
517
512
|
|
|
518
513
|
this._organisations = activeOrgs;
|
|
514
|
+
// Memberships already have branded types from earlier mapping
|
|
519
515
|
this._userMemberships = memberships as OrganisationMembership[];
|
|
520
516
|
|
|
521
517
|
// Store role map in component state for later use
|
|
@@ -551,7 +547,7 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
551
547
|
|
|
552
548
|
// 2. Fall back to org_admin role organisation (highest privilege)
|
|
553
549
|
if (!initialOrg) {
|
|
554
|
-
const adminMembership = memberships.find((m
|
|
550
|
+
const adminMembership = memberships.find((m) => m.role === 'org_admin');
|
|
555
551
|
if (adminMembership) {
|
|
556
552
|
const foundOrg = organisations.find((org) => org.id === adminMembership.organisation_id);
|
|
557
553
|
if (foundOrg) {
|
|
@@ -7,8 +7,12 @@ function createSupabaseMock() {
|
|
|
7
7
|
getSession: vi.fn().mockResolvedValue({ data: { session: null }, error: null }),
|
|
8
8
|
getUser: vi.fn(), // should not be called when session is null
|
|
9
9
|
onAuthStateChange: vi.fn().mockImplementation((cb: any) => {
|
|
10
|
-
// Provide a subscription-like object
|
|
11
|
-
|
|
10
|
+
// Provide a subscription-like object with data.subscription structure
|
|
11
|
+
const subscription = { unsubscribe: () => {} };
|
|
12
|
+
return {
|
|
13
|
+
data: { subscription },
|
|
14
|
+
error: null
|
|
15
|
+
} as any;
|
|
12
16
|
}),
|
|
13
17
|
} as any;
|
|
14
18
|
|