@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,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
lastUpdated: 2025-
|
|
3
|
-
version: 0.5.
|
|
4
|
-
reviewedBy:
|
|
2
|
+
lastUpdated: 2025-11-18T12:00:00+11:00
|
|
3
|
+
version: 0.5.181
|
|
4
|
+
reviewedBy: documentation-standards-audit
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Hooks API Reference
|
|
@@ -14,23 +14,77 @@ This section provides detailed API documentation for all React hooks in `@jmruth
|
|
|
14
14
|
|
|
15
15
|
### useUnifiedAuth
|
|
16
16
|
|
|
17
|
-
A comprehensive hook that combines authentication
|
|
17
|
+
A comprehensive hook that combines authentication, organisation context, event access management, and inactivity tracking.
|
|
18
18
|
|
|
19
19
|
```typescript
|
|
20
|
-
interface
|
|
20
|
+
interface UnifiedAuthContextType {
|
|
21
|
+
// Auth state
|
|
21
22
|
user: User | null;
|
|
22
23
|
session: Session | null;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
24
|
+
isAuthenticated: boolean;
|
|
25
|
+
authLoading: boolean;
|
|
26
|
+
authError: AuthError | null;
|
|
27
|
+
error: AuthError | null; // Alias for authError
|
|
28
|
+
supabase: SupabaseClient | null;
|
|
29
|
+
|
|
30
|
+
// Auth methods
|
|
31
|
+
signIn: (email: string, password?: string) => Promise<{ error: AuthError | null }>;
|
|
32
|
+
signUp: (email: string, password: string) => Promise<{ error: AuthError | null }>;
|
|
33
|
+
signOut: () => Promise<{ error: AuthError | null }>;
|
|
34
|
+
resetPassword: (email: string) => Promise<{ error: AuthError | null }>;
|
|
35
|
+
updatePassword: (password: string) => Promise<{ error: AuthError | null }>;
|
|
36
|
+
refreshSession: () => Promise<{ error: AuthError | null }>;
|
|
37
|
+
|
|
38
|
+
// Organisation state
|
|
39
|
+
selectedOrganisation: Organisation | null;
|
|
40
|
+
organisations: Organisation[];
|
|
41
|
+
userMemberships: OrganisationMembership[];
|
|
42
|
+
organisationLoading: boolean;
|
|
43
|
+
organisationError: Error | null;
|
|
44
|
+
hasValidOrganisationContext: boolean;
|
|
45
|
+
isContextReady: boolean;
|
|
46
|
+
|
|
47
|
+
// Organisation methods
|
|
48
|
+
switchOrganisation: (orgId: string) => Promise<void>;
|
|
49
|
+
getUserRole: (orgId?: string) => string;
|
|
50
|
+
validateOrganisationAccess: (orgId: string) => boolean;
|
|
51
|
+
refreshOrganisations: () => Promise<void>;
|
|
52
|
+
ensureOrganisationContext: () => Organisation;
|
|
53
|
+
isOrganisationSecure: () => boolean;
|
|
54
|
+
getPrimaryOrganisation: () => Organisation | null;
|
|
55
|
+
|
|
56
|
+
// Event state
|
|
30
57
|
events: Event[];
|
|
31
58
|
selectedEvent: Event | null;
|
|
59
|
+
eventLoading: boolean;
|
|
60
|
+
eventError: Error | null;
|
|
61
|
+
|
|
62
|
+
// Event methods
|
|
32
63
|
setSelectedEvent: (event: Event | null) => void;
|
|
33
|
-
|
|
64
|
+
refreshEvents: () => Promise<void>;
|
|
65
|
+
|
|
66
|
+
// Inactivity state
|
|
67
|
+
showInactivityWarning: boolean;
|
|
68
|
+
inactivityTimeRemaining: number;
|
|
69
|
+
isIdle: boolean;
|
|
70
|
+
timeRemaining: number;
|
|
71
|
+
showWarning: boolean;
|
|
72
|
+
isTracking: boolean;
|
|
73
|
+
|
|
74
|
+
// Inactivity methods
|
|
75
|
+
resetActivity: () => void;
|
|
76
|
+
startTracking: () => void;
|
|
77
|
+
stopTracking: () => void;
|
|
78
|
+
handleIdleLogout: () => Promise<void>;
|
|
79
|
+
handleStaySignedIn: () => void;
|
|
80
|
+
handleSignOutNow: () => Promise<void>;
|
|
81
|
+
|
|
82
|
+
// Additional properties
|
|
83
|
+
appName: string;
|
|
84
|
+
appConfig: { requires_event: boolean } | null;
|
|
85
|
+
isLoading: boolean;
|
|
86
|
+
hasErrors: boolean;
|
|
87
|
+
sessionRestorationTimedOut: boolean;
|
|
34
88
|
}
|
|
35
89
|
```
|
|
36
90
|
|
|
@@ -43,18 +97,22 @@ function App() {
|
|
|
43
97
|
const {
|
|
44
98
|
user,
|
|
45
99
|
session,
|
|
46
|
-
|
|
47
|
-
|
|
100
|
+
isLoading,
|
|
101
|
+
authError,
|
|
48
102
|
signIn,
|
|
49
103
|
signOut,
|
|
104
|
+
selectedOrganisation,
|
|
105
|
+
organisations,
|
|
50
106
|
events,
|
|
51
107
|
selectedEvent,
|
|
52
108
|
setSelectedEvent,
|
|
53
|
-
|
|
109
|
+
showWarning,
|
|
110
|
+
handleStaySignedIn,
|
|
111
|
+
handleSignOutNow,
|
|
54
112
|
} = useUnifiedAuth();
|
|
55
113
|
|
|
56
|
-
if (
|
|
57
|
-
if (
|
|
114
|
+
if (isLoading) return <div>Loading...</div>;
|
|
115
|
+
if (authError) return <div>Error: {authError.message}</div>;
|
|
58
116
|
|
|
59
117
|
return (
|
|
60
118
|
<div>
|
|
@@ -504,6 +562,78 @@ function Dropdown() {
|
|
|
504
562
|
|
|
505
563
|
## Performance Hooks
|
|
506
564
|
|
|
565
|
+
### usePerformanceMonitor
|
|
566
|
+
|
|
567
|
+
Monitor overall application performance metrics.
|
|
568
|
+
|
|
569
|
+
```typescript
|
|
570
|
+
interface PerformanceData {
|
|
571
|
+
renderTime: number;
|
|
572
|
+
memoryUsage: number;
|
|
573
|
+
componentCount: number;
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
function usePerformanceMonitor(): PerformanceData;
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
#### Usage
|
|
580
|
+
|
|
581
|
+
```tsx
|
|
582
|
+
import { usePerformanceMonitor } from '@jmruthers/pace-core';
|
|
583
|
+
|
|
584
|
+
function PerformanceDashboard() {
|
|
585
|
+
const metrics = usePerformanceMonitor();
|
|
586
|
+
|
|
587
|
+
return (
|
|
588
|
+
<div>
|
|
589
|
+
<p>Render time: {metrics.renderTime}ms</p>
|
|
590
|
+
<p>Memory usage: {metrics.memoryUsage}MB</p>
|
|
591
|
+
<p>Components: {metrics.componentCount}</p>
|
|
592
|
+
</div>
|
|
593
|
+
);
|
|
594
|
+
}
|
|
595
|
+
```
|
|
596
|
+
|
|
597
|
+
### useOperationPerformance
|
|
598
|
+
|
|
599
|
+
Monitor performance of specific operations with budget tracking.
|
|
600
|
+
|
|
601
|
+
```typescript
|
|
602
|
+
function useOperationPerformance(
|
|
603
|
+
operationName: string,
|
|
604
|
+
budgetName?: string
|
|
605
|
+
): {
|
|
606
|
+
start: () => void;
|
|
607
|
+
end: () => void;
|
|
608
|
+
duration: number;
|
|
609
|
+
isOverBudget: boolean;
|
|
610
|
+
};
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
#### Usage
|
|
614
|
+
|
|
615
|
+
```tsx
|
|
616
|
+
import { useOperationPerformance } from '@jmruthers/pace-core';
|
|
617
|
+
|
|
618
|
+
function ExpensiveOperation() {
|
|
619
|
+
const { start, end, duration, isOverBudget } = useOperationPerformance(
|
|
620
|
+
'data-processing',
|
|
621
|
+
'data-processing-budget'
|
|
622
|
+
);
|
|
623
|
+
|
|
624
|
+
const handleProcess = async () => {
|
|
625
|
+
start();
|
|
626
|
+
await processData();
|
|
627
|
+
end();
|
|
628
|
+
|
|
629
|
+
if (isOverBudget) {
|
|
630
|
+
console.warn('Operation exceeded budget');
|
|
631
|
+
}
|
|
632
|
+
};
|
|
633
|
+
|
|
634
|
+
return <button onClick={handleProcess}>Process</button>;
|
|
635
|
+
}
|
|
636
|
+
```
|
|
507
637
|
|
|
508
638
|
## Hook Composition
|
|
509
639
|
|
|
@@ -1290,4 +1420,4 @@ All hooks include comprehensive testing:
|
|
|
1290
1420
|
- **Performance Tests**: Memory leak detection
|
|
1291
1421
|
- **Type Safety**: TypeScript validation
|
|
1292
1422
|
|
|
1293
|
-
For more information about testing hooks, see the [Testing Guide](../
|
|
1423
|
+
For more information about testing hooks, see the [Testing Guide](../testing/README.md).
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
lastUpdated: 2025-
|
|
3
|
-
version: 0.5.
|
|
4
|
-
reviewedBy:
|
|
2
|
+
lastUpdated: 2025-11-18T20:00:00+11:00
|
|
3
|
+
version: 0.5.181
|
|
4
|
+
reviewedBy: documentation-standards-audit
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Providers API Reference
|
|
@@ -21,7 +21,7 @@ interface UnifiedAuthProviderProps {
|
|
|
21
21
|
children: React.ReactNode;
|
|
22
22
|
persistState?: boolean;
|
|
23
23
|
requireOrganisationContext?: boolean;
|
|
24
|
-
|
|
24
|
+
// Note: RBAC is always enabled - no prop needed
|
|
25
25
|
onAuthStateChange?: (event: AuthChangeEvent, session: Session | null) => void;
|
|
26
26
|
|
|
27
27
|
// Inactivity auto-logout configuration - MANDATORY for security
|
|
@@ -56,7 +56,6 @@ function App() {
|
|
|
56
56
|
<UnifiedAuthProvider
|
|
57
57
|
supabaseClient={supabase}
|
|
58
58
|
appName="my-app"
|
|
59
|
-
enableRBAC={true}
|
|
60
59
|
requireOrganisationContext={true}
|
|
61
60
|
idleTimeoutMs={30 * 60 * 1000} // Required: 30 minutes
|
|
62
61
|
warnBeforeMs={5 * 60 * 1000} // Required: 5 minutes warning
|
|
@@ -76,7 +75,7 @@ function App() {
|
|
|
76
75
|
| `appName` | `string` | Required | Name of your application |
|
|
77
76
|
| `persistState` | `boolean` | `true` | Persist auth state across sessions |
|
|
78
77
|
| `requireOrganisationContext` | `boolean` | `true` | Require organisation context for security |
|
|
79
|
-
|
|
|
78
|
+
| RBAC | Always enabled | - | RBAC is always enabled, no configuration needed |
|
|
80
79
|
| `onAuthStateChange` | `function` | `undefined` | Callback for auth state changes |
|
|
81
80
|
| `idleTimeoutMs` | `number` | **Required** | Inactivity timeout in milliseconds (e.g., `30 * 60 * 1000` for 30 minutes) |
|
|
82
81
|
| `warnBeforeMs` | `number` | **Required** | Warning time before logout in milliseconds (e.g., `5 * 60 * 1000` for 5 minutes) |
|
|
@@ -572,6 +571,62 @@ Use context splitting when possible to prevent unnecessary re-renders.
|
|
|
572
571
|
|
|
573
572
|
Only pass required props to avoid unnecessary re-renders and complexity.
|
|
574
573
|
|
|
574
|
+
## ♿ Accessibility
|
|
575
|
+
|
|
576
|
+
Providers support accessibility:
|
|
577
|
+
|
|
578
|
+
- **Keyboard navigation** - All provider-managed components support keyboard navigation
|
|
579
|
+
- **Screen reader support** - Providers ensure proper ARIA attributes and roles
|
|
580
|
+
- **Focus management** - Providers handle focus management correctly
|
|
581
|
+
- **Error announcements** - Error states are properly announced to screen readers
|
|
582
|
+
- **Loading states** - Loading indicators are accessible and announced
|
|
583
|
+
|
|
584
|
+
### Accessibility Best Practices
|
|
585
|
+
|
|
586
|
+
1. **Test provider composition** - Verify accessibility works with provider hierarchy
|
|
587
|
+
2. **Check focus management** - Ensure focus is properly managed during state changes
|
|
588
|
+
3. **Test with screen readers** - Verify provider-managed content works with assistive technologies
|
|
589
|
+
4. **Verify ARIA attributes** - Ensure providers set appropriate ARIA attributes
|
|
590
|
+
5. **Test keyboard navigation** - Verify all provider-managed interactions are keyboard accessible
|
|
591
|
+
|
|
592
|
+
## ⚠️ Edge Cases
|
|
593
|
+
|
|
594
|
+
### Provider Initialization Failures
|
|
595
|
+
|
|
596
|
+
When providers fail to initialize:
|
|
597
|
+
- Verify all required props are provided
|
|
598
|
+
- Check Supabase client is properly configured
|
|
599
|
+
- Review provider dependencies and order
|
|
600
|
+
- Test with minimal configuration
|
|
601
|
+
- Verify environment variables are set correctly
|
|
602
|
+
|
|
603
|
+
### Context Not Available
|
|
604
|
+
|
|
605
|
+
When provider context is not available:
|
|
606
|
+
- Verify provider is properly mounted in component tree
|
|
607
|
+
- Check provider order (UnifiedAuthProvider → OrganisationProvider → EventProvider)
|
|
608
|
+
- Review component hierarchy for missing providers
|
|
609
|
+
- Test with provider composition examples
|
|
610
|
+
- Verify hooks are called within provider context
|
|
611
|
+
|
|
612
|
+
### State Synchronization Issues
|
|
613
|
+
|
|
614
|
+
When provider state is out of sync:
|
|
615
|
+
- Check for multiple provider instances
|
|
616
|
+
- Verify provider state updates correctly
|
|
617
|
+
- Review state management logic
|
|
618
|
+
- Test with rapid state changes
|
|
619
|
+
- Check for race conditions in state updates
|
|
620
|
+
|
|
621
|
+
### Inactivity Tracking Edge Cases
|
|
622
|
+
|
|
623
|
+
When inactivity tracking fails:
|
|
624
|
+
- Verify mandatory props (idleTimeoutMs, warnBeforeMs, onIdleLogout) are provided
|
|
625
|
+
- Check localStorage is available and working
|
|
626
|
+
- Review cross-tab synchronization
|
|
627
|
+
- Test with different browser environments
|
|
628
|
+
- Verify inactivity events are properly monitored
|
|
629
|
+
|
|
575
630
|
## What's Next?
|
|
576
631
|
|
|
577
632
|
- **[Components](./components.md)** - All UI components
|
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
---
|
|
2
|
+
lastUpdated: 2025-11-18T12:00:00+11:00
|
|
3
|
+
version: 0.5.181
|
|
4
|
+
reviewedBy: documentation-standards-audit
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# RPC Functions API Reference
|
|
8
|
+
|
|
9
|
+
This document provides an overview of RPC (Remote Procedure Call) functions in `pace-core` and how to use them. RPC functions follow strict naming conventions and security standards as defined in the [API & RPC Standard](../standards/02-api-and-rpc-standard.md).
|
|
10
|
+
|
|
11
|
+
## Overview
|
|
12
|
+
|
|
13
|
+
RPC functions are PostgreSQL functions that provide a secure, standardized way to interact with the database. They enforce Row Level Security (RLS), validate organisation context, and return consistent result shapes.
|
|
14
|
+
|
|
15
|
+
## Naming Convention
|
|
16
|
+
|
|
17
|
+
All RPC functions follow the `<family>_<domain>_<verb>` pattern:
|
|
18
|
+
|
|
19
|
+
- **`data_*`** prefix for read operations (e.g., `data_file_reference_list`, `data_user_organisations_get`)
|
|
20
|
+
- **`app_*`** prefix for write operations (e.g., `app_cake_dish_create`, `app_file_reference_create`)
|
|
21
|
+
- **`rbac_*`** prefix for RBAC operations (exception to standard pattern, e.g., `rbac_permission_check`, `rbac_role_grant`)
|
|
22
|
+
- **`util_*`** prefix for utility functions (e.g., `util_app_resolve`)
|
|
23
|
+
- **CRUD verbs**: `create`, `read`, `get`, `list`, `update`, `delete`
|
|
24
|
+
- **Bulk operations**: Use `_bulk` suffix (e.g., `app_cake_dish_create_bulk`)
|
|
25
|
+
|
|
26
|
+
**Note**: The `rbac_*` prefix is an exception to the standard `data_*`/`app_*` pattern. RBAC functions use their own prefix for clarity and consistency within the RBAC system.
|
|
27
|
+
|
|
28
|
+
### Examples
|
|
29
|
+
|
|
30
|
+
```sql
|
|
31
|
+
-- Read operations (data_*)
|
|
32
|
+
data_file_reference_list(...)
|
|
33
|
+
data_file_reference_get(...)
|
|
34
|
+
data_cake_dishes_list(...)
|
|
35
|
+
data_event_list(...)
|
|
36
|
+
|
|
37
|
+
-- Write operations (app_*)
|
|
38
|
+
app_cake_dish_create(...)
|
|
39
|
+
app_file_reference_create(...)
|
|
40
|
+
app_cake_dish_update(...)
|
|
41
|
+
app_cake_dish_delete(...)
|
|
42
|
+
|
|
43
|
+
-- Bulk operations
|
|
44
|
+
app_cake_dish_create_bulk(...)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Result Shape
|
|
48
|
+
|
|
49
|
+
RPC functions conceptually follow the `ApiResult<T>` shape as defined in the [API & RPC Standard](../standards/02-api-and-rpc-standard.md), but are wrapped by Supabase's client into the standard `{ data, error }` format:
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
// Conceptual ApiResult shape (from standard)
|
|
53
|
+
type ApiResult<T> =
|
|
54
|
+
| { ok: true; data: T }
|
|
55
|
+
| { ok: false; error: ApiError };
|
|
56
|
+
|
|
57
|
+
type ApiError = {
|
|
58
|
+
code: string;
|
|
59
|
+
message: string;
|
|
60
|
+
details?: object;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
// Actual Supabase RPC response format
|
|
64
|
+
type SupabaseRPCResponse<T> = {
|
|
65
|
+
data: T | null;
|
|
66
|
+
error: PostgrestError | null;
|
|
67
|
+
};
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Note**: Supabase RPCs return data directly (as TABLE or scalar types), and the Supabase client wraps them in `{ data, error }` format. Error handling should check the `error` field rather than expecting an `ApiResult` wrapper.
|
|
71
|
+
|
|
72
|
+
### Usage Example
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
import { supabase } from './supabaseClient';
|
|
76
|
+
|
|
77
|
+
// Call RPC function
|
|
78
|
+
const { data, error } = await supabase.rpc('data_file_reference_list', {
|
|
79
|
+
p_table_name: 'pace_person',
|
|
80
|
+
p_record_id: personId,
|
|
81
|
+
p_organisation_id: orgId
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
if (error) {
|
|
85
|
+
// Handle error - Supabase wraps errors in the error field
|
|
86
|
+
console.error('RPC error:', error.message, error.code);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Use data - data is null if error occurred
|
|
91
|
+
if (data) {
|
|
92
|
+
const fileReferences = data;
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## RPC Rules
|
|
97
|
+
|
|
98
|
+
As per the [API & RPC Standard](../standards/02-api-and-rpc-standard.md):
|
|
99
|
+
|
|
100
|
+
1. **Read RPCs never mutate** - `data_*` functions are read-only
|
|
101
|
+
2. **Write RPCs should be idempotent** - `app_*` functions can be safely retried
|
|
102
|
+
3. **Never accept dynamic SQL** - All queries are parameterized
|
|
103
|
+
4. **Must enforce RLS + tenant boundaries** - Organisation context is always validated
|
|
104
|
+
5. **Errors must be user-safe** - No sensitive information in error messages
|
|
105
|
+
|
|
106
|
+
## Core RPC Functions
|
|
107
|
+
|
|
108
|
+
### File Reference System
|
|
109
|
+
|
|
110
|
+
Documented in [File Reference System Guide](../implementation-guides/file-reference-system.md):
|
|
111
|
+
|
|
112
|
+
**Note**: File reference RPCs use `data_*` prefix for all operations (including create/delete) as an exception to the standard naming pattern. This maintains consistency within the file reference system.
|
|
113
|
+
|
|
114
|
+
**Read Operations:**
|
|
115
|
+
- `data_file_reference_get` - Get a file reference by ID
|
|
116
|
+
- `data_file_reference_list` - List file references for a record
|
|
117
|
+
- `data_file_reference_url_get` - Get public URL for a file
|
|
118
|
+
- `data_file_reference_signed_url_get` - Get signed URL path for private files
|
|
119
|
+
- `data_file_reference_by_category_list` - List files by category
|
|
120
|
+
- `data_file_reference_count_get` - Get count of file references for a record
|
|
121
|
+
|
|
122
|
+
**Write Operations (exception to naming standard):**
|
|
123
|
+
- `data_file_reference_create` - Create a file reference (uses `data_*` prefix for consistency within file reference system)
|
|
124
|
+
- `data_file_reference_delete` - Delete a file reference (uses `data_*` prefix for consistency within file reference system)
|
|
125
|
+
|
|
126
|
+
### RBAC System
|
|
127
|
+
|
|
128
|
+
Documented in [RBAC API Reference](../rbac/api-reference.md):
|
|
129
|
+
|
|
130
|
+
**Permission Checking:**
|
|
131
|
+
- `rbac_permission_check` - Check if user has a specific permission
|
|
132
|
+
- `rbac_permissions_get` - Get all permissions for current user in a scope
|
|
133
|
+
- `rbac_access_validate` - Validate user access to a resource
|
|
134
|
+
- `rbac_page_access_check` - Check page-level access permissions
|
|
135
|
+
|
|
136
|
+
**Role Management:**
|
|
137
|
+
- `rbac_role_grant` - Grant a role to a user
|
|
138
|
+
- `rbac_role_revoke` - Revoke a role from a user
|
|
139
|
+
- `rbac_roles_list` - List available roles
|
|
140
|
+
- `rbac_role_validate` - Validate role configuration
|
|
141
|
+
|
|
142
|
+
**Session & Audit:**
|
|
143
|
+
- `rbac_session_track` - Track user session activity
|
|
144
|
+
- `rbac_audit_log` - Log RBAC-related actions
|
|
145
|
+
|
|
146
|
+
**Data Access (RBAC-protected):**
|
|
147
|
+
- `data_user_organisations_get` - Get all organisations for a user
|
|
148
|
+
- `data_user_organisation_roles_get` - Get user roles in organisations
|
|
149
|
+
- `data_user_events_get` - Get events accessible to a user
|
|
150
|
+
- `data_cake_meals_get` - Get cake meals for an event (application-specific, RBAC-protected)
|
|
151
|
+
|
|
152
|
+
**Additional RBAC Functions:**
|
|
153
|
+
- `rbac_check_permission_simplified` - Simplified permission check (event-scoped)
|
|
154
|
+
- `rbac_check_distribution_or_page_permission` - Check distribution or page permissions
|
|
155
|
+
|
|
156
|
+
**Utility:**
|
|
157
|
+
- `util_app_resolve` - Resolve app ID from app name
|
|
158
|
+
- `util_get_cake_app_id` - Get CAKE app ID (application-specific utility)
|
|
159
|
+
- `debug_auth_context` - Debug authentication context (development only)
|
|
160
|
+
- `handle_new_user` - Handle new user registration (triggered automatically)
|
|
161
|
+
|
|
162
|
+
### Event System
|
|
163
|
+
|
|
164
|
+
- `data_user_events_get` - Get events accessible to a user (replaces deprecated `get_pace_user_events`)
|
|
165
|
+
- `get_public_event_by_code` - Get public event by code (public access, exception to naming pattern)
|
|
166
|
+
- `data_event_list` - List events (if implemented)
|
|
167
|
+
- `app_event_create` - Create an event (if implemented)
|
|
168
|
+
|
|
169
|
+
**Note**: `get_public_event_by_code` is a legacy function that doesn't follow the standard naming pattern. It's maintained for backward compatibility with public pages.
|
|
170
|
+
|
|
171
|
+
## Application-Specific RPCs
|
|
172
|
+
|
|
173
|
+
Each application may define its own RPC functions following the naming convention. Common patterns include:
|
|
174
|
+
|
|
175
|
+
### Cake Application Example
|
|
176
|
+
|
|
177
|
+
```sql
|
|
178
|
+
-- Read operations
|
|
179
|
+
data_cake_dishes_list(p_organisation_id UUID, p_event_id UUID)
|
|
180
|
+
data_cake_diner_get(p_diner_id UUID, p_organisation_id UUID)
|
|
181
|
+
data_cake_diners_list(p_organisation_id UUID, p_event_id UUID)
|
|
182
|
+
|
|
183
|
+
-- Write operations
|
|
184
|
+
app_cake_dish_create(p_organisation_id UUID, p_event_id UUID, p_data JSONB)
|
|
185
|
+
app_cake_dish_update(p_dish_id UUID, p_organisation_id UUID, p_data JSONB)
|
|
186
|
+
app_cake_dish_delete(p_dish_id UUID, p_organisation_id UUID)
|
|
187
|
+
|
|
188
|
+
-- Bulk operations
|
|
189
|
+
app_cake_dish_create_bulk(p_organisation_id UUID, p_event_id UUID, p_data JSONB[])
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## Finding RPC Functions
|
|
193
|
+
|
|
194
|
+
### In Supabase Dashboard
|
|
195
|
+
|
|
196
|
+
1. Navigate to **Database** → **Functions**
|
|
197
|
+
2. Filter by prefix (`data_`, `app_`, `rbac_`, or `util_`)
|
|
198
|
+
3. Review function signatures and documentation
|
|
199
|
+
|
|
200
|
+
### In Migration Files
|
|
201
|
+
|
|
202
|
+
RPC functions are defined in Supabase migration files:
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
supabase/migrations/YYYYMMDDHHMMSS_description.sql
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
Search for `CREATE OR REPLACE FUNCTION` statements:
|
|
209
|
+
|
|
210
|
+
```sql
|
|
211
|
+
CREATE OR REPLACE FUNCTION data_file_reference_list(
|
|
212
|
+
p_table_name TEXT,
|
|
213
|
+
p_record_id TEXT,
|
|
214
|
+
p_organisation_id UUID
|
|
215
|
+
)
|
|
216
|
+
RETURNS TABLE(...)
|
|
217
|
+
LANGUAGE plpgsql
|
|
218
|
+
SECURITY DEFINER
|
|
219
|
+
SET search_path = public
|
|
220
|
+
AS $$
|
|
221
|
+
BEGIN
|
|
222
|
+
-- Function implementation
|
|
223
|
+
END;
|
|
224
|
+
$$;
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
## Security Considerations
|
|
228
|
+
|
|
229
|
+
### Organisation Context
|
|
230
|
+
|
|
231
|
+
All RPC functions validate organisation context:
|
|
232
|
+
|
|
233
|
+
```sql
|
|
234
|
+
-- Functions check organisation membership
|
|
235
|
+
IF NOT EXISTS (
|
|
236
|
+
SELECT 1 FROM user_organisation_memberships
|
|
237
|
+
WHERE user_id = auth.uid()
|
|
238
|
+
AND organisation_id = p_organisation_id
|
|
239
|
+
) THEN
|
|
240
|
+
RAISE EXCEPTION 'Access denied';
|
|
241
|
+
END IF;
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### RLS Enforcement
|
|
245
|
+
|
|
246
|
+
RPC functions run with `SECURITY DEFINER` but still respect RLS policies:
|
|
247
|
+
|
|
248
|
+
- Functions validate organisation membership
|
|
249
|
+
- Functions check user permissions
|
|
250
|
+
- Direct table access is protected by RLS
|
|
251
|
+
|
|
252
|
+
### Error Handling
|
|
253
|
+
|
|
254
|
+
RPC functions return user-safe errors:
|
|
255
|
+
|
|
256
|
+
```sql
|
|
257
|
+
BEGIN
|
|
258
|
+
-- Validation
|
|
259
|
+
IF p_organisation_id IS NULL THEN
|
|
260
|
+
RAISE EXCEPTION 'Organisation ID is required';
|
|
261
|
+
END IF;
|
|
262
|
+
|
|
263
|
+
-- Business logic
|
|
264
|
+
-- ...
|
|
265
|
+
|
|
266
|
+
EXCEPTION
|
|
267
|
+
WHEN OTHERS THEN
|
|
268
|
+
RAISE EXCEPTION 'Operation failed: %', SQLERRM;
|
|
269
|
+
END;
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
## Best Practices
|
|
273
|
+
|
|
274
|
+
### 1. Always Pass Organisation Context
|
|
275
|
+
|
|
276
|
+
```typescript
|
|
277
|
+
// ✅ Good
|
|
278
|
+
const { data, error } = await supabase.rpc('data_file_reference_list', {
|
|
279
|
+
p_table_name: 'pace_person',
|
|
280
|
+
p_record_id: personId,
|
|
281
|
+
p_organisation_id: currentOrganisationId // Always include
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
if (error) {
|
|
285
|
+
console.error('Failed to list file references:', error);
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// Use data
|
|
290
|
+
const fileReferences = data;
|
|
291
|
+
|
|
292
|
+
// ❌ Bad - Missing organisation context
|
|
293
|
+
const { data, error } = await supabase.rpc('data_file_reference_list', {
|
|
294
|
+
p_table_name: 'pace_person',
|
|
295
|
+
p_record_id: personId
|
|
296
|
+
// Missing p_organisation_id - will fail RLS validation
|
|
297
|
+
});
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### 2. Handle Errors Properly
|
|
301
|
+
|
|
302
|
+
```typescript
|
|
303
|
+
const { data, error } = await supabase.rpc('app_cake_dish_create', {
|
|
304
|
+
p_organisation_id: orgId,
|
|
305
|
+
p_event_id: eventId,
|
|
306
|
+
p_data: dishData
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
if (error) {
|
|
310
|
+
// Check error code
|
|
311
|
+
if (error.code === 'PGRST301' || error.message?.includes('Access denied')) {
|
|
312
|
+
// Handle permission error
|
|
313
|
+
toast.error('You do not have permission to create dishes');
|
|
314
|
+
} else {
|
|
315
|
+
// Handle other errors
|
|
316
|
+
toast.error('Failed to create dish');
|
|
317
|
+
}
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// Use data
|
|
322
|
+
const newDish = data;
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
### 3. Use TypeScript Types
|
|
326
|
+
|
|
327
|
+
```typescript
|
|
328
|
+
// Define RPC result types
|
|
329
|
+
type FileReferenceListResult = {
|
|
330
|
+
id: string;
|
|
331
|
+
table_name: string;
|
|
332
|
+
record_id: string;
|
|
333
|
+
file_path: string;
|
|
334
|
+
// ... other fields
|
|
335
|
+
}[];
|
|
336
|
+
|
|
337
|
+
const { data, error } = await supabase.rpc<FileReferenceListResult>(
|
|
338
|
+
'data_file_reference_list',
|
|
339
|
+
{
|
|
340
|
+
p_table_name: 'pace_person',
|
|
341
|
+
p_record_id: personId,
|
|
342
|
+
p_organisation_id: orgId
|
|
343
|
+
}
|
|
344
|
+
);
|
|
345
|
+
|
|
346
|
+
if (error) {
|
|
347
|
+
console.error('RPC error:', error);
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
// TypeScript now knows the shape of data
|
|
352
|
+
if (data) {
|
|
353
|
+
data.forEach(ref => {
|
|
354
|
+
console.log(ref.file_path); // Type-safe access
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
### 4. Prefer RPCs Over Direct Queries
|
|
360
|
+
|
|
361
|
+
```typescript
|
|
362
|
+
// ✅ Good - Use RPC function with proper error handling
|
|
363
|
+
const { data, error } = await supabase.rpc('data_file_reference_list', {
|
|
364
|
+
p_table_name: 'pace_person',
|
|
365
|
+
p_record_id: personId,
|
|
366
|
+
p_organisation_id: orgId
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
if (error) {
|
|
370
|
+
console.error('Failed to list file references:', error);
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
// Use data - RPC enforces RLS and organisation context
|
|
375
|
+
const fileReferences = data;
|
|
376
|
+
|
|
377
|
+
// ❌ Bad - Direct query bypasses RLS validation and organisation checks
|
|
378
|
+
const { data, error } = await supabase
|
|
379
|
+
.from('file_references')
|
|
380
|
+
.select('*')
|
|
381
|
+
.eq('table_name', 'pace_person')
|
|
382
|
+
.eq('record_id', personId);
|
|
383
|
+
// Missing organisation context validation
|
|
384
|
+
// May expose data from other organisations
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
## Deprecated RPCs
|
|
388
|
+
|
|
389
|
+
See [Deprecated APIs](./deprecated.md) for RPC functions that are deprecated and their migration paths.
|
|
390
|
+
|
|
391
|
+
## Related Documentation
|
|
392
|
+
|
|
393
|
+
- [API & RPC Standard](../standards/02-api-and-rpc-standard.md) - Complete RPC standards
|
|
394
|
+
- [File Reference System](../implementation-guides/file-reference-system.md) - File reference RPCs
|
|
395
|
+
- [RBAC API Reference](../rbac/api-reference.md) - RBAC RPC functions
|
|
396
|
+
- [Database Schema Requirements](../architecture/database-schema-requirements.md) - Required RPC functions
|
|
397
|
+
|