@jmruthers/pace-core 0.5.150 → 0.5.154
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-NRDKCKSX.js → chunk-UM4TRLQG.js} +70 -5
- package/dist/chunk-UM4TRLQG.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 +95 -5
- package/dist/chunk-NRDKCKSX.js.map +0 -1
package/docs/api/modules.md
CHANGED
package/package.json
CHANGED
|
@@ -457,23 +457,83 @@ export const NavigationMenu = React.forwardRef<
|
|
|
457
457
|
selectedEventId: filterByPermissions ? (selectedEvent?.event_id || null) : null
|
|
458
458
|
});
|
|
459
459
|
|
|
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]);
|
|
499
|
+
|
|
460
500
|
// Build scope from resolvedScope if available, otherwise fall back to context values
|
|
461
501
|
// This handles the case where useResolvedScope errored initially but context is now ready
|
|
502
|
+
// IMPORTANT: We need appId for usePermissions to work correctly
|
|
462
503
|
const effectiveScope = React.useMemo(() => {
|
|
463
504
|
if (!scopeLoading && resolvedScope?.organisationId) {
|
|
464
|
-
// Use resolved scope if available
|
|
505
|
+
// Use resolved scope if available (includes appId)
|
|
506
|
+
logger.warn('NavigationMenu', 'Using resolvedScope', {
|
|
507
|
+
organisationId: resolvedScope.organisationId,
|
|
508
|
+
eventId: resolvedScope.eventId,
|
|
509
|
+
appId: resolvedScope.appId
|
|
510
|
+
});
|
|
465
511
|
return resolvedScope;
|
|
466
512
|
} else if (!scopeLoading && selectedOrganisation?.id) {
|
|
467
513
|
// Fall back to building scope from context if resolvedScope is null but context is ready
|
|
468
|
-
//
|
|
469
|
-
|
|
514
|
+
// Use resolvedAppId if we've resolved it, otherwise undefined (usePermissions will try to resolve)
|
|
515
|
+
const fallbackScope = {
|
|
470
516
|
organisationId: selectedOrganisation.id,
|
|
471
517
|
eventId: selectedEvent?.event_id || undefined,
|
|
472
|
-
appId:
|
|
518
|
+
appId: resolvedAppId
|
|
473
519
|
};
|
|
520
|
+
logger.warn('NavigationMenu', 'Using fallback scope', {
|
|
521
|
+
organisationId: fallbackScope.organisationId,
|
|
522
|
+
eventId: fallbackScope.eventId,
|
|
523
|
+
appId: fallbackScope.appId,
|
|
524
|
+
resolvedAppId,
|
|
525
|
+
hasResolvedScope: !!resolvedScope,
|
|
526
|
+
scopeLoading
|
|
527
|
+
});
|
|
528
|
+
return fallbackScope;
|
|
474
529
|
}
|
|
530
|
+
logger.warn('NavigationMenu', 'effectiveScope is null', {
|
|
531
|
+
scopeLoading,
|
|
532
|
+
hasResolvedScope: !!resolvedScope,
|
|
533
|
+
hasSelectedOrganisation: !!selectedOrganisation?.id
|
|
534
|
+
});
|
|
475
535
|
return null;
|
|
476
|
-
}, [scopeLoading, resolvedScope, selectedOrganisation?.id, selectedEvent?.event_id]);
|
|
536
|
+
}, [scopeLoading, resolvedScope, selectedOrganisation?.id, selectedEvent?.event_id, resolvedAppId]);
|
|
477
537
|
|
|
478
538
|
// Create a stable scope object that changes when effectiveScope changes
|
|
479
539
|
// This ensures usePermissions detects scope changes and re-runs
|
|
@@ -496,10 +556,40 @@ export const NavigationMenu = React.forwardRef<
|
|
|
496
556
|
|
|
497
557
|
// Get permissions map for synchronous permission checks
|
|
498
558
|
const userId = authContext?.user?.id || '';
|
|
559
|
+
|
|
560
|
+
// Debug logging to understand why usePermissions returns empty map
|
|
561
|
+
React.useEffect(() => {
|
|
562
|
+
if (filterByPermissions && stableScope.organisationId) {
|
|
563
|
+
logger.warn('NavigationMenu', 'usePermissions scope', {
|
|
564
|
+
userId,
|
|
565
|
+
scope: stableScope,
|
|
566
|
+
hasOrganisationId: !!stableScope.organisationId,
|
|
567
|
+
hasEventId: !!stableScope.eventId,
|
|
568
|
+
hasAppId: !!stableScope.appId,
|
|
569
|
+
organisationId: stableScope.organisationId,
|
|
570
|
+
eventId: stableScope.eventId,
|
|
571
|
+
appId: stableScope.appId
|
|
572
|
+
});
|
|
573
|
+
}
|
|
574
|
+
}, [filterByPermissions, stableScope.organisationId, stableScope.eventId, stableScope.appId, userId]);
|
|
575
|
+
|
|
499
576
|
const { permissions: permissionMap, hasAnyPermission, isLoading: permissionsLoading, error: permissionsError } = usePermissions(
|
|
500
577
|
userId as any,
|
|
501
578
|
stableScope as any
|
|
502
579
|
);
|
|
580
|
+
|
|
581
|
+
// Debug logging for permission map state
|
|
582
|
+
React.useEffect(() => {
|
|
583
|
+
if (filterByPermissions) {
|
|
584
|
+
logger.warn('NavigationMenu', 'usePermissions result', {
|
|
585
|
+
permissionMapSize: permissionMap ? Object.keys(permissionMap).length : 0,
|
|
586
|
+
isLoading: permissionsLoading,
|
|
587
|
+
error: permissionsError?.message,
|
|
588
|
+
hasError: !!permissionsError,
|
|
589
|
+
scope: stableScope
|
|
590
|
+
});
|
|
591
|
+
}
|
|
592
|
+
}, [filterByPermissions, permissionMap, permissionsLoading, permissionsError, stableScope]);
|
|
503
593
|
|
|
504
594
|
// NEW: Phase 2 - Enhanced Security Features
|
|
505
595
|
// Filter navigation items based on permissions using RBAC hooks
|