@jmruthers/pace-core 0.5.189 → 0.5.190
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/core-usage-manifest.json +0 -4
- package/dist/{AuthService-B-cd2MA4.d.ts → AuthService-CbP_utw2.d.ts} +7 -3
- package/dist/{DataTable-GUFUNZ3N.js → DataTable-ON3IXISJ.js} +8 -8
- package/dist/{PublicPageProvider-B8HaLe69.d.ts → PublicPageProvider-C4uxosp6.d.ts} +83 -24
- package/dist/{UnifiedAuthProvider-BG0AL5eE.d.ts → UnifiedAuthProvider-BYA9qB-o.d.ts} +4 -3
- package/dist/{UnifiedAuthProvider-643PUAIM.js → UnifiedAuthProvider-X5NXANVI.js} +4 -2
- package/dist/{api-YP7XD5L6.js → api-I6UCQ5S6.js} +4 -2
- package/dist/{chunk-DDM4CCYT.js → chunk-4QYC5L4K.js} +60 -35
- package/dist/chunk-4QYC5L4K.js.map +1 -0
- package/dist/{chunk-IM4QE42D.js → chunk-73HSNNOQ.js} +141 -326
- package/dist/chunk-73HSNNOQ.js.map +1 -0
- package/dist/{chunk-YHCN776L.js → chunk-DZWK57KZ.js} +2 -75
- package/dist/chunk-DZWK57KZ.js.map +1 -0
- package/dist/{chunk-3GOZZZYH.js → chunk-HQVPB5MZ.js} +238 -301
- package/dist/chunk-HQVPB5MZ.js.map +1 -0
- package/dist/{chunk-THRPYOFK.js → chunk-HW3OVDUF.js} +5 -5
- package/dist/chunk-HW3OVDUF.js.map +1 -0
- package/dist/{chunk-F2IMUDXZ.js → chunk-I7PSE6JW.js} +75 -2
- package/dist/chunk-I7PSE6JW.js.map +1 -0
- package/dist/{chunk-VGZZXKBR.js → chunk-J2XXC7R5.js} +280 -52
- package/dist/chunk-J2XXC7R5.js.map +1 -0
- package/dist/{chunk-UCQSRW7Z.js → chunk-NIU6J6OX.js} +425 -378
- package/dist/chunk-NIU6J6OX.js.map +1 -0
- package/dist/{chunk-HESYZWZW.js → chunk-QWWZ5CAQ.js} +2 -2
- package/dist/{chunk-HEHYGYOX.js → chunk-RUYZKXOD.js} +401 -46
- package/dist/chunk-RUYZKXOD.js.map +1 -0
- package/dist/{chunk-2UUZZJFT.js → chunk-SDMHPX3X.js} +176 -160
- package/dist/{chunk-2UUZZJFT.js.map → chunk-SDMHPX3X.js.map} +1 -1
- package/dist/{chunk-MX64ZF6I.js → chunk-STYK4OH2.js} +11 -11
- package/dist/chunk-STYK4OH2.js.map +1 -0
- package/dist/{chunk-YGPFYGA6.js → chunk-VVBAW5A5.js} +822 -498
- package/dist/chunk-VVBAW5A5.js.map +1 -0
- package/dist/chunk-Y4BUBBHD.js +614 -0
- package/dist/chunk-Y4BUBBHD.js.map +1 -0
- package/dist/{chunk-SAUPYVLF.js → chunk-ZSAAAMVR.js} +1 -1
- package/dist/chunk-ZSAAAMVR.js.map +1 -0
- package/dist/components.d.ts +3 -4
- package/dist/components.js +19 -19
- package/dist/components.js.map +1 -1
- package/dist/eslint-rules/pace-core-compliance.cjs +0 -2
- package/dist/{file-reference-D037xOFK.d.ts → file-reference-BavO2eQj.d.ts} +13 -10
- package/dist/hooks.d.ts +10 -5
- package/dist/hooks.js +14 -8
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +13 -11
- package/dist/index.js +79 -69
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +3 -3
- package/dist/providers.js +3 -1
- package/dist/rbac/index.d.ts +76 -12
- package/dist/rbac/index.js +12 -9
- package/dist/types.d.ts +1 -1
- package/dist/types.js +1 -1
- package/dist/{usePublicRouteParams-CTDELQ7H.d.ts → usePublicRouteParams-DxIDS4bC.d.ts} +16 -9
- package/dist/utils.js +16 -16
- package/docs/README.md +2 -2
- package/docs/api/classes/ColumnFactory.md +1 -1
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/InvalidScopeError.md +2 -2
- package/docs/api/classes/Logger.md +1 -1
- package/docs/api/classes/MissingUserContextError.md +2 -2
- package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
- package/docs/api/classes/PermissionDeniedError.md +1 -1
- package/docs/api/classes/RBACAuditManager.md +1 -1
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +4 -4
- package/docs/api/classes/RBACError.md +1 -1
- package/docs/api/classes/RBACNotInitializedError.md +2 -2
- package/docs/api/classes/SecureSupabaseClient.md +21 -16
- package/docs/api/classes/StorageUtils.md +7 -4
- package/docs/api/enums/FileCategory.md +1 -1
- package/docs/api/enums/LogLevel.md +1 -1
- package/docs/api/enums/RBACErrorCode.md +1 -1
- package/docs/api/enums/RPCFunction.md +1 -1
- package/docs/api/interfaces/AddressFieldProps.md +1 -1
- package/docs/api/interfaces/AddressFieldRef.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +1 -1
- package/docs/api/interfaces/AutocompleteOptions.md +1 -1
- package/docs/api/interfaces/AvatarProps.md +1 -1
- package/docs/api/interfaces/BadgeProps.md +1 -1
- package/docs/api/interfaces/ButtonProps.md +1 -1
- package/docs/api/interfaces/CalendarProps.md +20 -6
- package/docs/api/interfaces/CardProps.md +1 -1
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +1 -1
- package/docs/api/interfaces/ComplianceResult.md +1 -1
- package/docs/api/interfaces/DataAccessRecord.md +9 -9
- package/docs/api/interfaces/DataRecord.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +1 -1
- package/docs/api/interfaces/DataTableColumn.md +1 -1
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
- package/docs/api/interfaces/DatabaseComplianceResult.md +1 -1
- package/docs/api/interfaces/DatabaseIssue.md +1 -1
- 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 +1 -1
- package/docs/api/interfaces/ExportOptions.md +1 -1
- package/docs/api/interfaces/FileDisplayProps.md +62 -16
- package/docs/api/interfaces/FileMetadata.md +1 -1
- package/docs/api/interfaces/FileReference.md +2 -2
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadOptions.md +26 -12
- package/docs/api/interfaces/FileUploadProps.md +30 -19
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/FormFieldProps.md +1 -1
- package/docs/api/interfaces/FormProps.md +1 -1
- package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
- package/docs/api/interfaces/InputProps.md +1 -1
- package/docs/api/interfaces/LabelProps.md +1 -1
- package/docs/api/interfaces/LoggerConfig.md +1 -1
- package/docs/api/interfaces/LoginFormProps.md +1 -1
- package/docs/api/interfaces/NavigationAccessRecord.md +10 -10
- package/docs/api/interfaces/NavigationContextType.md +9 -9
- package/docs/api/interfaces/NavigationGuardProps.md +1 -1
- package/docs/api/interfaces/NavigationItem.md +1 -1
- package/docs/api/interfaces/NavigationMenuProps.md +1 -1
- package/docs/api/interfaces/NavigationProviderProps.md +7 -7
- package/docs/api/interfaces/Organisation.md +1 -1
- package/docs/api/interfaces/OrganisationContextType.md +1 -1
- package/docs/api/interfaces/OrganisationMembership.md +1 -1
- package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
- package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
- package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
- package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
- package/docs/api/interfaces/PageAccessRecord.md +8 -8
- package/docs/api/interfaces/PagePermissionContextType.md +8 -8
- package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
- package/docs/api/interfaces/PagePermissionProviderProps.md +7 -7
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/ParsedAddress.md +1 -1
- package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
- package/docs/api/interfaces/ProgressProps.md +3 -11
- package/docs/api/interfaces/ProtectedRouteProps.md +1 -1
- package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
- package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
- package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
- package/docs/api/interfaces/QuickFix.md +1 -1
- package/docs/api/interfaces/RBACAccessValidateParams.md +1 -1
- package/docs/api/interfaces/RBACAccessValidateResult.md +1 -1
- package/docs/api/interfaces/RBACAuditLogParams.md +1 -1
- package/docs/api/interfaces/RBACAuditLogResult.md +1 -1
- package/docs/api/interfaces/RBACConfig.md +1 -1
- package/docs/api/interfaces/RBACContext.md +1 -1
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RBACPageAccessCheckParams.md +1 -1
- package/docs/api/interfaces/RBACPerformanceMetrics.md +1 -1
- package/docs/api/interfaces/RBACPermissionCheckParams.md +1 -1
- package/docs/api/interfaces/RBACPermissionCheckResult.md +1 -1
- package/docs/api/interfaces/RBACPermissionsGetParams.md +1 -1
- package/docs/api/interfaces/RBACPermissionsGetResult.md +1 -1
- package/docs/api/interfaces/RBACResult.md +1 -1
- package/docs/api/interfaces/RBACRoleGrantParams.md +1 -1
- package/docs/api/interfaces/RBACRoleGrantResult.md +1 -1
- package/docs/api/interfaces/RBACRoleRevokeParams.md +1 -1
- package/docs/api/interfaces/RBACRoleRevokeResult.md +1 -1
- package/docs/api/interfaces/RBACRoleValidateParams.md +1 -1
- package/docs/api/interfaces/RBACRoleValidateResult.md +1 -1
- package/docs/api/interfaces/RBACRolesListParams.md +1 -1
- package/docs/api/interfaces/RBACRolesListResult.md +1 -1
- package/docs/api/interfaces/RBACSessionTrackParams.md +1 -1
- package/docs/api/interfaces/RBACSessionTrackResult.md +1 -1
- package/docs/api/interfaces/ResourcePermissions.md +1 -1
- package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterContextType.md +8 -8
- package/docs/api/interfaces/RoleBasedRouterProps.md +10 -10
- package/docs/api/interfaces/RoleManagementResult.md +1 -1
- package/docs/api/interfaces/RouteAccessRecord.md +10 -10
- package/docs/api/interfaces/RouteConfig.md +10 -10
- package/docs/api/interfaces/RuntimeComplianceResult.md +1 -1
- package/docs/api/interfaces/SecureDataContextType.md +9 -9
- package/docs/api/interfaces/SecureDataProviderProps.md +8 -8
- package/docs/api/interfaces/SessionRestorationLoaderProps.md +1 -1
- package/docs/api/interfaces/SetupIssue.md +1 -1
- package/docs/api/interfaces/StorageConfig.md +4 -4
- package/docs/api/interfaces/StorageFileInfo.md +7 -7
- package/docs/api/interfaces/StorageFileMetadata.md +25 -14
- package/docs/api/interfaces/StorageListOptions.md +22 -9
- package/docs/api/interfaces/StorageListResult.md +4 -4
- package/docs/api/interfaces/StorageUploadOptions.md +21 -8
- package/docs/api/interfaces/StorageUploadResult.md +6 -6
- package/docs/api/interfaces/StorageUrlOptions.md +19 -6
- 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 +1 -1
- package/docs/api/interfaces/TextareaProps.md +1 -1
- package/docs/api/interfaces/ToastActionElement.md +1 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +53 -53
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
- package/docs/api/interfaces/UseFormDialogOptions.md +1 -1
- package/docs/api/interfaces/UseFormDialogReturn.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
- package/docs/api/interfaces/UsePublicFileDisplayOptions.md +1 -1
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeOptions.md +4 -4
- package/docs/api/interfaces/UseResolvedScopeReturn.md +4 -4
- package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
- package/docs/api/interfaces/UserEventAccess.md +11 -11
- package/docs/api/interfaces/UserMenuProps.md +1 -1
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +151 -92
- package/docs/api-reference/components.md +15 -7
- package/docs/api-reference/providers.md +2 -2
- package/docs/api-reference/rpc-functions.md +1 -0
- package/docs/best-practices/README.md +1 -1
- package/docs/best-practices/deployment.md +8 -8
- package/docs/getting-started/examples/README.md +2 -2
- package/docs/getting-started/installation-guide.md +4 -4
- package/docs/getting-started/quick-start.md +3 -3
- package/docs/migration/MIGRATION_GUIDE.md +3 -3
- package/docs/rbac/compliance/compliance-guide.md +2 -2
- package/docs/rbac/event-based-apps.md +2 -2
- package/docs/rbac/getting-started.md +2 -2
- package/docs/rbac/quick-start.md +2 -2
- package/docs/security/README.md +4 -4
- package/docs/standards/07-rbac-and-rls-standard.md +430 -7
- package/docs/troubleshooting/README.md +2 -2
- package/docs/troubleshooting/migration.md +3 -3
- package/package.json +1 -3
- package/scripts/check-pace-core-compliance.cjs +1 -1
- package/scripts/check-pace-core-compliance.js +1 -1
- package/src/__tests__/fixtures/supabase.ts +301 -0
- package/src/__tests__/public-recipe-view.test.ts +9 -9
- package/src/__tests__/rls-policies.test.ts +197 -61
- package/src/components/AddressField/AddressField.test.tsx +42 -0
- package/src/components/AddressField/AddressField.tsx +71 -60
- package/src/components/AddressField/README.md +1 -0
- package/src/components/Alert/Alert.test.tsx +50 -10
- package/src/components/Alert/Alert.tsx +5 -3
- package/src/components/Avatar/Avatar.test.tsx +95 -43
- package/src/components/Avatar/Avatar.tsx +16 -16
- package/src/components/Button/Button.test.tsx +2 -1
- package/src/components/Button/Button.tsx +3 -3
- package/src/components/Calendar/Calendar.test.tsx +53 -37
- package/src/components/Calendar/Calendar.tsx +409 -82
- package/src/components/Card/Card.test.tsx +7 -4
- package/src/components/Card/Card.tsx +3 -6
- package/src/components/Checkbox/Checkbox.tsx +2 -2
- package/src/components/DataTable/components/ActionButtons.tsx +5 -5
- package/src/components/DataTable/components/BulkOperationsDropdown.tsx +2 -2
- package/src/components/DataTable/components/ColumnFilter.tsx +1 -1
- package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +3 -3
- package/src/components/DataTable/components/DataTableBody.tsx +12 -12
- package/src/components/DataTable/components/DataTableCore.tsx +3 -3
- package/src/components/DataTable/components/DataTableToolbar.tsx +5 -5
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +3 -3
- package/src/components/DataTable/components/EditableRow.tsx +2 -2
- package/src/components/DataTable/components/EmptyState.tsx +3 -3
- package/src/components/DataTable/components/GroupHeader.tsx +2 -2
- package/src/components/DataTable/components/GroupingDropdown.tsx +1 -1
- package/src/components/DataTable/components/ImportModal.tsx +4 -4
- package/src/components/DataTable/components/LoadingState.tsx +1 -1
- package/src/components/DataTable/components/PaginationControls.tsx +11 -11
- package/src/components/DataTable/components/UnifiedTableBody.tsx +9 -9
- package/src/components/DataTable/components/ViewRowModal.tsx +2 -2
- package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +11 -37
- package/src/components/DataTable/components/__tests__/DataTableToolbar.test.tsx +157 -0
- package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +2 -1
- package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +128 -0
- package/src/components/DataTable/core/__tests__/ActionManager.test.ts +19 -0
- package/src/components/DataTable/core/__tests__/ColumnFactory.test.ts +51 -0
- package/src/components/DataTable/core/__tests__/ColumnManager.test.ts +84 -0
- package/src/components/DataTable/core/__tests__/DataManager.test.ts +14 -0
- package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +136 -0
- package/src/components/DataTable/core/__tests__/LocalDataAdapter.test.ts +16 -0
- package/src/components/DataTable/core/__tests__/PluginRegistry.test.ts +18 -0
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +28 -7
- package/src/components/DataTable/utils/__tests__/hierarchicalUtils.test.ts +30 -1
- package/src/components/DataTable/utils/hierarchicalUtils.ts +38 -10
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +8 -3
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +4 -4
- package/src/components/Dialog/Dialog.tsx +2 -2
- package/src/components/EventSelector/EventSelector.tsx +7 -7
- package/src/components/FileDisplay/FileDisplay.tsx +291 -179
- package/src/components/FileUpload/FileUpload.tsx +7 -4
- package/src/components/Header/Header.test.tsx +28 -0
- package/src/components/Header/Header.tsx +22 -9
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +2 -2
- package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +19 -14
- package/src/components/LoadingSpinner/LoadingSpinner.tsx +5 -5
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +127 -1
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +8 -8
- package/src/components/PaceAppLayout/PaceAppLayout.integration.test.tsx +4 -0
- package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +3 -0
- package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +3 -0
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +16 -6
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +37 -3
- package/src/components/PaceAppLayout/test-setup.tsx +1 -0
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +66 -45
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +6 -4
- package/src/components/Progress/Progress.test.tsx +18 -19
- package/src/components/Progress/Progress.tsx +31 -32
- package/src/components/PublicLayout/PublicLayout.test.tsx +6 -6
- package/src/components/PublicLayout/PublicPageProvider.tsx +5 -3
- package/src/components/Select/Select.tsx +5 -5
- package/src/components/Switch/Switch.test.tsx +2 -1
- package/src/components/Switch/Switch.tsx +1 -1
- package/src/components/Toast/Toast.tsx +1 -1
- package/src/components/Tooltip/Tooltip.test.tsx +8 -2
- package/src/components/UserMenu/UserMenu.tsx +3 -3
- package/src/eslint-rules/pace-core-compliance.cjs +0 -2
- package/src/eslint-rules/pace-core-compliance.js +0 -2
- package/src/hooks/__tests__/hooks.integration.test.tsx +4 -1
- package/src/hooks/__tests__/useAppConfig.unit.test.ts +76 -5
- package/src/hooks/__tests__/useDataTableState.test.ts +76 -0
- package/src/hooks/__tests__/useFileUrl.unit.test.ts +25 -69
- package/src/hooks/__tests__/useFileUrlCache.test.ts +129 -0
- package/src/hooks/__tests__/usePreventTabReload.test.ts +88 -0
- package/src/hooks/__tests__/{usePublicEvent.unit.test.ts → usePublicEvent.test.ts} +28 -1
- package/src/hooks/__tests__/useQueryCache.test.ts +144 -0
- package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +58 -16
- package/src/hooks/index.ts +1 -1
- package/src/hooks/public/usePublicEvent.ts +2 -2
- package/src/hooks/public/usePublicFileDisplay.ts +173 -87
- package/src/hooks/useAppConfig.ts +24 -5
- package/src/hooks/useFileDisplay.ts +297 -34
- package/src/hooks/useFileReference.ts +56 -11
- package/src/hooks/useFileUrl.ts +1 -1
- package/src/hooks/useInactivityTracker.ts +16 -7
- package/src/hooks/usePermissionCache.test.ts +85 -8
- package/src/hooks/useQueryCache.ts +21 -0
- package/src/hooks/useSecureDataAccess.test.ts +80 -35
- package/src/hooks/useSecureDataAccess.ts +80 -37
- package/src/providers/services/EventServiceProvider.tsx +37 -17
- package/src/providers/services/InactivityServiceProvider.tsx +4 -4
- package/src/providers/services/OrganisationServiceProvider.tsx +8 -1
- package/src/providers/services/UnifiedAuthProvider.tsx +115 -29
- package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +451 -0
- package/src/rbac/__tests__/engine.comprehensive.test.ts +12 -0
- package/src/rbac/__tests__/rbac-engine-core-logic.test.ts +8 -0
- package/src/rbac/__tests__/rbac-engine-simplified.test.ts +4 -0
- package/src/rbac/api.ts +240 -36
- package/src/rbac/cache-invalidation.ts +21 -7
- package/src/rbac/compliance/quick-fix-suggestions.ts +1 -1
- package/src/rbac/components/NavigationGuard.tsx +23 -63
- package/src/rbac/components/NavigationProvider.test.tsx +52 -23
- package/src/rbac/components/NavigationProvider.tsx +13 -11
- package/src/rbac/components/PagePermissionGuard.tsx +77 -203
- package/src/rbac/components/PagePermissionProvider.tsx +13 -11
- package/src/rbac/components/PermissionEnforcer.tsx +24 -62
- package/src/rbac/components/RoleBasedRouter.tsx +14 -12
- package/src/rbac/components/SecureDataProvider.tsx +13 -11
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +104 -41
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +49 -12
- package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +22 -1
- package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +161 -82
- package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +22 -1
- package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +77 -30
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +39 -5
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +47 -4
- package/src/rbac/engine.ts +4 -2
- package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +144 -52
- package/src/rbac/hooks/index.ts +3 -0
- package/src/rbac/hooks/useCan.test.ts +101 -53
- package/src/rbac/hooks/usePermissions.ts +108 -41
- package/src/rbac/hooks/useRBAC.test.ts +11 -3
- package/src/rbac/hooks/useRBAC.ts +83 -40
- package/src/rbac/hooks/useResolvedScope.test.ts +189 -63
- package/src/rbac/hooks/useResolvedScope.ts +128 -70
- package/src/rbac/hooks/useSecureSupabase.ts +36 -19
- package/src/rbac/hooks/useSuperAdminBypass.ts +126 -0
- package/src/rbac/request-deduplication.ts +1 -1
- package/src/rbac/secureClient.ts +72 -12
- package/src/rbac/security.ts +29 -23
- package/src/rbac/types.ts +10 -0
- package/src/rbac/utils/__tests__/contextValidator.test.ts +150 -0
- package/src/rbac/utils/__tests__/deep-equal.test.ts +53 -0
- package/src/rbac/utils/__tests__/eventContext.test.ts +6 -1
- package/src/rbac/utils/contextValidator.ts +288 -0
- package/src/rbac/utils/eventContext.ts +48 -2
- package/src/services/EventService.ts +165 -21
- package/src/services/OrganisationService.ts +37 -2
- package/src/services/__tests__/EventService.test.ts +26 -21
- package/src/types/file-reference.ts +13 -10
- package/src/utils/app/appNameResolver.test.ts +346 -73
- package/src/utils/context/superAdminOverride.ts +58 -0
- package/src/utils/file-reference/index.ts +61 -33
- package/src/utils/google-places/googlePlacesUtils.test.ts +98 -0
- package/src/utils/google-places/loadGoogleMapsScript.test.ts +83 -0
- package/src/utils/storage/helpers.test.ts +1 -1
- package/src/utils/storage/helpers.ts +38 -19
- package/src/utils/storage/types.ts +15 -8
- package/src/utils/validation/__tests__/csrf.test.ts +105 -0
- package/src/utils/validation/__tests__/sqlInjectionProtection.test.ts +92 -0
- package/src/vite-env.d.ts +2 -2
- package/dist/chunk-3GOZZZYH.js.map +0 -1
- package/dist/chunk-DDM4CCYT.js.map +0 -1
- package/dist/chunk-E7UAOUMY.js +0 -75
- package/dist/chunk-E7UAOUMY.js.map +0 -1
- package/dist/chunk-F2IMUDXZ.js.map +0 -1
- package/dist/chunk-HEHYGYOX.js.map +0 -1
- package/dist/chunk-IM4QE42D.js.map +0 -1
- package/dist/chunk-MX64ZF6I.js.map +0 -1
- package/dist/chunk-SAUPYVLF.js.map +0 -1
- package/dist/chunk-THRPYOFK.js.map +0 -1
- package/dist/chunk-UCQSRW7Z.js.map +0 -1
- package/dist/chunk-VGZZXKBR.js.map +0 -1
- package/dist/chunk-YGPFYGA6.js.map +0 -1
- package/dist/chunk-YHCN776L.js.map +0 -1
- package/src/hooks/__tests__/usePermissionCache.simple.test.ts +0 -192
- package/src/hooks/__tests__/usePermissionCache.unit.test.ts +0 -741
- package/src/hooks/__tests__/usePublicEvent.simple.test.ts +0 -703
- package/src/rbac/hooks/useRBAC.simple.test.ts +0 -95
- package/src/rbac/utils/__tests__/eventContext.unit.test.ts +0 -428
- /package/dist/{DataTable-GUFUNZ3N.js.map → DataTable-ON3IXISJ.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-643PUAIM.js.map → UnifiedAuthProvider-X5NXANVI.js.map} +0 -0
- /package/dist/{api-YP7XD5L6.js.map → api-I6UCQ5S6.js.map} +0 -0
- /package/dist/{chunk-HESYZWZW.js.map → chunk-QWWZ5CAQ.js.map} +0 -0
package/core-usage-manifest.json
CHANGED
|
@@ -213,10 +213,6 @@
|
|
|
213
213
|
"module": "@radix-ui/react-label",
|
|
214
214
|
"reason": "Use Label component from pace-core instead"
|
|
215
215
|
},
|
|
216
|
-
{
|
|
217
|
-
"module": "@radix-ui/react-progress",
|
|
218
|
-
"reason": "Use Progress component from pace-core instead"
|
|
219
|
-
},
|
|
220
216
|
{
|
|
221
217
|
"module": "@radix-ui/react-slot",
|
|
222
218
|
"reason": "Use Button component from pace-core which handles slot composition"
|
|
@@ -103,6 +103,8 @@ declare class EventService extends BaseService implements IEventService {
|
|
|
103
103
|
private appName;
|
|
104
104
|
private selectedOrganisation;
|
|
105
105
|
private setSelectedEventId;
|
|
106
|
+
private isSuperAdmin;
|
|
107
|
+
private appConfig;
|
|
106
108
|
private isInitializedRef;
|
|
107
109
|
private isFetchingRef;
|
|
108
110
|
private hasAutoSelectedRef;
|
|
@@ -349,11 +351,13 @@ interface InactivityServiceProviderProps {
|
|
|
349
351
|
supabaseClient: SupabaseClient;
|
|
350
352
|
user: User | null;
|
|
351
353
|
session: Session | null;
|
|
352
|
-
idleTimeoutMs
|
|
353
|
-
warnBeforeMs
|
|
354
|
+
idleTimeoutMs: number;
|
|
355
|
+
warnBeforeMs: number;
|
|
354
356
|
onIdleLogout: (reason: 'inactivity') => void;
|
|
355
357
|
}
|
|
356
|
-
declare function InactivityServiceProvider({ children, supabaseClient, user, session, idleTimeoutMs,
|
|
358
|
+
declare function InactivityServiceProvider({ children, supabaseClient, user, session, idleTimeoutMs, // REQUIRED: No default - must be explicitly provided
|
|
359
|
+
warnBeforeMs, // REQUIRED: No default - must be explicitly provided
|
|
360
|
+
onIdleLogout }: InactivityServiceProviderProps): react_jsx_runtime.JSX.Element;
|
|
357
361
|
|
|
358
362
|
/**
|
|
359
363
|
* @file Authentication Service Interface
|
|
@@ -60,10 +60,8 @@ import {
|
|
|
60
60
|
sum,
|
|
61
61
|
validateHierarchicalData,
|
|
62
62
|
validatePaginationConfig
|
|
63
|
-
} from "./chunk-
|
|
64
|
-
import "./chunk-
|
|
65
|
-
import "./chunk-HEHYGYOX.js";
|
|
66
|
-
import "./chunk-63FOKYGO.js";
|
|
63
|
+
} from "./chunk-SDMHPX3X.js";
|
|
64
|
+
import "./chunk-HQVPB5MZ.js";
|
|
67
65
|
import {
|
|
68
66
|
CircuitBreaker,
|
|
69
67
|
DEFAULT_FALLBACK_CONFIG,
|
|
@@ -82,11 +80,13 @@ import {
|
|
|
82
80
|
throttle,
|
|
83
81
|
useDataTablePerformance
|
|
84
82
|
} from "./chunk-6C4YBBJM.js";
|
|
85
|
-
import "./chunk-
|
|
86
|
-
import "./chunk-
|
|
83
|
+
import "./chunk-Y4BUBBHD.js";
|
|
84
|
+
import "./chunk-J2XXC7R5.js";
|
|
85
|
+
import "./chunk-RUYZKXOD.js";
|
|
86
|
+
import "./chunk-63FOKYGO.js";
|
|
87
87
|
import "./chunk-QXHPKYJV.js";
|
|
88
88
|
import "./chunk-R77UEZ4E.js";
|
|
89
|
-
import "./chunk-
|
|
89
|
+
import "./chunk-I7PSE6JW.js";
|
|
90
90
|
import "./chunk-VBXEHIUJ.js";
|
|
91
91
|
import "./chunk-PWLANIRT.js";
|
|
92
92
|
import "./chunk-7D4SUZUM.js";
|
|
@@ -169,4 +169,4 @@ export {
|
|
|
169
169
|
validateHierarchicalData,
|
|
170
170
|
validatePaginationConfig
|
|
171
171
|
};
|
|
172
|
-
//# sourceMappingURL=DataTable-
|
|
172
|
+
//# sourceMappingURL=DataTable-ON3IXISJ.js.map
|
|
@@ -2,14 +2,13 @@ import * as React$1 from 'react';
|
|
|
2
2
|
import React__default, { Component, ReactNode } from 'react';
|
|
3
3
|
import { P as ParsedAddress, A as AutocompleteOptions } from './types-Bwgl--Xo.js';
|
|
4
4
|
import * as LabelPrimitive from '@radix-ui/react-label';
|
|
5
|
-
import { F as FileCategory, e as FileUploadResult, U as UploadProgress, c as FileUploadOptions, a as FileReference } from './file-reference-
|
|
5
|
+
import { F as FileCategory, e as FileUploadResult, U as UploadProgress, c as FileUploadOptions, a as FileReference } from './file-reference-BavO2eQj.js';
|
|
6
6
|
import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
|
|
7
7
|
import * as SwitchPrimitive from '@radix-ui/react-switch';
|
|
8
|
-
import * as ProgressPrimitive from '@radix-ui/react-progress';
|
|
9
8
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
10
9
|
import * as DialogPrimitive from '@radix-ui/react-dialog';
|
|
11
10
|
import * as TabsPrimitive from '@radix-ui/react-tabs';
|
|
12
|
-
import { DayPickerProps } from 'react-day-picker';
|
|
11
|
+
import { DayPickerProps, DateRange } from 'react-day-picker';
|
|
13
12
|
import * as ToastPrimitives from '@radix-ui/react-toast';
|
|
14
13
|
import * as TooltipPrimitive from '@radix-ui/react-tooltip';
|
|
15
14
|
import { FieldValues, DefaultValues, SubmitHandler, SubmitErrorHandler, UseFormReturn, FieldPath, ControllerRenderProps, ControllerFieldState, UseFormStateReturn } from 'react-hook-form';
|
|
@@ -296,8 +295,15 @@ interface AddressFieldRef {
|
|
|
296
295
|
* - Debounced input with caching
|
|
297
296
|
* - Keyboard navigation (Arrow keys, Enter, Escape)
|
|
298
297
|
* - Accessible ARIA attributes
|
|
298
|
+
* - Semantic HTML (description list for suggestions)
|
|
299
299
|
* - Loading and error states
|
|
300
300
|
* - place_id storage for later retrieval
|
|
301
|
+
*
|
|
302
|
+
* @accessibility
|
|
303
|
+
* - Uses semantic HTML: `<dl>`, `<dt>`, `<dd>` for address suggestions
|
|
304
|
+
* - Proper ARIA attributes for combobox pattern
|
|
305
|
+
* - Keyboard navigation support
|
|
306
|
+
* - Screen reader friendly
|
|
301
307
|
*/
|
|
302
308
|
|
|
303
309
|
/**
|
|
@@ -532,6 +538,7 @@ declare const Textarea: React$1.ForwardRefExoticComponent<TextareaProps & React$
|
|
|
532
538
|
* Features:
|
|
533
539
|
* - Multiple visual variants (default, destructive, inline)
|
|
534
540
|
* - Title and description support
|
|
541
|
+
* - Semantic HTML: renders as `<aside>` element
|
|
535
542
|
* - ARIA role="alert" for accessibility
|
|
536
543
|
* - Keyboard and screen reader accessible
|
|
537
544
|
* - Composable with icons and actions
|
|
@@ -562,14 +569,15 @@ declare const Textarea: React$1.ForwardRefExoticComponent<TextareaProps & React$
|
|
|
562
569
|
* ```
|
|
563
570
|
*
|
|
564
571
|
* @accessibility
|
|
572
|
+
* - Uses semantic HTML: `<aside>` element for better semantic meaning
|
|
565
573
|
* - Uses role="alert" for screen reader announcement
|
|
566
574
|
* - Title and description are semantically structured
|
|
567
575
|
* - Supports keyboard navigation and focus
|
|
568
576
|
*/
|
|
569
577
|
|
|
570
|
-
declare const Alert: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<
|
|
578
|
+
declare const Alert: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLElement> & {
|
|
571
579
|
variant?: "default" | "destructive" | "inline";
|
|
572
|
-
} & React$1.RefAttributes<
|
|
580
|
+
} & React$1.RefAttributes<HTMLElement>>;
|
|
573
581
|
declare const AlertTitle: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLHeadingElement> & React$1.RefAttributes<HTMLHeadingElement>>;
|
|
574
582
|
declare const AlertDescription: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLParagraphElement> & React$1.RefAttributes<HTMLParagraphElement>>;
|
|
575
583
|
|
|
@@ -862,16 +870,16 @@ declare const Switch: React$1.ForwardRefExoticComponent<SwitchProps & React$1.Re
|
|
|
862
870
|
* @module Components/Progress
|
|
863
871
|
* @since 0.1.0
|
|
864
872
|
*
|
|
865
|
-
* An accessible progress bar component built on
|
|
873
|
+
* An accessible progress bar component built on the native HTML `<progress>` element.
|
|
866
874
|
* Provides smooth animations and proper ARIA attributes for screen readers.
|
|
867
875
|
*
|
|
868
876
|
* Features:
|
|
869
877
|
* - Smooth progress animations
|
|
870
878
|
* - Customizable value and max range
|
|
871
|
-
* -
|
|
879
|
+
* - Native accessibility support (role="progressbar" automatically applied)
|
|
872
880
|
* - Customizable styling and appearance
|
|
873
881
|
* - Responsive design
|
|
874
|
-
* -
|
|
882
|
+
* - Indeterminate state support
|
|
875
883
|
*
|
|
876
884
|
* @example
|
|
877
885
|
* ```tsx
|
|
@@ -898,22 +906,23 @@ declare const Switch: React$1.ForwardRefExoticComponent<SwitchProps & React$1.Re
|
|
|
898
906
|
* }, []);
|
|
899
907
|
*
|
|
900
908
|
* <Progress value={progress} />
|
|
909
|
+
*
|
|
910
|
+
* // Indeterminate progress (no value)
|
|
911
|
+
* <Progress />
|
|
901
912
|
* ```
|
|
902
913
|
*
|
|
903
914
|
* @accessibility
|
|
904
915
|
* - WCAG 2.1 AA compliant
|
|
905
|
-
* -
|
|
916
|
+
* - Native `<progress>` element provides role="progressbar" automatically
|
|
906
917
|
* - Screen reader announcements for progress changes
|
|
907
|
-
* - Keyboard navigation support
|
|
908
918
|
* - High contrast support
|
|
909
919
|
*
|
|
910
920
|
* @performance
|
|
911
921
|
* - CSS transitions for smooth animations
|
|
912
922
|
* - Efficient re-rendering
|
|
913
|
-
* - Minimal DOM structure
|
|
923
|
+
* - Minimal DOM structure (native HTML element)
|
|
914
924
|
*
|
|
915
925
|
* @dependencies
|
|
916
|
-
* - @radix-ui/react-progress - Core progress functionality
|
|
917
926
|
* - React 18+ - Hooks and refs
|
|
918
927
|
* - Tailwind CSS - Styling
|
|
919
928
|
*/
|
|
@@ -921,15 +930,15 @@ declare const Switch: React$1.ForwardRefExoticComponent<SwitchProps & React$1.Re
|
|
|
921
930
|
/**
|
|
922
931
|
* Props for the Progress component
|
|
923
932
|
*/
|
|
924
|
-
interface ProgressProps extends React$1.
|
|
925
|
-
/** Current progress value (0 to max) */
|
|
933
|
+
interface ProgressProps extends React$1.HTMLAttributes<HTMLProgressElement> {
|
|
934
|
+
/** Current progress value (0 to max). Omit for indeterminate state. */
|
|
926
935
|
value?: number;
|
|
927
936
|
/** Maximum progress value (default: 100) */
|
|
928
937
|
max?: number;
|
|
929
938
|
}
|
|
930
939
|
/**
|
|
931
940
|
* Progress component
|
|
932
|
-
* An accessible progress bar with smooth animations
|
|
941
|
+
* An accessible progress bar with smooth animations using native HTML `<progress>` element
|
|
933
942
|
*
|
|
934
943
|
* @param props - Progress configuration and styling
|
|
935
944
|
* @param ref - Forwarded ref to the progress element
|
|
@@ -940,7 +949,7 @@ interface ProgressProps extends React$1.ComponentPropsWithoutRef<typeof Progress
|
|
|
940
949
|
* <Progress value={75} max={100} />
|
|
941
950
|
* ```
|
|
942
951
|
*/
|
|
943
|
-
declare const Progress: React$1.ForwardRefExoticComponent<ProgressProps & React$1.RefAttributes<
|
|
952
|
+
declare const Progress: React$1.ForwardRefExoticComponent<ProgressProps & React$1.RefAttributes<HTMLProgressElement>>;
|
|
944
953
|
|
|
945
954
|
/**
|
|
946
955
|
* Dialog size variants
|
|
@@ -1359,7 +1368,7 @@ declare const TabsContent: React$1.ForwardRefExoticComponent<TabsContentProps &
|
|
|
1359
1368
|
* Features:
|
|
1360
1369
|
* - Single, range, and multiple date selection modes
|
|
1361
1370
|
* - Date disabling (past dates, weekends, etc.)
|
|
1362
|
-
* - Localization support
|
|
1371
|
+
* - Localization support (defaults to Australian locale with Monday as first day of week)
|
|
1363
1372
|
* - Keyboard navigation
|
|
1364
1373
|
* - Accessible date selection
|
|
1365
1374
|
* - Customizable styling
|
|
@@ -1406,13 +1415,18 @@ declare const TabsContent: React$1.ForwardRefExoticComponent<TabsContentProps &
|
|
|
1406
1415
|
|
|
1407
1416
|
interface CalendarProps extends Omit<DayPickerProps, 'className' | 'classNames' | 'styles' | 'onSelect'> {
|
|
1408
1417
|
/**
|
|
1409
|
-
* Additional CSS classes to apply to the calendar
|
|
1418
|
+
* Additional CSS classes to apply to the calendar table
|
|
1410
1419
|
*/
|
|
1411
1420
|
className?: string;
|
|
1412
1421
|
/**
|
|
1413
1422
|
* Custom classNames for DayPicker sub-components
|
|
1414
1423
|
*/
|
|
1415
1424
|
classNames?: DayPickerProps['classNames'];
|
|
1425
|
+
/**
|
|
1426
|
+
* Currently selected value; mirrors DayPicker's `selected` prop so callers
|
|
1427
|
+
* can control the selection state.
|
|
1428
|
+
*/
|
|
1429
|
+
selected?: Date | Date[] | DateRange | undefined;
|
|
1416
1430
|
/**
|
|
1417
1431
|
* Date selection handler. Signature depends on mode:
|
|
1418
1432
|
* - mode="single": (date: Date | undefined) => void
|
|
@@ -1429,13 +1443,22 @@ interface CalendarProps extends Omit<DayPickerProps, 'className' | 'classNames'
|
|
|
1429
1443
|
* A flexible, accessible calendar component for date selection.
|
|
1430
1444
|
* Built on react-day-picker with pace-core styling.
|
|
1431
1445
|
*
|
|
1446
|
+
* Defaults to Australian locale (en-AU) with Monday as the first day of the week.
|
|
1447
|
+
* The locale can be overridden by passing a `locale` prop.
|
|
1448
|
+
*
|
|
1449
|
+
* Month navigation is automatically managed internally when `month` and `onMonthChange` props
|
|
1450
|
+
* are not provided. The displayed month will sync with the selected date when available,
|
|
1451
|
+
* or default to the current month. Navigation buttons (prev/next) work automatically.
|
|
1452
|
+
*
|
|
1453
|
+
* For controlled month state, pass `month` and `onMonthChange` props.
|
|
1454
|
+
*
|
|
1432
1455
|
* @param props - Calendar configuration and styling
|
|
1433
1456
|
* @param ref - Forwarded ref (not used directly, but maintained for API consistency)
|
|
1434
1457
|
* @returns JSX.Element - The rendered calendar element
|
|
1435
1458
|
*
|
|
1436
1459
|
* @example
|
|
1437
1460
|
* ```tsx
|
|
1438
|
-
* // Single date selection
|
|
1461
|
+
* // Single date selection (uses default Australian locale)
|
|
1439
1462
|
* <Calendar
|
|
1440
1463
|
* mode="single"
|
|
1441
1464
|
* selected={date}
|
|
@@ -1449,9 +1472,28 @@ interface CalendarProps extends Omit<DayPickerProps, 'className' | 'classNames'
|
|
|
1449
1472
|
* onSelect={setDate}
|
|
1450
1473
|
* disabled={(date) => date < new Date()}
|
|
1451
1474
|
* />
|
|
1475
|
+
*
|
|
1476
|
+
* // Override locale (e.g., US locale with Sunday as first day)
|
|
1477
|
+
* import { enUS } from 'date-fns/locale';
|
|
1478
|
+
* <Calendar
|
|
1479
|
+
* mode="single"
|
|
1480
|
+
* selected={date}
|
|
1481
|
+
* onSelect={setDate}
|
|
1482
|
+
* locale={enUS}
|
|
1483
|
+
* />
|
|
1484
|
+
*
|
|
1485
|
+
* // Controlled month state (optional - month is auto-managed if not provided)
|
|
1486
|
+
* const [month, setMonth] = useState(new Date());
|
|
1487
|
+
* <Calendar
|
|
1488
|
+
* mode="single"
|
|
1489
|
+
* selected={date}
|
|
1490
|
+
* onSelect={setDate}
|
|
1491
|
+
* month={month}
|
|
1492
|
+
* onMonthChange={setMonth}
|
|
1493
|
+
* />
|
|
1452
1494
|
* ```
|
|
1453
1495
|
*/
|
|
1454
|
-
declare const Calendar: React$1.ForwardRefExoticComponent<CalendarProps & React$1.RefAttributes<
|
|
1496
|
+
declare const Calendar: React$1.ForwardRefExoticComponent<CalendarProps & React$1.RefAttributes<HTMLTableElement>>;
|
|
1455
1497
|
|
|
1456
1498
|
declare const ToastProvider: React$1.FC<ToastPrimitives.ToastProviderProps>;
|
|
1457
1499
|
/**
|
|
@@ -3625,7 +3667,8 @@ interface FileUploadProps {
|
|
|
3625
3667
|
supabase: SupabaseClient;
|
|
3626
3668
|
table_name: string;
|
|
3627
3669
|
record_id: string;
|
|
3628
|
-
organisation_id
|
|
3670
|
+
organisation_id?: string | null;
|
|
3671
|
+
userId?: string;
|
|
3629
3672
|
app_id?: string;
|
|
3630
3673
|
category: FileCategory;
|
|
3631
3674
|
folder: string;
|
|
@@ -3644,13 +3687,19 @@ interface FileUploadProps {
|
|
|
3644
3687
|
onProgress?: (progress: UploadProgress) => void;
|
|
3645
3688
|
children?: React__default.ReactNode;
|
|
3646
3689
|
}
|
|
3647
|
-
declare function FileUpload({ supabase, table_name, record_id, organisation_id, app_id, category, folder, pageContext, event_id, accept, maxSize, // 10MB default
|
|
3690
|
+
declare function FileUpload({ supabase, table_name, record_id, organisation_id, userId, app_id, category, folder, pageContext, event_id, accept, maxSize, // 10MB default
|
|
3648
3691
|
multiple, disabled, isPublic, className, showPreview, showProgress, onUploadSuccess, onUploadError, onProgress, children }: FileUploadProps): react_jsx_runtime.JSX.Element;
|
|
3649
3692
|
|
|
3650
3693
|
interface FileDisplayProps {
|
|
3651
3694
|
table_name: string;
|
|
3652
3695
|
record_id: string;
|
|
3653
|
-
|
|
3696
|
+
/**
|
|
3697
|
+
* Optional organisation ID. When not provided (undefined), the component will automatically
|
|
3698
|
+
* search for files in both user-scoped (organisation_id = null) and organisation-scoped contexts.
|
|
3699
|
+
* If both types of files exist, organisation-scoped files are preferred.
|
|
3700
|
+
* When explicitly set to null, only user-scoped files are searched.
|
|
3701
|
+
*/
|
|
3702
|
+
organisation_id?: string;
|
|
3654
3703
|
category?: FileCategory;
|
|
3655
3704
|
/** Display only a single file instead of all files. Uses first file (prefers images) from all files, without category filtering */
|
|
3656
3705
|
displayOnly?: boolean;
|
|
@@ -3670,8 +3719,18 @@ interface FileDisplayProps {
|
|
|
3670
3719
|
generateFallbackText?: (fileName?: string) => string;
|
|
3671
3720
|
/** Explicit fallback text to display (overrides generateFallbackText) */
|
|
3672
3721
|
fallbackText?: string;
|
|
3722
|
+
/** Source text to use for generating fallback text (overrides filename) */
|
|
3723
|
+
fallbackSourceText?: string;
|
|
3673
3724
|
/** Size variant for fallback display (only applies when showFallback is true) */
|
|
3674
3725
|
fallbackSize?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';
|
|
3726
|
+
/**
|
|
3727
|
+
* Enable children rendering in displayOnly mode. When true, uses standard display path
|
|
3728
|
+
* (with children support) even if showDelete is false. The delete button will only appear
|
|
3729
|
+
* if showDelete is also true.
|
|
3730
|
+
*/
|
|
3731
|
+
enableChildren?: boolean;
|
|
3732
|
+
/** Whether to show metadata (filename, filesize, mimetype) in figcaption. Defaults to true. */
|
|
3733
|
+
showMetadata?: boolean;
|
|
3675
3734
|
}
|
|
3676
3735
|
/**
|
|
3677
3736
|
* Component for displaying file references with context-awareness
|
|
@@ -3691,7 +3750,7 @@ interface FileDisplayProps {
|
|
|
3691
3750
|
* @param props.category - Optional category filter. When specified, only displays files matching this category and uses single file display variant.
|
|
3692
3751
|
* @returns React element with file display
|
|
3693
3752
|
*/
|
|
3694
|
-
declare function FileDisplay({ table_name, record_id, organisation_id, category, displayOnly, showDelete, className, children, loadingComponent, errorComponent, showFallback, generateFallbackText, fallbackText, fallbackSize }: FileDisplayProps): react_jsx_runtime.JSX.Element;
|
|
3753
|
+
declare function FileDisplay({ table_name, record_id, organisation_id, category, displayOnly, showDelete, className, children, loadingComponent, errorComponent, showFallback, generateFallbackText, fallbackText, fallbackSourceText, fallbackSize, enableChildren, showMetadata }: FileDisplayProps): react_jsx_runtime.JSX.Element;
|
|
3695
3754
|
|
|
3696
3755
|
declare function useFileReference(supabase: SupabaseClient): {
|
|
3697
3756
|
isLoading: boolean;
|
|
@@ -107,8 +107,9 @@ interface UnifiedAuthProviderProps {
|
|
|
107
107
|
dangerouslyDisableInactivity?: boolean;
|
|
108
108
|
}
|
|
109
109
|
declare function UnifiedAuthProvider({ children, supabaseClient, appName, appConfig, // Default to requiring events
|
|
110
|
-
persistState, enablePersistence, requireOrganisationContext, idleTimeoutMs, //
|
|
111
|
-
warnBeforeMs, //
|
|
112
|
-
onIdleLogout,
|
|
110
|
+
persistState, enablePersistence, requireOrganisationContext, idleTimeoutMs, // REQUIRED: No default - must be explicitly provided
|
|
111
|
+
warnBeforeMs, // REQUIRED: No default - must be explicitly provided
|
|
112
|
+
onIdleLogout, // REQUIRED: No default - must be explicitly provided
|
|
113
|
+
renderInactivityWarning, dangerouslyDisableInactivity }: UnifiedAuthProviderProps): react_jsx_runtime.JSX.Element;
|
|
113
114
|
|
|
114
115
|
export { type UserEventAccess as U, type UnifiedAuthContextType as a, UnifiedAuthContext as b, type UnifiedAuthProviderProps as c, UnifiedAuthProvider as d, useUnifiedAuth as u };
|
|
@@ -2,7 +2,9 @@ import {
|
|
|
2
2
|
UnifiedAuthContext,
|
|
3
3
|
UnifiedAuthProvider,
|
|
4
4
|
useUnifiedAuth
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-J2XXC7R5.js";
|
|
6
|
+
import "./chunk-RUYZKXOD.js";
|
|
7
|
+
import "./chunk-63FOKYGO.js";
|
|
6
8
|
import "./chunk-QXHPKYJV.js";
|
|
7
9
|
import "./chunk-VBXEHIUJ.js";
|
|
8
10
|
import "./chunk-PWLANIRT.js";
|
|
@@ -12,4 +14,4 @@ export {
|
|
|
12
14
|
UnifiedAuthProvider,
|
|
13
15
|
useUnifiedAuth
|
|
14
16
|
};
|
|
15
|
-
//# sourceMappingURL=UnifiedAuthProvider-
|
|
17
|
+
//# sourceMappingURL=UnifiedAuthProvider-X5NXANVI.js.map
|
|
@@ -3,6 +3,7 @@ import {
|
|
|
3
3
|
clearCache,
|
|
4
4
|
getAccessLevel,
|
|
5
5
|
getAppConfig,
|
|
6
|
+
getAppConfigByName,
|
|
6
7
|
getAppConfigWithClient,
|
|
7
8
|
getPermissionMap,
|
|
8
9
|
getRoleContext,
|
|
@@ -20,7 +21,7 @@ import {
|
|
|
20
21
|
isSuperAdmin,
|
|
21
22
|
resolveAppContext,
|
|
22
23
|
setupRBAC
|
|
23
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-RUYZKXOD.js";
|
|
24
25
|
import "./chunk-63FOKYGO.js";
|
|
25
26
|
import "./chunk-PWLANIRT.js";
|
|
26
27
|
import "./chunk-7D4SUZUM.js";
|
|
@@ -29,6 +30,7 @@ export {
|
|
|
29
30
|
clearCache,
|
|
30
31
|
getAccessLevel,
|
|
31
32
|
getAppConfig,
|
|
33
|
+
getAppConfigByName,
|
|
32
34
|
getAppConfigWithClient,
|
|
33
35
|
getPermissionMap,
|
|
34
36
|
getRoleContext,
|
|
@@ -47,4 +49,4 @@ export {
|
|
|
47
49
|
resolveAppContext,
|
|
48
50
|
setupRBAC
|
|
49
51
|
};
|
|
50
|
-
//# sourceMappingURL=api-
|
|
52
|
+
//# sourceMappingURL=api-I6UCQ5S6.js.map
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
useResolvedScope,
|
|
3
|
+
useSuperAdminBypass
|
|
4
|
+
} from "./chunk-Y4BUBBHD.js";
|
|
4
5
|
import {
|
|
5
6
|
EventServiceContext,
|
|
6
7
|
useUnifiedAuth
|
|
7
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-J2XXC7R5.js";
|
|
8
9
|
import {
|
|
9
10
|
setOrganisationContext
|
|
10
11
|
} from "./chunk-VBXEHIUJ.js";
|
|
@@ -15,10 +16,16 @@ import {
|
|
|
15
16
|
// src/hooks/useSecureDataAccess.ts
|
|
16
17
|
import { useCallback, useState, useContext } from "react";
|
|
17
18
|
function useSecureDataAccess() {
|
|
18
|
-
const { supabase, user, session } = useUnifiedAuth();
|
|
19
|
-
const { ensureOrganisationContext } = useOrganisations();
|
|
19
|
+
const { supabase, user, session, selectedOrganisation, selectedEvent } = useUnifiedAuth();
|
|
20
20
|
const eventServiceContext = useContext(EventServiceContext);
|
|
21
|
-
const
|
|
21
|
+
const eventFromContext = eventServiceContext?.eventService?.getSelectedEvent() || null;
|
|
22
|
+
const effectiveSelectedEvent = selectedEvent || eventFromContext;
|
|
23
|
+
const { isSuperAdmin } = useSuperAdminBypass();
|
|
24
|
+
const { resolvedScope } = useResolvedScope({
|
|
25
|
+
supabase,
|
|
26
|
+
selectedOrganisationId: selectedOrganisation?.id || null,
|
|
27
|
+
selectedEventId: effectiveSelectedEvent?.event_id || null
|
|
28
|
+
});
|
|
22
29
|
const validateContext = useCallback(() => {
|
|
23
30
|
if (!supabase) {
|
|
24
31
|
throw new Error("No Supabase client available");
|
|
@@ -26,26 +33,30 @@ function useSecureDataAccess() {
|
|
|
26
33
|
if (!user || !session) {
|
|
27
34
|
throw new Error("User must be authenticated with valid session");
|
|
28
35
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
}
|
|
36
|
+
if (isSuperAdmin) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (!resolvedScope?.organisationId) {
|
|
32
40
|
throw new Error("Organisation context is required for data access");
|
|
33
41
|
}
|
|
34
|
-
}, [supabase, user, session,
|
|
42
|
+
}, [supabase, user, session, resolvedScope, isSuperAdmin]);
|
|
35
43
|
const getCurrentOrganisationId = useCallback(() => {
|
|
44
|
+
if (isSuperAdmin) {
|
|
45
|
+
return resolvedScope?.organisationId || selectedOrganisation?.id || "";
|
|
46
|
+
}
|
|
36
47
|
validateContext();
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}, [validateContext, ensureOrganisationContext]);
|
|
48
|
+
return resolvedScope?.organisationId || "";
|
|
49
|
+
}, [validateContext, resolvedScope, selectedOrganisation, isSuperAdmin]);
|
|
40
50
|
const setOrganisationContextInSession = useCallback(async (organisationId) => {
|
|
41
|
-
if (!supabase) {
|
|
42
|
-
|
|
51
|
+
if (!supabase || !organisationId) {
|
|
52
|
+
return;
|
|
43
53
|
}
|
|
44
54
|
await setOrganisationContext(supabase, organisationId);
|
|
45
55
|
}, [supabase]);
|
|
46
56
|
const secureQuery = useCallback(async (table, columns, filters = {}, options = {}) => {
|
|
47
57
|
validateContext();
|
|
48
|
-
const
|
|
58
|
+
const bypassOrganisationFilter = isSuperAdmin;
|
|
59
|
+
const organisationId = bypassOrganisationFilter ? void 0 : getCurrentOrganisationId();
|
|
49
60
|
await setOrganisationContextInSession(organisationId);
|
|
50
61
|
let query = supabase.from(table).select(columns);
|
|
51
62
|
const tablesWithOrganisation = [
|
|
@@ -98,10 +109,15 @@ function useSecureDataAccess() {
|
|
|
98
109
|
"cake_unit",
|
|
99
110
|
"event_app_access",
|
|
100
111
|
"base_application",
|
|
101
|
-
"base_questions"
|
|
112
|
+
"base_questions",
|
|
113
|
+
// rbac_user_profiles has organisation_id but uses conditional filtering
|
|
114
|
+
"rbac_user_profiles"
|
|
102
115
|
];
|
|
103
|
-
if (tablesWithOrganisation.includes(table)) {
|
|
104
|
-
|
|
116
|
+
if (!bypassOrganisationFilter && organisationId && tablesWithOrganisation.includes(table)) {
|
|
117
|
+
if (table === "rbac_user_profiles" && isSuperAdmin) {
|
|
118
|
+
} else {
|
|
119
|
+
query = query.eq("organisation_id", organisationId);
|
|
120
|
+
}
|
|
105
121
|
}
|
|
106
122
|
Object.entries(filters).forEach(([key, value]) => {
|
|
107
123
|
if (value !== void 0 && value !== null) {
|
|
@@ -129,12 +145,13 @@ function useSecureDataAccess() {
|
|
|
129
145
|
}
|
|
130
146
|
recordDataAccess(table, "read", true, `SELECT ${columns} FROM ${table}`, filters);
|
|
131
147
|
return data || [];
|
|
132
|
-
}, [validateContext, getCurrentOrganisationId, setOrganisationContextInSession, supabase]);
|
|
148
|
+
}, [validateContext, getCurrentOrganisationId, setOrganisationContextInSession, supabase, isSuperAdmin]);
|
|
133
149
|
const secureInsert = useCallback(async (table, data) => {
|
|
134
150
|
validateContext();
|
|
135
|
-
const
|
|
151
|
+
const bypassOrganisationFilter = isSuperAdmin;
|
|
152
|
+
const organisationId = bypassOrganisationFilter ? void 0 : getCurrentOrganisationId();
|
|
136
153
|
await setOrganisationContextInSession(organisationId);
|
|
137
|
-
const secureData = {
|
|
154
|
+
const secureData = bypassOrganisationFilter ? { ...data } : {
|
|
138
155
|
...data,
|
|
139
156
|
organisation_id: organisationId
|
|
140
157
|
};
|
|
@@ -144,10 +161,11 @@ function useSecureDataAccess() {
|
|
|
144
161
|
throw error;
|
|
145
162
|
}
|
|
146
163
|
return insertData;
|
|
147
|
-
}, [validateContext, getCurrentOrganisationId, setOrganisationContextInSession, supabase]);
|
|
164
|
+
}, [validateContext, getCurrentOrganisationId, setOrganisationContextInSession, supabase, isSuperAdmin]);
|
|
148
165
|
const secureUpdate = useCallback(async (table, data, filters) => {
|
|
149
166
|
validateContext();
|
|
150
|
-
const
|
|
167
|
+
const bypassOrganisationFilter = isSuperAdmin;
|
|
168
|
+
const organisationId = bypassOrganisationFilter ? void 0 : getCurrentOrganisationId();
|
|
151
169
|
await setOrganisationContextInSession(organisationId);
|
|
152
170
|
const { organisation_id, ...secureData } = data;
|
|
153
171
|
let query = supabase.from(table).update(secureData);
|
|
@@ -166,7 +184,7 @@ function useSecureDataAccess() {
|
|
|
166
184
|
"pace_person",
|
|
167
185
|
"pace_member"
|
|
168
186
|
];
|
|
169
|
-
if (tablesWithOrganisation.includes(table)) {
|
|
187
|
+
if (!bypassOrganisationFilter && organisationId && tablesWithOrganisation.includes(table)) {
|
|
170
188
|
query = query.eq("organisation_id", organisationId);
|
|
171
189
|
}
|
|
172
190
|
Object.entries(filters).forEach(([key, value]) => {
|
|
@@ -180,10 +198,11 @@ function useSecureDataAccess() {
|
|
|
180
198
|
throw error;
|
|
181
199
|
}
|
|
182
200
|
return updateData || [];
|
|
183
|
-
}, [validateContext, getCurrentOrganisationId, setOrganisationContextInSession, supabase]);
|
|
201
|
+
}, [validateContext, getCurrentOrganisationId, setOrganisationContextInSession, supabase, isSuperAdmin]);
|
|
184
202
|
const secureDelete = useCallback(async (table, filters) => {
|
|
185
203
|
validateContext();
|
|
186
|
-
const
|
|
204
|
+
const bypassOrganisationFilter = isSuperAdmin;
|
|
205
|
+
const organisationId = bypassOrganisationFilter ? void 0 : getCurrentOrganisationId();
|
|
187
206
|
await setOrganisationContextInSession(organisationId);
|
|
188
207
|
let query = supabase.from(table).delete();
|
|
189
208
|
const tablesWithOrganisation = [
|
|
@@ -238,7 +257,7 @@ function useSecureDataAccess() {
|
|
|
238
257
|
"base_application",
|
|
239
258
|
"base_questions"
|
|
240
259
|
];
|
|
241
|
-
if (tablesWithOrganisation.includes(table)) {
|
|
260
|
+
if (!bypassOrganisationFilter && organisationId && tablesWithOrganisation.includes(table)) {
|
|
242
261
|
query = query.eq("organisation_id", organisationId);
|
|
243
262
|
}
|
|
244
263
|
Object.entries(filters).forEach(([key, value]) => {
|
|
@@ -251,10 +270,11 @@ function useSecureDataAccess() {
|
|
|
251
270
|
logger.error("useSecureDataAccess", "Delete failed", { table, filters, error });
|
|
252
271
|
throw error;
|
|
253
272
|
}
|
|
254
|
-
}, [validateContext, getCurrentOrganisationId, setOrganisationContextInSession, supabase]);
|
|
273
|
+
}, [validateContext, getCurrentOrganisationId, setOrganisationContextInSession, supabase, isSuperAdmin]);
|
|
255
274
|
const secureRpc = useCallback(async (functionName, params = {}) => {
|
|
256
275
|
validateContext();
|
|
257
|
-
const
|
|
276
|
+
const bypassOrganisationFilter = isSuperAdmin;
|
|
277
|
+
const organisationId = bypassOrganisationFilter ? void 0 : getCurrentOrganisationId();
|
|
258
278
|
await setOrganisationContextInSession(organisationId);
|
|
259
279
|
const functionsWithPOrganisationId = [
|
|
260
280
|
"data_cake_diners_list",
|
|
@@ -297,7 +317,11 @@ function useSecureDataAccess() {
|
|
|
297
317
|
if (user?.id) {
|
|
298
318
|
secureParams.p_user_id = user.id;
|
|
299
319
|
}
|
|
300
|
-
|
|
320
|
+
if (!bypassOrganisationFilter && organisationId) {
|
|
321
|
+
secureParams[paramName] = organisationId;
|
|
322
|
+
} else if (organisationId && !(paramName in params)) {
|
|
323
|
+
secureParams[paramName] = organisationId;
|
|
324
|
+
}
|
|
301
325
|
if (functionsNeedingEventId.includes(functionName) && selectedEvent?.event_id) {
|
|
302
326
|
secureParams.p_event_id = selectedEvent.event_id;
|
|
303
327
|
}
|
|
@@ -311,7 +335,7 @@ function useSecureDataAccess() {
|
|
|
311
335
|
throw error;
|
|
312
336
|
}
|
|
313
337
|
return data;
|
|
314
|
-
}, [validateContext, getCurrentOrganisationId, setOrganisationContextInSession, supabase, selectedEvent?.event_id, user?.id]);
|
|
338
|
+
}, [validateContext, getCurrentOrganisationId, setOrganisationContextInSession, supabase, selectedEvent?.event_id, user?.id, isSuperAdmin]);
|
|
315
339
|
const [dataAccessHistory, setDataAccessHistory] = useState([]);
|
|
316
340
|
const [isStrictMode] = useState(true);
|
|
317
341
|
const [isAuditLogEnabled] = useState(true);
|
|
@@ -342,11 +366,12 @@ function useSecureDataAccess() {
|
|
|
342
366
|
}, [user?.id, validateContext, isDataAccessAllowed]);
|
|
343
367
|
const recordDataAccess = useCallback((table, operation, allowed, query, filters) => {
|
|
344
368
|
if (!isAuditLogEnabled || !user?.id) return;
|
|
369
|
+
const auditOrganisationId = getCurrentOrganisationId() || "super-admin-bypass";
|
|
345
370
|
const record = {
|
|
346
371
|
table,
|
|
347
372
|
operation,
|
|
348
373
|
userId: user.id,
|
|
349
|
-
organisationId:
|
|
374
|
+
organisationId: auditOrganisationId,
|
|
350
375
|
allowed,
|
|
351
376
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
352
377
|
query,
|
|
@@ -361,7 +386,7 @@ function useSecureDataAccess() {
|
|
|
361
386
|
table,
|
|
362
387
|
operation,
|
|
363
388
|
userId: user.id,
|
|
364
|
-
organisationId:
|
|
389
|
+
organisationId: auditOrganisationId,
|
|
365
390
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
366
391
|
});
|
|
367
392
|
}
|
|
@@ -388,4 +413,4 @@ function useSecureDataAccess() {
|
|
|
388
413
|
export {
|
|
389
414
|
useSecureDataAccess
|
|
390
415
|
};
|
|
391
|
-
//# sourceMappingURL=chunk-
|
|
416
|
+
//# sourceMappingURL=chunk-4QYC5L4K.js.map
|