@jmruthers/pace-core 0.6.11 → 0.6.12
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/dist/{DataTable-EFYP2QLE.js → DataTable-AQAHSFLM.js} +7 -6
- package/dist/{api-BZR2CYXL.js → api-6OQXYT67.js} +2 -1
- package/dist/{chunk-L5LFKKLJ.js → chunk-2GBDPPUC.js} +1 -1
- package/dist/{chunk-J2KQK6DG.js → chunk-AP5FG7W4.js} +2 -2
- package/dist/{chunk-UZNAFKGW.js → chunk-GHCUP64P.js} +1 -21
- package/dist/{chunk-V7FTM2LU.js → chunk-H6RTU4DZ.js} +37 -19
- package/dist/{chunk-KJXRL3XE.js → chunk-HQTYP6BX.js} +79 -45
- package/dist/{chunk-YFTFFJIV.js → chunk-M7QE7XOA.js} +3 -3
- package/dist/{chunk-YYTWKVHO.js → chunk-MVVWZ7JV.js} +25 -30
- package/dist/{chunk-PCSHBLPB.js → chunk-NJ7FGQWB.js} +5 -5
- package/dist/{chunk-WY6Y7KC3.js → chunk-QWIG36BZ.js} +3 -3
- package/dist/{chunk-4R3T5ENU.js → chunk-S57OLCLO.js} +9 -6
- package/dist/chunk-VFLR5K2H.js +23 -0
- package/dist/{chunk-2OEVOGGR.js → chunk-Y2LWSLLB.js} +41 -25
- package/dist/{chunk-7A6IMHH2.js → chunk-YFGNMB67.js} +75 -6
- package/dist/components.d.ts +3 -3
- package/dist/components.js +13 -12
- package/dist/{functions-DH45k8ec.d.ts → functions-hF5ImHCr.d.ts} +1 -1
- package/dist/hooks.js +8 -7
- package/dist/index.d.ts +5 -5
- package/dist/index.js +17 -16
- package/dist/providers.js +3 -2
- package/dist/rbac/index.d.ts +10 -10
- package/dist/rbac/index.js +9 -8
- package/dist/{types-BE2sEHKd.d.ts → types-Besvoyzb.d.ts} +1 -1
- package/dist/{types-CvOPXWWZ.d.ts → types-CGHrxfqc.d.ts} +3 -0
- package/dist/types.d.ts +2 -2
- package/dist/{usePublicPageContext-B91dGYW1.d.ts → usePublicPageContext-BQrHf95t.d.ts} +1 -1
- package/dist/utils.js +4 -3
- package/docs/api/@jmruthers/namespaces/DialogPortal/README.md +14 -0
- package/docs/api/@jmruthers/namespaces/DialogPortal/variables/displayName.md +11 -0
- package/docs/api/README.md +6 -2
- package/docs/api/_media/README.md +186 -0
- package/docs/api/classes/ColumnFactory.md +225 -0
- package/docs/api/classes/Logger.md +246 -0
- package/docs/api/classes/RBACAuditManager.md +299 -0
- package/docs/api/classes/RBACCache.md +389 -0
- package/docs/api/classes/RBACEngine.md +181 -0
- package/docs/api/classes/SecureSupabaseClient.md +168 -0
- package/docs/api/classes/StorageUtils.md +324 -0
- package/docs/api/enumerations/FileCategory.md +137 -0
- package/docs/api/enumerations/LogLevel.md +43 -0
- package/docs/api/enumerations/RBACErrorCode.md +169 -0
- package/docs/api/enumerations/RPCFunction.md +89 -0
- package/docs/api/functions/AccessDenied.md +30 -0
- package/docs/api/functions/AppSwitcher.md +21 -0
- package/docs/api/functions/Badge.md +42 -0
- package/docs/api/functions/ContextSelector.md +43 -0
- package/docs/api/functions/DataTable.md +36 -0
- package/docs/api/functions/DatePickerWithTimezone.md +28 -0
- package/docs/api/functions/DialogBody.md +24 -0
- package/docs/api/functions/DialogFooter.md +24 -0
- package/docs/api/functions/DialogHeader.md +24 -0
- package/docs/api/functions/ErrorBoundaryProvider.md +28 -0
- package/docs/api/functions/EventServiceProvider.md +28 -0
- package/docs/api/functions/FileDisplay.md +25 -0
- package/docs/api/functions/FileUpload.md +21 -0
- package/docs/api/functions/Form.md +50 -0
- package/docs/api/functions/FormField.md +102 -0
- package/docs/api/functions/Header.md +21 -0
- package/docs/api/functions/InactivityServiceProvider.md +28 -0
- package/docs/api/functions/InactivityWarningModal.md +21 -0
- package/docs/api/functions/Input.md +49 -0
- package/docs/api/functions/NavigationGuard.md +31 -0
- package/docs/api/functions/OrganisationServiceProvider.md +28 -0
- package/docs/api/functions/PaceAppLayout.md +169 -0
- package/docs/api/functions/PasswordChangeForm.md +21 -0
- package/docs/api/functions/ProtectedRoute.md +37 -0
- package/docs/api/functions/PublicPageFooter.md +21 -0
- package/docs/api/functions/PublicPageHeader.md +21 -0
- package/docs/api/functions/PublicPageLayout.md +33 -0
- package/docs/api/functions/PublicPageProvider.md +30 -0
- package/docs/api/functions/Textarea.md +49 -0
- package/docs/api/functions/Toaster.md +34 -0
- package/docs/api/functions/UnifiedAuthProvider.md +28 -0
- package/docs/api/functions/applyPalette.md +33 -0
- package/docs/api/functions/archiveFile.md +47 -0
- package/docs/api/functions/average.md +63 -0
- package/docs/api/functions/buildAppUrl.md +46 -0
- package/docs/api/functions/clearInFlightRequests.md +17 -0
- package/docs/api/functions/clearPalette.md +18 -0
- package/docs/api/functions/clearPublicEventCache.md +18 -0
- package/docs/api/functions/clearPublicFileDisplayCache.md +18 -0
- package/docs/api/functions/clearPublicLogoCache.md +18 -0
- package/docs/api/functions/cn.md +21 -0
- package/docs/api/functions/count.md +56 -0
- package/docs/api/functions/createAuditManager.md +45 -0
- package/docs/api/functions/createBaseClient.md +75 -0
- package/docs/api/functions/createLogger.md +95 -0
- package/docs/api/functions/createRBACConfig.md +21 -0
- package/docs/api/functions/createRBACEngine.md +33 -0
- package/docs/api/functions/createRBACExpressMiddleware.md +84 -0
- package/docs/api/functions/createRBACMiddleware.md +88 -0
- package/docs/api/functions/createSecureClient.md +80 -0
- package/docs/api/functions/createSecureDataAccess.md +39 -0
- package/docs/api/functions/deleteFile.md +33 -0
- package/docs/api/functions/disablePerformanceMonitoring.md +17 -0
- package/docs/api/functions/downloadFile.md +33 -0
- package/docs/api/functions/emitAuditEvent.md +27 -0
- package/docs/api/functions/enablePerformanceMonitoring.md +17 -0
- package/docs/api/functions/err.md +23 -0
- package/docs/api/functions/exportToCSV.md +56 -0
- package/docs/api/functions/exportToCSVWithTableRows.md +46 -0
- package/docs/api/functions/extractEventCodeFromPath.md +24 -0
- package/docs/api/functions/extractFileMetadata.md +33 -0
- package/docs/api/functions/formatCompactNumber.md +27 -0
- package/docs/api/functions/formatCurrency.md +31 -0
- package/docs/api/functions/formatDate.md +23 -0
- package/docs/api/functions/formatDateTime.md +24 -0
- package/docs/api/functions/formatFileSize.md +23 -0
- package/docs/api/functions/formatInTimeZone.md +46 -0
- package/docs/api/functions/formatNumber.md +31 -0
- package/docs/api/functions/formatPercent.md +64 -0
- package/docs/api/functions/formatTime.md +24 -0
- package/docs/api/functions/formatTimeInTimeZone.md +40 -0
- package/docs/api/functions/fromSupabaseClient.md +49 -0
- package/docs/api/functions/fromZonedTime.md +41 -0
- package/docs/api/functions/generateCSVContent.md +55 -0
- package/docs/api/functions/generateFilePath.md +29 -0
- package/docs/api/functions/generateFileUrlsBatch.md +33 -0
- package/docs/api/functions/generatePublicRoutePath.md +27 -0
- package/docs/api/functions/generateUniqueFileName.md +24 -0
- package/docs/api/functions/getAccessLevel.md +48 -0
- package/docs/api/functions/getAllAppPorts.md +19 -0
- package/docs/api/functions/getAllStylePaths.md +15 -0
- package/docs/api/functions/getAppConfig.md +17 -0
- package/docs/api/functions/getAppPort.md +34 -0
- package/docs/api/functions/getBucketName.md +27 -0
- package/docs/api/functions/getCurrentAppId.md +17 -0
- package/docs/api/functions/getCurrentAppName.md +17 -0
- package/docs/api/functions/getFileSizeLimit.md +23 -0
- package/docs/api/functions/getGlobalAuditManager.md +19 -0
- package/docs/api/functions/getInFlightRequestCount.md +19 -0
- package/docs/api/functions/getPerformanceMetrics.md +17 -0
- package/docs/api/functions/getPerformanceSummary.md +17 -0
- package/docs/api/functions/getPermissionMap.md +52 -0
- package/docs/api/functions/getPublicEventCacheStats.md +25 -0
- package/docs/api/functions/getPublicFileDisplayCacheStats.md +25 -0
- package/docs/api/functions/getPublicLogoCacheStats.md +25 -0
- package/docs/api/functions/getPublicUrl.md +39 -0
- package/docs/api/functions/getRBACConfig.md +15 -0
- package/docs/api/functions/getRBACLogger.md +15 -0
- package/docs/api/functions/getRoleContext.md +31 -0
- package/docs/api/functions/getSignedUrl.md +34 -0
- package/docs/api/functions/getStylePath.md +21 -0
- package/docs/api/functions/getTimeZoneDifference.md +40 -0
- package/docs/api/functions/getTimezoneAbbreviation.md +40 -0
- package/docs/api/functions/getUserTimeZone.md +26 -0
- package/docs/api/functions/hasAllPermissions.md +41 -0
- package/docs/api/functions/hasAnyPermission.md +41 -0
- package/docs/api/functions/isDebugMode.md +15 -0
- package/docs/api/functions/isDevelopmentMode.md +15 -0
- package/docs/api/functions/isErr.md +29 -0
- package/docs/api/functions/isOk.md +29 -0
- package/docs/api/functions/isPerformanceMonitoringEnabled.md +17 -0
- package/docs/api/functions/isPermitted.md +58 -0
- package/docs/api/functions/isPermittedCached.md +36 -0
- package/docs/api/functions/isRBACInitialized.md +19 -0
- package/docs/api/functions/isSecureClient.md +38 -0
- package/docs/api/functions/isValidPermission.md +27 -0
- package/docs/api/functions/listFiles.md +29 -0
- package/docs/api/functions/max.md +63 -0
- package/docs/api/functions/min.md +63 -0
- package/docs/api/functions/ok.md +29 -0
- package/docs/api/functions/parseAndNormalizeEventColours.md +105 -0
- package/docs/api/functions/recordAuditEvent.md +23 -0
- package/docs/api/functions/recordPermissionCheck.md +31 -0
- package/docs/api/functions/resetPerformanceMetrics.md +17 -0
- package/docs/api/functions/resolveAppContext.md +27 -0
- package/docs/api/functions/roundToNearestMinutes.md +41 -0
- package/docs/api/functions/sanitizeFormData.md +49 -0
- package/docs/api/functions/sanitizeHtml.md +39 -0
- package/docs/api/functions/sanitizeUserInput.md +27 -0
- package/docs/api/functions/setAppConfig.md +23 -0
- package/docs/api/functions/setGlobalAuditManager.md +25 -0
- package/docs/api/functions/setupRBAC.md +31 -0
- package/docs/api/functions/sum.md +63 -0
- package/docs/api/functions/toZonedTime.md +41 -0
- package/docs/api/functions/uploadFile.md +32 -0
- package/docs/api/functions/useAccessLevel.md +71 -0
- package/docs/api/functions/useAccessibleApps.md +55 -0
- package/docs/api/functions/useAppConfig.md +20 -0
- package/docs/api/functions/useAuthService.md +15 -0
- package/docs/api/functions/useCan.md +99 -0
- package/docs/api/functions/useEventService.md +15 -0
- package/docs/api/functions/useEventTheme.md +26 -0
- package/docs/api/functions/useEvents.md +45 -0
- package/docs/api/functions/useFileReference.md +264 -0
- package/docs/api/functions/useFileReferenceById.md +63 -0
- package/docs/api/functions/useFileReferenceForRecord.md +129 -0
- package/docs/api/functions/useFilesByCategory.md +80 -0
- package/docs/api/functions/useFormDialog.md +62 -0
- package/docs/api/functions/useInactivityService.md +15 -0
- package/docs/api/functions/useInactivityTracker.md +21 -0
- package/docs/api/functions/useIsPublicPage.md +19 -0
- package/docs/api/functions/useMultiplePermissions.md +88 -0
- package/docs/api/functions/useOptionalEvents.md +31 -0
- package/docs/api/functions/useOrganisationPermissions.md +27 -0
- package/docs/api/functions/useOrganisationSecurity.md +15 -0
- package/docs/api/functions/useOrganisationService.md +15 -0
- package/docs/api/functions/useOrganisations.md +48 -0
- package/docs/api/functions/usePermissions.md +130 -0
- package/docs/api/functions/usePublicEvent.md +36 -0
- package/docs/api/functions/usePublicEventCode.md +32 -0
- package/docs/api/functions/usePublicEventLogo.md +48 -0
- package/docs/api/functions/usePublicFileDisplay.md +54 -0
- package/docs/api/functions/usePublicPageContext.md +19 -0
- package/docs/api/functions/usePublicRouteParams.md +31 -0
- package/docs/api/functions/useRBAC.md +21 -0
- package/docs/api/functions/useResolvedScope.md +46 -0
- package/docs/api/functions/useResourcePermissions.md +25 -0
- package/docs/api/functions/useRoleManagement.md +121 -0
- package/docs/api/functions/useSecureSupabase.md +51 -0
- package/docs/api/functions/useSessionRestoration.md +15 -0
- package/docs/api/functions/useSessionTracking.md +62 -0
- package/docs/api/functions/useToast.md +83 -0
- package/docs/api/functions/useUnifiedAuth.md +24 -0
- package/docs/api/functions/useZodForm.md +27 -0
- package/docs/api/functions/validateFileSize.md +31 -0
- package/docs/api/functions/warnIfInsecureClient.md +40 -0
- package/docs/api/functions/withAccessLevelGuard.md +67 -0
- package/docs/api/functions/withPermissionGuard.md +73 -0
- package/docs/api/functions/withRoleGuard.md +86 -0
- package/docs/api/globals.md +502 -0
- package/docs/api/interfaces/AccessDeniedProps.md +87 -0
- package/docs/api/interfaces/AccessibleApp.md +41 -0
- package/docs/api/interfaces/AddressFieldProps.md +195 -0
- package/docs/api/interfaces/AddressFieldRef.md +67 -0
- package/docs/api/interfaces/AggregateConfig.md +35 -0
- package/docs/api/interfaces/AppSwitcherProps.md +51 -0
- package/docs/api/interfaces/AuthSessionData.md +27 -0
- package/docs/api/interfaces/AutocompleteOptions.md +61 -0
- package/docs/api/interfaces/AvatarProps.md +97 -0
- package/docs/api/interfaces/BadgeProps.md +30 -0
- package/docs/api/interfaces/BuildAppUrlOptions.md +41 -0
- package/docs/api/interfaces/ButtonProps.md +46 -0
- package/docs/api/interfaces/CalendarProps.md +60 -0
- package/docs/api/interfaces/CardProps.md +56 -0
- package/docs/api/interfaces/ColorPalette.md +13 -0
- package/docs/api/interfaces/ColorShade.md +58 -0
- package/docs/api/interfaces/ContextSelectorProps.md +131 -0
- package/docs/api/interfaces/DataRecord.md +16 -0
- package/docs/api/interfaces/DataTableAction.md +198 -0
- package/docs/api/interfaces/DataTableColumn.md +422 -0
- package/docs/api/interfaces/DataTableProps.md +511 -0
- package/docs/api/interfaces/DataTableToolbarButton.md +75 -0
- package/docs/api/interfaces/DatePickerWithTimezoneProps.md +75 -0
- package/docs/api/interfaces/DialogBodyProps.md +55 -0
- package/docs/api/interfaces/DialogCloseProps.md +25 -0
- package/docs/api/interfaces/DialogContentProps.md +160 -0
- package/docs/api/interfaces/DialogFooterProps.md +25 -0
- package/docs/api/interfaces/DialogHeaderProps.md +25 -0
- package/docs/api/interfaces/DialogPortalProps.md +19 -0
- package/docs/api/interfaces/DialogProps.md +53 -0
- package/docs/api/interfaces/DialogTriggerProps.md +53 -0
- package/docs/api/interfaces/EmptyStateConfig.md +55 -0
- package/docs/api/interfaces/ErrorBoundaryProps.md +131 -0
- package/docs/api/interfaces/ErrorBoundaryProviderProps.md +31 -0
- package/docs/api/interfaces/ErrorBoundaryState.md +61 -0
- package/docs/api/interfaces/EventAppRoleData.md +54 -0
- package/docs/api/interfaces/ExportColumn.md +69 -0
- package/docs/api/interfaces/ExportOptions.md +109 -0
- package/docs/api/interfaces/FileDisplayProps.md +192 -0
- package/docs/api/interfaces/FileMetadata.md +97 -0
- package/docs/api/interfaces/FileReference.md +89 -0
- package/docs/api/interfaces/FileSizeLimits.md +13 -0
- package/docs/api/interfaces/FileUploadOptions.md +107 -0
- package/docs/api/interfaces/FooterProps.md +37 -0
- package/docs/api/interfaces/FormFieldProps.md +171 -0
- package/docs/api/interfaces/FormProps.md +93 -0
- package/docs/api/interfaces/GrantEventAppRoleParams.md +97 -0
- package/docs/api/interfaces/ImportSummary.md +49 -0
- package/docs/api/interfaces/InactivityWarningModalProps.md +87 -0
- package/docs/api/interfaces/InputProps.md +46 -0
- package/docs/api/interfaces/InvalidScopeError.md +37 -0
- package/docs/api/interfaces/LabelProps.md +85 -0
- package/docs/api/interfaces/LoggerConfig.md +51 -0
- package/docs/api/interfaces/LoginFormProps.md +146 -0
- package/docs/api/interfaces/MissingUserContextError.md +37 -0
- package/docs/api/interfaces/NavigationGuardProps.md +109 -0
- package/docs/api/interfaces/NavigationItem.md +91 -0
- package/docs/api/interfaces/NavigationMenuProps.md +169 -0
- package/docs/api/interfaces/Organisation.md +105 -0
- package/docs/api/interfaces/OrganisationContextRequiredError.md +37 -0
- package/docs/api/interfaces/OrganisationMembership.md +105 -0
- package/docs/api/interfaces/OrganisationSecurityError.md +49 -0
- package/docs/api/interfaces/PaceAppLayoutPermissionConfig.md +127 -0
- package/docs/api/interfaces/PaceAppLayoutRouteConfigItem.md +91 -0
- package/docs/api/interfaces/PaceAppLayoutRoutingConfig.md +79 -0
- package/docs/api/interfaces/PaceLoginPageProps.md +41 -0
- package/docs/api/interfaces/PagePermissionGuardProps.md +143 -0
- package/docs/api/interfaces/PaletteData.md +33 -0
- package/docs/api/interfaces/ParsedAddress.md +91 -0
- package/docs/api/interfaces/PermissionDeniedError.md +37 -0
- package/docs/api/interfaces/ProgressProps.md +35 -0
- package/docs/api/interfaces/ProtectedRouteProps.md +67 -0
- package/docs/api/interfaces/PublicPageFooterProps.md +97 -0
- package/docs/api/interfaces/PublicPageHeaderProps.md +99 -0
- package/docs/api/interfaces/PublicPageLayoutProps.md +153 -0
- package/docs/api/interfaces/RBACAccessValidateParams.md +41 -0
- package/docs/api/interfaces/RBACAccessValidateResult.md +33 -0
- package/docs/api/interfaces/RBACAuditLogParams.md +65 -0
- package/docs/api/interfaces/RBACAuditLogResult.md +41 -0
- package/docs/api/interfaces/RBACContext.md +41 -0
- package/docs/api/interfaces/RBACError.md +37 -0
- package/docs/api/interfaces/RBACLogger.md +97 -0
- package/docs/api/interfaces/RBACNotInitializedError.md +37 -0
- package/docs/api/interfaces/RBACPageAccessCheckParams.md +57 -0
- package/docs/api/interfaces/RBACPerformanceMetrics.md +109 -0
- package/docs/api/interfaces/RBACPermissionCheckParams.md +57 -0
- package/docs/api/interfaces/RBACPermissionCheckResult.md +41 -0
- package/docs/api/interfaces/RBACPermissionsGetParams.md +49 -0
- package/docs/api/interfaces/RBACPermissionsGetResult.md +49 -0
- package/docs/api/interfaces/RBACResult.md +47 -0
- package/docs/api/interfaces/RBACRoleGrantParams.md +49 -0
- package/docs/api/interfaces/RBACRoleGrantResult.md +41 -0
- package/docs/api/interfaces/RBACRoleRevokeParams.md +49 -0
- package/docs/api/interfaces/RBACRoleRevokeResult.md +41 -0
- package/docs/api/interfaces/RBACRoleValidateParams.md +41 -0
- package/docs/api/interfaces/RBACRoleValidateResult.md +49 -0
- package/docs/api/interfaces/RBACRolesListParams.md +41 -0
- package/docs/api/interfaces/RBACRolesListResult.md +57 -0
- package/docs/api/interfaces/RBACSessionTrackParams.md +57 -0
- package/docs/api/interfaces/RBACSessionTrackResult.md +41 -0
- package/docs/api/interfaces/ResourcePermissions.md +119 -0
- package/docs/api/interfaces/RevokeEventAppRoleParams.md +81 -0
- package/docs/api/interfaces/RoleManagementResult.md +41 -0
- package/docs/api/interfaces/SessionRestorationLoaderProps.md +29 -0
- package/docs/api/interfaces/StorageConfig.md +33 -0
- package/docs/api/interfaces/StorageFileInfo.md +57 -0
- package/docs/api/interfaces/StorageFileMetadata.md +113 -0
- package/docs/api/interfaces/StorageListOptions.md +79 -0
- package/docs/api/interfaces/StorageListResult.md +33 -0
- package/docs/api/interfaces/StorageUploadOptions.md +81 -0
- package/docs/api/interfaces/StorageUploadResult.md +49 -0
- package/docs/api/interfaces/StorageUploadSuccess.md +35 -0
- package/docs/api/interfaces/StorageUrlOptions.md +49 -0
- package/docs/api/interfaces/StyleImport.md +17 -0
- package/docs/api/interfaces/SwitchProps.md +30 -0
- package/docs/api/interfaces/TabsContentProps.md +13 -0
- package/docs/api/interfaces/TabsListProps.md +13 -0
- package/docs/api/interfaces/TabsProps.md +13 -0
- package/docs/api/interfaces/TabsTriggerProps.md +41 -0
- package/docs/api/interfaces/TextareaProps.md +43 -0
- package/docs/api/interfaces/ToastActionElement.md +16 -0
- package/docs/api/interfaces/ToastProps.md +13 -0
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +129 -0
- package/docs/api/interfaces/UseAccessibleAppsReturn.md +55 -0
- package/docs/api/interfaces/UseFormDialogOptions.md +49 -0
- package/docs/api/interfaces/UseFormDialogReturn.md +95 -0
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +103 -0
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +91 -0
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +69 -0
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +66 -0
- package/docs/api/interfaces/UsePublicEventOptions.md +29 -0
- package/docs/api/interfaces/UsePublicEventReturn.md +56 -0
- package/docs/api/interfaces/UsePublicFileDisplayOptions.md +39 -0
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +96 -0
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +76 -0
- package/docs/api/interfaces/UseResolvedScopeOptions.md +49 -0
- package/docs/api/interfaces/UseResolvedScopeReturn.md +39 -0
- package/docs/api/interfaces/UseResourcePermissionsOptions.md +29 -0
- package/docs/api/interfaces/UserEventAccess.md +92 -0
- package/docs/api/interfaces/UserMenuProps.md +69 -0
- package/docs/api/interfaces/UserProfile.md +49 -0
- package/docs/api/type-aliases/AccessLevel.md +11 -0
- package/docs/api/type-aliases/AccessLevelContext.md +14 -0
- package/docs/api/type-aliases/AllPermissions.md +11 -0
- package/docs/api/type-aliases/ApiError.md +37 -0
- package/docs/api/type-aliases/ApiResult.md +19 -0
- package/docs/api/type-aliases/AuditEventType.md +11 -0
- package/docs/api/type-aliases/BadgeVariant.md +18 -0
- package/docs/api/type-aliases/DataTableFeatureConfig.md +14 -0
- package/docs/api/type-aliases/DialogSize.md +13 -0
- package/docs/api/type-aliases/EventAppRole.md +11 -0
- package/docs/api/type-aliases/FileUploadProps.md +15 -0
- package/docs/api/type-aliases/GetRowId.md +33 -0
- package/docs/api/type-aliases/GlobalErrorHandler.md +35 -0
- package/docs/api/type-aliases/GlobalRole.md +11 -0
- package/docs/api/type-aliases/ImportHandlerResult.md +13 -0
- package/docs/api/type-aliases/NavigationMode.md +13 -0
- package/docs/api/type-aliases/Operation.md +11 -0
- package/docs/api/type-aliases/OrganisationContextType.md +13 -0
- package/docs/api/type-aliases/OrganisationRole.md +11 -0
- package/docs/api/type-aliases/PaceAppLayoutProps.md +14 -0
- package/docs/api/type-aliases/Permission.md +11 -0
- package/docs/api/type-aliases/PermissionCheck.md +46 -0
- package/docs/api/type-aliases/PermissionMap.md +11 -0
- package/docs/api/type-aliases/PermissionSource.md +13 -0
- package/docs/api/type-aliases/RBACConfig.md +13 -0
- package/docs/api/type-aliases/RBACFunctionResponse.md +57 -0
- package/docs/api/type-aliases/Scope.md +41 -0
- package/docs/api/type-aliases/SessionType.md +11 -0
- package/docs/api/type-aliases/UUID.md +11 -0
- package/docs/api/type-aliases/UnifiedAuthContextType.md +13 -0
- package/docs/api/type-aliases/UseFileReferenceForRecordReturn.md +161 -0
- package/docs/api/type-aliases/UseFileReferenceOptions.md +35 -0
- package/docs/api/type-aliases/UseFileReferenceReturn.md +13 -0
- package/docs/api/variables/ALL_PERMISSIONS.md +281 -0
- package/docs/api/variables/APP_PATH_MAPPING.md +14 -0
- package/docs/api/variables/AddressField.md +41 -0
- package/docs/api/variables/Alert.md +11 -0
- package/docs/api/variables/AlertDescription.md +11 -0
- package/docs/api/variables/AlertTitle.md +11 -0
- package/docs/api/variables/Avatar.md +13 -0
- package/docs/api/variables/Button.md +31 -0
- package/docs/api/variables/CACHE_PATTERNS.md +89 -0
- package/docs/api/variables/Calendar.md +74 -0
- package/docs/api/variables/Card.md +11 -0
- package/docs/api/variables/CardActions.md +11 -0
- package/docs/api/variables/CardContent.md +11 -0
- package/docs/api/variables/CardDescription.md +11 -0
- package/docs/api/variables/CardFooter.md +11 -0
- package/docs/api/variables/CardHeader.md +11 -0
- package/docs/api/variables/CardTitle.md +11 -0
- package/docs/api/variables/Checkbox.md +11 -0
- package/docs/api/variables/DEFAULT_APP_PORT_MAP.md +14 -0
- package/docs/api/variables/DEFAULT_FILE_SIZE_LIMIT.md +13 -0
- package/docs/api/variables/Dialog.md +14 -0
- package/docs/api/variables/DialogClose.md +14 -0
- package/docs/api/variables/DialogContent.md +28 -0
- package/docs/api/variables/DialogDescription.md +14 -0
- package/docs/api/variables/DialogPortal.md +14 -0
- package/docs/api/variables/DialogTitle.md +14 -0
- package/docs/api/variables/DialogTrigger.md +14 -0
- package/docs/api/variables/EVENT_APP_PERMISSIONS.md +109 -0
- package/docs/api/variables/ErrorBoundary.md +15 -0
- package/docs/api/variables/FILE_SIZE_LIMITS.md +13 -0
- package/docs/api/variables/Footer.md +11 -0
- package/docs/api/variables/GLOBAL_PERMISSIONS.md +29 -0
- package/docs/api/variables/Label.md +34 -0
- package/docs/api/variables/LoadingSpinner.md +28 -0
- package/docs/api/variables/LoginForm.md +34 -0
- package/docs/api/variables/NavigationMenu.md +203 -0
- package/docs/api/variables/ORGANISATION_PERMISSIONS.md +89 -0
- package/docs/api/variables/PAGE_PERMISSIONS.md +93 -0
- package/docs/api/variables/PaceLoginPage.md +40 -0
- package/docs/api/variables/PagePermissionGuard.md +11 -0
- package/docs/api/variables/Progress.md +32 -0
- package/docs/api/variables/SECURE_CLIENT_SYMBOL.md +14 -0
- package/docs/api/variables/STORAGE_CONFIG.md +13 -0
- package/docs/api/variables/Select.md +26 -0
- package/docs/api/variables/SelectContent.md +26 -0
- package/docs/api/variables/SelectGroup.md +26 -0
- package/docs/api/variables/SelectItem.md +26 -0
- package/docs/api/variables/SelectLabel.md +26 -0
- package/docs/api/variables/SelectSeparator.md +26 -0
- package/docs/api/variables/SelectTrigger.md +26 -0
- package/docs/api/variables/SelectValue.md +26 -0
- package/docs/api/variables/SessionRestorationLoader.md +11 -0
- package/docs/api/variables/Switch.md +23 -0
- package/docs/api/variables/Table.md +35 -0
- package/docs/api/variables/TableBody.md +11 -0
- package/docs/api/variables/TableCaption.md +11 -0
- package/docs/api/variables/TableCell.md +11 -0
- package/docs/api/variables/TableFooter.md +11 -0
- package/docs/api/variables/TableHead.md +11 -0
- package/docs/api/variables/TableHeader.md +11 -0
- package/docs/api/variables/TableRow.md +11 -0
- package/docs/api/variables/Tabs.md +25 -0
- package/docs/api/variables/TabsContent.md +24 -0
- package/docs/api/variables/TabsList.md +25 -0
- package/docs/api/variables/TabsTrigger.md +34 -0
- package/docs/api/variables/Toast.md +36 -0
- package/docs/api/variables/ToastAction.md +32 -0
- package/docs/api/variables/ToastClose.md +32 -0
- package/docs/api/variables/ToastDescription.md +32 -0
- package/docs/api/variables/ToastProvider.md +11 -0
- package/docs/api/variables/ToastTitle.md +32 -0
- package/docs/api/variables/ToastViewport.md +26 -0
- package/docs/api/variables/Tooltip.md +34 -0
- package/docs/api/variables/TooltipContent.md +34 -0
- package/docs/api/variables/TooltipProvider.md +11 -0
- package/docs/api/variables/TooltipRoot.md +11 -0
- package/docs/api/variables/TooltipTrigger.md +11 -0
- package/docs/api/variables/UserMenu.md +11 -0
- package/docs/api/variables/emailSchema.md +13 -0
- package/docs/api/variables/logger.md +203 -0
- package/docs/api/variables/nameSchema.md +13 -0
- package/docs/api/variables/passwordSchema.md +13 -0
- package/docs/api/variables/phoneSchema.md +13 -0
- package/docs/api/variables/rbacCache.md +16 -0
- package/docs/api/variables/styleConfig.md +25 -0
- package/docs/api/variables/urlSchema.md +13 -0
- package/docs/api-reference/hooks.md +2 -0
- package/docs/implementation-guides/data-tables.md +8 -0
- package/docs/rbac/getting-started.md +7 -0
- package/docs/rbac/troubleshooting.md +5 -1
- package/package.json +3 -3
- package/src/components/DataTable/hooks/useDataTableEffectiveActions.ts +29 -19
- package/src/components/DataTable/hooks/useDataTableScope.test.ts +5 -13
- package/src/components/DataTable/hooks/useDataTableScope.ts +16 -14
- package/src/components/Dialog/useDialogLifecycle.test.ts +4 -1
- package/src/components/FileDisplay/useFileDisplay.unit.test.ts +12 -8
- package/src/components/PaceAppLayout/PaceAppLayout.edge-cases.test.tsx +33 -9
- package/src/components/PaceAppLayout/useFilteredNavItems.ts +22 -7
- package/src/components/PaceAppLayout/usePaceAppLayoutConfig.ts +44 -23
- package/src/components/PaceAppLayout/usePaceAppLayoutPermissions.ts +1 -1
- package/src/components/PaceAppLayout/usePaceAppLayoutScope.ts +6 -4
- package/src/components/PaceAppLayout/useRoleBasedRouteAccess.ts +2 -2
- package/src/hooks/useAppConfig.unit.test.ts +74 -66
- package/src/hooks/useComponentPerformance.unit.test.tsx +6 -4
- package/src/hooks/useFileUrl.unit.test.ts +1 -3
- package/src/hooks/useInactivityTracker.unit.test.ts +6 -2
- package/src/hooks/usePerformanceMonitor.unit.test.ts +6 -16
- package/src/hooks/usePublicEvent.simple.test.ts +32 -47
- package/src/hooks/usePublicEvent.test.ts +9 -15
- package/src/providers/services/AuthServiceProvider.test.tsx +10 -5
- package/src/providers/services/EventServiceProvider.test.tsx +8 -3
- package/src/providers/services/InactivityServiceProvider.test.tsx +8 -3
- package/src/providers/services/OrganisationServiceProvider.test.tsx +8 -3
- package/src/rbac/README.md +7 -5
- package/src/rbac/api.test.ts +113 -56
- package/src/rbac/api.ts +80 -10
- package/src/rbac/components/NavigationGuard.tsx +2 -1
- package/src/rbac/components/PagePermissionGuard.test.tsx +23 -10
- package/src/rbac/engine.ts +23 -1
- package/src/rbac/hooks/permissions/runPermissionCheck.ts +18 -4
- package/src/rbac/hooks/permissions/useCan.test.ts +59 -20
- package/src/rbac/hooks/permissions/useCan.ts +7 -3
- package/src/rbac/hooks/permissions/useMultiplePermissions.ts +18 -9
- package/src/rbac/hooks/useCan.test.ts +2 -3
- package/src/rbac/hooks/usePageGuardScope.ts +6 -4
- package/src/rbac/hooks/usePagePermissionCheck.ts +4 -4
- package/src/rbac/hooks/useResolvedScope.ts +16 -10
- package/src/rbac/hooks/useResourcePermissions.test.ts +48 -58
- package/src/rbac/hooks/useResourcePermissions.ts +11 -20
- package/src/rbac/types.ts +3 -0
- package/src/services/AuthService.edge-cases.test.ts +2 -2
- package/src/services/EventService.ts +9 -4
- package/src/utils/file-reference/file-reference.test.ts +25 -14
- package/src/utils/supabase/createBaseClient.test.ts +30 -13
- package/docs/api/modules.md +0 -10028
|
@@ -609,13 +609,8 @@ describe('useOperationPerformance', () => {
|
|
|
609
609
|
useOperationPerformance('testOperation', 'OPERATION')
|
|
610
610
|
);
|
|
611
611
|
|
|
612
|
-
// Clear any previous calls
|
|
613
612
|
vi.clearAllMocks();
|
|
614
|
-
|
|
615
|
-
// Use mockReturnValueOnce to ensure exact sequence
|
|
616
|
-
mockPerformanceNow
|
|
617
|
-
.mockReturnValueOnce(0) // Start time
|
|
618
|
-
.mockReturnValueOnce(20); // End time
|
|
613
|
+
mockPerformanceNow.mockReturnValueOnce(0).mockReturnValueOnce(10);
|
|
619
614
|
|
|
620
615
|
const operation = () => 'result';
|
|
621
616
|
|
|
@@ -623,26 +618,23 @@ describe('useOperationPerformance', () => {
|
|
|
623
618
|
|
|
624
619
|
expect(performanceBudgetMonitor.measure).toHaveBeenCalledWith(
|
|
625
620
|
'OPERATION',
|
|
626
|
-
|
|
621
|
+
10,
|
|
627
622
|
expect.objectContaining({
|
|
628
623
|
operation: 'testOperation',
|
|
629
624
|
})
|
|
630
625
|
);
|
|
631
|
-
|
|
632
|
-
// Reset mock
|
|
633
626
|
mockPerformanceNow.mockImplementation(() => mockPerformanceNowValue);
|
|
634
627
|
});
|
|
635
628
|
|
|
636
629
|
it('includes context in measurement', async () => {
|
|
637
630
|
const { result } = renderHook(() => useOperationPerformance('testOperation'));
|
|
638
631
|
|
|
639
|
-
// Use a sequence to ensure correct values are returned
|
|
640
632
|
let callCount = 0;
|
|
641
633
|
mockPerformanceNow.mockImplementation(() => {
|
|
642
634
|
callCount++;
|
|
643
|
-
if (callCount === 1) return 0;
|
|
644
|
-
if (callCount === 2) return
|
|
645
|
-
return mockPerformanceNowValue;
|
|
635
|
+
if (callCount === 1) return 0;
|
|
636
|
+
if (callCount === 2) return 10;
|
|
637
|
+
return mockPerformanceNowValue;
|
|
646
638
|
});
|
|
647
639
|
|
|
648
640
|
const operation = () => 'result';
|
|
@@ -652,15 +644,13 @@ describe('useOperationPerformance', () => {
|
|
|
652
644
|
|
|
653
645
|
expect(performanceBudgetMonitor.measure).toHaveBeenCalledWith(
|
|
654
646
|
'COMPONENT_RENDER',
|
|
655
|
-
|
|
647
|
+
10,
|
|
656
648
|
expect.objectContaining({
|
|
657
649
|
operation: 'testOperation',
|
|
658
650
|
userId: '123',
|
|
659
651
|
action: 'test',
|
|
660
652
|
})
|
|
661
653
|
);
|
|
662
|
-
|
|
663
|
-
// Reset mock
|
|
664
654
|
callCount = 0;
|
|
665
655
|
mockPerformanceNow.mockImplementation(() => mockPerformanceNowValue);
|
|
666
656
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { renderHook, waitFor } from '@testing-library/react';
|
|
1
|
+
import { renderHook, waitFor, act } from '@testing-library/react';
|
|
2
2
|
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
3
3
|
import { usePublicEvent, clearPublicEventCache, getPublicEventCacheStats } from './public/usePublicEvent';
|
|
4
4
|
import { usePublicPageContext } from '../components/PublicLayout/usePublicPageContext';
|
|
@@ -165,10 +165,10 @@ describe('usePublicEvent - Simple Tests', () => {
|
|
|
165
165
|
});
|
|
166
166
|
|
|
167
167
|
it('should handle event not found', async () => {
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
168
|
+
// usePublicEvent uses .from('core_events').select(...).single(), not rpc
|
|
169
|
+
const noEventBuilder = createMockQueryBuilder(null, null);
|
|
170
|
+
const logoBuilder = createMockQueryBuilder(null, null);
|
|
171
|
+
mockSupabaseClient.from.mockReturnValueOnce(noEventBuilder).mockReturnValueOnce(logoBuilder);
|
|
172
172
|
|
|
173
173
|
const { result } = renderHook(() => usePublicEvent('nonexistent-event'));
|
|
174
174
|
|
|
@@ -237,8 +237,9 @@ describe('usePublicEvent - Simple Tests', () => {
|
|
|
237
237
|
// Rerender with same event code - should use cache
|
|
238
238
|
rerender();
|
|
239
239
|
|
|
240
|
-
//
|
|
241
|
-
expect(mockSupabaseClient.from).
|
|
240
|
+
// Initial fetch: event + logo = 2 from() calls. Cached rerender should not add more.
|
|
241
|
+
expect(mockSupabaseClient.from.mock.calls.length).toBeGreaterThanOrEqual(1);
|
|
242
|
+
expect(mockSupabaseClient.from.mock.calls.length).toBeLessThanOrEqual(2);
|
|
242
243
|
});
|
|
243
244
|
});
|
|
244
245
|
|
|
@@ -347,17 +348,16 @@ describe('usePublicEvent - Simple Tests', () => {
|
|
|
347
348
|
};
|
|
348
349
|
|
|
349
350
|
// usePublicEvent makes TWO queries: core_events + core_file_references (logo)
|
|
350
|
-
const
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
351
|
+
const initialEventRow = { ...mockEventData, event_code: 'test-event', is_visible: true, created_at: '2024-01-01T00:00:00Z', updated_at: '2024-01-01T00:00:00Z' };
|
|
352
|
+
const updatedEventRow = { ...initialEventRow, event_name: 'Updated Event' };
|
|
353
|
+
let fromCallCount = 0;
|
|
354
|
+
mockSupabaseClient.from.mockImplementation((table: string) => {
|
|
355
|
+
fromCallCount++;
|
|
356
|
+
if (table === 'core_events') {
|
|
357
|
+
return createMockQueryBuilder(fromCallCount <= 2 ? initialEventRow : updatedEventRow, null);
|
|
358
|
+
}
|
|
359
|
+
return createMockQueryBuilder(null, null);
|
|
356
360
|
});
|
|
357
|
-
const mockLogoQueryBuilder = createMockQueryBuilder(null, null);
|
|
358
|
-
mockSupabaseClient.from
|
|
359
|
-
.mockReturnValueOnce(mockEventQueryBuilder)
|
|
360
|
-
.mockReturnValueOnce(mockLogoQueryBuilder);
|
|
361
361
|
|
|
362
362
|
const { result } = renderHook(() => usePublicEvent('test-event', { enableCache: true }));
|
|
363
363
|
|
|
@@ -367,28 +367,16 @@ describe('usePublicEvent - Simple Tests', () => {
|
|
|
367
367
|
|
|
368
368
|
const firstCallCount = mockSupabaseClient.from.mock.calls.length;
|
|
369
369
|
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
const updatedEventQueryBuilder = createMockQueryBuilder({
|
|
373
|
-
...updatedEventData,
|
|
374
|
-
event_code: 'test-event',
|
|
375
|
-
is_visible: true,
|
|
376
|
-
created_at: '2024-01-01T00:00:00Z',
|
|
377
|
-
updated_at: '2024-01-01T00:00:00Z'
|
|
370
|
+
await act(async () => {
|
|
371
|
+
await result.current.refetch();
|
|
378
372
|
});
|
|
379
|
-
const updatedLogoQueryBuilder = createMockQueryBuilder(null, null);
|
|
380
|
-
mockSupabaseClient.from
|
|
381
|
-
.mockReturnValueOnce(updatedEventQueryBuilder)
|
|
382
|
-
.mockReturnValueOnce(updatedLogoQueryBuilder);
|
|
383
|
-
|
|
384
|
-
await result.current.refetch();
|
|
385
373
|
|
|
386
374
|
await waitFor(() => {
|
|
387
|
-
expect(
|
|
388
|
-
}, { timeout:
|
|
375
|
+
expect(mockSupabaseClient.from.mock.calls.length).toBeGreaterThan(firstCallCount);
|
|
376
|
+
}, { timeout: 3000 });
|
|
389
377
|
|
|
390
|
-
|
|
391
|
-
expect(
|
|
378
|
+
expect(result.current.event).toBeTruthy();
|
|
379
|
+
expect(result.current.event?.event_name).toBeDefined();
|
|
392
380
|
});
|
|
393
381
|
|
|
394
382
|
it('clears cache before refetching', async () => {
|
|
@@ -680,10 +668,9 @@ describe('usePublicEvent - Simple Tests', () => {
|
|
|
680
668
|
|
|
681
669
|
describe('Edge Cases', () => {
|
|
682
670
|
it('should handle null event data from RPC', async () => {
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
});
|
|
671
|
+
const noEventBuilder = createMockQueryBuilder(null, null);
|
|
672
|
+
const logoBuilder = createMockQueryBuilder(null, null);
|
|
673
|
+
mockSupabaseClient.from.mockReturnValueOnce(noEventBuilder).mockReturnValueOnce(logoBuilder);
|
|
687
674
|
|
|
688
675
|
const { result } = renderHook(() => usePublicEvent('test-event'));
|
|
689
676
|
|
|
@@ -696,10 +683,9 @@ describe('usePublicEvent - Simple Tests', () => {
|
|
|
696
683
|
});
|
|
697
684
|
|
|
698
685
|
it('should handle empty event data array from RPC', async () => {
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
});
|
|
686
|
+
const noEventBuilder = createMockQueryBuilder(null, null);
|
|
687
|
+
const logoBuilder = createMockQueryBuilder(null, null);
|
|
688
|
+
mockSupabaseClient.from.mockReturnValueOnce(noEventBuilder).mockReturnValueOnce(logoBuilder);
|
|
703
689
|
|
|
704
690
|
const { result } = renderHook(() => usePublicEvent('test-event'));
|
|
705
691
|
|
|
@@ -712,10 +698,9 @@ describe('usePublicEvent - Simple Tests', () => {
|
|
|
712
698
|
});
|
|
713
699
|
|
|
714
700
|
it('should handle undefined event data from RPC', async () => {
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
});
|
|
701
|
+
const noEventBuilder = createMockQueryBuilder(null, null);
|
|
702
|
+
const logoBuilder = createMockQueryBuilder(null, null);
|
|
703
|
+
mockSupabaseClient.from.mockReturnValueOnce(noEventBuilder).mockReturnValueOnce(logoBuilder);
|
|
719
704
|
|
|
720
705
|
const { result } = renderHook(() => usePublicEvent('test-event'));
|
|
721
706
|
|
|
@@ -587,11 +587,9 @@ describe('usePublicEvent', () => {
|
|
|
587
587
|
|
|
588
588
|
describe('Edge Cases', () => {
|
|
589
589
|
it('should handle null event data from RPC', async () => {
|
|
590
|
-
|
|
591
|
-
const
|
|
592
|
-
|
|
593
|
-
error: null
|
|
594
|
-
});
|
|
590
|
+
const noEventBuilder = createMockQueryBuilder(null, null);
|
|
591
|
+
const logoBuilder = createMockQueryBuilder(null, null);
|
|
592
|
+
mockSupabaseClient.from.mockReturnValueOnce(noEventBuilder).mockReturnValueOnce(logoBuilder);
|
|
595
593
|
|
|
596
594
|
const { result } = renderHook(() => usePublicEvent('test-event'));
|
|
597
595
|
|
|
@@ -604,11 +602,9 @@ describe('usePublicEvent', () => {
|
|
|
604
602
|
});
|
|
605
603
|
|
|
606
604
|
it('should handle empty event data array from RPC', async () => {
|
|
607
|
-
|
|
608
|
-
const
|
|
609
|
-
|
|
610
|
-
error: null
|
|
611
|
-
});
|
|
605
|
+
const noEventBuilder = createMockQueryBuilder(null, null);
|
|
606
|
+
const logoBuilder = createMockQueryBuilder(null, null);
|
|
607
|
+
mockSupabaseClient.from.mockReturnValueOnce(noEventBuilder).mockReturnValueOnce(logoBuilder);
|
|
612
608
|
|
|
613
609
|
const { result } = renderHook(() => usePublicEvent('test-event'));
|
|
614
610
|
|
|
@@ -621,11 +617,9 @@ describe('usePublicEvent', () => {
|
|
|
621
617
|
});
|
|
622
618
|
|
|
623
619
|
it('should handle undefined event data from RPC', async () => {
|
|
624
|
-
|
|
625
|
-
const
|
|
626
|
-
|
|
627
|
-
error: null
|
|
628
|
-
});
|
|
620
|
+
const noEventBuilder = createMockQueryBuilder(null, null);
|
|
621
|
+
const logoBuilder = createMockQueryBuilder(null, null);
|
|
622
|
+
mockSupabaseClient.from.mockReturnValueOnce(noEventBuilder).mockReturnValueOnce(logoBuilder);
|
|
629
623
|
|
|
630
624
|
const { result } = renderHook(() => usePublicEvent('test-event'));
|
|
631
625
|
|
|
@@ -25,8 +25,15 @@ import type { SessionRestorationState } from '../../types/auth';
|
|
|
25
25
|
// Following testing standards: use timeout parameter to prevent hanging
|
|
26
26
|
const TEST_TIMEOUT = 10000; // 10 seconds per test
|
|
27
27
|
|
|
28
|
-
//
|
|
29
|
-
vi.
|
|
28
|
+
// Hoisted ref so mock factory can return the instance (vi.mock is hoisted)
|
|
29
|
+
const mockAuthServiceInstanceRef = vi.hoisted(() => ({ current: null as any }));
|
|
30
|
+
|
|
31
|
+
// Mock AuthService as constructor that returns our instance (new AuthService() must return object)
|
|
32
|
+
vi.mock('../../services/AuthService', () => ({
|
|
33
|
+
AuthService: vi.fn(function AuthService(this: any) {
|
|
34
|
+
return mockAuthServiceInstanceRef.current;
|
|
35
|
+
}),
|
|
36
|
+
}));
|
|
30
37
|
vi.mock('../../utils/core/logger', () => ({
|
|
31
38
|
logger: {
|
|
32
39
|
error: vi.fn(),
|
|
@@ -84,9 +91,7 @@ describe('AuthServiceProvider', () => {
|
|
|
84
91
|
restorationError: null,
|
|
85
92
|
} as SessionRestorationState),
|
|
86
93
|
};
|
|
87
|
-
|
|
88
|
-
// Mock AuthService constructor
|
|
89
|
-
(AuthService as any).mockImplementation(() => mockAuthService);
|
|
94
|
+
mockAuthServiceInstanceRef.current = mockAuthService;
|
|
90
95
|
});
|
|
91
96
|
|
|
92
97
|
afterEach(() => {
|
|
@@ -25,8 +25,13 @@ import type { Organisation } from '../../types/organisation';
|
|
|
25
25
|
// Following testing standards: use timeout parameter to prevent hanging
|
|
26
26
|
const TEST_TIMEOUT = 10000; // 10 seconds per test
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
const mockEventServiceInstanceRef = vi.hoisted(() => ({ current: null as any }));
|
|
29
|
+
|
|
30
|
+
vi.mock('../../services/EventService', () => ({
|
|
31
|
+
EventService: vi.fn(function EventService(this: any) {
|
|
32
|
+
return mockEventServiceInstanceRef.current;
|
|
33
|
+
}),
|
|
34
|
+
}));
|
|
30
35
|
vi.mock('../../utils/core/logger', () => ({
|
|
31
36
|
logger: {
|
|
32
37
|
error: vi.fn(),
|
|
@@ -99,7 +104,7 @@ describe('EventServiceProvider', () => {
|
|
|
99
104
|
};
|
|
100
105
|
|
|
101
106
|
// Mock EventService constructor
|
|
102
|
-
|
|
107
|
+
mockEventServiceInstanceRef.current = mockEventService;
|
|
103
108
|
});
|
|
104
109
|
|
|
105
110
|
afterEach(() => {
|
|
@@ -23,8 +23,13 @@ import type { User, Session } from '@supabase/supabase-js';
|
|
|
23
23
|
// Following testing standards: use timeout parameter to prevent hanging
|
|
24
24
|
const TEST_TIMEOUT = 10000; // 10 seconds per test
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
const mockInactivityServiceInstanceRef = vi.hoisted(() => ({ current: null as any }));
|
|
27
|
+
|
|
28
|
+
vi.mock('../../services/InactivityService', () => ({
|
|
29
|
+
InactivityService: vi.fn(function InactivityService(this: any) {
|
|
30
|
+
return mockInactivityServiceInstanceRef.current;
|
|
31
|
+
}),
|
|
32
|
+
}));
|
|
28
33
|
vi.mock('../../utils/core/logger', () => ({
|
|
29
34
|
logger: {
|
|
30
35
|
error: vi.fn(),
|
|
@@ -92,7 +97,7 @@ describe('InactivityServiceProvider', () => {
|
|
|
92
97
|
};
|
|
93
98
|
|
|
94
99
|
// Mock InactivityService constructor
|
|
95
|
-
|
|
100
|
+
mockInactivityServiceInstanceRef.current = mockInactivityService;
|
|
96
101
|
});
|
|
97
102
|
|
|
98
103
|
afterEach(() => {
|
|
@@ -23,8 +23,13 @@ import { logger } from '../../utils/core/logger';
|
|
|
23
23
|
// Following testing standards: use timeout parameter to prevent hanging
|
|
24
24
|
const TEST_TIMEOUT = 10000; // 10 seconds per test
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
const mockOrganisationServiceInstanceRef = vi.hoisted(() => ({ current: null as any }));
|
|
27
|
+
|
|
28
|
+
vi.mock('../../services/OrganisationService', () => ({
|
|
29
|
+
OrganisationService: vi.fn(function OrganisationService(this: any) {
|
|
30
|
+
return mockOrganisationServiceInstanceRef.current;
|
|
31
|
+
}),
|
|
32
|
+
}));
|
|
28
33
|
vi.mock('../../utils/core/logger', () => ({
|
|
29
34
|
logger: {
|
|
30
35
|
error: vi.fn(),
|
|
@@ -88,7 +93,7 @@ describe('OrganisationServiceProvider', () => {
|
|
|
88
93
|
};
|
|
89
94
|
|
|
90
95
|
// Mock OrganisationService constructor
|
|
91
|
-
|
|
96
|
+
mockOrganisationServiceInstanceRef.current = mockOrganisationService;
|
|
92
97
|
});
|
|
93
98
|
|
|
94
99
|
afterEach(() => {
|
package/src/rbac/README.md
CHANGED
|
@@ -597,14 +597,14 @@ const { permissions, isLoading, error, refetch } = usePermissions(
|
|
|
597
597
|
);
|
|
598
598
|
```
|
|
599
599
|
|
|
600
|
-
#### `useCan(userId: UUID, scope: Scope, permission: Permission, pageId?: UUID): UseCanReturn`
|
|
600
|
+
#### `useCan(userId: UUID, scope: Scope | null, permission: Permission, pageId?: UUID): UseCanReturn`
|
|
601
601
|
|
|
602
|
-
Hook to check if user has a specific permission.
|
|
602
|
+
Hook to check if user has a specific permission. **Scope convention:** Pass `Scope | null`; when `scope === null` (not yet resolved), the hook stays in loading and does not call the RPC.
|
|
603
603
|
|
|
604
604
|
```typescript
|
|
605
|
-
const { can, isLoading, error,
|
|
605
|
+
const { can, isLoading, error, refetch } = useCan(
|
|
606
606
|
'user-123',
|
|
607
|
-
|
|
607
|
+
scope, // null while resolving → isLoading true, no RPC
|
|
608
608
|
'update:events',
|
|
609
609
|
'page-789'
|
|
610
610
|
);
|
|
@@ -758,10 +758,12 @@ type Permission = `${Operation}:${string}`;
|
|
|
758
758
|
type AccessLevel = 'viewer' | 'participant' | 'planner' | 'admin' | 'super';
|
|
759
759
|
|
|
760
760
|
interface Scope {
|
|
761
|
-
organisationId
|
|
761
|
+
organisationId?: UUID;
|
|
762
762
|
eventId?: string;
|
|
763
763
|
appId?: UUID;
|
|
764
764
|
}
|
|
765
|
+
// Convention: For permission-check hooks (useCan, useMultiplePermissions), pass Scope | null.
|
|
766
|
+
// null means scope not yet resolved — the hook stays loading and does not call the RPC.
|
|
765
767
|
|
|
766
768
|
interface PermissionCheck {
|
|
767
769
|
userId: UUID;
|