@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
|
@@ -1,25 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @file RBAC Function Types
|
|
3
3
|
* @package @jmruthers/pace-core
|
|
4
|
-
* @module RBAC/Types
|
|
4
|
+
* @module RBAC/Types/Functions
|
|
5
5
|
* @since 1.0.0
|
|
6
6
|
*
|
|
7
|
-
* TypeScript types for standardized RBAC functions.
|
|
7
|
+
* TypeScript types for standardized RBAC RPC functions.
|
|
8
|
+
* These types define the parameters and return types for database RPC functions.
|
|
8
9
|
*/
|
|
9
10
|
|
|
10
|
-
import { UUID } from '../
|
|
11
|
+
import type { UUID, Operation } from '../types';
|
|
12
|
+
import type { AppId, PageId } from '../../types/core';
|
|
11
13
|
|
|
12
14
|
// ============================================================================
|
|
13
15
|
// PERMISSION CHECKING FUNCTION TYPES
|
|
14
16
|
// ============================================================================
|
|
15
17
|
|
|
16
18
|
export interface RBACPermissionCheckParams {
|
|
17
|
-
p_operation:
|
|
19
|
+
p_operation: Operation;
|
|
18
20
|
p_page_name: string;
|
|
19
21
|
p_user_id?: UUID;
|
|
20
22
|
p_organisation_id?: UUID;
|
|
21
23
|
p_event_id?: string;
|
|
22
|
-
p_app_id?: UUID;
|
|
24
|
+
p_app_id?: AppId | UUID;
|
|
23
25
|
}
|
|
24
26
|
|
|
25
27
|
export interface RBACPermissionCheckResult {
|
|
@@ -33,8 +35,8 @@ export interface RBACPermissionsGetParams {
|
|
|
33
35
|
p_user_id: UUID; // REQUIRED - no default, must be explicitly provided
|
|
34
36
|
p_organisation_id?: UUID;
|
|
35
37
|
p_event_id?: string;
|
|
36
|
-
p_app_id?: UUID;
|
|
37
|
-
p_page_id?: UUID;
|
|
38
|
+
p_app_id?: AppId | UUID;
|
|
39
|
+
p_page_id?: PageId | UUID;
|
|
38
40
|
}
|
|
39
41
|
|
|
40
42
|
export interface RBACPermissionsGetResult {
|
|
@@ -49,19 +51,19 @@ export interface RBACAccessValidateParams {
|
|
|
49
51
|
p_resource_type: 'organisation' | 'event';
|
|
50
52
|
p_resource_id: string;
|
|
51
53
|
p_user_id?: UUID;
|
|
52
|
-
p_operation?:
|
|
54
|
+
p_operation?: Operation;
|
|
53
55
|
}
|
|
54
56
|
|
|
55
57
|
export interface RBACAccessValidateResult {
|
|
56
58
|
has_access: boolean;
|
|
57
|
-
access_level:
|
|
59
|
+
access_level: AccessLevelContext;
|
|
58
60
|
context_id: string | null;
|
|
59
61
|
}
|
|
60
62
|
|
|
61
63
|
export interface RBACPageAccessCheckParams {
|
|
62
|
-
p_app_id: UUID;
|
|
63
|
-
p_page_id:
|
|
64
|
-
p_operation:
|
|
64
|
+
p_app_id: AppId | UUID;
|
|
65
|
+
p_page_id: PageId | UUID;
|
|
66
|
+
p_operation: Operation;
|
|
65
67
|
p_user_id?: UUID;
|
|
66
68
|
p_event_id?: string;
|
|
67
69
|
p_organisation_id?: UUID;
|
|
@@ -105,7 +107,7 @@ export interface RBACRolesListParams {
|
|
|
105
107
|
p_user_id?: UUID;
|
|
106
108
|
p_organisation_id?: UUID;
|
|
107
109
|
p_event_id?: string;
|
|
108
|
-
p_app_id?: UUID;
|
|
110
|
+
p_app_id?: AppId | UUID;
|
|
109
111
|
}
|
|
110
112
|
|
|
111
113
|
export interface RBACRolesListResult {
|
|
@@ -140,7 +142,7 @@ export interface RBACSessionTrackParams {
|
|
|
140
142
|
p_user_id?: UUID;
|
|
141
143
|
p_session_type?: 'web' | 'mobile' | 'api' | 'admin';
|
|
142
144
|
p_event_id?: string;
|
|
143
|
-
p_app_id?: UUID;
|
|
145
|
+
p_app_id?: AppId | UUID;
|
|
144
146
|
p_ip_address?: string;
|
|
145
147
|
p_user_agent?: string;
|
|
146
148
|
}
|
|
@@ -157,7 +159,7 @@ export interface RBACAuditLogParams {
|
|
|
157
159
|
p_user_id?: UUID;
|
|
158
160
|
p_organisation_id?: UUID;
|
|
159
161
|
p_permission?: string;
|
|
160
|
-
p_metadata?: Record<string,
|
|
162
|
+
p_metadata?: Record<string, unknown>;
|
|
161
163
|
p_ip_address?: string;
|
|
162
164
|
p_user_agent?: string;
|
|
163
165
|
}
|
|
@@ -218,23 +220,20 @@ export enum RBACErrorCode {
|
|
|
218
220
|
GRANTED_BY_NOT_FOUND = 'GRANTED_BY_NOT_FOUND',
|
|
219
221
|
}
|
|
220
222
|
|
|
221
|
-
// ============================================================================
|
|
222
|
-
// ROLE TYPES
|
|
223
|
-
// ============================================================================
|
|
224
|
-
|
|
225
|
-
export type GlobalRole = 'super_admin';
|
|
226
|
-
export type OrganisationRole = 'supporter' | 'member' | 'leader' | 'org_admin';
|
|
227
|
-
export type EventAppRole = 'viewer' | 'participant' | 'planner' | 'event_admin';
|
|
228
|
-
|
|
229
|
-
export type RBACRole = GlobalRole | OrganisationRole | EventAppRole;
|
|
230
|
-
|
|
231
223
|
// ============================================================================
|
|
232
224
|
// PERMISSION TYPES
|
|
233
225
|
// ============================================================================
|
|
234
226
|
|
|
235
|
-
|
|
227
|
+
/**
|
|
228
|
+
* Permission source indicates where a permission was granted from
|
|
229
|
+
*/
|
|
236
230
|
export type PermissionSource = 'global' | 'organisation' | 'event_app' | 'default' | 'none';
|
|
237
|
-
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Access level context for RPC functions (different from RBAC AccessLevel)
|
|
234
|
+
* Indicates the scope/context of access validation
|
|
235
|
+
*/
|
|
236
|
+
export type AccessLevelContext = 'super_admin' | 'organisation' | 'event' | 'none';
|
|
238
237
|
|
|
239
238
|
// ============================================================================
|
|
240
239
|
// SESSION TYPES
|
|
@@ -268,10 +267,10 @@ export interface RBACContext {
|
|
|
268
267
|
user_id: UUID;
|
|
269
268
|
organisation_id?: UUID;
|
|
270
269
|
event_id?: string;
|
|
271
|
-
app_id?: UUID;
|
|
270
|
+
app_id?: AppId | UUID;
|
|
272
271
|
}
|
|
273
272
|
|
|
274
|
-
export interface RBACResult<T =
|
|
273
|
+
export interface RBACResult<T = unknown> {
|
|
275
274
|
success: boolean;
|
|
276
275
|
data?: T;
|
|
277
276
|
error?: string;
|
|
@@ -284,8 +283,9 @@ export interface RBACResult<T = any> {
|
|
|
284
283
|
|
|
285
284
|
export type RBACFunctionResponse<T> = {
|
|
286
285
|
data: T | null;
|
|
287
|
-
error:
|
|
286
|
+
error: unknown | null;
|
|
288
287
|
count?: number | null;
|
|
289
288
|
status: number;
|
|
290
289
|
statusText: string;
|
|
291
290
|
};
|
|
291
|
+
|
package/src/rbac/types.ts
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import type React from 'react';
|
|
12
|
+
import type { AppId, PageId } from '../types/core';
|
|
12
13
|
|
|
13
14
|
// ============================================================================
|
|
14
15
|
// CORE TYPES
|
|
@@ -30,14 +31,14 @@ export type AccessLevel =
|
|
|
30
31
|
export type Scope = {
|
|
31
32
|
organisationId?: UUID;
|
|
32
33
|
eventId?: string; // event_id is text/varchar
|
|
33
|
-
appId?: UUID;
|
|
34
|
+
appId?: AppId | UUID;
|
|
34
35
|
};
|
|
35
36
|
|
|
36
37
|
export type PermissionCheck = {
|
|
37
38
|
userId: UUID;
|
|
38
39
|
scope: Scope;
|
|
39
40
|
permission: Permission;
|
|
40
|
-
pageId?:
|
|
41
|
+
pageId?: PageId | UUID;
|
|
41
42
|
};
|
|
42
43
|
|
|
43
44
|
export type PermissionMap = Record<Permission, boolean> & Partial<Record<'*', boolean>>;
|
|
@@ -8,19 +8,27 @@
|
|
|
8
8
|
* Handles user authentication, session management, and auth-related operations.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import { type SupabaseClient, type User, type Session, AuthError } from '@supabase/supabase-js';
|
|
11
|
+
import { type SupabaseClient, type User, type Session, AuthError, type AuthChangeEvent, type Session as SupabaseSession } from '@supabase/supabase-js';
|
|
12
12
|
import type { SessionRestorationState } from '../types/auth';
|
|
13
13
|
import { BaseService } from './base/BaseService';
|
|
14
14
|
import { IAuthService, AuthResult } from './interfaces/IAuthService';
|
|
15
15
|
import { logger } from '../utils/core/logger';
|
|
16
16
|
|
|
17
|
+
type AuthStateSubscription = {
|
|
18
|
+
data: {
|
|
19
|
+
subscription: {
|
|
20
|
+
unsubscribe: () => void;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
|
|
17
25
|
export class AuthService extends BaseService implements IAuthService {
|
|
18
26
|
private user: User | null = null;
|
|
19
27
|
private session: Session | null = null;
|
|
20
28
|
private authLoading = false;
|
|
21
29
|
private authError: AuthError | null = null;
|
|
22
30
|
private supabaseClient: SupabaseClient | null = null;
|
|
23
|
-
private authStateSubscription:
|
|
31
|
+
private authStateSubscription: { unsubscribe: () => void } | null = null;
|
|
24
32
|
private sessionRestorationState: SessionRestorationState = {
|
|
25
33
|
isRestoring: false,
|
|
26
34
|
restorationComplete: false,
|
|
@@ -30,6 +38,8 @@ export class AuthService extends BaseService implements IAuthService {
|
|
|
30
38
|
private readonly restorationTimeoutMs = 5000;
|
|
31
39
|
private restorationStartTime: number | null = null;
|
|
32
40
|
private appName: string | undefined = undefined;
|
|
41
|
+
private errorHandler: ((event: ErrorEvent) => void) | null = null;
|
|
42
|
+
private unhandledRejectionHandler: ((event: PromiseRejectionEvent) => void) | null = null;
|
|
33
43
|
|
|
34
44
|
constructor(supabaseClient: SupabaseClient, appName?: string) {
|
|
35
45
|
super();
|
|
@@ -294,7 +304,7 @@ export class AuthService extends BaseService implements IAuthService {
|
|
|
294
304
|
}
|
|
295
305
|
|
|
296
306
|
cleanup(): void {
|
|
297
|
-
if (this.authStateSubscription
|
|
307
|
+
if (this.authStateSubscription) {
|
|
298
308
|
this.authStateSubscription.unsubscribe();
|
|
299
309
|
this.authStateSubscription = null;
|
|
300
310
|
}
|
|
@@ -328,7 +338,6 @@ export class AuthService extends BaseService implements IAuthService {
|
|
|
328
338
|
};
|
|
329
339
|
this.authLoading = true;
|
|
330
340
|
this.restorationStartTime = Date.now();
|
|
331
|
-
logger.debug('AuthService', 'Starting session restoration at', this.restorationStartTime);
|
|
332
341
|
this.notify();
|
|
333
342
|
|
|
334
343
|
this.restorationTimeoutId = setTimeout(() => {
|
|
@@ -357,9 +366,7 @@ export class AuthService extends BaseService implements IAuthService {
|
|
|
357
366
|
this.authLoading = false;
|
|
358
367
|
|
|
359
368
|
if (error) {
|
|
360
|
-
logger.warn('AuthService', 'Session restoration finished with error:', error
|
|
361
|
-
} else {
|
|
362
|
-
logger.debug('AuthService', 'Session restoration completed successfully in', duration ?? 'unknown', 'ms');
|
|
369
|
+
logger.warn('AuthService', 'Session restoration finished with error:', error);
|
|
363
370
|
}
|
|
364
371
|
|
|
365
372
|
this.notify();
|
|
@@ -380,10 +387,9 @@ export class AuthService extends BaseService implements IAuthService {
|
|
|
380
387
|
}
|
|
381
388
|
|
|
382
389
|
try {
|
|
383
|
-
|
|
384
|
-
(event, session) => {
|
|
390
|
+
const subscription = this.supabaseClient.auth.onAuthStateChange(
|
|
391
|
+
(event: AuthChangeEvent, session: SupabaseSession | null) => {
|
|
385
392
|
try {
|
|
386
|
-
logger.debug('AuthService', 'Auth state change event received:', event);
|
|
387
393
|
// Handle different auth events
|
|
388
394
|
if (event === 'SIGNED_OUT') {
|
|
389
395
|
this.session = null;
|
|
@@ -445,6 +451,7 @@ export class AuthService extends BaseService implements IAuthService {
|
|
|
445
451
|
}
|
|
446
452
|
}
|
|
447
453
|
);
|
|
454
|
+
this.authStateSubscription = subscription.data.subscription;
|
|
448
455
|
} catch (error) {
|
|
449
456
|
logger.error('AuthService', 'Failed to setup auth state listener:', error);
|
|
450
457
|
throw error; // Re-throw to propagate to the provider
|
|
@@ -462,7 +469,6 @@ export class AuthService extends BaseService implements IAuthService {
|
|
|
462
469
|
this.startSessionRestoration();
|
|
463
470
|
|
|
464
471
|
try {
|
|
465
|
-
logger.debug('AuthService', 'Fetching existing session from Supabase');
|
|
466
472
|
let currentSession: Session | null = null;
|
|
467
473
|
let sessionError: AuthError | null = null;
|
|
468
474
|
|
|
@@ -472,14 +478,12 @@ export class AuthService extends BaseService implements IAuthService {
|
|
|
472
478
|
sessionError = error ?? null;
|
|
473
479
|
} catch (error) {
|
|
474
480
|
// Handle cases where getSession might not exist (mocked/test clients)
|
|
475
|
-
logger.debug('AuthService', 'getSession unavailable, treating as no active session');
|
|
476
481
|
currentSession = null;
|
|
477
482
|
sessionError = null;
|
|
478
483
|
}
|
|
479
484
|
|
|
480
485
|
if (sessionError) {
|
|
481
486
|
// Record error but continue to attempt getUser to satisfy edge cases
|
|
482
|
-
logger.debug('AuthService', 'getSession returned error, attempting to fetch user anyway');
|
|
483
487
|
this.authError = sessionError;
|
|
484
488
|
|
|
485
489
|
// Attempt getUser as fallback when getSession fails
|
|
@@ -498,7 +502,6 @@ export class AuthService extends BaseService implements IAuthService {
|
|
|
498
502
|
}
|
|
499
503
|
} catch (getUserError) {
|
|
500
504
|
// If getUser also fails, we've already recorded the sessionError
|
|
501
|
-
logger.debug('AuthService', 'getUser also failed:', getUserError);
|
|
502
505
|
}
|
|
503
506
|
}
|
|
504
507
|
|
|
@@ -510,7 +513,7 @@ export class AuthService extends BaseService implements IAuthService {
|
|
|
510
513
|
// Only skip getUser if we didn't already attempt it due to a sessionError
|
|
511
514
|
// Treat missing session as a normal cold-start state on public pages (e.g., login)
|
|
512
515
|
// Do not call getUser() which can raise AuthSessionMissingError and surface a noisy banner
|
|
513
|
-
|
|
516
|
+
// No active session found; treating as normal unauthenticated state
|
|
514
517
|
this.session = null;
|
|
515
518
|
this.user = null;
|
|
516
519
|
this.authError = null;
|
|
@@ -570,7 +573,8 @@ export class AuthService extends BaseService implements IAuthService {
|
|
|
570
573
|
|
|
571
574
|
// Call rbac_session_track RPC function
|
|
572
575
|
// This automatically inserts into rbac_user_sessions AND rbac_user_login_history (for login)
|
|
573
|
-
|
|
576
|
+
// Note: Using type assertion for RPC call as Supabase doesn't provide full typing for custom RPC functions
|
|
577
|
+
const { error } = await (this.supabaseClient as unknown as { rpc: (name: string, params: Record<string, unknown>) => Promise<{ error: Error | null }> }).rpc('rbac_session_track', {
|
|
574
578
|
p_user_id: session.user.id,
|
|
575
579
|
p_session_type: sessionType,
|
|
576
580
|
p_event_id: null, // Event ID should come from context, not auth service
|
|
@@ -582,8 +586,6 @@ export class AuthService extends BaseService implements IAuthService {
|
|
|
582
586
|
|
|
583
587
|
if (error) {
|
|
584
588
|
logger.warn('AuthService', `Failed to track ${sessionType} session:`, error);
|
|
585
|
-
} else {
|
|
586
|
-
logger.debug('AuthService', `Successfully tracked ${sessionType} session`);
|
|
587
589
|
}
|
|
588
590
|
} catch (error) {
|
|
589
591
|
// Log error but don't throw (non-blocking)
|
|
@@ -594,7 +596,7 @@ export class AuthService extends BaseService implements IAuthService {
|
|
|
594
596
|
private setupErrorHandlers(): void {
|
|
595
597
|
if (typeof window === 'undefined') return;
|
|
596
598
|
|
|
597
|
-
|
|
599
|
+
this.errorHandler = (event: ErrorEvent) => {
|
|
598
600
|
if (event.error?.message?.includes('AuthSessionMissingError') ||
|
|
599
601
|
event.error?.message?.includes('Auth session missing')) {
|
|
600
602
|
logger.warn('AuthService', 'Suppressing AuthSessionMissingError during logout');
|
|
@@ -603,7 +605,7 @@ export class AuthService extends BaseService implements IAuthService {
|
|
|
603
605
|
}
|
|
604
606
|
};
|
|
605
607
|
|
|
606
|
-
|
|
608
|
+
this.unhandledRejectionHandler = (event: PromiseRejectionEvent) => {
|
|
607
609
|
if (event.reason?.message?.includes('AuthSessionMissingError') ||
|
|
608
610
|
event.reason?.message?.includes('Auth session missing')) {
|
|
609
611
|
logger.warn('AuthService', 'Suppressing unhandled AuthSessionMissingError');
|
|
@@ -612,15 +614,21 @@ export class AuthService extends BaseService implements IAuthService {
|
|
|
612
614
|
}
|
|
613
615
|
};
|
|
614
616
|
|
|
615
|
-
window.addEventListener('error',
|
|
616
|
-
window.addEventListener('unhandledrejection',
|
|
617
|
+
window.addEventListener('error', this.errorHandler);
|
|
618
|
+
window.addEventListener('unhandledrejection', this.unhandledRejectionHandler);
|
|
617
619
|
}
|
|
618
620
|
|
|
619
621
|
private removeErrorHandlers(): void {
|
|
620
622
|
if (typeof window === 'undefined') return;
|
|
621
623
|
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
624
|
+
if (this.errorHandler) {
|
|
625
|
+
window.removeEventListener('error', this.errorHandler);
|
|
626
|
+
this.errorHandler = null;
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
if (this.unhandledRejectionHandler) {
|
|
630
|
+
window.removeEventListener('unhandledrejection', this.unhandledRejectionHandler);
|
|
631
|
+
this.unhandledRejectionHandler = null;
|
|
632
|
+
}
|
|
625
633
|
}
|
|
626
634
|
}
|
|
@@ -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;
|