@jmruthers/pace-core 0.5.68 → 0.5.69

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 (375) hide show
  1. package/dist/{DataTable-4IUY7BXB.js → DataTable-MPBSXUC6.js} +5 -6
  2. package/dist/{PublicLoadingSpinner-DdKXTkCZ.d.ts → PublicLoadingSpinner-BOdyU3u-.d.ts} +1 -1
  3. package/dist/{chunk-PXWEDX7Y.js → chunk-2ARQW6VX.js} +3 -3
  4. package/dist/{chunk-MOJXHWDE.js → chunk-6JILXFEA.js} +335 -5
  5. package/dist/chunk-6JILXFEA.js.map +1 -0
  6. package/dist/{chunk-D7ARGIA3.js → chunk-6RBH67W7.js} +23 -6
  7. package/dist/chunk-6RBH67W7.js.map +1 -0
  8. package/dist/{chunk-ZMS23NS5.js → chunk-FJTAWPAQ.js} +3 -5
  9. package/dist/{chunk-ZMS23NS5.js.map → chunk-FJTAWPAQ.js.map} +1 -1
  10. package/dist/{chunk-OPCWH3A4.js → chunk-NO5QHMDX.js} +7 -6
  11. package/dist/chunk-NO5QHMDX.js.map +1 -0
  12. package/dist/{chunk-ZPK5656W.js → chunk-O3NWNXDY.js} +4 -5
  13. package/dist/chunk-O3NWNXDY.js.map +1 -0
  14. package/dist/{chunk-UYA6U6H7.js → chunk-Q2UP3ZWQ.js} +4 -4
  15. package/dist/{chunk-KRCRNXPD.js → chunk-RVYGJPOD.js} +79 -18
  16. package/dist/chunk-RVYGJPOD.js.map +1 -0
  17. package/dist/{chunk-NN45OBIS.js → chunk-UCMHBF7Y.js} +3 -5
  18. package/dist/{chunk-NN45OBIS.js.map → chunk-UCMHBF7Y.js.map} +1 -1
  19. package/dist/{chunk-ZPG4XPV5.js → chunk-V3QO3LL7.js} +5 -7
  20. package/dist/chunk-V3QO3LL7.js.map +1 -0
  21. package/dist/{chunk-U6GPOF6J.js → chunk-ZXJGZLLO.js} +17 -17
  22. package/dist/{chunk-U6GPOF6J.js.map → chunk-ZXJGZLLO.js.map} +1 -1
  23. package/dist/components.d.ts +1 -1
  24. package/dist/components.js +8 -9
  25. package/dist/components.js.map +1 -1
  26. package/dist/hooks.d.ts +1 -1
  27. package/dist/hooks.js +9 -6
  28. package/dist/hooks.js.map +1 -1
  29. package/dist/index.d.ts +3 -3
  30. package/dist/index.js +16 -16
  31. package/dist/index.js.map +1 -1
  32. package/dist/providers.js +5 -7
  33. package/dist/rbac/index.js +5 -6
  34. package/dist/{usePublicRouteParams-CdoFxnJK.d.ts → usePublicRouteParams-Ua1Vz-HG.d.ts} +35 -1
  35. package/dist/utils.d.ts +4 -1
  36. package/dist/utils.js +3 -3
  37. package/docs/DOCUMENTATION_CHECKLIST.md +281 -0
  38. package/docs/README.md +22 -10
  39. package/docs/api/classes/ColumnFactory.md +1 -1
  40. package/docs/api/classes/ErrorBoundary.md +1 -1
  41. package/docs/api/classes/InvalidScopeError.md +1 -1
  42. package/docs/api/classes/MissingUserContextError.md +1 -1
  43. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  44. package/docs/api/classes/PermissionDeniedError.md +1 -1
  45. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  46. package/docs/api/classes/RBACAuditManager.md +1 -1
  47. package/docs/api/classes/RBACCache.md +1 -1
  48. package/docs/api/classes/RBACEngine.md +1 -1
  49. package/docs/api/classes/RBACError.md +1 -1
  50. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  51. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  52. package/docs/api/classes/StorageUtils.md +1 -1
  53. package/docs/api/interfaces/AggregateConfig.md +1 -1
  54. package/docs/api/interfaces/ButtonProps.md +1 -1
  55. package/docs/api/interfaces/CardProps.md +1 -1
  56. package/docs/api/interfaces/ColorPalette.md +1 -1
  57. package/docs/api/interfaces/ColorShade.md +1 -1
  58. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  59. package/docs/api/interfaces/DataTableAction.md +1 -1
  60. package/docs/api/interfaces/DataTableColumn.md +1 -1
  61. package/docs/api/interfaces/DataTableProps.md +1 -1
  62. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  63. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  64. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  65. package/docs/api/interfaces/EventContextType.md +1 -1
  66. package/docs/api/interfaces/EventLogoProps.md +1 -1
  67. package/docs/api/interfaces/EventProviderProps.md +1 -1
  68. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  69. package/docs/api/interfaces/FileUploadProps.md +1 -1
  70. package/docs/api/interfaces/FooterProps.md +1 -1
  71. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  72. package/docs/api/interfaces/InputProps.md +1 -1
  73. package/docs/api/interfaces/LabelProps.md +1 -1
  74. package/docs/api/interfaces/LoginFormProps.md +1 -1
  75. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  76. package/docs/api/interfaces/NavigationContextType.md +1 -1
  77. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  78. package/docs/api/interfaces/NavigationItem.md +1 -1
  79. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  80. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  81. package/docs/api/interfaces/Organisation.md +1 -1
  82. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  83. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  84. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  85. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  86. package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
  87. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  88. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  89. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  90. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  91. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  92. package/docs/api/interfaces/PaletteData.md +1 -1
  93. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  94. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  95. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  96. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  97. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  98. package/docs/api/interfaces/PublicPageHeaderProps.md +2 -2
  99. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  100. package/docs/api/interfaces/RBACConfig.md +1 -1
  101. package/docs/api/interfaces/RBACContextType.md +1 -1
  102. package/docs/api/interfaces/RBACLogger.md +1 -1
  103. package/docs/api/interfaces/RBACProviderProps.md +1 -1
  104. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  105. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  106. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  107. package/docs/api/interfaces/RouteConfig.md +1 -1
  108. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  109. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  110. package/docs/api/interfaces/StorageConfig.md +1 -1
  111. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  112. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  113. package/docs/api/interfaces/StorageListOptions.md +1 -1
  114. package/docs/api/interfaces/StorageListResult.md +1 -1
  115. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  116. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  117. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  118. package/docs/api/interfaces/StyleImport.md +1 -1
  119. package/docs/api/interfaces/SwitchProps.md +1 -1
  120. package/docs/api/interfaces/ToastActionElement.md +1 -1
  121. package/docs/api/interfaces/ToastProps.md +1 -1
  122. package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
  123. package/docs/api/interfaces/UnifiedAuthProviderProps.md +1 -1
  124. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  125. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  126. package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
  127. package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
  128. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  129. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  130. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  131. package/docs/api/interfaces/UserEventAccess.md +1 -1
  132. package/docs/api/interfaces/UserMenuProps.md +1 -1
  133. package/docs/api/interfaces/UserProfile.md +1 -1
  134. package/docs/api/modules.md +39 -14
  135. package/docs/architecture/services.md +374 -0
  136. package/docs/best-practices/README.md +1 -1
  137. package/docs/best-practices/testing.md +1 -1
  138. package/docs/breaking-changes.md +182 -0
  139. package/docs/common-patterns.md +445 -0
  140. package/docs/core-concepts/authentication.md +26 -11
  141. package/docs/core-concepts/events.md +2 -0
  142. package/docs/core-concepts/organisations.md +2 -0
  143. package/docs/core-concepts/permissions.md +2 -0
  144. package/docs/{INDEX.md → documentation-index.md} +26 -38
  145. package/docs/faq.md +286 -0
  146. package/docs/{FILE_REFERENCE_SYSTEM.md → file-reference-system.md} +1 -1
  147. package/docs/getting-started/installation-guide.md +284 -0
  148. package/docs/getting-started/quick-start.md +8 -1
  149. package/docs/implementation-guides/app-layout.md +3 -1
  150. package/docs/implementation-guides/data-tables.md +2 -0
  151. package/docs/implementation-guides/dynamic-colors.md +47 -2
  152. package/docs/implementation-guides/event-theming-summary.md +220 -0
  153. package/docs/implementation-guides/forms.md +9 -7
  154. package/docs/implementation-guides/navigation.md +2 -0
  155. package/docs/migration/service-architecture.md +351 -0
  156. package/docs/rbac/README-rbac-rls-integration.md +2 -2
  157. package/docs/rbac/README.md +1 -1
  158. package/docs/rbac/examples/rbac-rls-integration-example.md +3 -3
  159. package/docs/rbac/quick-start.md +2 -0
  160. package/docs/rbac/rbac-rls-integration.md +2 -2
  161. package/docs/style-guide.md +136 -1
  162. package/docs/testing/README.md +1 -1
  163. package/docs/troubleshooting/authentication-issues.md +334 -0
  164. package/docs/troubleshooting/common-issues.md +2 -0
  165. package/docs/troubleshooting/styling-issues.md +199 -144
  166. package/docs/usage.md +23 -2
  167. package/package.json +1 -1
  168. package/src/__tests__/{TESTING_GUIDELINES.md → TEST_GUIDE_CURSOR.md} +20 -0
  169. package/src/__tests__/TEST_GUIDE_HUMAN.md +103 -0
  170. package/src/__tests__/fixtures/test-data.ts +90 -0
  171. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +260 -0
  172. package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +224 -0
  173. package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +273 -0
  174. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +98 -0
  175. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +436 -0
  176. package/src/__tests__/helpers/__tests__/timer-utils.test.ts +371 -0
  177. package/src/__tests__/helpers/component-test-utils.tsx +14 -4
  178. package/src/__tests__/helpers/optimized-test-setup.ts +68 -0
  179. package/src/__tests__/helpers/test-providers.tsx +329 -0
  180. package/src/__tests__/helpers/test-utils.tsx +91 -45
  181. package/src/__tests__/helpers/timer-utils.ts +71 -0
  182. package/src/__tests__/hooks/usePermissions.test.ts +1 -5
  183. package/src/__tests__/integration/UserProfile.test.tsx +1 -5
  184. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +42 -12
  185. package/src/__tests__/setup.ts +34 -28
  186. package/src/components/Alert/Alert.test.tsx +1 -5
  187. package/src/components/Avatar/Avatar.test.tsx +1 -5
  188. package/src/components/Button/Button.test.tsx +4 -20
  189. package/src/components/Card/Card.test.tsx +1 -5
  190. package/src/components/Checkbox/Checkbox.test.tsx +1 -5
  191. package/src/components/DataTable/__tests__/DataTable.comprehensive.test.tsx +1 -5
  192. package/src/components/DataTable/__tests__/DataTable.test.tsx +45 -49
  193. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +1 -5
  194. package/src/components/DataTable/__tests__/styles.test.ts +382 -0
  195. package/src/components/DataTable/context/__tests__/DataTableContext.test.tsx +409 -0
  196. package/src/components/DataTable/core/__tests__/ActionManager.test.ts +634 -0
  197. package/src/components/DataTable/core/__tests__/DataManager.test.ts +519 -0
  198. package/src/components/DataTable/core/__tests__/StateManager.test.ts +714 -0
  199. package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +592 -0
  200. package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +354 -0
  201. package/src/components/DataTable/utils/__tests__/hierarchicalUtils.test.ts +539 -0
  202. package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +1 -5
  203. package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +1 -8
  204. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +34 -38
  205. package/src/components/Footer/Footer.test.tsx +1 -5
  206. package/src/components/Form/Form.test.tsx +22 -35
  207. package/src/components/Header/Header.test.tsx +1 -9
  208. package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +1 -5
  209. package/src/components/Input/Input.test.tsx +2 -10
  210. package/src/components/LoginForm/LoginForm.test.tsx +1 -5
  211. package/src/components/NavigationMenu/NavigationMenu.test.tsx +24 -24
  212. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +1 -6
  213. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +6 -16
  214. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +1 -5
  215. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.rbac.test.tsx +1 -5
  216. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +1 -7
  217. package/src/components/PasswordReset/PasswordChangeForm.test.tsx +1 -9
  218. package/src/components/PasswordReset/PasswordResetForm.test.tsx +1 -9
  219. package/src/components/PublicLayout/PublicErrorBoundary.tsx +4 -5
  220. package/src/components/PublicLayout/PublicPageHeader.tsx +13 -9
  221. package/src/components/PublicLayout/__tests__/EventLogo.test.tsx +666 -0
  222. package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +457 -0
  223. package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +393 -0
  224. package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +351 -0
  225. package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +374 -0
  226. package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +388 -0
  227. package/src/components/Select/Select.bug-test.tsx +69 -0
  228. package/src/components/Select/Select.refactored.tsx +497 -0
  229. package/src/components/Select/Select.test.tsx +42 -49
  230. package/src/components/Select/Select.tsx +5 -2
  231. package/src/components/Select/hooks.ts +254 -0
  232. package/src/components/Switch/Switch.test.tsx +1 -5
  233. package/src/components/Table/__tests__/Table.test.tsx +775 -0
  234. package/src/components/Toast/Toast.test.tsx +15 -8
  235. package/src/components/Tooltip/Tooltip.test.tsx +1 -5
  236. package/src/components/UserMenu/UserMenu.test.tsx +3 -15
  237. package/src/components/__tests__/FileDisplay.test.tsx +575 -0
  238. package/src/components/__tests__/FileUpload.test.tsx +446 -0
  239. package/src/components/__tests__/SuperAdminGuard.test.tsx +422 -354
  240. package/src/hooks/__tests__/ServiceHooks.test.tsx +613 -0
  241. package/src/hooks/__tests__/hooks.integration.test.tsx +1 -10
  242. package/src/hooks/__tests__/useApiFetch.unit.test.ts +10 -14
  243. package/src/hooks/__tests__/useAppConfig.unit.test.ts +307 -0
  244. package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +1 -6
  245. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +1 -5
  246. package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +6 -9
  247. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +321 -0
  248. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +583 -0
  249. package/src/hooks/__tests__/usePublicEventLogo.unit.test.ts +640 -0
  250. package/src/hooks/__tests__/usePublicRouteParams.unit.test.ts +435 -0
  251. package/src/hooks/__tests__/useRBAC.unit.test.ts +10 -10
  252. package/src/hooks/__tests__/useStorage.unit.test.ts +751 -0
  253. package/src/hooks/index.ts +3 -0
  254. package/src/hooks/public/usePublicEvent.ts +30 -9
  255. package/src/hooks/public/usePublicRouteParams.ts +13 -3
  256. package/src/hooks/services/useAuth.ts +50 -0
  257. package/src/hooks/services/useAuthService.ts +30 -0
  258. package/src/hooks/services/useCurrentEvent.ts +36 -0
  259. package/src/hooks/services/useCurrentOrganisation.ts +52 -0
  260. package/src/hooks/services/useEventService.ts +30 -0
  261. package/src/hooks/services/useInactivityService.ts +30 -0
  262. package/src/hooks/services/useOrganisationService.ts +30 -0
  263. package/src/hooks/services/usePermissions.ts +70 -0
  264. package/src/hooks/services/useRBACService.ts +30 -0
  265. package/src/hooks/useCounter.test.ts +1 -5
  266. package/src/hooks/useEventTheme.ts +86 -0
  267. package/src/hooks/useOrganisationPermissions.test.ts +2 -5
  268. package/src/hooks/useOrganisationSecurity.test.ts +1 -5
  269. package/src/hooks/usePermissionCache.test.ts +1 -5
  270. package/src/hooks/usePermissionCheck.ts +150 -0
  271. package/src/hooks/useSecureDataAccess.test.ts +1 -5
  272. package/src/index.ts +1 -0
  273. package/src/providers/OrganisationProvider.test.tsx +1 -5
  274. package/src/providers/OrganisationProvider.tsx +56 -4
  275. package/src/providers/UnifiedAuthProvider.test.tsx +1 -5
  276. package/src/providers/__tests__/AuthProvider.test.tsx +105 -439
  277. package/src/providers/__tests__/AuthProvider.test.tsx.backup +771 -0
  278. package/src/providers/__tests__/EventProvider.test.tsx +211 -110
  279. package/src/providers/__tests__/EventProvider.test.tsx.backup +824 -0
  280. package/src/providers/__tests__/InactivityProvider.test.tsx +1 -5
  281. package/src/providers/__tests__/OrganisationProvider.test.tsx +97 -261
  282. package/src/providers/__tests__/OrganisationProvider.test.tsx.backup +820 -0
  283. package/src/providers/__tests__/ServiceProviders.test.tsx +477 -0
  284. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +72 -504
  285. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx.backup +911 -0
  286. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx.backup2 +166 -0
  287. package/src/providers/services/AuthServiceProvider.tsx +65 -0
  288. package/src/providers/services/EventServiceProvider.tsx +83 -0
  289. package/src/providers/services/InactivityServiceProvider.tsx +83 -0
  290. package/src/providers/services/OrganisationServiceProvider.tsx +77 -0
  291. package/src/providers/services/RBACServiceProvider.tsx +79 -0
  292. package/src/providers/services/UnifiedAuthProvider.tsx +368 -0
  293. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +210 -0
  294. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +269 -0
  295. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +892 -0
  296. package/src/rbac/__tests__/engine.comprehensive.test.ts +954 -0
  297. package/src/rbac/__tests__/integration.authflow.test.tsx +1 -5
  298. package/src/rbac/__tests__/integration.navigation.test.tsx +1 -4
  299. package/src/rbac/__tests__/rbac-core.test.tsx +2 -7
  300. package/src/rbac/__tests__/rbac-functions.test.ts +1 -9
  301. package/src/rbac/__tests__/rbac-integration.test.ts +1 -9
  302. package/src/rbac/api.test.ts +1 -9
  303. package/src/rbac/cache.test.ts +10 -8
  304. package/src/rbac/cli/__tests__/policy-manager.test.ts +339 -0
  305. package/src/rbac/components/EnhancedNavigationMenu.test.tsx +1 -5
  306. package/src/rbac/components/NavigationProvider.test.tsx +1 -5
  307. package/src/rbac/components/PagePermissionProvider.test.tsx +1 -5
  308. package/src/rbac/components/SecureDataProvider.test.tsx +1 -5
  309. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +25 -29
  310. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +27 -30
  311. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +23 -27
  312. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +18 -22
  313. package/src/rbac/config.test.ts +1 -5
  314. package/src/rbac/hooks/useCan.test.ts +262 -9
  315. package/src/rbac/hooks/usePermissions.test.ts +246 -6
  316. package/src/rbac/hooks/useRBAC.simple.test.ts +1 -5
  317. package/src/rbac/hooks/useRBAC.test.ts +472 -198
  318. package/src/rbac/providers/__tests__/RBACProvider.test.tsx +1 -9
  319. package/src/services/AuthService.ts +416 -0
  320. package/src/services/EventService.ts +366 -0
  321. package/src/services/InactivityService.ts +388 -0
  322. package/src/services/OrganisationService.ts +592 -0
  323. package/src/services/RBACService.ts +522 -0
  324. package/src/services/__tests__/AuthService.test.ts +356 -0
  325. package/src/services/__tests__/BaseService.test.ts +314 -0
  326. package/src/services/__tests__/EventService.test.ts +489 -0
  327. package/src/services/__tests__/InactivityService.test.ts +403 -0
  328. package/src/services/__tests__/OrganisationService.test.ts +660 -0
  329. package/src/services/__tests__/RBACService.test.ts +492 -0
  330. package/src/services/base/BaseService.ts +87 -0
  331. package/src/services/interfaces/IAuthService.ts +39 -0
  332. package/src/services/interfaces/IEventService.ts +30 -0
  333. package/src/services/interfaces/IInactivityService.ts +31 -0
  334. package/src/services/interfaces/IOrganisationService.ts +41 -0
  335. package/src/services/interfaces/IRBACService.ts +62 -0
  336. package/src/theming/__tests__/runtime.test.ts +540 -0
  337. package/src/types/__tests__/file-reference.test.ts +447 -0
  338. package/src/types/__tests__/organisation.test.ts +1133 -0
  339. package/src/types/__tests__/theme.test.ts +830 -0
  340. package/src/types/__tests__/type-validation.test.ts +527 -0
  341. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +1 -5
  342. package/src/utils/__tests__/debugLogger.test.ts +417 -0
  343. package/src/utils/__tests__/deviceFingerprint.unit.test.ts +1 -6
  344. package/src/utils/__tests__/dynamicUtils.unit.test.ts +1 -5
  345. package/src/utils/__tests__/lazyLoad.unit.test.tsx +35 -35
  346. package/src/utils/__tests__/organisationContext.unit.test.ts +1 -5
  347. package/src/utils/__tests__/performanceBudgets.unit.test.ts +5 -11
  348. package/src/utils/__tests__/secureErrors.unit.test.ts +1 -6
  349. package/src/utils/__tests__/secureStorage.unit.test.ts +1 -5
  350. package/src/utils/__tests__/securityMonitor.unit.test.ts +1 -5
  351. package/src/utils/__tests__/sessionTracking.unit.test.ts +1 -5
  352. package/src/utils/appIdResolver.test.ts +6 -10
  353. package/src/utils/appNameResolver.simple.test.ts +142 -0
  354. package/src/utils/appNameResolver.test.ts +31 -458
  355. package/src/utils/appNameResolver.test.ts.backup +494 -0
  356. package/src/utils/debugLogger.ts +26 -5
  357. package/src/utils/formatDate.test.ts +1 -5
  358. package/src/utils/organisationContext.test.ts +1 -5
  359. package/src/utils/performanceBudgets.ts +3 -4
  360. package/src/utils/secureDataAccess.test.ts +1 -5
  361. package/src/utils/storage/__tests__/helpers.unit.test.ts +1 -5
  362. package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +1 -5
  363. package/dist/chunk-D7ARGIA3.js.map +0 -1
  364. package/dist/chunk-IPCH4YPT.js +0 -315
  365. package/dist/chunk-IPCH4YPT.js.map +0 -1
  366. package/dist/chunk-KRCRNXPD.js.map +0 -1
  367. package/dist/chunk-MOJXHWDE.js.map +0 -1
  368. package/dist/chunk-OPCWH3A4.js.map +0 -1
  369. package/dist/chunk-ZPG4XPV5.js.map +0 -1
  370. package/dist/chunk-ZPK5656W.js.map +0 -1
  371. package/docs/getting-started/installation.md +0 -269
  372. package/src/__tests__/REBUILD_PLAN.md +0 -223
  373. /package/dist/{DataTable-4IUY7BXB.js.map → DataTable-MPBSXUC6.js.map} +0 -0
  374. /package/dist/{chunk-PXWEDX7Y.js.map → chunk-2ARQW6VX.js.map} +0 -0
  375. /package/dist/{chunk-UYA6U6H7.js.map → chunk-Q2UP3ZWQ.js.map} +0 -0
@@ -0,0 +1,366 @@
1
+ /**
2
+ * @file Event Service
3
+ * @package @jmruthers/pace-core
4
+ * @module Services
5
+ * @since 0.1.0
6
+ *
7
+ * Event service implementation.
8
+ * Handles event management and selection with organisation context validation.
9
+ */
10
+
11
+ import { BaseService } from './base/BaseService';
12
+ import { IEventService } from './interfaces/IEventService';
13
+ import { Event } from '../types/unified';
14
+ import { DebugLogger } from '../utils/debugLogger';
15
+
16
+ export class EventService extends BaseService implements IEventService {
17
+ private events: Event[] = [];
18
+ private selectedEvent: Event | null = null;
19
+ private _isLoading = true;
20
+ private error: Error | null = null;
21
+
22
+ // Dependencies
23
+ private supabaseClient: any = null;
24
+ private user: any = null;
25
+ private session: any = null;
26
+ private appName: string = '';
27
+ private selectedOrganisation: any = null;
28
+ private setSelectedEventId: ((eventId: string | null) => void) | null = null;
29
+
30
+ // Internal state management
31
+ private isInitializedRef = false;
32
+ private isFetchingRef = false;
33
+ private hasAutoSelectedRef = false;
34
+ private userClearedEventRef = false;
35
+
36
+ constructor(
37
+ supabaseClient: any,
38
+ user: any,
39
+ session: any,
40
+ appName: string,
41
+ selectedOrganisation: any,
42
+ setSelectedEventId: (eventId: string | null) => void
43
+ ) {
44
+ super();
45
+ this.supabaseClient = supabaseClient;
46
+ this.user = user;
47
+ this.session = session;
48
+ this.appName = appName;
49
+ this.selectedOrganisation = selectedOrganisation;
50
+ this.setSelectedEventId = setSelectedEventId;
51
+ }
52
+
53
+ // Update dependencies
54
+ updateDependencies(
55
+ supabaseClient: any,
56
+ user: any,
57
+ session: any,
58
+ appName: string,
59
+ selectedOrganisation: any,
60
+ setSelectedEventId: (eventId: string | null) => void
61
+ ): void {
62
+ this.supabaseClient = supabaseClient;
63
+ this.user = user;
64
+ this.session = session;
65
+ this.appName = appName;
66
+ this.selectedOrganisation = selectedOrganisation;
67
+ this.setSelectedEventId = setSelectedEventId;
68
+ this.notify();
69
+ }
70
+
71
+ // Event state getters
72
+ getEvents(): Event[] {
73
+ return this.events;
74
+ }
75
+
76
+ getSelectedEvent(): Event | null {
77
+ return this.selectedEvent;
78
+ }
79
+
80
+ isLoading(): boolean {
81
+ return this._isLoading;
82
+ }
83
+
84
+ getError(): Error | null {
85
+ return this.error;
86
+ }
87
+
88
+ // Event methods
89
+ setSelectedEvent(event: Event | null): void {
90
+ if (event) {
91
+ // SECURITY: Validate event belongs to current organisation
92
+ try {
93
+ console.log('[EventService] Event selection validation:', {
94
+ eventId: event.event_id,
95
+ eventName: event.event_name,
96
+ eventOrganisationId: event.organisation_id,
97
+ selectedOrganisationId: this.selectedOrganisation?.id,
98
+ selectedOrganisationName: this.selectedOrganisation?.display_name,
99
+ match: event.organisation_id === this.selectedOrganisation?.id
100
+ });
101
+
102
+ if (this.selectedOrganisation && event.organisation_id !== this.selectedOrganisation.id) {
103
+ console.error('[EventService] Event organisation_id does not match selected organisation', {
104
+ eventOrganisationId: event.organisation_id,
105
+ selectedOrganisationId: this.selectedOrganisation.id,
106
+ eventName: event.event_name
107
+ });
108
+ return;
109
+ }
110
+ } catch (error) {
111
+ console.error('[EventService] Error during event validation:', error);
112
+ }
113
+
114
+ this.selectedEvent = event;
115
+ this.setSelectedEventId?.(event.event_id);
116
+ this.persistEventSelection(event.event_id);
117
+ // Reset the user cleared flag when selecting an event
118
+ this.userClearedEventRef = false;
119
+ } else {
120
+ this.selectedEvent = null;
121
+ this.setSelectedEventId?.(null);
122
+ // Clear both sessionStorage and localStorage
123
+ sessionStorage.removeItem('pace-core-selected-event');
124
+ localStorage.removeItem('pace-core-selected-event');
125
+ // Reset the auto-selection flag when clearing the event
126
+ this.hasAutoSelectedRef = false;
127
+ // Mark that user explicitly cleared the event to prevent auto-selection
128
+ this.userClearedEventRef = true;
129
+ }
130
+ this.notify();
131
+ }
132
+
133
+ async refreshEvents(): Promise<void> {
134
+ this.isInitializedRef = false;
135
+ this.isFetchingRef = false;
136
+ // Don't reset the user cleared flag - respect user's choice
137
+ await this.fetchEvents();
138
+ }
139
+
140
+ async loadPersistedEvent(events: Event[]): Promise<boolean> {
141
+ try {
142
+ // Try sessionStorage first (tab-specific)
143
+ let persistedEventId = sessionStorage.getItem('pace-core-selected-event');
144
+
145
+ // Fallback to localStorage if no sessionStorage value (for new tabs)
146
+ if (!persistedEventId) {
147
+ persistedEventId = localStorage.getItem('pace-core-selected-event');
148
+ // If we found a value in localStorage, also store it in sessionStorage for this tab
149
+ if (persistedEventId) {
150
+ sessionStorage.setItem('pace-core-selected-event', persistedEventId);
151
+ }
152
+ }
153
+
154
+ if (persistedEventId && events.length > 0) {
155
+ const persistedEvent = events.find(event => event.event_id === persistedEventId);
156
+ if (persistedEvent) {
157
+ DebugLogger.log('EventService', 'Restoring persisted event:', persistedEvent.event_name);
158
+ this.selectedEvent = persistedEvent;
159
+ this.setSelectedEventId?.(persistedEventId);
160
+ return true;
161
+ } else {
162
+ DebugLogger.log('EventService', 'Persisted event not found in current events, clearing storage');
163
+ // Clear invalid persisted event
164
+ sessionStorage.removeItem('pace-core-selected-event');
165
+ localStorage.removeItem('pace-core-selected-event');
166
+ }
167
+ }
168
+ } catch (error) {
169
+ console.warn('[EventService] Failed to load persisted event:', error);
170
+ }
171
+ return false;
172
+ }
173
+
174
+ persistEventSelection(eventId: string): void {
175
+ try {
176
+ // Store in sessionStorage for tab-specific persistence
177
+ sessionStorage.setItem('pace-core-selected-event', eventId);
178
+ // Also store in localStorage as fallback for new tabs
179
+ localStorage.setItem('pace-core-selected-event', eventId);
180
+ } catch (error) {
181
+ console.warn('[EventService] Failed to persist event selection:', error);
182
+ }
183
+ }
184
+
185
+ clearEventSelection(): void {
186
+ try {
187
+ // Clear from both storage locations
188
+ sessionStorage.removeItem('pace-core-selected-event');
189
+ localStorage.removeItem('pace-core-selected-event');
190
+ // Clear the selected event
191
+ this.selectedEvent = null;
192
+ this.setSelectedEventId?.(null);
193
+ } catch (error) {
194
+ console.warn('[EventService] Failed to clear event selection:', error);
195
+ }
196
+ }
197
+
198
+ autoSelectNextEvent(events: Event[]): void {
199
+ const nextEvent = this.getNextEventByDate(events);
200
+ if (nextEvent) {
201
+ DebugLogger.log('EventService', 'Auto-selecting next event:', nextEvent.event_name);
202
+ this.selectedEvent = nextEvent;
203
+ this.setSelectedEventId?.(nextEvent.event_id);
204
+ this.persistEventSelection(nextEvent.event_id);
205
+ }
206
+ }
207
+
208
+ // Lifecycle methods
209
+ async initialize(): Promise<void> {
210
+ await super.initialize();
211
+ await this.fetchEvents();
212
+ }
213
+
214
+ cleanup(): void {
215
+ super.cleanup();
216
+ }
217
+
218
+ protected async doInitialize(): Promise<void> {
219
+ // Initial setup - fetch events on initialization
220
+ await this.fetchEvents();
221
+ }
222
+
223
+ protected doCleanup(): void {
224
+ // Cleanup any resources
225
+ }
226
+
227
+ private async fetchEvents(): Promise<void> {
228
+ if (!this.user || !this.session || !this.supabaseClient || !this.appName || !this.selectedOrganisation) {
229
+ DebugLogger.log('EventService', 'Missing required dependencies, skipping fetch');
230
+ this._isLoading = false;
231
+ this.notify();
232
+ return;
233
+ }
234
+
235
+ // Prevent multiple simultaneous fetches
236
+ if (this.isFetchingRef) {
237
+ DebugLogger.log('EventService', 'Already fetching events, skipping');
238
+ return;
239
+ }
240
+
241
+ DebugLogger.log('EventService', 'User and organisation found, fetching events for:', {
242
+ userId: this.user.id,
243
+ appName: this.appName,
244
+ organisationId: this.selectedOrganisation.id,
245
+ organisationName: this.selectedOrganisation.display_name
246
+ });
247
+
248
+ this.isFetchingRef = true;
249
+ let isMounted = true;
250
+
251
+ try {
252
+ // Call the RPC function following the established pattern
253
+ DebugLogger.log('EventService', 'Calling data_user_events_get RPC with:', {
254
+ user_id: this.user.id,
255
+ organisation_id: this.selectedOrganisation.id,
256
+ app_name: this.appName
257
+ });
258
+
259
+ const { data, error: rpcError } = await this.supabaseClient.rpc('data_user_events_get', {
260
+ p_user_id: this.user.id,
261
+ p_organisation_id: this.selectedOrganisation.id,
262
+ p_app_name: this.appName
263
+ });
264
+
265
+ DebugLogger.log('EventService', 'RPC response:', {
266
+ data,
267
+ error: rpcError,
268
+ dataLength: data?.length || 0,
269
+ organisationId: this.selectedOrganisation.id
270
+ });
271
+
272
+ if (rpcError) {
273
+ throw new Error(rpcError.message || 'Failed to fetch events');
274
+ }
275
+
276
+ if (isMounted) {
277
+ const eventsData = data || [];
278
+ console.log('[EventService] Loaded events:', eventsData.map((event: any) => ({
279
+ eventId: event.event_id,
280
+ eventName: event.event_name,
281
+ organisationId: event.organisation_id,
282
+ selectedOrganisationId: this.selectedOrganisation?.id
283
+ })));
284
+
285
+ // Transform the data to match our Event interface
286
+ const transformedEvents: Event[] = eventsData.map((event: any) => ({
287
+ id: event.event_id, // Use event_id as the primary id
288
+ event_id: event.event_id,
289
+ event_name: event.event_name,
290
+ event_date: event.event_date,
291
+ event_venue: event.event_venue,
292
+ event_participants: event.event_participants,
293
+ event_colours: event.event_colours,
294
+ event_logo: '', // No logo field in event table
295
+ organisation_id: event.organisation_id,
296
+ is_visible: event.is_visible,
297
+ // Legacy compatibility
298
+ name: event.event_name,
299
+ start_date: event.event_date
300
+ }));
301
+
302
+ this.events = transformedEvents;
303
+ this.error = null;
304
+
305
+ // Reset auto-selection ref for new events
306
+ this.hasAutoSelectedRef = false;
307
+
308
+ // Try to restore persisted event first
309
+ const persistedEventLoaded = await this.loadPersistedEvent(transformedEvents);
310
+
311
+ // If no persisted event was loaded and user hasn't explicitly cleared an event, auto-select the next event
312
+ if (!persistedEventLoaded && !this.userClearedEventRef) {
313
+ const nextEvent = this.getNextEventByDate(transformedEvents);
314
+ if (nextEvent) {
315
+ DebugLogger.log('EventService', 'Auto-selecting next event after no persisted event found:', nextEvent.event_name);
316
+ this.hasAutoSelectedRef = true;
317
+ this.selectedEvent = nextEvent;
318
+ this.setSelectedEventId?.(nextEvent.event_id);
319
+ this.persistEventSelection(nextEvent.event_id);
320
+ }
321
+ }
322
+ }
323
+ } catch (err) {
324
+ console.error('[EventService] Error fetching events:', err);
325
+ const _error = err instanceof Error ? err : new Error('Unknown error occurred');
326
+
327
+ if (isMounted) {
328
+ this.error = _error;
329
+ this.events = [];
330
+ }
331
+ } finally {
332
+ if (isMounted) {
333
+ this._isLoading = false;
334
+ }
335
+ this.isFetchingRef = false;
336
+ this.notify();
337
+ }
338
+ }
339
+
340
+ getNextEventByDate(events?: Event[]): Event | null {
341
+ const eventsToUse = events || this.events;
342
+ if (!eventsToUse || eventsToUse.length === 0) {
343
+ return null;
344
+ }
345
+
346
+ const now = new Date();
347
+ const futureEvents = eventsToUse.filter(event => {
348
+ if (!event.event_date) return false;
349
+ const eventDate = new Date(event.event_date);
350
+ return eventDate >= now;
351
+ });
352
+
353
+ if (futureEvents.length === 0) {
354
+ return null;
355
+ }
356
+
357
+ // Sort by date (ascending) to get the next event
358
+ const sortedFutureEvents = futureEvents.sort((a, b) => {
359
+ const dateA = new Date(a.event_date!);
360
+ const dateB = new Date(b.event_date!);
361
+ return dateA.getTime() - dateB.getTime();
362
+ });
363
+
364
+ return sortedFutureEvents[0];
365
+ }
366
+ }