@jmruthers/pace-core 0.5.149 → 0.5.152
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/{chunk-ZEPHPGHZ.js → chunk-UHNMAVK4.js} +37 -28
- package/dist/chunk-UHNMAVK4.js.map +1 -0
- package/dist/components.js +1 -1
- package/dist/index.js +1 -1
- package/docs/api/classes/ColumnFactory.md +1 -1
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/InvalidScopeError.md +1 -1
- package/docs/api/classes/MissingUserContextError.md +1 -1
- package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
- package/docs/api/classes/PermissionDeniedError.md +1 -1
- package/docs/api/classes/PublicErrorBoundary.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 +1 -1
- package/docs/api/classes/RBACError.md +1 -1
- package/docs/api/classes/RBACNotInitializedError.md +1 -1
- package/docs/api/classes/SecureSupabaseClient.md +1 -1
- package/docs/api/classes/StorageUtils.md +1 -1
- package/docs/api/enums/FileCategory.md +1 -1
- package/docs/api/interfaces/AggregateConfig.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 +1 -1
- 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/DataAccessRecord.md +1 -1
- 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/EmptyStateConfig.md +1 -1
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
- package/docs/api/interfaces/EventAppRoleData.md +1 -1
- package/docs/api/interfaces/EventLogoProps.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 +1 -1
- package/docs/api/interfaces/FileMetadata.md +1 -1
- package/docs/api/interfaces/FileReference.md +1 -1
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadOptions.md +1 -1
- package/docs/api/interfaces/FileUploadProps.md +1 -1
- package/docs/api/interfaces/FooterProps.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/LoginFormProps.md +1 -1
- package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
- package/docs/api/interfaces/NavigationContextType.md +1 -1
- package/docs/api/interfaces/NavigationGuardProps.md +1 -1
- package/docs/api/interfaces/NavigationItem.md +1 -1
- package/docs/api/interfaces/NavigationMenuProps.md +1 -1
- package/docs/api/interfaces/NavigationProviderProps.md +1 -1
- 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 +1 -1
- package/docs/api/interfaces/PagePermissionContextType.md +1 -1
- package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
- package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
- package/docs/api/interfaces/ProtectedRouteProps.md +1 -1
- package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
- package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
- package/docs/api/interfaces/PublicLoadingSpinnerProps.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/RBACConfig.md +1 -1
- package/docs/api/interfaces/RBACLogger.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 +1 -1
- package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
- package/docs/api/interfaces/RoleManagementResult.md +1 -1
- package/docs/api/interfaces/RouteAccessRecord.md +1 -1
- package/docs/api/interfaces/RouteConfig.md +1 -1
- package/docs/api/interfaces/SecureDataContextType.md +1 -1
- package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
- package/docs/api/interfaces/SessionRestorationLoaderProps.md +1 -1
- package/docs/api/interfaces/StorageConfig.md +1 -1
- package/docs/api/interfaces/StorageFileInfo.md +1 -1
- package/docs/api/interfaces/StorageFileMetadata.md +1 -1
- package/docs/api/interfaces/StorageListOptions.md +1 -1
- package/docs/api/interfaces/StorageListResult.md +1 -1
- package/docs/api/interfaces/StorageUploadOptions.md +1 -1
- package/docs/api/interfaces/StorageUploadResult.md +1 -1
- package/docs/api/interfaces/StorageUrlOptions.md +1 -1
- package/docs/api/interfaces/StyleImport.md +1 -1
- package/docs/api/interfaces/SwitchProps.md +1 -1
- package/docs/api/interfaces/TabsContentProps.md +1 -1
- package/docs/api/interfaces/TabsListProps.md +1 -1
- package/docs/api/interfaces/TabsProps.md +1 -1
- package/docs/api/interfaces/TabsTriggerProps.md +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 +1 -1
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerReturn.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 +1 -1
- package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
- package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
- package/docs/api/interfaces/UserEventAccess.md +1 -1
- package/docs/api/interfaces/UserMenuProps.md +1 -1
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +2 -2
- package/package.json +1 -1
- package/src/components/NavigationMenu/NavigationMenu.tsx +60 -41
- package/dist/chunk-ZEPHPGHZ.js.map +0 -1
package/docs/api/modules.md
CHANGED
package/package.json
CHANGED
|
@@ -457,64 +457,83 @@ export const NavigationMenu = React.forwardRef<
|
|
|
457
457
|
selectedEventId: filterByPermissions ? (selectedEvent?.event_id || null) : null
|
|
458
458
|
});
|
|
459
459
|
|
|
460
|
-
//
|
|
461
|
-
// This
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
460
|
+
// Resolve appId when useResolvedScope fails but context is ready
|
|
461
|
+
// This is needed because usePermissions requires appId to fetch permissions correctly
|
|
462
|
+
const [resolvedAppId, setResolvedAppId] = React.useState<string | undefined>(undefined);
|
|
463
|
+
React.useEffect(() => {
|
|
464
|
+
// Only resolve appId if:
|
|
465
|
+
// 1. useResolvedScope errored or returned null
|
|
466
|
+
// 2. But we have organisation context ready
|
|
467
|
+
// 3. And we have appName from authContext
|
|
468
|
+
// 4. And we haven't resolved it yet
|
|
469
|
+
if (
|
|
470
|
+
!scopeLoading &&
|
|
471
|
+
!resolvedScope?.appId &&
|
|
472
|
+
selectedOrganisation?.id &&
|
|
473
|
+
authContext?.appName &&
|
|
474
|
+
authContext?.user?.id &&
|
|
475
|
+
!resolvedAppId
|
|
476
|
+
) {
|
|
477
|
+
// Resolve appId using the same method as useRBAC
|
|
478
|
+
// Double-check user exists (TypeScript narrowing) and capture values
|
|
479
|
+
if (!authContext.user || !authContext.appName) {
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
const userId = authContext.user.id;
|
|
483
|
+
const appName = authContext.appName;
|
|
484
|
+
import('../../rbac/api').then(({ resolveAppContext }) => {
|
|
485
|
+
resolveAppContext({
|
|
486
|
+
userId,
|
|
487
|
+
appName
|
|
488
|
+
}).then((result) => {
|
|
489
|
+
if (result?.appId) {
|
|
490
|
+
setResolvedAppId(result.appId);
|
|
491
|
+
}
|
|
492
|
+
}).catch((error) => {
|
|
493
|
+
// Silently fail - usePermissions will handle it
|
|
494
|
+
logger.debug('NavigationMenu', 'Failed to resolve appId', error);
|
|
495
|
+
});
|
|
496
|
+
});
|
|
497
|
+
}
|
|
498
|
+
}, [scopeLoading, resolvedScope?.appId, selectedOrganisation?.id, authContext?.appName, authContext?.user?.id, resolvedAppId]);
|
|
469
499
|
|
|
470
500
|
// Build scope from resolvedScope if available, otherwise fall back to context values
|
|
471
501
|
// This handles the case where useResolvedScope errored initially but context is now ready
|
|
502
|
+
// IMPORTANT: We need appId for usePermissions to work correctly
|
|
472
503
|
const effectiveScope = React.useMemo(() => {
|
|
473
504
|
if (!scopeLoading && resolvedScope?.organisationId) {
|
|
474
|
-
// Use resolved scope if available
|
|
505
|
+
// Use resolved scope if available (includes appId)
|
|
475
506
|
return resolvedScope;
|
|
476
507
|
} else if (!scopeLoading && selectedOrganisation?.id) {
|
|
477
508
|
// Fall back to building scope from context if resolvedScope is null but context is ready
|
|
478
|
-
//
|
|
509
|
+
// Use resolvedAppId if we've resolved it, otherwise undefined (usePermissions will try to resolve)
|
|
479
510
|
return {
|
|
480
511
|
organisationId: selectedOrganisation.id,
|
|
481
512
|
eventId: selectedEvent?.event_id || undefined,
|
|
482
|
-
appId:
|
|
513
|
+
appId: resolvedAppId
|
|
483
514
|
};
|
|
484
515
|
}
|
|
485
516
|
return null;
|
|
486
|
-
}, [scopeLoading, resolvedScope, selectedOrganisation?.id, selectedEvent?.event_id]);
|
|
517
|
+
}, [scopeLoading, resolvedScope, selectedOrganisation?.id, selectedEvent?.event_id, resolvedAppId]);
|
|
487
518
|
|
|
488
|
-
//
|
|
489
|
-
// This
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
stableScopeRef.current.eventId !== newEventId ||
|
|
498
|
-
stableScopeRef.current.appId !== newAppId) {
|
|
499
|
-
stableScopeRef.current = {
|
|
500
|
-
organisationId: newOrgId,
|
|
501
|
-
eventId: newEventId,
|
|
502
|
-
appId: newAppId
|
|
503
|
-
};
|
|
504
|
-
}
|
|
505
|
-
} else if (!scopeLoading && !effectiveScope) {
|
|
506
|
-
// Only reset if we had a previous value and scope is resolved - don't clear during loading
|
|
507
|
-
if (stableScopeRef.current.organisationId !== '') {
|
|
508
|
-
stableScopeRef.current = {
|
|
509
|
-
organisationId: '',
|
|
510
|
-
eventId: undefined,
|
|
511
|
-
appId: undefined
|
|
519
|
+
// Create a stable scope object that changes when effectiveScope changes
|
|
520
|
+
// This ensures usePermissions detects scope changes and re-runs
|
|
521
|
+
// We memoize it to prevent unnecessary re-renders while still triggering usePermissions when scope changes
|
|
522
|
+
const stableScope = React.useMemo(() => {
|
|
523
|
+
if (effectiveScope?.organisationId) {
|
|
524
|
+
return {
|
|
525
|
+
organisationId: effectiveScope.organisationId,
|
|
526
|
+
eventId: effectiveScope.eventId,
|
|
527
|
+
appId: effectiveScope.appId
|
|
512
528
|
};
|
|
513
529
|
}
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
530
|
+
// Return empty scope object (not null) so usePermissions can handle it
|
|
531
|
+
return {
|
|
532
|
+
organisationId: '',
|
|
533
|
+
eventId: undefined,
|
|
534
|
+
appId: undefined
|
|
535
|
+
};
|
|
536
|
+
}, [effectiveScope?.organisationId, effectiveScope?.eventId, effectiveScope?.appId]);
|
|
518
537
|
|
|
519
538
|
// Get permissions map for synchronous permission checks
|
|
520
539
|
const userId = authContext?.user?.id || '';
|