@jmruthers/pace-core 0.5.111 → 0.5.113

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 (156) hide show
  1. package/dist/{DataTable-5W2HVLLV.js → DataTable-YNEB5WDK.js} +8 -8
  2. package/dist/{UnifiedAuthProvider-LUM3QLS5.js → UnifiedAuthProvider-KZZUO27W.js} +3 -3
  3. package/dist/{api-SIZPFBFX.js → api-PKU4PUBO.js} +3 -3
  4. package/dist/{audit-5JI5T3SL.js → audit-H4YJJF7R.js} +2 -2
  5. package/dist/{chunk-IWJYNWXN.js → chunk-3OGQLOJM.js} +11 -3
  6. package/dist/chunk-3OGQLOJM.js.map +1 -0
  7. package/dist/{chunk-TDFBX7KJ.js → chunk-7H75SHXZ.js} +2 -2
  8. package/dist/{chunk-EFVQBYFN.js → chunk-BUN7NMV7.js} +2 -2
  9. package/dist/{chunk-X7SPKHYZ.js → chunk-F6QB26OS.js} +4 -4
  10. package/dist/{chunk-ZL45MG76.js → chunk-HKWQN44G.js} +15 -15
  11. package/dist/{chunk-TD4BXGPE.js → chunk-KISJX3XZ.js} +8 -4
  12. package/dist/{chunk-TD4BXGPE.js.map → chunk-KISJX3XZ.js.map} +1 -1
  13. package/dist/{chunk-ACYQNYHB.js → chunk-KTHLNIMA.js} +7 -7
  14. package/dist/{chunk-I5YM5BGS.js → chunk-L36JW4KV.js} +2 -2
  15. package/dist/{chunk-JE2GFA3O.js → chunk-NEONKMTU.js} +3 -3
  16. package/dist/{chunk-MW73E7SP.js → chunk-OO3V7W4H.js} +2 -2
  17. package/dist/chunk-OO3V7W4H.js.map +1 -0
  18. package/dist/{chunk-PXXS26G5.js → chunk-QKIVSZ2O.js} +5 -4
  19. package/dist/{chunk-PXXS26G5.js.map → chunk-QKIVSZ2O.js.map} +1 -1
  20. package/dist/{chunk-2BIDKXQU.js → chunk-YUKG6PXE.js} +82 -23
  21. package/dist/chunk-YUKG6PXE.js.map +1 -0
  22. package/dist/{chunk-UGVU7L7N.js → chunk-ZPXWJA4H.js} +6 -6
  23. package/dist/chunk-ZPXWJA4H.js.map +1 -0
  24. package/dist/components.js +10 -10
  25. package/dist/hooks.js +7 -7
  26. package/dist/index.js +13 -13
  27. package/dist/providers.js +2 -2
  28. package/dist/rbac/index.js +9 -9
  29. package/dist/utils.js +1 -1
  30. package/docs/api/classes/ColumnFactory.md +1 -1
  31. package/docs/api/classes/ErrorBoundary.md +1 -1
  32. package/docs/api/classes/InvalidScopeError.md +1 -1
  33. package/docs/api/classes/MissingUserContextError.md +1 -1
  34. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  35. package/docs/api/classes/PermissionDeniedError.md +1 -1
  36. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  37. package/docs/api/classes/RBACAuditManager.md +8 -8
  38. package/docs/api/classes/RBACCache.md +1 -1
  39. package/docs/api/classes/RBACEngine.md +3 -3
  40. package/docs/api/classes/RBACError.md +1 -1
  41. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  42. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  43. package/docs/api/classes/StorageUtils.md +1 -1
  44. package/docs/api/enums/FileCategory.md +1 -1
  45. package/docs/api/interfaces/AggregateConfig.md +1 -1
  46. package/docs/api/interfaces/ButtonProps.md +1 -1
  47. package/docs/api/interfaces/CardProps.md +1 -1
  48. package/docs/api/interfaces/ColorPalette.md +1 -1
  49. package/docs/api/interfaces/ColorShade.md +1 -1
  50. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  51. package/docs/api/interfaces/DataRecord.md +1 -1
  52. package/docs/api/interfaces/DataTableAction.md +1 -1
  53. package/docs/api/interfaces/DataTableColumn.md +1 -1
  54. package/docs/api/interfaces/DataTableProps.md +1 -1
  55. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  56. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  57. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  58. package/docs/api/interfaces/FileDisplayProps.md +1 -1
  59. package/docs/api/interfaces/FileMetadata.md +1 -1
  60. package/docs/api/interfaces/FileReference.md +1 -1
  61. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  62. package/docs/api/interfaces/FileUploadOptions.md +1 -1
  63. package/docs/api/interfaces/FileUploadProps.md +1 -1
  64. package/docs/api/interfaces/FooterProps.md +1 -1
  65. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  66. package/docs/api/interfaces/InputProps.md +1 -1
  67. package/docs/api/interfaces/LabelProps.md +1 -1
  68. package/docs/api/interfaces/LoginFormProps.md +1 -1
  69. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  70. package/docs/api/interfaces/NavigationContextType.md +1 -1
  71. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  72. package/docs/api/interfaces/NavigationItem.md +1 -1
  73. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  74. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  75. package/docs/api/interfaces/Organisation.md +1 -1
  76. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  77. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  78. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  79. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  80. package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
  81. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  82. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  83. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  84. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  85. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  86. package/docs/api/interfaces/PaletteData.md +1 -1
  87. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  88. package/docs/api/interfaces/ProtectedRouteProps.md +1 -1
  89. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  90. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  91. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  92. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  93. package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
  94. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  95. package/docs/api/interfaces/RBACConfig.md +1 -1
  96. package/docs/api/interfaces/RBACLogger.md +1 -1
  97. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  98. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  99. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  100. package/docs/api/interfaces/RouteConfig.md +1 -1
  101. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  102. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  103. package/docs/api/interfaces/StorageConfig.md +1 -1
  104. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  105. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  106. package/docs/api/interfaces/StorageListOptions.md +1 -1
  107. package/docs/api/interfaces/StorageListResult.md +1 -1
  108. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  109. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  110. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  111. package/docs/api/interfaces/StyleImport.md +1 -1
  112. package/docs/api/interfaces/SwitchProps.md +1 -1
  113. package/docs/api/interfaces/ToastActionElement.md +1 -1
  114. package/docs/api/interfaces/ToastProps.md +1 -1
  115. package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
  116. package/docs/api/interfaces/UnifiedAuthProviderProps.md +1 -1
  117. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  118. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  119. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  120. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  121. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +1 -1
  122. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
  123. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  124. package/docs/api/interfaces/UseResolvedScopeOptions.md +1 -1
  125. package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
  126. package/docs/api/interfaces/UserEventAccess.md +1 -1
  127. package/docs/api/interfaces/UserMenuProps.md +1 -1
  128. package/docs/api/interfaces/UserProfile.md +1 -1
  129. package/docs/api/modules.md +13 -13
  130. package/package.json +1 -1
  131. package/src/components/DataTable/DataTable.test.tsx +405 -154
  132. package/src/components/DataTable/components/DataTableCore.tsx +6 -1
  133. package/src/components/EventSelector/EventSelector.tsx +32 -2
  134. package/src/components/NavigationMenu/NavigationMenu.test.tsx +56 -8
  135. package/src/components/NavigationMenu/NavigationMenu.tsx +75 -12
  136. package/src/rbac/audit-enhanced.ts +14 -2
  137. package/src/rbac/audit.test.ts +16 -6
  138. package/src/rbac/audit.ts +11 -1
  139. package/src/rbac/engine.ts +4 -2
  140. package/src/rbac/hooks/usePermissions.ts +18 -2
  141. package/src/services/EventService.ts +3 -2
  142. package/dist/chunk-2BIDKXQU.js.map +0 -1
  143. package/dist/chunk-IWJYNWXN.js.map +0 -1
  144. package/dist/chunk-MW73E7SP.js.map +0 -1
  145. package/dist/chunk-UGVU7L7N.js.map +0 -1
  146. /package/dist/{DataTable-5W2HVLLV.js.map → DataTable-YNEB5WDK.js.map} +0 -0
  147. /package/dist/{UnifiedAuthProvider-LUM3QLS5.js.map → UnifiedAuthProvider-KZZUO27W.js.map} +0 -0
  148. /package/dist/{api-SIZPFBFX.js.map → api-PKU4PUBO.js.map} +0 -0
  149. /package/dist/{audit-5JI5T3SL.js.map → audit-H4YJJF7R.js.map} +0 -0
  150. /package/dist/{chunk-TDFBX7KJ.js.map → chunk-7H75SHXZ.js.map} +0 -0
  151. /package/dist/{chunk-EFVQBYFN.js.map → chunk-BUN7NMV7.js.map} +0 -0
  152. /package/dist/{chunk-X7SPKHYZ.js.map → chunk-F6QB26OS.js.map} +0 -0
  153. /package/dist/{chunk-ZL45MG76.js.map → chunk-HKWQN44G.js.map} +0 -0
  154. /package/dist/{chunk-ACYQNYHB.js.map → chunk-KTHLNIMA.js.map} +0 -0
  155. /package/dist/{chunk-I5YM5BGS.js.map → chunk-L36JW4KV.js.map} +0 -0
  156. /package/dist/{chunk-JE2GFA3O.js.map → chunk-NEONKMTU.js.map} +0 -0
@@ -25,16 +25,16 @@ import {
25
25
  SelectSeparator,
26
26
  SelectTrigger,
27
27
  SelectValue
28
- } from "./chunk-TD4BXGPE.js";
28
+ } from "./chunk-KISJX3XZ.js";
29
29
  import {
30
30
  useCan,
31
31
  usePermissions,
32
32
  useRBAC,
33
33
  useResolvedScope
34
- } from "./chunk-UGVU7L7N.js";
34
+ } from "./chunk-ZPXWJA4H.js";
35
35
  import {
36
36
  isSuperAdmin
37
- } from "./chunk-PXXS26G5.js";
37
+ } from "./chunk-QKIVSZ2O.js";
38
38
  import {
39
39
  OrganisationProvider_exports,
40
40
  PublicErrorBoundary,
@@ -49,7 +49,7 @@ import {
49
49
  useIsPublicPage,
50
50
  usePublicFileDisplay,
51
51
  usePublicPageContext
52
- } from "./chunk-X7SPKHYZ.js";
52
+ } from "./chunk-F6QB26OS.js";
53
53
  import {
54
54
  useToast
55
55
  } from "./chunk-4OX5PXHX.js";
@@ -57,11 +57,11 @@ import {
57
57
  init_useOrganisations,
58
58
  useEvents,
59
59
  useOrganisations
60
- } from "./chunk-I5YM5BGS.js";
60
+ } from "./chunk-L36JW4KV.js";
61
61
  import {
62
62
  UnifiedAuthProvider_exports,
63
63
  init_UnifiedAuthProvider as init_UnifiedAuthProvider2
64
- } from "./chunk-TDFBX7KJ.js";
64
+ } from "./chunk-7H75SHXZ.js";
65
65
  import {
66
66
  EventServiceContext,
67
67
  EventServiceProvider,
@@ -71,7 +71,7 @@ import {
71
71
  useEventService,
72
72
  useSessionRestoration,
73
73
  useUnifiedAuth
74
- } from "./chunk-MW73E7SP.js";
74
+ } from "./chunk-OO3V7W4H.js";
75
75
  import {
76
76
  LoadingSpinner
77
77
  } from "./chunk-CDQ3PX7L.js";
@@ -585,7 +585,23 @@ function EventSelector({
585
585
  return [...events].sort((a, b) => getTime(b) - getTime(a));
586
586
  }, [events]);
587
587
  useEffect(() => {
588
- if (!selectedEvent && events.length > 0) {
588
+ if (!selectedEvent && events.length > 0 && !isLoading) {
589
+ const persistedEventId = localStorage.getItem("pace-core-selected-event") || sessionStorage.getItem("pace-core-selected-event");
590
+ if (persistedEventId) {
591
+ const persistedEvent = events.find((e) => e.event_id === persistedEventId);
592
+ if (persistedEvent) {
593
+ console.debug("[EventSelector] Persisted event found in storage but not selected:", persistedEventId);
594
+ return;
595
+ } else {
596
+ localStorage.removeItem("pace-core-selected-event");
597
+ sessionStorage.removeItem("pace-core-selected-event");
598
+ autoSelectEvent();
599
+ }
600
+ } else {
601
+ autoSelectEvent();
602
+ }
603
+ }
604
+ function autoSelectEvent() {
589
605
  const today = /* @__PURE__ */ new Date();
590
606
  const startOfToday = new Date(today.getFullYear(), today.getMonth(), today.getDate()).getTime();
591
607
  const next = [...events].filter((e) => e.event_date && new Date(e.event_date).getTime() >= startOfToday).sort((a, b) => new Date(a.event_date).getTime() - new Date(b.event_date).getTime())[0];
@@ -605,7 +621,7 @@ function EventSelector({
605
621
  }
606
622
  }
607
623
  }
608
- }, [events, selectedEvent, setSelectedEvent, onEventChange]);
624
+ }, [events, selectedEvent, setSelectedEvent, onEventChange, isLoading]);
609
625
  if (isLoading) {
610
626
  return /* @__PURE__ */ jsxs4("div", { className: `flex items-center gap-2 ${className}`, children: [
611
627
  /* @__PURE__ */ jsx8(LoadingSpinner, { size: "sm" }),
@@ -920,14 +936,50 @@ var NavigationMenu = React9.forwardRef(({
920
936
  selectedOrganisationId: selectedOrganisation?.id || null,
921
937
  selectedEventId: selectedEvent?.event_id || null
922
938
  });
939
+ const stableScopeRef = React9.useRef({
940
+ organisationId: "",
941
+ eventId: void 0,
942
+ appId: void 0
943
+ });
944
+ if (resolvedScope?.organisationId) {
945
+ const newOrgId = resolvedScope.organisationId;
946
+ const newEventId = resolvedScope.eventId;
947
+ const newAppId = resolvedScope.appId;
948
+ if (stableScopeRef.current.organisationId !== newOrgId || stableScopeRef.current.eventId !== newEventId || stableScopeRef.current.appId !== newAppId) {
949
+ stableScopeRef.current = {
950
+ organisationId: newOrgId,
951
+ eventId: newEventId,
952
+ appId: newAppId
953
+ };
954
+ }
955
+ } else if (!resolvedScope) {
956
+ if (stableScopeRef.current.organisationId !== "") {
957
+ stableScopeRef.current = {
958
+ organisationId: "",
959
+ eventId: void 0,
960
+ appId: void 0
961
+ };
962
+ }
963
+ }
964
+ const stableScope = stableScopeRef.current;
923
965
  const userId = authContext?.user?.id || "";
924
- const scope = resolvedScope || { organisationId: "", eventId: void 0, appId: void 0 };
925
- const { permissions: permissionMap, hasAnyPermission, isLoading: permissionsLoading } = usePermissions(
966
+ const { permissions: permissionMap, hasAnyPermission, isLoading: permissionsLoading, error: permissionsError } = usePermissions(
926
967
  userId,
927
- scope
968
+ stableScope
928
969
  );
929
970
  const filteredItems = React9.useMemo(() => {
930
- if (!filterByPermissions || !authContext || !rbacContext || scopeLoading || permissionsLoading || !resolvedScope?.organisationId) {
971
+ if (filterByPermissions) {
972
+ if (!authContext || !rbacContext || scopeLoading || permissionsLoading || !resolvedScope?.organisationId) {
973
+ return [];
974
+ }
975
+ if (permissionsError || !permissionMap || Object.keys(permissionMap).length === 0) {
976
+ console.warn("[NavigationMenu] Permission map is empty or has error - showing no items for security", {
977
+ permissionsError: permissionsError?.message,
978
+ permissionMapSize: permissionMap ? Object.keys(permissionMap).length : 0
979
+ });
980
+ return [];
981
+ }
982
+ } else {
931
983
  return (items || []).filter((item) => !item.meta?.hidden);
932
984
  }
933
985
  const getPageIdFromHref = (href) => {
@@ -991,19 +1043,25 @@ var NavigationMenu = React9.forwardRef(({
991
1043
  }
992
1044
  }
993
1045
  }
994
- if (item.href && !item.permissions && !item.roles && !item.accessLevel) {
1046
+ if (item.href) {
995
1047
  const pageId = item.pageId || getPageIdFromHref(item.href);
996
1048
  if (pageId) {
997
1049
  const pagePermission = `read:page.${pageId}`;
998
- const hasPagePermission = permissionMap["*"] === true || permissionMap[pagePermission] === true;
999
- if (!hasPagePermission) {
1050
+ const isSuperAdmin2 = permissionMap["*"] === true;
1051
+ const hasPagePermission = permissionMap[pagePermission] === true;
1052
+ const finalHasPermission = isSuperAdmin2 || hasPagePermission;
1053
+ if (!finalHasPermission) {
1000
1054
  if (auditLog) {
1001
1055
  console.log(`[NavigationMenu] Filtering out navigation item "${item.label}" - no page permission:`, {
1002
1056
  itemId: item.id,
1003
1057
  href: item.href,
1004
1058
  pageId,
1005
1059
  permission: pagePermission,
1006
- hasPermission: hasPagePermission
1060
+ hasPermission: finalHasPermission,
1061
+ isSuperAdmin: isSuperAdmin2,
1062
+ permissionMapValue: permissionMap[pagePermission],
1063
+ permissionMapKeys: Object.keys(permissionMap).slice(0, 10)
1064
+ // Show first 10 keys for debugging
1007
1065
  });
1008
1066
  }
1009
1067
  return false;
@@ -1027,7 +1085,8 @@ var NavigationMenu = React9.forwardRef(({
1027
1085
  children: filteredChildren
1028
1086
  };
1029
1087
  };
1030
- return (items || []).map((item) => filterItem(item)).filter((item) => item !== null);
1088
+ const filtered = (items || []).map((item) => filterItem(item)).filter((item) => item !== null);
1089
+ return filtered;
1031
1090
  }, [
1032
1091
  items,
1033
1092
  filterByPermissions,
@@ -1518,7 +1577,7 @@ function PaceAppLayout({
1518
1577
  appId: user.user_metadata?.appId || user.app_metadata?.appId
1519
1578
  };
1520
1579
  try {
1521
- const { isSuperAdmin: isSuperAdmin2 } = await import("./api-SIZPFBFX.js");
1580
+ const { isSuperAdmin: isSuperAdmin2 } = await import("./api-PKU4PUBO.js");
1522
1581
  const isSuper = await isSuperAdmin2(user.id);
1523
1582
  if (isSuper) {
1524
1583
  if (isMounted) {
@@ -1539,7 +1598,7 @@ function PaceAppLayout({
1539
1598
  return;
1540
1599
  }
1541
1600
  try {
1542
- const { getPermissionMap } = await import("./api-SIZPFBFX.js");
1601
+ const { getPermissionMap } = await import("./api-PKU4PUBO.js");
1543
1602
  const permissionMap = await getPermissionMap({
1544
1603
  userId: user.id,
1545
1604
  scope: scope2
@@ -1598,7 +1657,7 @@ function PaceAppLayout({
1598
1657
  let hasAccess = true;
1599
1658
  if (currentRoute.pageId && currentRoute.permissions && currentRoute.permissions.length > 0) {
1600
1659
  try {
1601
- const { isPermittedCached } = await import("./api-SIZPFBFX.js");
1660
+ const { isPermittedCached } = await import("./api-PKU4PUBO.js");
1602
1661
  const hasPagePermission = await isPermittedCached({
1603
1662
  userId: user?.id || "",
1604
1663
  scope,
@@ -1614,7 +1673,7 @@ function PaceAppLayout({
1614
1673
  }
1615
1674
  }
1616
1675
  if (hasAccess && currentRoute.roles && currentRoute.roles.length > 0 && user?.id) {
1617
- const { useUnifiedAuth: useUnifiedAuth2 } = await import("./UnifiedAuthProvider-LUM3QLS5.js");
1676
+ const { useUnifiedAuth: useUnifiedAuth2 } = await import("./UnifiedAuthProvider-KZZUO27W.js");
1618
1677
  hasAccess = true;
1619
1678
  }
1620
1679
  if (!isMounted) return;
@@ -4450,4 +4509,4 @@ export {
4450
4509
  PublicPageDiagnostic,
4451
4510
  PublicPageContextChecker
4452
4511
  };
4453
- //# sourceMappingURL=chunk-2BIDKXQU.js.map
4512
+ //# sourceMappingURL=chunk-YUKG6PXE.js.map