@jmruthers/pace-core 0.5.115 → 0.5.116

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 (234) hide show
  1. package/dist/{AuthService-CVgsgtaZ.d.ts → AuthService-D4646R4b.d.ts} +9 -4
  2. package/dist/{DataTable-H5KJCAIS.js → DataTable-ZOAKQ3SU.js} +10 -9
  3. package/dist/{UnifiedAuthProvider-KZZUO27W.js → UnifiedAuthProvider-YFN7YGVN.js} +4 -3
  4. package/dist/{api-PKU4PUBO.js → api-TNIBJWLM.js} +3 -3
  5. package/dist/{audit-H4YJJF7R.js → audit-T36HM7IM.js} +2 -2
  6. package/dist/{chunk-SYXOZQ4P.js → chunk-2GJ5GL77.js} +1 -1
  7. package/dist/chunk-2GJ5GL77.js.map +1 -0
  8. package/dist/{chunk-XYRZV7R5.js → chunk-2LM4QQGH.js} +30 -34
  9. package/dist/chunk-2LM4QQGH.js.map +1 -0
  10. package/dist/{chunk-3OGQLOJM.js → chunk-3DBFLLLU.js} +30 -1
  11. package/dist/chunk-3DBFLLLU.js.map +1 -0
  12. package/dist/{chunk-KTHLNIMA.js → chunk-ECOVPXYS.js} +13 -62
  13. package/dist/chunk-ECOVPXYS.js.map +1 -0
  14. package/dist/{chunk-OO3V7W4H.js → chunk-KA3PSVNV.js} +87 -40
  15. package/dist/chunk-KA3PSVNV.js.map +1 -0
  16. package/dist/{chunk-HKWQN44G.js → chunk-KMPWND3F.js} +15 -15
  17. package/dist/{chunk-L36JW4KV.js → chunk-LFS45U62.js} +2 -2
  18. package/dist/{chunk-NEONKMTU.js → chunk-LZYHAL7Y.js} +9 -4
  19. package/dist/{chunk-NEONKMTU.js.map → chunk-LZYHAL7Y.js.map} +1 -1
  20. package/dist/{chunk-BUN7NMV7.js → chunk-O3FTRYEU.js} +2 -2
  21. package/dist/{chunk-F6QB26OS.js → chunk-P3PUOL6B.js} +80 -8
  22. package/dist/chunk-P3PUOL6B.js.map +1 -0
  23. package/dist/{chunk-ZPXWJA4H.js → chunk-PHDAXDHB.js} +131 -5
  24. package/dist/chunk-PHDAXDHB.js.map +1 -0
  25. package/dist/chunk-UJI6WSMD.js +201 -0
  26. package/dist/{chunk-5CDJCTOO.js.map → chunk-UJI6WSMD.js.map} +1 -1
  27. package/dist/{chunk-OUU3SP6I.js → chunk-UKZWNQMB.js} +50 -7
  28. package/dist/{chunk-OUU3SP6I.js.map → chunk-UKZWNQMB.js.map} +1 -1
  29. package/dist/{chunk-7H75SHXZ.js → chunk-VN3OOE35.js} +2 -2
  30. package/dist/{chunk-QKIVSZ2O.js → chunk-WP5I5GLN.js} +2 -2
  31. package/dist/components.d.ts +1 -1
  32. package/dist/components.js +12 -11
  33. package/dist/components.js.map +1 -1
  34. package/dist/hooks.d.ts +1 -1
  35. package/dist/hooks.js +10 -9
  36. package/dist/hooks.js.map +1 -1
  37. package/dist/index.d.ts +4 -4
  38. package/dist/index.js +19 -16
  39. package/dist/index.js.map +1 -1
  40. package/dist/providers.d.ts +2 -2
  41. package/dist/providers.js +3 -2
  42. package/dist/rbac/index.d.ts +82 -1
  43. package/dist/rbac/index.js +13 -10
  44. package/dist/{useToast-DVT4dMtf.d.ts → useToast-Cs_g32bg.d.ts} +1 -1
  45. package/dist/utils.js +6 -4
  46. package/dist/utils.js.map +1 -1
  47. package/dist/validation.js +3 -1
  48. package/dist/validation.js.map +1 -1
  49. package/docs/README.md +4 -0
  50. package/docs/api/classes/ColumnFactory.md +1 -1
  51. package/docs/api/classes/ErrorBoundary.md +1 -1
  52. package/docs/api/classes/InvalidScopeError.md +1 -1
  53. package/docs/api/classes/MissingUserContextError.md +1 -1
  54. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  55. package/docs/api/classes/PermissionDeniedError.md +1 -1
  56. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  57. package/docs/api/classes/RBACAuditManager.md +35 -12
  58. package/docs/api/classes/RBACCache.md +1 -1
  59. package/docs/api/classes/RBACEngine.md +1 -1
  60. package/docs/api/classes/RBACError.md +1 -1
  61. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  62. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  63. package/docs/api/classes/StorageUtils.md +1 -1
  64. package/docs/api/enums/FileCategory.md +1 -1
  65. package/docs/api/interfaces/AggregateConfig.md +1 -1
  66. package/docs/api/interfaces/ButtonProps.md +1 -1
  67. package/docs/api/interfaces/CardProps.md +1 -1
  68. package/docs/api/interfaces/ColorPalette.md +1 -1
  69. package/docs/api/interfaces/ColorShade.md +1 -1
  70. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  71. package/docs/api/interfaces/DataRecord.md +1 -1
  72. package/docs/api/interfaces/DataTableAction.md +1 -1
  73. package/docs/api/interfaces/DataTableColumn.md +1 -1
  74. package/docs/api/interfaces/DataTableProps.md +1 -1
  75. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  76. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  77. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  78. package/docs/api/interfaces/EventAppRoleData.md +71 -0
  79. package/docs/api/interfaces/FileDisplayProps.md +1 -1
  80. package/docs/api/interfaces/FileMetadata.md +1 -1
  81. package/docs/api/interfaces/FileReference.md +1 -1
  82. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  83. package/docs/api/interfaces/FileUploadOptions.md +1 -1
  84. package/docs/api/interfaces/FileUploadProps.md +1 -1
  85. package/docs/api/interfaces/FooterProps.md +1 -1
  86. package/docs/api/interfaces/GrantEventAppRoleParams.md +122 -0
  87. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  88. package/docs/api/interfaces/InputProps.md +1 -1
  89. package/docs/api/interfaces/LabelProps.md +1 -1
  90. package/docs/api/interfaces/LoginFormProps.md +1 -1
  91. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  92. package/docs/api/interfaces/NavigationContextType.md +1 -1
  93. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  94. package/docs/api/interfaces/NavigationItem.md +1 -1
  95. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  96. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  97. package/docs/api/interfaces/Organisation.md +1 -1
  98. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  99. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  100. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  101. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  102. package/docs/api/interfaces/PaceAppLayoutProps.md +27 -27
  103. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  104. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  105. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  106. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  107. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  108. package/docs/api/interfaces/PaletteData.md +1 -1
  109. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  110. package/docs/api/interfaces/ProtectedRouteProps.md +1 -1
  111. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  112. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  113. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  114. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  115. package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
  116. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  117. package/docs/api/interfaces/RBACConfig.md +1 -1
  118. package/docs/api/interfaces/RBACLogger.md +1 -1
  119. package/docs/api/interfaces/RevokeEventAppRoleParams.md +100 -0
  120. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  121. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  122. package/docs/api/interfaces/RoleManagementResult.md +52 -0
  123. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  124. package/docs/api/interfaces/RouteConfig.md +1 -1
  125. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  126. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  127. package/docs/api/interfaces/StorageConfig.md +1 -1
  128. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  129. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  130. package/docs/api/interfaces/StorageListOptions.md +1 -1
  131. package/docs/api/interfaces/StorageListResult.md +1 -1
  132. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  133. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  134. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  135. package/docs/api/interfaces/StyleImport.md +1 -1
  136. package/docs/api/interfaces/SwitchProps.md +1 -1
  137. package/docs/api/interfaces/ToastActionElement.md +1 -1
  138. package/docs/api/interfaces/ToastProps.md +1 -1
  139. package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
  140. package/docs/api/interfaces/UnifiedAuthProviderProps.md +1 -1
  141. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  142. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  143. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  144. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  145. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +1 -1
  146. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
  147. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  148. package/docs/api/interfaces/UseResolvedScopeOptions.md +1 -1
  149. package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
  150. package/docs/api/interfaces/UserEventAccess.md +1 -1
  151. package/docs/api/interfaces/UserMenuProps.md +1 -1
  152. package/docs/api/interfaces/UserProfile.md +1 -1
  153. package/docs/api/modules.md +41 -14
  154. package/docs/architecture/rpc-function-standards.md +193 -0
  155. package/package.json +1 -1
  156. package/src/__tests__/TEST_STANDARD.md +244 -2
  157. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +46 -16
  158. package/src/components/DataTable/__tests__/keyboard.test.tsx +276 -217
  159. package/src/components/DataTable/components/DataTableCore.tsx +29 -2
  160. package/src/components/DataTable/components/DataTableToolbar.tsx +3 -2
  161. package/src/components/DataTable/components/EditableRow.tsx +18 -1
  162. package/src/components/DataTable/components/ViewRowModal.tsx +1 -1
  163. package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +735 -0
  164. package/src/components/DataTable/components/__tests__/BulkOperationsDropdown.test.tsx +572 -0
  165. package/src/components/DataTable/components/__tests__/ColumnVisibilityDropdown.test.tsx +708 -0
  166. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +451 -0
  167. package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +456 -0
  168. package/src/components/DataTable/components/__tests__/EditableRow.test.tsx +454 -0
  169. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +462 -0
  170. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +423 -0
  171. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +393 -0
  172. package/src/components/DataTable/components/__tests__/GroupingDropdown.test.tsx +617 -0
  173. package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +734 -0
  174. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +412 -0
  175. package/src/components/DataTable/hooks/useTableHandlers.ts +4 -0
  176. package/src/components/EventSelector/EventSelector.tsx +5 -25
  177. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +12 -7
  178. package/src/components/PaceAppLayout/PaceAppLayout.tsx +4 -0
  179. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +7 -2
  180. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +13 -8
  181. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +109 -100
  182. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +18 -13
  183. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +17 -12
  184. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +2 -0
  185. package/src/components/PaceLoginPage/PaceLoginPage.tsx +11 -1
  186. package/src/components/PasswordReset/PasswordChangeForm.test.tsx +2 -2
  187. package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +648 -0
  188. package/src/components/ProtectedRoute/ProtectedRoute.tsx +10 -7
  189. package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +4 -12
  190. package/src/components/Select/Select.tsx +8 -0
  191. package/src/components/Toast/Toast.tsx +1 -1
  192. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +367 -3
  193. package/src/hooks/__tests__/usePublicFileDisplay.test.ts +916 -0
  194. package/src/hooks/useEventTheme.ts +49 -18
  195. package/src/hooks/usePermissionCache.ts +5 -3
  196. package/src/hooks/useSecureDataAccess.ts +11 -1
  197. package/src/hooks/useToast.ts +1 -1
  198. package/src/providers/services/EventServiceProvider.tsx +15 -8
  199. package/src/rbac/__tests__/cache-invalidation.test.ts +385 -0
  200. package/src/rbac/audit.test.ts +206 -0
  201. package/src/rbac/audit.ts +37 -2
  202. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +26 -23
  203. package/src/rbac/errors.test.ts +340 -0
  204. package/src/rbac/hooks/index.ts +9 -0
  205. package/src/rbac/hooks/useResolvedScope.test.ts +1063 -0
  206. package/src/rbac/hooks/useRoleManagement.test.ts +908 -0
  207. package/src/rbac/hooks/useRoleManagement.ts +255 -0
  208. package/src/services/AuthService.ts +10 -0
  209. package/src/services/EventService.ts +111 -50
  210. package/src/services/__tests__/AuthService.test.ts +1 -1
  211. package/src/services/__tests__/EventService.test.ts +60 -45
  212. package/src/services/interfaces/IEventService.ts +1 -1
  213. package/src/utils/__tests__/deviceFingerprint.unit.test.ts +320 -0
  214. package/src/utils/__tests__/logger.unit.test.ts +398 -0
  215. package/src/utils/__tests__/validation.unit.test.ts +225 -1
  216. package/src/utils/file-reference.test.ts +214 -0
  217. package/dist/chunk-3OGQLOJM.js.map +0 -1
  218. package/dist/chunk-5CDJCTOO.js +0 -190
  219. package/dist/chunk-F6QB26OS.js.map +0 -1
  220. package/dist/chunk-KTHLNIMA.js.map +0 -1
  221. package/dist/chunk-OO3V7W4H.js.map +0 -1
  222. package/dist/chunk-SYXOZQ4P.js.map +0 -1
  223. package/dist/chunk-XYRZV7R5.js.map +0 -1
  224. package/dist/chunk-ZPXWJA4H.js.map +0 -1
  225. package/src/rbac/audit-enhanced.ts +0 -351
  226. /package/dist/{DataTable-H5KJCAIS.js.map → DataTable-ZOAKQ3SU.js.map} +0 -0
  227. /package/dist/{UnifiedAuthProvider-KZZUO27W.js.map → UnifiedAuthProvider-YFN7YGVN.js.map} +0 -0
  228. /package/dist/{api-PKU4PUBO.js.map → api-TNIBJWLM.js.map} +0 -0
  229. /package/dist/{audit-H4YJJF7R.js.map → audit-T36HM7IM.js.map} +0 -0
  230. /package/dist/{chunk-HKWQN44G.js.map → chunk-KMPWND3F.js.map} +0 -0
  231. /package/dist/{chunk-L36JW4KV.js.map → chunk-LFS45U62.js.map} +0 -0
  232. /package/dist/{chunk-BUN7NMV7.js.map → chunk-O3FTRYEU.js.map} +0 -0
  233. /package/dist/{chunk-7H75SHXZ.js.map → chunk-VN3OOE35.js.map} +0 -0
  234. /package/dist/{chunk-QKIVSZ2O.js.map → chunk-WP5I5GLN.js.map} +0 -0
@@ -77,7 +77,7 @@ interface IEventService {
77
77
  refreshEvents(): Promise<void>;
78
78
  loadPersistedEvent(events: Event[]): Promise<boolean>;
79
79
  restorePersistedEvent(): Promise<boolean>;
80
- persistEventSelection(eventId: string): void;
80
+ persistEventSelection(eventId: string): Promise<void>;
81
81
  autoSelectNextEvent(events: Event[]): void;
82
82
  initialize(): Promise<void>;
83
83
  cleanup(): void;
@@ -109,7 +109,8 @@ declare class EventService extends BaseService implements IEventService {
109
109
  private hasAutoSelectedRef;
110
110
  private userClearedEventRef;
111
111
  constructor(supabaseClient: SupabaseClient, user: User | null, session: Session | null, appName: string, selectedOrganisation: Organisation | null, setSelectedEventId: (eventId: string | null) => void);
112
- updateDependencies(supabaseClient: SupabaseClient, user: User | null, session: Session | null, appName: string, selectedOrganisation: Organisation | null, setSelectedEventId: (eventId: string | null) => void): void;
112
+ private getStorageKey;
113
+ updateDependencies(supabaseClient: SupabaseClient, user: User | null, session: Session | null, appName: string, selectedOrganisation: Organisation | null, setSelectedEventId: (eventId: string | null) => void): Promise<void>;
113
114
  getEvents(): Event[];
114
115
  getSelectedEvent(): Event | null;
115
116
  isLoading(): boolean;
@@ -124,8 +125,12 @@ declare class EventService extends BaseService implements IEventService {
124
125
  * @returns Promise<boolean> - true if event was successfully restored, false otherwise
125
126
  */
126
127
  restorePersistedEvent(): Promise<boolean>;
127
- persistEventSelection(eventId: string): void;
128
- clearEventSelection(): void;
128
+ persistEventSelection(eventId: string): Promise<void>;
129
+ clearEventSelection(): Promise<void>;
130
+ /**
131
+ * Clear event selection for a specific user (used when user logs out or changes)
132
+ */
133
+ clearEventSelectionForUser(userId: string | null): Promise<void>;
129
134
  autoSelectNextEvent(events: Event[]): void;
130
135
  initialize(): Promise<void>;
131
136
  cleanup(): void;
@@ -54,10 +54,10 @@ import {
54
54
  sortHierarchicalDataWithSorting,
55
55
  validateHierarchicalData,
56
56
  validatePaginationConfig
57
- } from "./chunk-OUU3SP6I.js";
58
- import "./chunk-ZPXWJA4H.js";
59
- import "./chunk-QKIVSZ2O.js";
60
- import "./chunk-3OGQLOJM.js";
57
+ } from "./chunk-UKZWNQMB.js";
58
+ import "./chunk-PHDAXDHB.js";
59
+ import "./chunk-WP5I5GLN.js";
60
+ import "./chunk-3DBFLLLU.js";
61
61
  import {
62
62
  CircuitBreaker,
63
63
  DEFAULT_FALLBACK_CONFIG,
@@ -75,13 +75,14 @@ import {
75
75
  safeExecute,
76
76
  throttle,
77
77
  useDataTablePerformance
78
- } from "./chunk-SYXOZQ4P.js";
79
- import "./chunk-L36JW4KV.js";
80
- import "./chunk-7H75SHXZ.js";
81
- import "./chunk-OO3V7W4H.js";
78
+ } from "./chunk-2GJ5GL77.js";
79
+ import "./chunk-LFS45U62.js";
80
+ import "./chunk-VN3OOE35.js";
81
+ import "./chunk-KA3PSVNV.js";
82
82
  import "./chunk-PYUXFQJ3.js";
83
83
  import "./chunk-JCQZ6LA7.js";
84
84
  import "./chunk-BDZUMRBD.js";
85
+ import "./chunk-UJI6WSMD.js";
85
86
  import "./chunk-SMJZMKYN.js";
86
87
  import "./chunk-PLDDJCW6.js";
87
88
  export {
@@ -157,4 +158,4 @@ export {
157
158
  validateHierarchicalData,
158
159
  validatePaginationConfig
159
160
  };
160
- //# sourceMappingURL=DataTable-H5KJCAIS.js.map
161
+ //# sourceMappingURL=DataTable-ZOAKQ3SU.js.map
@@ -1,11 +1,12 @@
1
1
  import {
2
2
  init_UnifiedAuthProvider
3
- } from "./chunk-7H75SHXZ.js";
3
+ } from "./chunk-VN3OOE35.js";
4
4
  import {
5
5
  UnifiedAuthProvider,
6
6
  useUnifiedAuth
7
- } from "./chunk-OO3V7W4H.js";
7
+ } from "./chunk-KA3PSVNV.js";
8
8
  import "./chunk-BDZUMRBD.js";
9
+ import "./chunk-UJI6WSMD.js";
9
10
  import "./chunk-SMJZMKYN.js";
10
11
  import "./chunk-PLDDJCW6.js";
11
12
  init_UnifiedAuthProvider();
@@ -13,4 +14,4 @@ export {
13
14
  UnifiedAuthProvider,
14
15
  useUnifiedAuth
15
16
  };
16
- //# sourceMappingURL=UnifiedAuthProvider-KZZUO27W.js.map
17
+ //# sourceMappingURL=UnifiedAuthProvider-YFN7YGVN.js.map
@@ -20,8 +20,8 @@ import {
20
20
  isSuperAdmin,
21
21
  resolveAppContext,
22
22
  setupRBAC
23
- } from "./chunk-QKIVSZ2O.js";
24
- import "./chunk-3OGQLOJM.js";
23
+ } from "./chunk-WP5I5GLN.js";
24
+ import "./chunk-3DBFLLLU.js";
25
25
  import "./chunk-PLDDJCW6.js";
26
26
  export {
27
27
  OrganisationContextRequiredError,
@@ -46,4 +46,4 @@ export {
46
46
  resolveAppContext,
47
47
  setupRBAC
48
48
  };
49
- //# sourceMappingURL=api-PKU4PUBO.js.map
49
+ //# sourceMappingURL=api-TNIBJWLM.js.map
@@ -4,7 +4,7 @@ import {
4
4
  emitAuditEvent,
5
5
  getGlobalAuditManager,
6
6
  setGlobalAuditManager
7
- } from "./chunk-3OGQLOJM.js";
7
+ } from "./chunk-3DBFLLLU.js";
8
8
  import "./chunk-PLDDJCW6.js";
9
9
  export {
10
10
  RBACAuditManager,
@@ -13,4 +13,4 @@ export {
13
13
  getGlobalAuditManager,
14
14
  setGlobalAuditManager
15
15
  };
16
- //# sourceMappingURL=audit-H4YJJF7R.js.map
16
+ //# sourceMappingURL=audit-T36HM7IM.js.map
@@ -616,4 +616,4 @@ export {
616
616
  safeExecute,
617
617
  useDataTablePerformance
618
618
  };
619
- //# sourceMappingURL=chunk-SYXOZQ4P.js.map
619
+ //# sourceMappingURL=chunk-2GJ5GL77.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useToast.ts","../src/components/DataTable/utils/performanceUtils.ts","../src/components/DataTable/utils/errorHandling.ts","../src/hooks/useDataTablePerformance.ts"],"sourcesContent":["\n/**\n * @file Toast hook for managing toast notifications\n * @package @jmruthers/pace-core\n * @module Hooks\n * @since 0.1.0\n *\n * Toast notifications automatically dismiss after 10 seconds by default.\n * The duration is fixed to the pace-core default to ensure consistent behaviour.\n */\n\nimport * as React from \"react\"\n\n/** Maximum number of toasts to show at once */\nconst TOAST_LIMIT = 5\n/** Delay before removing a dismissed toast */\nconst TOAST_REMOVE_DELAY = 1000\n/** Default duration for auto-dismissing toasts (10 seconds) */\nconst DEFAULT_TOAST_DURATION = 10000\n\nexport interface ToastProps {\n title?: React.ReactNode;\n description?: React.ReactNode;\n variant?: 'default' | 'destructive' | 'success';\n onClose?: () => void;\n action?: React.ReactElement;\n}\n\n/**\n * Extended toast props with additional properties\n * @interface ToasterToast\n */\ntype ToasterToast = ToastProps & {\n /** Unique identifier for the toast */\n id: string\n /** Duration before automatic dismissal in milliseconds */\n duration?: number\n /** Optional title content */\n title?: React.ReactNode\n /** Optional description content */\n description?: React.ReactNode\n /** Optional action button */\n action?: React.ReactElement\n /** Open state */\n open?: boolean\n /** Open change handler */\n onOpenChange?: (open: boolean) => void\n /** Dismiss function */\n dismiss?: () => void\n}\n\n/**\n * State interface for toast management\n */\ninterface State {\n /** Array of active toasts */\n toasts: ToasterToast[]\n}\n\n/** Map of toast IDs to their removal timeouts */\nconst toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>()\n\n/** Current toast state */\nlet memoryState: State = {\n toasts: [],\n}\n\n/** List of state change listeners */\nconst listeners: Array<(state: State) => void> = []\n\n/**\n * Reset the toast state and clear all timeouts\n */\nexport function reset() {\n memoryState = { toasts: [] }\n toastTimeouts.forEach((timeout) => clearTimeout(timeout))\n toastTimeouts.clear()\n}\n\n/**\n * Dispatch a state change\n * @param action - Action to dispatch\n */\nfunction dispatch(action: {\n type: \"ADD_TOAST\" | \"UPDATE_TOAST\" | \"DISMISS_TOAST\" | \"REMOVE_TOAST\"\n toast?: ToasterToast\n toastId?: string\n}) {\n memoryState = reducer(memoryState, action)\n listeners.forEach((listener) => {\n listener(memoryState)\n })\n}\n\n/**\n * Generate a unique ID for a toast\n * @returns Unique ID string\n */\nfunction genId() {\n return Math.random().toString(36).substring(2, 9)\n}\n\n/**\n * Add a toast to the removal queue\n * @param toastId - ID of the toast to remove\n */\nconst addToRemoveQueue = (toastId: string) => {\n if (toastTimeouts.has(toastId)) {\n return\n }\n\n const timeout = setTimeout(() => {\n toastTimeouts.delete(toastId)\n dispatch({\n type: \"REMOVE_TOAST\",\n toastId: toastId,\n })\n }, TOAST_REMOVE_DELAY)\n\n toastTimeouts.set(toastId, timeout)\n}\n\n/**\n * State reducer for toast management\n * @param state - Current state\n * @param action - Action to process\n * @returns New state\n */\nfunction reducer(state: State, action: {\n type: \"ADD_TOAST\" | \"UPDATE_TOAST\" | \"DISMISS_TOAST\" | \"REMOVE_TOAST\"\n toast?: ToasterToast\n toastId?: string\n}): State {\n switch (action.type) {\n case \"ADD_TOAST\":\n return {\n ...state,\n toasts: [action.toast!, ...state.toasts].slice(0, TOAST_LIMIT),\n }\n\n case \"UPDATE_TOAST\":\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === action.toast?.id ? { ...t, ...action.toast } : t\n ),\n }\n\n case \"DISMISS_TOAST\": {\n const { toastId } = action\n\n if (toastId) {\n addToRemoveQueue(toastId)\n }\n\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === toastId || toastId === undefined\n ? {\n ...t,\n open: false,\n }\n : t\n ),\n }\n }\n\n case \"REMOVE_TOAST\":\n if (action.toastId === undefined) {\n return {\n ...state,\n toasts: [],\n }\n }\n return {\n ...state,\n toasts: state.toasts.filter((t) => t.id !== action.toastId),\n }\n }\n}\n\n/**\n * Toast configuration without ID\n * Duration is fixed to DEFAULT_TOAST_DURATION and cannot be overridden\n */\ntype Toast = Omit<ToasterToast, \"id\" | \"duration\">\n\n/**\n * Creates a new toast notification\n * @param props - Toast configuration. Duration is automatically set to 10 seconds (10000ms) and cannot be customized.\n * @returns Object with toast ID and control methods\n */\nfunction toast(props: Toast) {\n const id = genId()\n\n const update = (props: Partial<Omit<ToasterToast, \"id\" | \"duration\">>) =>\n dispatch({\n type: \"UPDATE_TOAST\",\n toast: { ...props, duration: DEFAULT_TOAST_DURATION, id },\n })\n const dismiss = () => dispatch({ type: \"DISMISS_TOAST\", toastId: id })\n\n dispatch({\n type: \"ADD_TOAST\",\n toast: {\n ...props,\n duration: DEFAULT_TOAST_DURATION,\n id,\n open: true,\n dismiss,\n onOpenChange: (open) => {\n if (!open) dismiss()\n },\n },\n })\n\n return {\n id: id,\n dismiss,\n update,\n }\n}\n\n/**\n * Hook for managing toast notifications\n * @returns Object with toast state and control methods\n */\nfunction useToast() {\n const [state, setState] = React.useState<State>(memoryState)\n\n React.useEffect(() => {\n listeners.push(setState)\n return () => {\n const index = listeners.indexOf(setState)\n if (index > -1) {\n listeners.splice(index, 1)\n }\n }\n }, [state])\n\n return {\n ...state,\n toast,\n dismiss: (toastId?: string) => dispatch({ type: \"DISMISS_TOAST\", toastId }),\n }\n}\n\nexport { useToast, toast }\nexport type { ToasterToast }\n","/**\n * @file Performance Utilities for DataTable\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Utils/Performance\n * @since 0.3.0\n */\n\nimport type { \n DataRecord, \n PaginationMode, \n ChunkingConfig, \n SearchIndexConfig\n} from '../types';\n\n// ============================================================================\n// PAGINATION MODE DETECTION\n// ============================================================================\n\n/**\n * Determines the optimal pagination mode based on dataset size\n * \n * IMPORTANT: This function NEVER returns 'server' mode - it only returns 'client' or 'hybrid'.\n * Server mode should ONLY be used when serverSide config is explicitly provided.\n * Returning 'server' without serverSide config breaks pagination because TanStack Table\n * expects pre-paginated data but receives all client-side data.\n * \n * For large datasets (>10k rows), returns 'hybrid' which still uses client-side pagination\n * but with optimizations. If true server-side pagination is needed, serverSide config must be provided.\n */\nexport function determinePaginationMode(\n dataLength: number,\n serverSideThreshold: number = 10000\n): 'client' | 'hybrid' {\n if (dataLength <= 1000) return 'client';\n // Even for very large datasets, use 'hybrid' mode (client-side pagination with optimizations)\n // unless serverSide config is explicitly provided (handled in useDataTablePerformance)\n return 'hybrid';\n}\n\n/**\n * Gets optimal page size options based on pagination mode and dataset size\n */\nexport function getOptimalPageSizeOptions(\n mode: PaginationMode,\n dataLength: number\n): number[] {\n switch (mode) {\n case 'client':\n return dataLength <= 100 ? [10, 25, 50] : [10, 25, 50, 100];\n case 'hybrid':\n return [50, 100, 250, 500];\n case 'server':\n return [25, 50, 100, 250];\n default:\n return [10, 25, 50, 100];\n }\n}\n\n// ============================================================================\n// DATA CHUNKING\n// ============================================================================\n\n/**\n * Splits data into chunks for memory management\n */\nexport function chunkData<TData extends DataRecord>(\n data: TData[],\n chunkSize: number\n): TData[][] {\n const chunks: TData[][] = [];\n for (let i = 0; i < data.length; i += chunkSize) {\n chunks.push(data.slice(i, i + chunkSize));\n }\n return chunks;\n}\n\n/**\n * Manages data chunks with LRU cache\n */\nexport class DataChunkManager<TData extends DataRecord> {\n private chunks: Map<number, TData[]> = new Map();\n private accessOrder: number[] = [];\n private maxChunks: number;\n private chunkSize: number;\n\n constructor(config: ChunkingConfig) {\n this.maxChunks = config.maxChunksInMemory;\n this.chunkSize = config.chunkSize;\n }\n\n getChunk(chunkIndex: number, allData: TData[]): TData[] {\n // Check if chunk is already in memory\n if (this.chunks.has(chunkIndex)) {\n this.updateAccessOrder(chunkIndex);\n return this.chunks.get(chunkIndex)!;\n }\n\n // Calculate chunk bounds\n const startIndex = chunkIndex * this.chunkSize;\n const endIndex = Math.min(startIndex + this.chunkSize, allData.length);\n const chunk = allData.slice(startIndex, endIndex);\n\n // Add chunk to memory\n this.addChunk(chunkIndex, chunk);\n return chunk;\n }\n\n private addChunk(chunkIndex: number, chunk: TData[]): void {\n // Remove oldest chunk if at capacity\n if (this.chunks.size >= this.maxChunks && !this.chunks.has(chunkIndex)) {\n const oldestChunk = this.accessOrder.shift();\n if (oldestChunk !== undefined) {\n this.chunks.delete(oldestChunk);\n }\n }\n\n this.chunks.set(chunkIndex, chunk);\n this.updateAccessOrder(chunkIndex);\n }\n\n private updateAccessOrder(chunkIndex: number): void {\n const existingIndex = this.accessOrder.indexOf(chunkIndex);\n if (existingIndex > -1) {\n this.accessOrder.splice(existingIndex, 1);\n }\n this.accessOrder.push(chunkIndex);\n }\n\n clear(): void {\n this.chunks.clear();\n this.accessOrder = [];\n }\n\n getMemoryUsage(): number {\n let totalSize = 0;\n for (const chunk of this.chunks.values()) {\n totalSize += JSON.stringify(chunk).length;\n }\n return totalSize / (1024 * 1024); // Convert to MB\n }\n}\n\n// ============================================================================\n// SEARCH INDEXING\n// ============================================================================\n\n/**\n * Creates a search index for fast text searching\n */\nexport class SearchIndex<TData extends DataRecord> {\n private index: Map<string, Set<number>> = new Map();\n private data: TData[] = [];\n private indexedFields: string[];\n private fuzzySearch: boolean;\n private fuzzyThreshold: number;\n\n constructor(config: SearchIndexConfig) {\n this.indexedFields = config.indexedFields;\n this.fuzzySearch = config.fuzzySearch ?? false;\n this.fuzzyThreshold = config.fuzzyThreshold ?? 0.6;\n }\n\n buildIndex(data: TData[]): void {\n this.data = data;\n this.index.clear();\n\n data.forEach((row, rowIndex) => {\n this.indexedFields.forEach(field => {\n const value = this.getNestedValue(row, field);\n if (value != null) {\n const searchableText = String(value).toLowerCase();\n const words = this.tokenize(searchableText);\n \n words.forEach(word => {\n if (!this.index.has(word)) {\n this.index.set(word, new Set());\n }\n this.index.get(word)!.add(rowIndex);\n });\n }\n });\n });\n }\n\n search(query: string): number[] {\n if (!query.trim()) return [];\n\n const searchTerms = this.tokenize(query.toLowerCase());\n const matchingSets: Set<number>[] = [];\n\n searchTerms.forEach(term => {\n const matches = new Set<number>();\n \n // Exact matches\n if (this.index.has(term)) {\n this.index.get(term)!.forEach(index => matches.add(index));\n }\n\n // Fuzzy matches\n if (this.fuzzySearch) {\n for (const [indexedTerm, indices] of this.index.entries()) {\n if (this.calculateSimilarity(term, indexedTerm) >= this.fuzzyThreshold) {\n indices.forEach(index => matches.add(index));\n }\n }\n }\n\n matchingSets.push(matches);\n });\n\n // Find intersection of all matching sets\n if (matchingSets.length === 0) return [];\n \n let result = matchingSets[0];\n for (let i = 1; i < matchingSets.length; i++) {\n result = new Set([...result].filter(x => matchingSets[i].has(x)));\n }\n\n return Array.from(result);\n }\n\n private getNestedValue(obj: any, path: string): any {\n return path.split('.').reduce((current, key) => current?.[key], obj);\n }\n\n private tokenize(text: string): string[] {\n return text\n .replace(/[^\\w\\s]/g, ' ')\n .split(/\\s+/)\n .filter(word => word.length > 0);\n }\n\n private calculateSimilarity(str1: string, str2: string): number {\n const longer = str1.length > str2.length ? str1 : str2;\n const shorter = str1.length > str2.length ? str2 : str1;\n \n if (longer.length === 0) return 1.0;\n \n const editDistance = this.levenshteinDistance(longer, shorter);\n return (longer.length - editDistance) / longer.length;\n }\n\n private levenshteinDistance(str1: string, str2: string): number {\n const matrix = Array(str2.length + 1).fill(null).map(() => \n Array(str1.length + 1).fill(null)\n );\n\n for (let i = 0; i <= str1.length; i++) matrix[0][i] = i;\n for (let j = 0; j <= str2.length; j++) matrix[j][0] = j;\n\n for (let j = 1; j <= str2.length; j++) {\n for (let i = 1; i <= str1.length; i++) {\n const substitutionCost = str1[i - 1] === str2[j - 1] ? 0 : 1;\n matrix[j][i] = Math.min(\n matrix[j][i - 1] + 1, // insertion\n matrix[j - 1][i] + 1, // deletion\n matrix[j - 1][i - 1] + substitutionCost // substitution\n );\n }\n }\n\n return matrix[str2.length][str1.length];\n }\n}\n\n\n// ============================================================================\n// DEBOUNCE UTILITIES\n// ============================================================================\n\n/**\n * Creates a debounced function\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let timeoutId: NodeJS.Timeout;\n \n return (...args: Parameters<T>) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => func(...args), delay);\n };\n}\n\n/**\n * Creates a throttled function\n */\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let lastCall = 0;\n \n return (...args: Parameters<T>) => {\n const now = Date.now();\n if (now - lastCall >= delay) {\n lastCall = now;\n func(...args);\n }\n };\n}\n\n// ============================================================================\n// MEMORY MANAGEMENT\n// ============================================================================\n\n/**\n * Intersection Observer for tracking visible rows\n */\nexport class VisibilityTracker {\n private observer: IntersectionObserver | null = null;\n private visibleElements = new Set<Element>();\n private callbacks = new Set<(visibleCount: number) => void>();\n\n constructor() {\n if (typeof IntersectionObserver !== 'undefined') {\n this.observer = new IntersectionObserver(\n (entries) => {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n this.visibleElements.add(entry.target);\n } else {\n this.visibleElements.delete(entry.target);\n }\n });\n \n this.callbacks.forEach(callback => {\n callback(this.visibleElements.size);\n });\n },\n { threshold: 0.1 }\n );\n }\n }\n\n observe(element: Element): void {\n this.observer?.observe(element);\n }\n\n unobserve(element: Element): void {\n this.observer?.unobserve(element);\n this.visibleElements.delete(element);\n }\n\n onVisibilityChange(callback: (visibleCount: number) => void): () => void {\n this.callbacks.add(callback);\n return () => this.callbacks.delete(callback);\n }\n\n getVisibleCount(): number {\n return this.visibleElements.size;\n }\n\n destroy(): void {\n this.observer?.disconnect();\n this.visibleElements.clear();\n this.callbacks.clear();\n }\n} ","/**\n * @file Error Handling Stubs\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Utils/Stubs\n * \n * Minimal stubs for removed error handling utilities.\n * This file exists only to prevent import errors in useDataTablePerformance.\n */\n\nexport interface FallbackConfig {\n enabled: boolean;\n}\n\nexport const DEFAULT_FALLBACK_CONFIG: FallbackConfig = {\n enabled: false\n};\n\nexport enum DataTableErrorType {\n VIRTUALIZATION = 'virtualization',\n SEARCH_INDEX = 'search_index',\n DATA_CHUNK = 'data_chunk',\n SERVER_FETCH = 'server_fetch',\n MEMORY = 'memory'\n}\n\nexport class DataTableError extends Error {\n constructor(\n message: string,\n public type: DataTableErrorType,\n public recoverable: boolean = true\n ) {\n super(message);\n this.name = 'DataTableError';\n }\n}\n\nexport class ErrorRecoveryManager {\n constructor(private config: FallbackConfig) {}\n \n async handleError(error: DataTableError) {\n return { recovered: false, strategy: null };\n }\n \n clearErrorLog(): void {\n // Stub method\n }\n}\n\nexport class MemoryMonitor {\n constructor(private threshold: number = 100) {}\n \n getCurrentUsage(): number {\n return 0;\n }\n \n checkThreshold(): boolean {\n return true;\n }\n \n stopMonitoring(): void {\n // Stub method\n }\n}\n\nexport class CircuitBreaker {\n constructor() {}\n \n isOpen(): boolean {\n return false;\n }\n \n recordSuccess(): void {}\n \n recordFailure(): void {}\n \n reset(): void {}\n}\n\nexport function safeExecute<T>(fn: () => T, fallback: T): T {\n try {\n return fn();\n } catch {\n return fallback;\n }\n}\n\n","/**\n * @file DataTable Performance Hook\n * @package @jmruthers/pace-core\n * @module Hooks/DataTablePerformance\n * @since 0.3.0\n */\n\nimport { useState, useEffect, useCallback, useMemo, useRef } from 'react';\nimport type { \n DataRecord,\n PaginationMode,\n PerformanceConfig,\n ServerSideConfig,\n ServerSideParams,\n ServerSideResponse,\n ChunkingConfig,\n SearchIndexConfig,\n} from '../components/DataTable/types';\nimport {\n determinePaginationMode,\n getOptimalPageSizeOptions,\n DataChunkManager,\n SearchIndex,\n debounce,\n VisibilityTracker\n} from '../components/DataTable/utils/performanceUtils';\nimport {\n ErrorRecoveryManager,\n DataTableError,\n DataTableErrorType,\n safeExecute,\n MemoryMonitor,\n CircuitBreaker,\n DEFAULT_FALLBACK_CONFIG,\n type FallbackConfig\n} from '../components/DataTable/utils/errorHandling';\n\nexport interface UseDataTablePerformanceOptions<TData extends DataRecord> {\n data: TData[];\n performance?: PerformanceConfig;\n serverSide?: ServerSideConfig<TData>;\n chunking?: ChunkingConfig;\n searchIndex?: SearchIndexConfig;\n // Enhanced error handling options\n fallbackConfig?: FallbackConfig;\n onError?: (error: DataTableError) => void;\n enableErrorRecovery?: boolean;\n}\n\nexport interface UseDataTablePerformanceReturn<TData extends DataRecord> {\n // Performance state\n paginationMode: PaginationMode;\n isVirtualized: boolean;\n pageSizeOptions: number[];\n \n // Data management\n processedData: TData[];\n totalCount: number;\n isLoading: boolean;\n \n // Search functionality\n searchQuery: string;\n setSearchQuery: (query: string) => void;\n searchResults: number[];\n \n // Server-side functionality\n fetchServerData: (params: ServerSideParams) => Promise<void>;\n serverData: ServerSideResponse<TData> | null;\n \n // Performance monitoring\n memoryUsage: number;\n \n // Error handling and recovery\n errorState: {\n hasErrors: boolean;\n errorCount: number;\n lastError: DataTableError | null;\n fallbacksActive: string[];\n };\n retryLastOperation: () => Promise<void>;\n clearErrors: () => void;\n \n // Cleanup\n cleanup: () => void;\n}\n\n/**\n * Hook for managing DataTable performance optimizations\n */\nexport function useDataTablePerformance<TData extends DataRecord>({\n data,\n performance = {},\n serverSide,\n chunking,\n searchIndex,\n fallbackConfig = DEFAULT_FALLBACK_CONFIG,\n onError,\n enableErrorRecovery = true\n}: UseDataTablePerformanceOptions<TData>): UseDataTablePerformanceReturn<TData> {\n // ============================================================================\n // STATE MANAGEMENT\n // ============================================================================\n \n const [isLoading, setIsLoading] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n const [searchResults, setSearchResults] = useState<number[]>([]);\n const [serverData, setServerData] = useState<ServerSideResponse<TData> | null>(null);\n const [memoryUsage, setMemoryUsage] = useState(0);\n \n // Error handling state\n const [errorState, setErrorState] = useState({\n hasErrors: false,\n errorCount: 0,\n lastError: null as DataTableError | null,\n fallbacksActive: [] as string[],\n });\n const [lastFailedOperation, setLastFailedOperation] = useState<(() => Promise<any>) | null>(null);\n\n // ============================================================================\n // REFS AND MANAGERS\n // ============================================================================\n \n const chunkManagerRef = useRef<DataChunkManager<TData> | null>(null);\n const searchIndexRef = useRef<SearchIndex<TData> | null>(null);\n const visibilityTrackerRef = useRef<VisibilityTracker | null>(null);\n \n // Error handling managers\n const errorRecoveryManagerRef = useRef<ErrorRecoveryManager>(new ErrorRecoveryManager(fallbackConfig));\n const memoryMonitorRef = useRef<MemoryMonitor | null>(null);\n const circuitBreakerRef = useRef<CircuitBreaker>(new CircuitBreaker());\n\n // ============================================================================\n // COMPUTED VALUES\n // ============================================================================\n \n const paginationMode = useMemo(() => {\n // CRITICAL FIX: Only use 'server' mode if serverSide config is explicitly provided.\n // determinePaginationMode now never returns 'server' - it only returns 'client' or 'hybrid'.\n // This fixes pagination issues where large datasets would auto-detect 'server' mode\n // but have no serverSide config, causing pagination controls to break.\n if (serverSide) return 'server';\n return determinePaginationMode(data?.length || 0, performance.serverSideThreshold);\n }, [data?.length, performance.serverSideThreshold, serverSide]);\n\n // Virtualization is now handled internally by UnifiedTableBody\n const isVirtualized = false;\n\n const pageSizeOptions = useMemo(() => {\n return getOptimalPageSizeOptions(paginationMode, data?.length || 0);\n }, [paginationMode, data?.length]);\n\n // ============================================================================\n // DATA PROCESSING\n // ============================================================================\n \n const processedData = useMemo(() => {\n if (serverSide && serverData) {\n return serverData.data;\n }\n\n let filteredData = data;\n \n // Apply search filtering - ensure we don't exclude zero values\n if (searchQuery && searchResults.length > 0) {\n filteredData = searchResults.map(index => data[index]);\n }\n\n // Important: Ensure we don't accidentally filter out rows with zero values\n // This was causing \"no data\" issues when rows contained zero values in numeric columns\n // The filtering should be explicit, not implicit based on falsy values\n\n return filteredData;\n }, [data, serverData, searchQuery, searchResults, serverSide]);\n\n const totalCount = useMemo(() => {\n if (serverSide && serverData) {\n return serverData.totalCount;\n }\n return processedData?.length || 0;\n }, [serverData, processedData?.length, serverSide]);\n\n // ============================================================================\n // CHUNK MANAGEMENT\n // ============================================================================\n \n useEffect(() => {\n if (chunking && !chunkManagerRef.current) {\n chunkManagerRef.current = new DataChunkManager<TData>(chunking);\n }\n }, [chunking]);\n\n // ============================================================================\n // SEARCH INDEX MANAGEMENT\n // ============================================================================\n \n useEffect(() => {\n if (searchIndex && !searchIndexRef.current) {\n searchIndexRef.current = new SearchIndex<TData>(searchIndex);\n }\n\n if (searchIndexRef.current && data.length > 0) {\n searchIndexRef.current.buildIndex(data);\n }\n }, [searchIndex, data]);\n\n // Debounced search function\n const debouncedSearch = useCallback(\n debounce((query: string) => {\n if (!searchIndexRef.current) return;\n \n if (!query.trim()) {\n setSearchResults([]);\n return;\n }\n\n const results = searchIndexRef.current.search(query);\n setSearchResults(results);\n }, performance.debounceSearch ?? 300),\n [performance.debounceSearch]\n );\n\n // Handle search query changes\n useEffect(() => {\n debouncedSearch(searchQuery);\n }, [searchQuery, debouncedSearch]);\n\n // ============================================================================\n // SERVER-SIDE DATA FETCHING\n // ============================================================================\n \n const fetchServerData = useCallback(async (params: ServerSideParams) => {\n if (!serverSide) return;\n\n setIsLoading(true);\n try {\n const response = await serverSide.fetchData(params);\n setServerData(response);\n } catch (error) {\n console.error('Failed to fetch server data:', error);\n } finally {\n setIsLoading(false);\n }\n }, [serverSide]);\n\n // ============================================================================\n // PERFORMANCE MONITORING\n // ============================================================================\n \n useEffect(() => {\n if (!visibilityTrackerRef.current) {\n visibilityTrackerRef.current = new VisibilityTracker();\n }\n\n const tracker = visibilityTrackerRef.current;\n const unsubscribe = tracker.onVisibilityChange((visibleCount) => {\n // Performance monitoring removed\n });\n\n return unsubscribe;\n }, [totalCount, isVirtualized, paginationMode]);\n\n // Update memory usage\n useEffect(() => {\n const updateMemoryUsage = () => {\n let usage = 0;\n \n if (chunkManagerRef.current) {\n usage += chunkManagerRef.current.getMemoryUsage();\n }\n \n // Add general memory estimation\n usage += (JSON.stringify(processedData || []).length) / (1024 * 1024);\n \n setMemoryUsage(usage);\n };\n\n updateMemoryUsage();\n \n // Only set up interval in non-test environments to prevent memory leaks during testing\n const interval = import.meta.env.MODE !== 'test' \n ? setInterval(updateMemoryUsage, 5000) \n : null;\n \n return () => {\n if (interval) {\n clearInterval(interval);\n }\n };\n }, [processedData]);\n\n // ============================================================================\n // ERROR HANDLING FUNCTIONS\n // ============================================================================\n \n const handleError = useCallback(async (error: DataTableError, operation?: () => Promise<any>) => {\n if (enableErrorRecovery) {\n try {\n const recovery = await errorRecoveryManagerRef.current.handleError(error);\n setErrorState(prev => ({\n hasErrors: true,\n errorCount: prev.errorCount + 1,\n lastError: error,\n fallbacksActive: [...prev.fallbacksActive, error.type],\n }));\n \n if (operation) {\n setLastFailedOperation(() => operation);\n }\n \n onError?.(error);\n return recovery;\n } catch (recoveryError) {\n console.error('Error recovery failed:', recoveryError);\n }\n }\n throw error;\n }, [enableErrorRecovery, onError]);\n\n const retryLastOperation = useCallback(async () => {\n if (lastFailedOperation) {\n try {\n await lastFailedOperation();\n setLastFailedOperation(null);\n setErrorState(prev => ({ ...prev, hasErrors: false }));\n } catch (error) {\n console.error('Retry failed:', error);\n }\n }\n }, [lastFailedOperation]);\n\n const clearErrors = useCallback(() => {\n setErrorState({\n hasErrors: false,\n errorCount: 0,\n lastError: null,\n fallbacksActive: [],\n });\n setLastFailedOperation(null);\n errorRecoveryManagerRef.current.clearErrorLog();\n }, []);\n\n // ============================================================================\n // CLEANUP\n // ============================================================================\n \n const cleanup = useCallback(() => {\n chunkManagerRef.current?.clear();\n visibilityTrackerRef.current?.destroy();\n memoryMonitorRef.current?.stopMonitoring();\n }, []);\n\n useEffect(() => {\n return cleanup;\n }, [cleanup]);\n\n // ============================================================================\n // RETURN VALUES\n // ============================================================================\n \n return {\n // Performance state\n paginationMode,\n isVirtualized,\n pageSizeOptions,\n \n // Data management\n processedData,\n totalCount,\n isLoading,\n \n // Search functionality\n searchQuery,\n setSearchQuery,\n searchResults,\n \n // Server-side functionality\n fetchServerData,\n serverData,\n \n // Performance monitoring\n memoryUsage,\n \n // Error handling and recovery\n errorState,\n retryLastOperation,\n clearErrors,\n \n // Cleanup\n cleanup\n };\n} "],"mappings":"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","names":["props","DataTableErrorType","useState","useEffect","useState","useEffect"]}
@@ -25,16 +25,16 @@ import {
25
25
  SelectSeparator,
26
26
  SelectTrigger,
27
27
  SelectValue
28
- } from "./chunk-OUU3SP6I.js";
28
+ } from "./chunk-UKZWNQMB.js";
29
29
  import {
30
30
  useCan,
31
31
  usePermissions,
32
32
  useRBAC,
33
33
  useResolvedScope
34
- } from "./chunk-ZPXWJA4H.js";
34
+ } from "./chunk-PHDAXDHB.js";
35
35
  import {
36
36
  isSuperAdmin
37
- } from "./chunk-QKIVSZ2O.js";
37
+ } from "./chunk-WP5I5GLN.js";
38
38
  import {
39
39
  OrganisationProvider_exports,
40
40
  PublicErrorBoundary,
@@ -45,23 +45,24 @@ import {
45
45
  init_OrganisationProvider,
46
46
  uploadFileWithReference,
47
47
  useAppConfig,
48
+ useEventTheme,
48
49
  useFileDisplay,
49
50
  useIsPublicPage,
50
51
  usePublicFileDisplay,
51
52
  usePublicPageContext
52
- } from "./chunk-F6QB26OS.js";
53
+ } from "./chunk-P3PUOL6B.js";
53
54
  import {
54
55
  useToast
55
- } from "./chunk-SYXOZQ4P.js";
56
+ } from "./chunk-2GJ5GL77.js";
56
57
  import {
57
58
  init_useOrganisations,
58
59
  useEvents,
59
60
  useOrganisations
60
- } from "./chunk-L36JW4KV.js";
61
+ } from "./chunk-LFS45U62.js";
61
62
  import {
62
63
  UnifiedAuthProvider_exports,
63
64
  init_UnifiedAuthProvider as init_UnifiedAuthProvider2
64
- } from "./chunk-7H75SHXZ.js";
65
+ } from "./chunk-VN3OOE35.js";
65
66
  import {
66
67
  EventServiceContext,
67
68
  EventServiceProvider,
@@ -71,7 +72,7 @@ import {
71
72
  useEventService,
72
73
  useSessionRestoration,
73
74
  useUnifiedAuth
74
- } from "./chunk-OO3V7W4H.js";
75
+ } from "./chunk-KA3PSVNV.js";
75
76
  import {
76
77
  LoadingSpinner
77
78
  } from "./chunk-CDQ3PX7L.js";
@@ -375,7 +376,7 @@ function Toaster() {
375
376
  /* @__PURE__ */ jsx5(ToastViewport, {}),
376
377
  toasts.map((toast) => {
377
378
  const { id, title, description, action, dismiss, duration, ...toastProps } = toast;
378
- return /* @__PURE__ */ jsxs2(Toast, { ...toastProps, children: [
379
+ return /* @__PURE__ */ jsxs2(Toast, { ...toastProps, duration, children: [
379
380
  title && /* @__PURE__ */ jsx5(ToastTitle, { children: title }),
380
381
  description && /* @__PURE__ */ jsx5(ToastDescription, { children: description }),
381
382
  action && action,
@@ -586,20 +587,7 @@ function EventSelector({
586
587
  }, [events]);
587
588
  useEffect(() => {
588
589
  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
- }
590
+ autoSelectEvent();
603
591
  }
604
592
  function autoSelectEvent() {
605
593
  const today = /* @__PURE__ */ new Date();
@@ -1480,6 +1468,7 @@ function PaceAppLayout({
1480
1468
  const { selectedOrganisation } = useOrganisations();
1481
1469
  const navigate = useNavigate();
1482
1470
  const location = useLocation();
1471
+ useEventTheme();
1483
1472
  let selectedEvent = null;
1484
1473
  try {
1485
1474
  const eventsContext = useEvents();
@@ -1585,7 +1574,7 @@ function PaceAppLayout({
1585
1574
  appId: user.user_metadata?.appId || user.app_metadata?.appId
1586
1575
  };
1587
1576
  try {
1588
- const { isSuperAdmin: isSuperAdmin2 } = await import("./api-PKU4PUBO.js");
1577
+ const { isSuperAdmin: isSuperAdmin2 } = await import("./api-TNIBJWLM.js");
1589
1578
  const isSuper = await isSuperAdmin2(user.id);
1590
1579
  if (isSuper) {
1591
1580
  if (isMounted) {
@@ -1606,7 +1595,7 @@ function PaceAppLayout({
1606
1595
  return;
1607
1596
  }
1608
1597
  try {
1609
- const { getPermissionMap } = await import("./api-PKU4PUBO.js");
1598
+ const { getPermissionMap } = await import("./api-TNIBJWLM.js");
1610
1599
  const permissionMap = await getPermissionMap({
1611
1600
  userId: user.id,
1612
1601
  scope: scope2
@@ -1665,7 +1654,7 @@ function PaceAppLayout({
1665
1654
  let hasAccess = true;
1666
1655
  if (currentRoute.pageId && currentRoute.permissions && currentRoute.permissions.length > 0) {
1667
1656
  try {
1668
- const { isPermittedCached } = await import("./api-PKU4PUBO.js");
1657
+ const { isPermittedCached } = await import("./api-TNIBJWLM.js");
1669
1658
  const hasPagePermission = await isPermittedCached({
1670
1659
  userId: user?.id || "",
1671
1660
  scope,
@@ -1681,7 +1670,7 @@ function PaceAppLayout({
1681
1670
  }
1682
1671
  }
1683
1672
  if (hasAccess && currentRoute.roles && currentRoute.roles.length > 0 && user?.id) {
1684
- const { useUnifiedAuth: useUnifiedAuth2 } = await import("./UnifiedAuthProvider-KZZUO27W.js");
1673
+ const { useUnifiedAuth: useUnifiedAuth2 } = await import("./UnifiedAuthProvider-YFN7YGVN.js");
1685
1674
  hasAccess = true;
1686
1675
  }
1687
1676
  if (!isMounted) return;
@@ -1790,7 +1779,7 @@ function PaceAppLayout({
1790
1779
 
1791
1780
  // src/components/PaceLoginPage/PaceLoginPage.tsx
1792
1781
  import { useEffect as useEffect4, useState as useState6, useContext } from "react";
1793
- import { useNavigate as useNavigate2 } from "react-router-dom";
1782
+ import { useNavigate as useNavigate2, useLocation as useLocation2 } from "react-router-dom";
1794
1783
  init_runtime();
1795
1784
  init_EventServiceProvider();
1796
1785
  import { jsx as jsx15, jsxs as jsxs11 } from "react/jsx-runtime";
@@ -1801,6 +1790,7 @@ var PaceLoginPage = ({
1801
1790
  }) => {
1802
1791
  const { signIn, isAuthenticated, isLoading, authError, user, supabase } = useUnifiedAuth();
1803
1792
  const navigate = useNavigate2();
1793
+ const location = useLocation2();
1804
1794
  const [isSigningIn, setIsSigningIn] = useState6(false);
1805
1795
  const [accessError, setAccessError] = useState6(null);
1806
1796
  const [isCheckingAccess, setIsCheckingAccess] = useState6(false);
@@ -1809,6 +1799,12 @@ var PaceLoginPage = ({
1809
1799
  useEffect4(() => {
1810
1800
  clearPalette();
1811
1801
  }, []);
1802
+ useEffect4(() => {
1803
+ const isOnLoginPage = location.pathname === "/login" || location.pathname.startsWith("/login");
1804
+ if (isOnLoginPage) {
1805
+ clearPalette();
1806
+ }
1807
+ }, [location.pathname]);
1812
1808
  useEffect4(() => {
1813
1809
  const restoreEvent = async () => {
1814
1810
  try {
@@ -1997,7 +1993,7 @@ function ProtectedRoute({
1997
1993
  loadingFallback,
1998
1994
  loginPath = "/login"
1999
1995
  }) {
2000
- const { isAuthenticated, isLoading } = useUnifiedAuth();
1996
+ const { isAuthenticated, authLoading } = useUnifiedAuth();
2001
1997
  const { selectedEvent, events, isLoading: eventLoading } = useEvents();
2002
1998
  const sessionRestoration = useSessionRestoration();
2003
1999
  const isRestoringSession = useMemo6(() => {
@@ -2011,7 +2007,10 @@ function ProtectedRoute({
2011
2007
  if (isRestoringSession) {
2012
2008
  return /* @__PURE__ */ jsx17(SessionRestorationLoader, {});
2013
2009
  }
2014
- if (isLoading && !sessionRestoration.hasTimedOut) {
2010
+ if (requireEvent && eventLoading) {
2011
+ return /* @__PURE__ */ jsx17(Outlet2, {});
2012
+ }
2013
+ if (authLoading && !sessionRestoration.hasTimedOut) {
2015
2014
  return loadingFallback || /* @__PURE__ */ jsx17("div", { style: { display: "flex", justifyContent: "center", alignItems: "center", height: "100vh" }, children: /* @__PURE__ */ jsx17(LoadingSpinner, {}) });
2016
2015
  }
2017
2016
  if (!isAuthenticated) {
@@ -2026,9 +2025,6 @@ function ProtectedRoute({
2026
2025
  if (!requireEvent) {
2027
2026
  return /* @__PURE__ */ jsx17(Outlet2, {});
2028
2027
  }
2029
- if (eventLoading) {
2030
- return /* @__PURE__ */ jsx17(Outlet2, {});
2031
- }
2032
2028
  if (!events || events.length === 0) {
2033
2029
  return noEventsFallback || /* @__PURE__ */ jsx17("div", { style: { display: "flex", justifyContent: "center", alignItems: "center", minHeight: "100vh", padding: "2rem" }, children: /* @__PURE__ */ jsxs13(Alert, { variant: "destructive", className: "max-w-md", children: [
2034
2030
  /* @__PURE__ */ jsx17(AlertTitle, { children: "No Events Available" }),
@@ -4517,4 +4513,4 @@ export {
4517
4513
  PublicPageDiagnostic,
4518
4514
  PublicPageContextChecker
4519
4515
  };
4520
- //# sourceMappingURL=chunk-XYRZV7R5.js.map
4516
+ //# sourceMappingURL=chunk-2LM4QQGH.js.map