@jmruthers/pace-core 0.5.44 → 0.5.46

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.
Files changed (123) hide show
  1. package/dist/{DataTable-GU72TTL6.js → DataTable-CBZ4FWLB.js} +5 -5
  2. package/dist/{chunk-KVMIO3BU.js → chunk-QGIMHNFE.js} +3 -3
  3. package/dist/{chunk-SFXM5VTP.js → chunk-RZZ4U2VB.js} +3 -3
  4. package/dist/{chunk-HEYEDETJ.js → chunk-TCPMEL3C.js} +2 -2
  5. package/dist/{chunk-DZSLRIE2.js → chunk-UK5BMO5B.js} +3 -3
  6. package/dist/{chunk-6CGBO4IS.js → chunk-VW4YRTVX.js} +66 -16
  7. package/dist/{chunk-6CGBO4IS.js.map → chunk-VW4YRTVX.js.map} +1 -1
  8. package/dist/{chunk-U7EDXJBG.js → chunk-WUCWNFHS.js} +5 -5
  9. package/dist/{chunk-OTQBUB66.js → chunk-YAACZXDE.js} +4 -4
  10. package/dist/{chunk-D4ZF5QUY.js → chunk-YJ7MYXN4.js} +2 -2
  11. package/dist/{chunk-7NAMQC3W.js → chunk-YOMT5BFG.js} +2 -2
  12. package/dist/{chunk-DWA6SCGM.js → chunk-ZK26ZQ3P.js} +3 -3
  13. package/dist/components.js +7 -7
  14. package/dist/hooks.js +4 -4
  15. package/dist/index.js +10 -10
  16. package/dist/providers.js +3 -3
  17. package/dist/rbac/index.js +5 -5
  18. package/dist/utils.js +1 -1
  19. package/docs/api/classes/ErrorBoundary.md +1 -1
  20. package/docs/api/classes/InvalidScopeError.md +1 -1
  21. package/docs/api/classes/MissingUserContextError.md +1 -1
  22. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  23. package/docs/api/classes/PermissionDeniedError.md +1 -1
  24. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  25. package/docs/api/classes/RBACAuditManager.md +1 -1
  26. package/docs/api/classes/RBACCache.md +1 -1
  27. package/docs/api/classes/RBACEngine.md +1 -1
  28. package/docs/api/classes/RBACError.md +1 -1
  29. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  30. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  31. package/docs/api/interfaces/AggregateConfig.md +1 -1
  32. package/docs/api/interfaces/ButtonProps.md +1 -1
  33. package/docs/api/interfaces/CardProps.md +1 -1
  34. package/docs/api/interfaces/ColorPalette.md +1 -1
  35. package/docs/api/interfaces/ColorShade.md +1 -1
  36. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  37. package/docs/api/interfaces/DataTableAction.md +1 -1
  38. package/docs/api/interfaces/DataTableColumn.md +1 -1
  39. package/docs/api/interfaces/DataTableProps.md +1 -1
  40. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  41. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  42. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  43. package/docs/api/interfaces/EventContextType.md +1 -1
  44. package/docs/api/interfaces/EventLogoProps.md +1 -1
  45. package/docs/api/interfaces/EventProviderProps.md +1 -1
  46. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  47. package/docs/api/interfaces/FileUploadProps.md +1 -1
  48. package/docs/api/interfaces/FooterProps.md +1 -1
  49. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  50. package/docs/api/interfaces/InputProps.md +1 -1
  51. package/docs/api/interfaces/LabelProps.md +1 -1
  52. package/docs/api/interfaces/LoginFormProps.md +1 -1
  53. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  54. package/docs/api/interfaces/NavigationContextType.md +1 -1
  55. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  56. package/docs/api/interfaces/NavigationItem.md +1 -1
  57. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  58. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  59. package/docs/api/interfaces/Organisation.md +1 -1
  60. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  61. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  62. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  63. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  64. package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
  65. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  66. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  67. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  68. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  69. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  70. package/docs/api/interfaces/PaletteData.md +1 -1
  71. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  72. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  73. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  74. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  75. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  76. package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
  77. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  78. package/docs/api/interfaces/RBACConfig.md +1 -1
  79. package/docs/api/interfaces/RBACContextType.md +1 -1
  80. package/docs/api/interfaces/RBACLogger.md +1 -1
  81. package/docs/api/interfaces/RBACProviderProps.md +1 -1
  82. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  83. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  84. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  85. package/docs/api/interfaces/RouteConfig.md +1 -1
  86. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  87. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  88. package/docs/api/interfaces/StorageConfig.md +1 -1
  89. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  90. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  91. package/docs/api/interfaces/StorageListOptions.md +1 -1
  92. package/docs/api/interfaces/StorageListResult.md +1 -1
  93. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  94. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  95. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  96. package/docs/api/interfaces/StyleImport.md +1 -1
  97. package/docs/api/interfaces/ToastActionElement.md +1 -1
  98. package/docs/api/interfaces/ToastProps.md +1 -1
  99. package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
  100. package/docs/api/interfaces/UnifiedAuthProviderProps.md +1 -1
  101. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  102. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  103. package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
  104. package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
  105. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  106. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  107. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  108. package/docs/api/interfaces/UserEventAccess.md +1 -1
  109. package/docs/api/interfaces/UserMenuProps.md +1 -1
  110. package/docs/api/interfaces/UserProfile.md +1 -1
  111. package/docs/api/modules.md +3 -3
  112. package/package.json +1 -1
  113. package/src/providers/OrganisationProvider.tsx +82 -16
  114. /package/dist/{DataTable-GU72TTL6.js.map → DataTable-CBZ4FWLB.js.map} +0 -0
  115. /package/dist/{chunk-KVMIO3BU.js.map → chunk-QGIMHNFE.js.map} +0 -0
  116. /package/dist/{chunk-SFXM5VTP.js.map → chunk-RZZ4U2VB.js.map} +0 -0
  117. /package/dist/{chunk-HEYEDETJ.js.map → chunk-TCPMEL3C.js.map} +0 -0
  118. /package/dist/{chunk-DZSLRIE2.js.map → chunk-UK5BMO5B.js.map} +0 -0
  119. /package/dist/{chunk-U7EDXJBG.js.map → chunk-WUCWNFHS.js.map} +0 -0
  120. /package/dist/{chunk-OTQBUB66.js.map → chunk-YAACZXDE.js.map} +0 -0
  121. /package/dist/{chunk-D4ZF5QUY.js.map → chunk-YJ7MYXN4.js.map} +0 -0
  122. /package/dist/{chunk-7NAMQC3W.js.map → chunk-YOMT5BFG.js.map} +0 -0
  123. /package/dist/{chunk-DWA6SCGM.js.map → chunk-ZK26ZQ3P.js.map} +0 -0
@@ -32,11 +32,11 @@ import {
32
32
  useDataTableContext,
33
33
  usePluginRegistry,
34
34
  useStateManager
35
- } from "./chunk-KVMIO3BU.js";
36
- import "./chunk-DZSLRIE2.js";
35
+ } from "./chunk-QGIMHNFE.js";
36
+ import "./chunk-UK5BMO5B.js";
37
37
  import "./chunk-GWSBHC4J.js";
38
38
  import "./chunk-7BNPOCLL.js";
39
- import "./chunk-HEYEDETJ.js";
39
+ import "./chunk-TCPMEL3C.js";
40
40
  import {
41
41
  DataChunkManager,
42
42
  SearchIndex,
@@ -48,7 +48,7 @@ import {
48
48
  throttle,
49
49
  useDataTablePerformance
50
50
  } from "./chunk-SS3E6QLB.js";
51
- import "./chunk-6CGBO4IS.js";
51
+ import "./chunk-VW4YRTVX.js";
52
52
  import "./chunk-YDJW5XTN.js";
53
53
  import "./chunk-MZBUOP4P.js";
54
54
  import "./chunk-WJARTBCT.js";
@@ -97,4 +97,4 @@ export {
97
97
  usePluginRegistry,
98
98
  useStateManager
99
99
  };
100
- //# sourceMappingURL=DataTable-GU72TTL6.js.map
100
+ //# sourceMappingURL=DataTable-CBZ4FWLB.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useCan
3
- } from "./chunk-DZSLRIE2.js";
3
+ } from "./chunk-UK5BMO5B.js";
4
4
  import {
5
5
  useDataTablePerformance
6
6
  } from "./chunk-SS3E6QLB.js";
@@ -14,7 +14,7 @@ import {
14
14
  init_Button,
15
15
  init_UnifiedAuthProvider,
16
16
  useUnifiedAuth
17
- } from "./chunk-6CGBO4IS.js";
17
+ } from "./chunk-VW4YRTVX.js";
18
18
  import {
19
19
  getCurrentAppName,
20
20
  init_appNameResolver
@@ -5584,4 +5584,4 @@ export {
5584
5584
  GroupHeader,
5585
5585
  EditableRow
5586
5586
  };
5587
- //# sourceMappingURL=chunk-KVMIO3BU.js.map
5587
+ //# sourceMappingURL=chunk-QGIMHNFE.js.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  init_EventProvider
3
- } from "./chunk-HEYEDETJ.js";
3
+ } from "./chunk-TCPMEL3C.js";
4
4
  import {
5
5
  init_AuthProvider,
6
6
  init_InactivityProvider,
7
7
  init_OrganisationProvider,
8
8
  init_UnifiedAuthProvider
9
- } from "./chunk-6CGBO4IS.js";
9
+ } from "./chunk-VW4YRTVX.js";
10
10
 
11
11
  // src/providers/index.ts
12
12
  init_EventProvider();
@@ -14,4 +14,4 @@ init_OrganisationProvider();
14
14
  init_UnifiedAuthProvider();
15
15
  init_AuthProvider();
16
16
  init_InactivityProvider();
17
- //# sourceMappingURL=chunk-SFXM5VTP.js.map
17
+ //# sourceMappingURL=chunk-RZZ4U2VB.js.map
@@ -3,7 +3,7 @@ import {
3
3
  init_UnifiedAuthProvider,
4
4
  useOrganisations,
5
5
  useUnifiedAuth
6
- } from "./chunk-6CGBO4IS.js";
6
+ } from "./chunk-VW4YRTVX.js";
7
7
  import {
8
8
  DebugLogger,
9
9
  init_debugLogger,
@@ -261,4 +261,4 @@ export {
261
261
  EventProvider_exports,
262
262
  init_EventProvider
263
263
  };
264
- //# sourceMappingURL=chunk-HEYEDETJ.js.map
264
+ //# sourceMappingURL=chunk-TCPMEL3C.js.map
@@ -7,13 +7,13 @@ import {
7
7
  import {
8
8
  init_EventProvider,
9
9
  useEvents
10
- } from "./chunk-HEYEDETJ.js";
10
+ } from "./chunk-TCPMEL3C.js";
11
11
  import {
12
12
  init_OrganisationProvider,
13
13
  init_UnifiedAuthProvider,
14
14
  useOrganisations,
15
15
  useUnifiedAuth
16
- } from "./chunk-6CGBO4IS.js";
16
+ } from "./chunk-VW4YRTVX.js";
17
17
 
18
18
  // src/rbac/hooks/useRBAC.ts
19
19
  init_UnifiedAuthProvider();
@@ -506,4 +506,4 @@ export {
506
506
  useHasAllPermissions,
507
507
  useCachedPermissions
508
508
  };
509
- //# sourceMappingURL=chunk-DZSLRIE2.js.map
509
+ //# sourceMappingURL=chunk-UK5BMO5B.js.map
@@ -7300,6 +7300,7 @@ function OrganisationProvider({ children }) {
7300
7300
  const [isLoading, setIsLoading] = useState7(true);
7301
7301
  const [error, setError] = useState7(null);
7302
7302
  const [isContextReady, setIsContextReady] = useState7(false);
7303
+ const [retryCount, setRetryCount] = useState7(0);
7303
7304
  const { user, session, supabase, signOut } = useUnifiedAuth();
7304
7305
  let navigate = null;
7305
7306
  try {
@@ -7307,6 +7308,17 @@ function OrganisationProvider({ children }) {
7307
7308
  } catch (error2) {
7308
7309
  navigate = null;
7309
7310
  }
7311
+ const clearAllCachedData = useCallback7(() => {
7312
+ localStorage.removeItem(STORAGE_KEYS2.SELECTED_ORGANISATION);
7313
+ localStorage.removeItem(STORAGE_KEYS2.ORGANISATION_CONTEXT);
7314
+ setSelectedOrganisation(null);
7315
+ setOrganisations([]);
7316
+ setUserMemberships([]);
7317
+ setRoleMapState(/* @__PURE__ */ new Map());
7318
+ setError(null);
7319
+ setRetryCount(0);
7320
+ setIsContextReady(false);
7321
+ }, []);
7310
7322
  const setDatabaseOrganisationContext = useCallback7(async (organisation) => {
7311
7323
  if (!supabase || !session) {
7312
7324
  console.warn("[OrganisationProvider] No Supabase client or session available for setting organisation context");
@@ -7379,18 +7391,39 @@ function OrganisationProvider({ children }) {
7379
7391
  if (!memberships || memberships.length === 0) {
7380
7392
  throw new Error("User has no active organisation memberships");
7381
7393
  }
7394
+ memberships.forEach((membership, index) => {
7395
+ if (!membership.organisation_id || membership.organisation_id.trim() === "") {
7396
+ console.warn(`[OrganisationProvider] Membership ${index} has invalid organisation_id:`, membership);
7397
+ }
7398
+ });
7382
7399
  const organisationIds = memberships.map((m) => m.organisation_id).filter((id) => {
7383
- if (!id || typeof id !== "string") return false;
7400
+ if (!id || typeof id !== "string") {
7401
+ console.warn("[OrganisationProvider] Invalid organisation ID (not string):", id);
7402
+ return false;
7403
+ }
7384
7404
  const trimmedId = id.trim();
7385
- if (trimmedId === "") return false;
7386
- return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(trimmedId);
7405
+ if (trimmedId === "") {
7406
+ console.warn("[OrganisationProvider] Empty organisation ID found");
7407
+ return false;
7408
+ }
7409
+ const isValidUuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(trimmedId);
7410
+ if (!isValidUuid) {
7411
+ console.warn("[OrganisationProvider] Invalid UUID format:", trimmedId);
7412
+ }
7413
+ return isValidUuid;
7387
7414
  });
7388
7415
  if (organisationIds.length === 0) {
7389
7416
  console.warn("[OrganisationProvider] No valid organisation IDs found in memberships:", memberships);
7390
7417
  throw new Error("No valid organisation IDs found in memberships");
7391
7418
  }
7392
7419
  DebugLogger.log("OrganisationProvider", "Valid organisation IDs:", organisationIds);
7393
- const { data: organisations2, error: orgError } = await supabase.from("organisations").select("id, name, display_name, subscription_tier, settings, is_active, parent_id, created_at, updated_at").in("id", organisationIds);
7420
+ const cleanOrganisationIds = organisationIds.filter((id) => id && id.trim() !== "");
7421
+ if (cleanOrganisationIds.length === 0) {
7422
+ console.warn("[OrganisationProvider] No clean organisation IDs after filtering:", organisationIds);
7423
+ throw new Error("No valid organisation IDs found after cleaning");
7424
+ }
7425
+ DebugLogger.log("OrganisationProvider", "Clean organisation IDs for query:", cleanOrganisationIds);
7426
+ const { data: organisations2, error: orgError } = await supabase.from("organisations").select("id, name, display_name, subscription_tier, settings, is_active, parent_id, created_at, updated_at").in("id", cleanOrganisationIds);
7394
7427
  if (orgError) {
7395
7428
  console.error("[OrganisationProvider] Error loading organisations:", orgError);
7396
7429
  throw orgError;
@@ -7413,14 +7446,23 @@ function OrganisationProvider({ children }) {
7413
7446
  const persistedOrgString = localStorage.getItem(STORAGE_KEYS2.SELECTED_ORGANISATION);
7414
7447
  if (persistedOrgString) {
7415
7448
  const persistedOrg = JSON.parse(persistedOrgString);
7416
- const validPersistedOrg = activeOrgs.find((org) => org.id === persistedOrg.id);
7417
- if (validPersistedOrg) {
7418
- initialOrg = validPersistedOrg;
7419
- DebugLogger.log("OrganisationProvider", "Restored persisted organisation:", initialOrg.display_name);
7449
+ if (persistedOrg.id && typeof persistedOrg.id === "string" && persistedOrg.id.trim() !== "") {
7450
+ const validPersistedOrg = activeOrgs.find((org) => org.id === persistedOrg.id);
7451
+ if (validPersistedOrg) {
7452
+ initialOrg = validPersistedOrg;
7453
+ DebugLogger.log("OrganisationProvider", "Restored persisted organisation:", initialOrg.display_name);
7454
+ } else {
7455
+ console.warn("[OrganisationProvider] Persisted organisation not found in active orgs, clearing cache");
7456
+ localStorage.removeItem(STORAGE_KEYS2.SELECTED_ORGANISATION);
7457
+ }
7458
+ } else {
7459
+ console.warn("[OrganisationProvider] Invalid persisted organisation ID, clearing cache");
7460
+ localStorage.removeItem(STORAGE_KEYS2.SELECTED_ORGANISATION);
7420
7461
  }
7421
7462
  }
7422
7463
  } catch (storageError) {
7423
7464
  console.warn("[OrganisationProvider] Failed to restore persisted organisation:", storageError);
7465
+ localStorage.removeItem(STORAGE_KEYS2.SELECTED_ORGANISATION);
7424
7466
  }
7425
7467
  if (!initialOrg) {
7426
7468
  const adminMembership = memberships.find((m) => m.role === "org_admin");
@@ -7446,20 +7488,25 @@ function OrganisationProvider({ children }) {
7446
7488
  totalOrganisations: activeOrgs.length,
7447
7489
  userRole: roleMap.get(initialOrg.id)
7448
7490
  });
7491
+ setRetryCount(0);
7449
7492
  } catch (err) {
7450
7493
  console.error("[OrganisationProvider] Failed to load organisations:", err);
7451
7494
  setError(err);
7452
- setSelectedOrganisation(null);
7453
- setOrganisations([]);
7454
- setUserMemberships([]);
7455
- localStorage.removeItem(STORAGE_KEYS2.SELECTED_ORGANISATION);
7495
+ setRetryCount((prev) => prev + 1);
7496
+ clearAllCachedData();
7456
7497
  } finally {
7457
7498
  setIsLoading(false);
7458
7499
  }
7459
- }, [user, session, supabase]);
7500
+ }, [user, session, supabase, clearAllCachedData]);
7460
7501
  useEffect7(() => {
7461
7502
  if (user && session && supabase && !isLoading) {
7462
- DebugLogger.log("OrganisationProvider", "Authentication stable, loading organizations...");
7503
+ if (retryCount >= 3) {
7504
+ console.error("[OrganisationProvider] Max retry count reached, stopping organisation loading");
7505
+ setError(new Error("Failed to load organisations after multiple attempts"));
7506
+ setIsLoading(false);
7507
+ return;
7508
+ }
7509
+ DebugLogger.log("OrganisationProvider", "Authentication stable, loading organizations... (retry:", retryCount, ")");
7463
7510
  loadUserOrganisations();
7464
7511
  } else if (!user && !session) {
7465
7512
  DebugLogger.log("OrganisationProvider", "No authentication, clearing organization state");
@@ -7469,8 +7516,11 @@ function OrganisationProvider({ children }) {
7469
7516
  setRoleMapState(/* @__PURE__ */ new Map());
7470
7517
  setIsLoading(false);
7471
7518
  setError(null);
7519
+ setRetryCount(0);
7520
+ localStorage.removeItem(STORAGE_KEYS2.SELECTED_ORGANISATION);
7521
+ localStorage.removeItem(STORAGE_KEYS2.ORGANISATION_CONTEXT);
7472
7522
  }
7473
- }, [user, session, supabase, isLoading, loadUserOrganisations]);
7523
+ }, [user, session, supabase, isLoading, loadUserOrganisations, retryCount]);
7474
7524
  const handleLogoutAndRedirect = useCallback7(async () => {
7475
7525
  try {
7476
7526
  await signOut();
@@ -7719,4 +7769,4 @@ lodash/lodash.js:
7719
7769
  * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
7720
7770
  *)
7721
7771
  */
7722
- //# sourceMappingURL=chunk-6CGBO4IS.js.map
7772
+ //# sourceMappingURL=chunk-VW4YRTVX.js.map