@jmruthers/pace-core 0.5.158 → 0.5.160
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-J33RZUVQ.js → DataTable-AB5BBQXJ.js} +3 -3
- package/dist/{chunk-PCSNCMVD.js → chunk-3KYPEQVM.js} +2 -2
- package/dist/{chunk-YBBFFGBX.js → chunk-4XFFMXYN.js} +2 -2
- package/dist/{chunk-KMPFOZJU.js → chunk-5SS46AOR.js} +32 -25
- package/dist/chunk-5SS46AOR.js.map +1 -0
- package/dist/{chunk-M4IQISCX.js → chunk-SRASYANN.js} +20 -18
- package/dist/chunk-SRASYANN.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 +1 -1
- package/src/components/NavigationMenu/NavigationMenu.tsx +20 -17
- package/src/rbac/hooks/usePermissions.ts +35 -23
- package/dist/chunk-KMPFOZJU.js.map +0 -1
- package/dist/chunk-M4IQISCX.js.map +0 -1
- /package/dist/{DataTable-J33RZUVQ.js.map → DataTable-AB5BBQXJ.js.map} +0 -0
- /package/dist/{chunk-PCSNCMVD.js.map → chunk-3KYPEQVM.js.map} +0 -0
- /package/dist/{chunk-YBBFFGBX.js.map → chunk-4XFFMXYN.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.159](README.md) / Exports
|
|
2
2
|
|
|
3
|
-
# @jmruthers/pace-core - v0.5.
|
|
3
|
+
# @jmruthers/pace-core - v0.5.159
|
|
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:287](https://github.com/jmruthers/pace-core/blob/main/packages/core/src/rbac/hooks/usePermissions.ts#L287)
|
|
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:483](https://github.com/jmruthers/pace-core/blob/main/packages/core/src/rbac/hooks/usePermissions.ts#L483)
|
|
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:558](https://github.com/jmruthers/pace-core/blob/main/packages/core/src/rbac/hooks/usePermissions.ts#L558)
|
|
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:641](https://github.com/jmruthers/pace-core/blob/main/packages/core/src/rbac/hooks/usePermissions.ts#L641)
|
|
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:727](https://github.com/jmruthers/pace-core/blob/main/packages/core/src/rbac/hooks/usePermissions.ts#L727)
|
|
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:812](https://github.com/jmruthers/pace-core/blob/main/packages/core/src/rbac/hooks/usePermissions.ts#L812)
|
|
6937
6937
|
|
|
6938
6938
|
___
|
|
6939
6939
|
|
package/package.json
CHANGED
|
@@ -594,27 +594,30 @@ export const NavigationMenu = React.forwardRef<
|
|
|
594
594
|
}
|
|
595
595
|
}, [filterByPermissions, stableScope.organisationId, stableScope.eventId, stableScope.appId, userId]);
|
|
596
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
|
-
|
|
609
597
|
// Create a stable scope reference that React can properly track
|
|
598
|
+
// IMPORTANT: Extract individual values to ensure React detects changes
|
|
610
599
|
// This ensures usePermissions detects changes when appId changes from undefined to a value
|
|
600
|
+
const orgId = stableScope.organisationId || '';
|
|
601
|
+
const eventId = stableScope.eventId;
|
|
602
|
+
const appId = stableScope.appId;
|
|
603
|
+
|
|
611
604
|
const stableScopeForPermissions = React.useMemo(() => {
|
|
612
|
-
|
|
613
|
-
organisationId:
|
|
614
|
-
eventId:
|
|
615
|
-
appId:
|
|
605
|
+
const scope = {
|
|
606
|
+
organisationId: orgId,
|
|
607
|
+
eventId: eventId,
|
|
608
|
+
appId: appId
|
|
616
609
|
};
|
|
617
|
-
|
|
610
|
+
// Log when scope changes to verify React detects the change
|
|
611
|
+
if (filterByPermissions && scope.organisationId) {
|
|
612
|
+
logger.warn('NavigationMenu', 'stableScopeForPermissions created', {
|
|
613
|
+
organisationId: scope.organisationId,
|
|
614
|
+
eventId: scope.eventId,
|
|
615
|
+
appId: scope.appId,
|
|
616
|
+
hasAppId: !!scope.appId
|
|
617
|
+
});
|
|
618
|
+
}
|
|
619
|
+
return scope;
|
|
620
|
+
}, [filterByPermissions, orgId, eventId, appId]);
|
|
618
621
|
|
|
619
622
|
const { permissions: permissionMap, hasAnyPermission, isLoading: permissionsLoading, error: permissionsError } = usePermissions(
|
|
620
623
|
userId as any,
|
|
@@ -54,17 +54,23 @@ export function usePermissions(userId: UUID, scope: Scope) {
|
|
|
54
54
|
const isFetchingRef = useRef(false);
|
|
55
55
|
const logger = getRBACLogger();
|
|
56
56
|
|
|
57
|
+
// Extract individual values to ensure React detects changes
|
|
58
|
+
// This is critical - React compares these values, not the object reference
|
|
59
|
+
const orgId = scope.organisationId || '';
|
|
60
|
+
const eventId = scope.eventId;
|
|
61
|
+
const appId = scope.appId;
|
|
62
|
+
|
|
57
63
|
// Log when scope changes to verify React detects the change
|
|
58
64
|
React.useEffect(() => {
|
|
59
65
|
logger.warn('[usePermissions] Scope changed', {
|
|
60
66
|
userId,
|
|
61
|
-
organisationId:
|
|
62
|
-
eventId:
|
|
63
|
-
appId:
|
|
64
|
-
hasAppId: !!
|
|
65
|
-
hasOrganisationId: !!
|
|
67
|
+
organisationId: orgId,
|
|
68
|
+
eventId: eventId,
|
|
69
|
+
appId: appId,
|
|
70
|
+
hasAppId: !!appId,
|
|
71
|
+
hasOrganisationId: !!orgId
|
|
66
72
|
});
|
|
67
|
-
}, [
|
|
73
|
+
}, [orgId, eventId, appId, userId]);
|
|
68
74
|
|
|
69
75
|
// Add timeout for missing organisation context (3 seconds)
|
|
70
76
|
useEffect(() => {
|
|
@@ -86,13 +92,12 @@ export function usePermissions(userId: UUID, scope: Scope) {
|
|
|
86
92
|
const fetchPermissions = async () => {
|
|
87
93
|
// Prevent multiple simultaneous fetches
|
|
88
94
|
if (isFetchingRef.current) {
|
|
89
|
-
const logger = getRBACLogger();
|
|
90
95
|
logger.warn('[usePermissions] Skipping fetch - already fetching', {
|
|
91
96
|
userId,
|
|
92
97
|
scope: {
|
|
93
|
-
organisationId:
|
|
94
|
-
eventId:
|
|
95
|
-
appId:
|
|
98
|
+
organisationId: orgId,
|
|
99
|
+
eventId: eventId,
|
|
100
|
+
appId: appId
|
|
96
101
|
}
|
|
97
102
|
});
|
|
98
103
|
return;
|
|
@@ -107,7 +112,7 @@ export function usePermissions(userId: UUID, scope: Scope) {
|
|
|
107
112
|
// Don't fetch permissions if scope is invalid (e.g., organisationId is null/empty)
|
|
108
113
|
// Wait for organisation context to resolve
|
|
109
114
|
// IMPORTANT: Don't clear existing permissions here - keep them until we have new ones
|
|
110
|
-
if (!
|
|
115
|
+
if (!orgId || orgId === null || (typeof orgId === 'string' && orgId.trim() === '')) {
|
|
111
116
|
// Keep existing permissions, just mark as loading
|
|
112
117
|
setIsLoading(true);
|
|
113
118
|
setError(null);
|
|
@@ -117,11 +122,11 @@ export function usePermissions(userId: UUID, scope: Scope) {
|
|
|
117
122
|
// CRITICAL: getPermissionMap requires appId to fetch pages and permissions
|
|
118
123
|
// If appId is missing, it returns an empty map
|
|
119
124
|
// Wait for appId to be available before fetching
|
|
120
|
-
if (!
|
|
125
|
+
if (!appId) {
|
|
121
126
|
logger.warn('[usePermissions] Waiting for appId before fetching permissions', {
|
|
122
127
|
userId,
|
|
123
|
-
organisationId:
|
|
124
|
-
eventId:
|
|
128
|
+
organisationId: orgId,
|
|
129
|
+
eventId: eventId,
|
|
125
130
|
hasAppId: false
|
|
126
131
|
});
|
|
127
132
|
setIsLoading(true);
|
|
@@ -131,11 +136,11 @@ export function usePermissions(userId: UUID, scope: Scope) {
|
|
|
131
136
|
logger.warn('[usePermissions] Fetching permissions', {
|
|
132
137
|
userId,
|
|
133
138
|
scope: {
|
|
134
|
-
organisationId:
|
|
135
|
-
eventId:
|
|
136
|
-
appId:
|
|
139
|
+
organisationId: orgId,
|
|
140
|
+
eventId: eventId,
|
|
141
|
+
appId: appId
|
|
137
142
|
},
|
|
138
|
-
hasAppId: !!
|
|
143
|
+
hasAppId: !!appId
|
|
139
144
|
});
|
|
140
145
|
|
|
141
146
|
try {
|
|
@@ -143,16 +148,23 @@ export function usePermissions(userId: UUID, scope: Scope) {
|
|
|
143
148
|
setIsLoading(true);
|
|
144
149
|
setError(null);
|
|
145
150
|
|
|
151
|
+
// Build scope object from extracted values
|
|
152
|
+
const scopeForFetch: Scope = {
|
|
153
|
+
organisationId: orgId,
|
|
154
|
+
eventId: eventId,
|
|
155
|
+
appId: appId
|
|
156
|
+
};
|
|
157
|
+
|
|
146
158
|
// Fetch new permissions - don't clear old ones until we have new ones
|
|
147
|
-
const permissionMap = await getPermissionMap({ userId, scope });
|
|
159
|
+
const permissionMap = await getPermissionMap({ userId, scope: scopeForFetch });
|
|
148
160
|
|
|
149
161
|
logger.warn('[usePermissions] Permissions fetched successfully', {
|
|
150
162
|
permissionCount: Object.keys(permissionMap).length,
|
|
151
163
|
hasWildcard: !!permissionMap['*'],
|
|
152
164
|
scope: {
|
|
153
|
-
organisationId:
|
|
154
|
-
eventId:
|
|
155
|
-
appId:
|
|
165
|
+
organisationId: orgId,
|
|
166
|
+
eventId: eventId,
|
|
167
|
+
appId: appId
|
|
156
168
|
}
|
|
157
169
|
});
|
|
158
170
|
|
|
@@ -171,7 +183,7 @@ export function usePermissions(userId: UUID, scope: Scope) {
|
|
|
171
183
|
};
|
|
172
184
|
|
|
173
185
|
fetchPermissions();
|
|
174
|
-
}, [userId,
|
|
186
|
+
}, [userId, orgId, eventId, appId]);
|
|
175
187
|
|
|
176
188
|
const hasPermission = useCallback((permission: Permission): boolean => {
|
|
177
189
|
if (permissions['*']) {
|