@jmruthers/pace-core 0.5.155 → 0.5.157
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-6G3KTRE2.js → DataTable-ETXX7VK2.js} +3 -3
- package/dist/{chunk-RF6SUNXB.js → chunk-5K6IGAVZ.js} +2 -2
- package/dist/{chunk-I63KPRGZ.js → chunk-DWOXTTW7.js} +44 -6
- package/dist/chunk-DWOXTTW7.js.map +1 -0
- package/dist/{chunk-XXFXL7A5.js → chunk-UBTXIMLS.js} +2 -2
- package/dist/{chunk-4MBPFXR4.js → chunk-ZYGBJWTB.js} +22 -5
- package/dist/chunk-ZYGBJWTB.js.map +1 -0
- package/dist/components.js +3 -3
- package/dist/index.js +4 -4
- package/dist/rbac/index.js +2 -2
- package/dist/utils.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 +8 -8
- package/package.json +3 -2
- package/src/components/NavigationMenu/NavigationMenu.tsx +26 -3
- package/src/rbac/hooks/usePermissions.ts +45 -3
- package/dist/chunk-4MBPFXR4.js.map +0 -1
- package/dist/chunk-I63KPRGZ.js.map +0 -1
- /package/dist/{DataTable-6G3KTRE2.js.map → DataTable-ETXX7VK2.js.map} +0 -0
- /package/dist/{chunk-RF6SUNXB.js.map → chunk-5K6IGAVZ.js.map} +0 -0
- /package/dist/{chunk-XXFXL7A5.js.map → chunk-UBTXIMLS.js.map} +0 -0
package/docs/api/modules.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
[@jmruthers/pace-core - v0.5.
|
|
1
|
+
[@jmruthers/pace-core - v0.5.157](README.md) / Exports
|
|
2
2
|
|
|
3
|
-
# @jmruthers/pace-core - v0.5.
|
|
3
|
+
# @jmruthers/pace-core - v0.5.157
|
|
4
4
|
|
|
5
5
|
**`File`**
|
|
6
6
|
|
|
@@ -6673,7 +6673,7 @@ function MyComponent() {
|
|
|
6673
6673
|
|
|
6674
6674
|
#### Defined in
|
|
6675
6675
|
|
|
6676
|
-
[packages/core/src/rbac/hooks/usePermissions.ts:
|
|
6676
|
+
[packages/core/src/rbac/hooks/usePermissions.ts:262](https://github.com/jmruthers/pace-core/blob/main/packages/core/src/rbac/hooks/usePermissions.ts#L262)
|
|
6677
6677
|
|
|
6678
6678
|
___
|
|
6679
6679
|
|
|
@@ -6723,7 +6723,7 @@ function MyComponent() {
|
|
|
6723
6723
|
|
|
6724
6724
|
#### Defined in
|
|
6725
6725
|
|
|
6726
|
-
[packages/core/src/rbac/hooks/usePermissions.ts:
|
|
6726
|
+
[packages/core/src/rbac/hooks/usePermissions.ts:458](https://github.com/jmruthers/pace-core/blob/main/packages/core/src/rbac/hooks/usePermissions.ts#L458)
|
|
6727
6727
|
|
|
6728
6728
|
___
|
|
6729
6729
|
|
|
@@ -6780,7 +6780,7 @@ function MyComponent() {
|
|
|
6780
6780
|
|
|
6781
6781
|
#### Defined in
|
|
6782
6782
|
|
|
6783
|
-
[packages/core/src/rbac/hooks/usePermissions.ts:
|
|
6783
|
+
[packages/core/src/rbac/hooks/usePermissions.ts:533](https://github.com/jmruthers/pace-core/blob/main/packages/core/src/rbac/hooks/usePermissions.ts#L533)
|
|
6784
6784
|
|
|
6785
6785
|
___
|
|
6786
6786
|
|
|
@@ -6831,7 +6831,7 @@ function MyComponent() {
|
|
|
6831
6831
|
|
|
6832
6832
|
#### Defined in
|
|
6833
6833
|
|
|
6834
|
-
[packages/core/src/rbac/hooks/usePermissions.ts:
|
|
6834
|
+
[packages/core/src/rbac/hooks/usePermissions.ts:616](https://github.com/jmruthers/pace-core/blob/main/packages/core/src/rbac/hooks/usePermissions.ts#L616)
|
|
6835
6835
|
|
|
6836
6836
|
___
|
|
6837
6837
|
|
|
@@ -6882,7 +6882,7 @@ function MyComponent() {
|
|
|
6882
6882
|
|
|
6883
6883
|
#### Defined in
|
|
6884
6884
|
|
|
6885
|
-
[packages/core/src/rbac/hooks/usePermissions.ts:
|
|
6885
|
+
[packages/core/src/rbac/hooks/usePermissions.ts:702](https://github.com/jmruthers/pace-core/blob/main/packages/core/src/rbac/hooks/usePermissions.ts#L702)
|
|
6886
6886
|
|
|
6887
6887
|
___
|
|
6888
6888
|
|
|
@@ -6933,7 +6933,7 @@ function MyComponent() {
|
|
|
6933
6933
|
|
|
6934
6934
|
#### Defined in
|
|
6935
6935
|
|
|
6936
|
-
[packages/core/src/rbac/hooks/usePermissions.ts:
|
|
6936
|
+
[packages/core/src/rbac/hooks/usePermissions.ts:787](https://github.com/jmruthers/pace-core/blob/main/packages/core/src/rbac/hooks/usePermissions.ts#L787)
|
|
6937
6937
|
|
|
6938
6938
|
___
|
|
6939
6939
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jmruthers/pace-core",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.157",
|
|
4
4
|
"description": "Clean, modern React component library with Tailwind v4 styling and native utilities",
|
|
5
5
|
"private": false,
|
|
6
6
|
"publishConfig": {
|
|
@@ -143,7 +143,8 @@
|
|
|
143
143
|
"scripts": {
|
|
144
144
|
"_comment_build": "Build package and documentation",
|
|
145
145
|
"build": "tsup && node scripts/build-css.js",
|
|
146
|
-
"build:docs": "
|
|
146
|
+
"build:docs": "node scripts/build-docs-incremental.js",
|
|
147
|
+
"build:docs:force": "node scripts/build-docs-incremental.js --force",
|
|
147
148
|
"build:all": "npm run build && npm run build:docs",
|
|
148
149
|
"validate:theme": "node scripts/validate-theme.js",
|
|
149
150
|
"prepublishOnly": "npm run build:all",
|
|
@@ -538,7 +538,12 @@ export const NavigationMenu = React.forwardRef<
|
|
|
538
538
|
// Create a stable scope object that changes when effectiveScope changes
|
|
539
539
|
// This ensures usePermissions detects scope changes and re-runs
|
|
540
540
|
// We memoize it to prevent unnecessary re-renders while still triggering usePermissions when scope changes
|
|
541
|
-
// IMPORTANT:
|
|
541
|
+
// IMPORTANT: Use a string key for dependencies to ensure React detects changes
|
|
542
|
+
// This is more reliable than depending on the object itself
|
|
543
|
+
const scopeKey = effectiveScope
|
|
544
|
+
? `${effectiveScope.organisationId || ''}-${effectiveScope.eventId || ''}-${effectiveScope.appId || ''}`
|
|
545
|
+
: 'empty';
|
|
546
|
+
|
|
542
547
|
const stableScope = React.useMemo(() => {
|
|
543
548
|
if (effectiveScope?.organisationId) {
|
|
544
549
|
const scope = {
|
|
@@ -552,17 +557,23 @@ export const NavigationMenu = React.forwardRef<
|
|
|
552
557
|
stableScopeAppId: scope.appId,
|
|
553
558
|
hasAppId: !!scope.appId,
|
|
554
559
|
organisationId: scope.organisationId,
|
|
555
|
-
eventId: scope.eventId
|
|
560
|
+
eventId: scope.eventId,
|
|
561
|
+
scopeKey
|
|
556
562
|
});
|
|
557
563
|
return scope;
|
|
558
564
|
}
|
|
559
565
|
// Return empty scope object (not null) so usePermissions can handle it
|
|
566
|
+
logger.warn('NavigationMenu', 'stableScope is empty (no effectiveScope)', {
|
|
567
|
+
hasEffectiveScope: !!effectiveScope,
|
|
568
|
+
effectiveScopeOrgId: effectiveScope?.organisationId,
|
|
569
|
+
scopeKey
|
|
570
|
+
});
|
|
560
571
|
return {
|
|
561
572
|
organisationId: '',
|
|
562
573
|
eventId: undefined,
|
|
563
574
|
appId: undefined
|
|
564
575
|
};
|
|
565
|
-
}, [effectiveScope]);
|
|
576
|
+
}, [scopeKey, effectiveScope]);
|
|
566
577
|
|
|
567
578
|
// Get permissions map for synchronous permission checks
|
|
568
579
|
const userId = authContext?.user?.id || '';
|
|
@@ -583,6 +594,18 @@ export const NavigationMenu = React.forwardRef<
|
|
|
583
594
|
}
|
|
584
595
|
}, [filterByPermissions, stableScope.organisationId, stableScope.eventId, stableScope.appId, userId]);
|
|
585
596
|
|
|
597
|
+
// Log when stableScope changes to verify usePermissions receives updates
|
|
598
|
+
React.useEffect(() => {
|
|
599
|
+
if (filterByPermissions && stableScope.organisationId) {
|
|
600
|
+
logger.warn('NavigationMenu', 'Calling usePermissions with stableScope', {
|
|
601
|
+
organisationId: stableScope.organisationId,
|
|
602
|
+
eventId: stableScope.eventId,
|
|
603
|
+
appId: stableScope.appId,
|
|
604
|
+
hasAppId: !!stableScope.appId
|
|
605
|
+
});
|
|
606
|
+
}
|
|
607
|
+
}, [filterByPermissions, stableScope.organisationId, stableScope.eventId, stableScope.appId]);
|
|
608
|
+
|
|
586
609
|
const { permissions: permissionMap, hasAnyPermission, isLoading: permissionsLoading, error: permissionsError } = usePermissions(
|
|
587
610
|
userId as any,
|
|
588
611
|
stableScope as any
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* This module provides React hooks for RBAC functionality.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import { useState, useEffect, useCallback, useMemo, useRef } from 'react';
|
|
10
|
+
import React, { useState, useEffect, useCallback, useMemo, useRef } from 'react';
|
|
11
11
|
import {
|
|
12
12
|
UUID,
|
|
13
13
|
Scope,
|
|
@@ -52,6 +52,19 @@ export function usePermissions(userId: UUID, scope: Scope) {
|
|
|
52
52
|
const [isLoading, setIsLoading] = useState(true);
|
|
53
53
|
const [error, setError] = useState<Error | null>(null);
|
|
54
54
|
const isFetchingRef = useRef(false);
|
|
55
|
+
const logger = getRBACLogger();
|
|
56
|
+
|
|
57
|
+
// Log when scope changes to verify React detects the change
|
|
58
|
+
React.useEffect(() => {
|
|
59
|
+
logger.warn('[usePermissions] Scope changed', {
|
|
60
|
+
userId,
|
|
61
|
+
organisationId: scope.organisationId,
|
|
62
|
+
eventId: scope.eventId,
|
|
63
|
+
appId: scope.appId,
|
|
64
|
+
hasAppId: !!scope.appId,
|
|
65
|
+
hasOrganisationId: !!scope.organisationId
|
|
66
|
+
});
|
|
67
|
+
}, [scope.organisationId, scope.eventId, scope.appId, userId]);
|
|
55
68
|
|
|
56
69
|
// Add timeout for missing organisation context (3 seconds)
|
|
57
70
|
useEffect(() => {
|
|
@@ -73,6 +86,15 @@ export function usePermissions(userId: UUID, scope: Scope) {
|
|
|
73
86
|
const fetchPermissions = async () => {
|
|
74
87
|
// Prevent multiple simultaneous fetches
|
|
75
88
|
if (isFetchingRef.current) {
|
|
89
|
+
const logger = getRBACLogger();
|
|
90
|
+
logger.warn('[usePermissions] Skipping fetch - already fetching', {
|
|
91
|
+
userId,
|
|
92
|
+
scope: {
|
|
93
|
+
organisationId: scope.organisationId,
|
|
94
|
+
eventId: scope.eventId,
|
|
95
|
+
appId: scope.appId
|
|
96
|
+
}
|
|
97
|
+
});
|
|
76
98
|
return;
|
|
77
99
|
}
|
|
78
100
|
|
|
@@ -92,6 +114,17 @@ export function usePermissions(userId: UUID, scope: Scope) {
|
|
|
92
114
|
return;
|
|
93
115
|
}
|
|
94
116
|
|
|
117
|
+
const logger = getRBACLogger();
|
|
118
|
+
logger.warn('[usePermissions] Fetching permissions', {
|
|
119
|
+
userId,
|
|
120
|
+
scope: {
|
|
121
|
+
organisationId: scope.organisationId,
|
|
122
|
+
eventId: scope.eventId,
|
|
123
|
+
appId: scope.appId
|
|
124
|
+
},
|
|
125
|
+
hasAppId: !!scope.appId
|
|
126
|
+
});
|
|
127
|
+
|
|
95
128
|
try {
|
|
96
129
|
isFetchingRef.current = true;
|
|
97
130
|
setIsLoading(true);
|
|
@@ -100,13 +133,22 @@ export function usePermissions(userId: UUID, scope: Scope) {
|
|
|
100
133
|
// Fetch new permissions - don't clear old ones until we have new ones
|
|
101
134
|
const permissionMap = await getPermissionMap({ userId, scope });
|
|
102
135
|
|
|
136
|
+
logger.warn('[usePermissions] Permissions fetched successfully', {
|
|
137
|
+
permissionCount: Object.keys(permissionMap).length,
|
|
138
|
+
hasWildcard: !!permissionMap['*'],
|
|
139
|
+
scope: {
|
|
140
|
+
organisationId: scope.organisationId,
|
|
141
|
+
eventId: scope.eventId,
|
|
142
|
+
appId: scope.appId
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
|
|
103
146
|
// Only update permissions if fetch was successful
|
|
104
147
|
setPermissions(permissionMap);
|
|
105
148
|
} catch (err) {
|
|
106
149
|
// On error, keep existing permissions but set error state
|
|
107
150
|
// This prevents the UI from losing all items when there's a transient error
|
|
108
|
-
|
|
109
|
-
logger.error('Failed to fetch permissions:', err);
|
|
151
|
+
logger.error('[usePermissions] Failed to fetch permissions:', err);
|
|
110
152
|
setError(err instanceof Error ? err : new Error('Failed to fetch permissions'));
|
|
111
153
|
// Don't clear permissions on error - keep what we had
|
|
112
154
|
} finally {
|