@jmruthers/pace-core 0.5.135 → 0.5.136

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 (522) hide show
  1. package/dist/{DataTable-C7GaRZye.d.ts → DataTable-CWAZZcXC.d.ts} +1 -1
  2. package/dist/{DataTable-A36PJG6N.js → DataTable-CYOHOX3O.js} +25 -13
  3. package/dist/{PublicLoadingSpinner-CUAnTvcg.d.ts → EventLogo-801uofbR.d.ts} +51 -135
  4. package/dist/UnifiedAuthProvider-5E5TUNMS.js +17 -0
  5. package/dist/{UnifiedAuthProvider-BVKmQd9u.d.ts → UnifiedAuthProvider-DJxGTftH.d.ts} +1 -1
  6. package/dist/{api-TNIBJWLM.js → api-45XYYO2A.js} +4 -3
  7. package/dist/{audit-T36HM7IM.js → audit-64X3VJXB.js} +3 -2
  8. package/dist/{chunk-CTJRBUX2.js → chunk-2TWNJ46Y.js} +2 -2
  9. package/dist/{chunk-UJI6WSMD.js → chunk-444EZN6N.js} +3 -3
  10. package/dist/chunk-444EZN6N.js.map +1 -0
  11. package/dist/{chunk-3CG5L6RN.js → chunk-4MT5BGGL.js} +90 -73
  12. package/dist/chunk-4MT5BGGL.js.map +1 -0
  13. package/dist/{chunk-PYUXFQJ3.js → chunk-56XJ3TU6.js} +2 -2
  14. package/dist/chunk-56XJ3TU6.js.map +1 -0
  15. package/dist/chunk-5DPZ5EAT.js +60 -0
  16. package/dist/chunk-5DPZ5EAT.js.map +1 -0
  17. package/dist/{chunk-66C4BSAY.js → chunk-ANBQRTPX.js} +9 -2
  18. package/dist/chunk-ANBQRTPX.js.map +1 -0
  19. package/dist/chunk-APIBCTL2.js +670 -0
  20. package/dist/chunk-APIBCTL2.js.map +1 -0
  21. package/dist/{chunk-GKHF54DI.js → chunk-BESYRHQM.js} +10 -4
  22. package/dist/chunk-BESYRHQM.js.map +1 -0
  23. package/dist/{chunk-WP5I5GLN.js → chunk-BVYWGZVV.js} +112 -97
  24. package/dist/chunk-BVYWGZVV.js.map +1 -0
  25. package/dist/{chunk-GEVIB2UB.js → chunk-ERISIBYU.js} +14 -5
  26. package/dist/chunk-ERISIBYU.js.map +1 -0
  27. package/dist/{chunk-CQZU6TFE.js → chunk-FHWWBIHA.js} +100 -62
  28. package/dist/chunk-FHWWBIHA.js.map +1 -0
  29. package/dist/{chunk-O3NWNXDY.js → chunk-FMUCXFII.js} +2 -2
  30. package/dist/chunk-FMUCXFII.js.map +1 -0
  31. package/dist/{chunk-GVDR7WNV.js → chunk-HJGGOMQ6.js} +194 -518
  32. package/dist/chunk-HJGGOMQ6.js.map +1 -0
  33. package/dist/{chunk-BDZUMRBD.js → chunk-K2WWTH7O.js} +13 -6
  34. package/dist/chunk-K2WWTH7O.js.map +1 -0
  35. package/dist/{chunk-BYXRHAIF.js → chunk-L6PGMCMD.js} +23 -14
  36. package/dist/chunk-L6PGMCMD.js.map +1 -0
  37. package/dist/chunk-LMC26NLJ.js +84 -0
  38. package/dist/chunk-LMC26NLJ.js.map +1 -0
  39. package/dist/{chunk-M6DDYFUD.js → chunk-LS353YLY.js} +19 -16
  40. package/dist/chunk-LS353YLY.js.map +1 -0
  41. package/dist/{chunk-ZYZCRSBD.js → chunk-LTV3XIJJ.js} +16 -11
  42. package/dist/chunk-LTV3XIJJ.js.map +1 -0
  43. package/dist/{chunk-HMNOSGVA.js → chunk-NOHEVYVX.js} +377 -666
  44. package/dist/chunk-NOHEVYVX.js.map +1 -0
  45. package/dist/{chunk-JCQZ6LA7.js → chunk-Q5QRDWKI.js} +9 -3
  46. package/dist/chunk-Q5QRDWKI.js.map +1 -0
  47. package/dist/chunk-S5OFRT4M.js +94 -0
  48. package/dist/chunk-S5OFRT4M.js.map +1 -0
  49. package/dist/{chunk-3DBFLLLU.js → chunk-SBVILCCA.js} +14 -9
  50. package/dist/chunk-SBVILCCA.js.map +1 -0
  51. package/dist/{chunk-TGIY2AR2.js → chunk-SL2YQDR6.js} +4 -3
  52. package/dist/{chunk-TGIY2AR2.js.map → chunk-SL2YQDR6.js.map} +1 -1
  53. package/dist/{chunk-VZ5OR6HD.js → chunk-TVYPTYOY.js} +55 -179
  54. package/dist/chunk-TVYPTYOY.js.map +1 -0
  55. package/dist/{chunk-ZV77RZMU.js → chunk-XARJS7CD.js} +2 -2
  56. package/dist/chunk-XDNLUEXI.js +138 -0
  57. package/dist/chunk-XDNLUEXI.js.map +1 -0
  58. package/dist/{chunk-F64FFPOZ.js → chunk-YLKIDTUK.js} +26 -20
  59. package/dist/chunk-YLKIDTUK.js.map +1 -0
  60. package/dist/{chunk-5F3NDPJV.js → chunk-ZZ2SS7NI.js} +10 -5
  61. package/dist/chunk-ZZ2SS7NI.js.map +1 -0
  62. package/dist/components.d.ts +7 -287
  63. package/dist/components.js +26 -157
  64. package/dist/components.js.map +1 -1
  65. package/dist/{file-reference-C9isKNPn.d.ts → file-reference-C6Gkn77H.d.ts} +1 -1
  66. package/dist/{formatting-DFcCxUEk.d.ts → formatting-CvUXy2mF.d.ts} +1 -1
  67. package/dist/hooks.d.ts +3 -3
  68. package/dist/hooks.js +22 -16
  69. package/dist/hooks.js.map +1 -1
  70. package/dist/index.d.ts +101 -9
  71. package/dist/index.js +43 -31
  72. package/dist/index.js.map +1 -1
  73. package/dist/providers.d.ts +1 -1
  74. package/dist/providers.js +5 -4
  75. package/dist/rbac/index.js +13 -12
  76. package/dist/styles/index.js +2 -1
  77. package/dist/theming/runtime.d.ts +2 -19
  78. package/dist/theming/runtime.js +2 -1
  79. package/dist/{types-D5rqZQXk.d.ts → types-Dfz9dmVH.d.ts} +12 -1
  80. package/dist/types.d.ts +2 -2
  81. package/dist/types.js +1 -1
  82. package/dist/{useInactivityTracker-MRUU55XI.js → useInactivityTracker-TO6ZOF35.js} +3 -2
  83. package/dist/{usePublicRouteParams-Dyt1tzI9.d.ts → usePublicRouteParams-B7PabvuH.d.ts} +1 -1
  84. package/dist/utils.d.ts +195 -232
  85. package/dist/utils.js +173 -331
  86. package/dist/utils.js.map +1 -1
  87. package/dist/{validation-DnhrNMju.d.ts → validation-8npbysjg.d.ts} +26 -8
  88. package/dist/validation.d.ts +261 -10
  89. package/dist/validation.js +82 -440
  90. package/dist/validation.js.map +1 -1
  91. package/docs/api/classes/ColumnFactory.md +1 -1
  92. package/docs/api/classes/ErrorBoundary.md +6 -6
  93. package/docs/api/classes/InvalidScopeError.md +1 -1
  94. package/docs/api/classes/MissingUserContextError.md +1 -1
  95. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  96. package/docs/api/classes/PermissionDeniedError.md +1 -1
  97. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  98. package/docs/api/classes/RBACAuditManager.md +6 -6
  99. package/docs/api/classes/RBACCache.md +1 -1
  100. package/docs/api/classes/RBACEngine.md +7 -7
  101. package/docs/api/classes/RBACError.md +1 -1
  102. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  103. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  104. package/docs/api/classes/StorageUtils.md +1 -1
  105. package/docs/api/enums/FileCategory.md +1 -1
  106. package/docs/api/interfaces/AggregateConfig.md +4 -4
  107. package/docs/api/interfaces/ButtonProps.md +1 -1
  108. package/docs/api/interfaces/CardProps.md +1 -1
  109. package/docs/api/interfaces/ColorPalette.md +1 -1
  110. package/docs/api/interfaces/ColorShade.md +29 -4
  111. package/docs/api/interfaces/DataAccessRecord.md +9 -9
  112. package/docs/api/interfaces/DataRecord.md +1 -1
  113. package/docs/api/interfaces/DataTableAction.md +18 -18
  114. package/docs/api/interfaces/DataTableColumn.md +61 -1
  115. package/docs/api/interfaces/DataTableProps.md +1 -1
  116. package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
  117. package/docs/api/interfaces/EmptyStateConfig.md +5 -5
  118. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +14 -14
  119. package/docs/api/interfaces/EventAppRoleData.md +1 -1
  120. package/docs/api/interfaces/EventLogoProps.md +152 -0
  121. package/docs/api/interfaces/ExportColumn.md +1 -1
  122. package/docs/api/interfaces/ExportOptions.md +8 -8
  123. package/docs/api/interfaces/FileDisplayProps.md +15 -15
  124. package/docs/api/interfaces/FileMetadata.md +1 -1
  125. package/docs/api/interfaces/FileReference.md +1 -1
  126. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  127. package/docs/api/interfaces/FileUploadOptions.md +1 -1
  128. package/docs/api/interfaces/FileUploadProps.md +1 -1
  129. package/docs/api/interfaces/FooterProps.md +1 -1
  130. package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
  131. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  132. package/docs/api/interfaces/InputProps.md +1 -1
  133. package/docs/api/interfaces/LabelProps.md +1 -1
  134. package/docs/api/interfaces/LoginFormProps.md +1 -1
  135. package/docs/api/interfaces/NavigationAccessRecord.md +10 -10
  136. package/docs/api/interfaces/NavigationContextType.md +9 -9
  137. package/docs/api/interfaces/NavigationGuardProps.md +10 -10
  138. package/docs/api/interfaces/NavigationItem.md +1 -1
  139. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  140. package/docs/api/interfaces/NavigationProviderProps.md +7 -7
  141. package/docs/api/interfaces/Organisation.md +1 -1
  142. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  143. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  144. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  145. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  146. package/docs/api/interfaces/PaceAppLayoutProps.md +27 -27
  147. package/docs/api/interfaces/PaceLoginPageProps.md +4 -4
  148. package/docs/api/interfaces/PageAccessRecord.md +8 -8
  149. package/docs/api/interfaces/PagePermissionContextType.md +8 -8
  150. package/docs/api/interfaces/PagePermissionGuardProps.md +11 -11
  151. package/docs/api/interfaces/PagePermissionProviderProps.md +7 -7
  152. package/docs/api/interfaces/PaletteData.md +4 -4
  153. package/docs/api/interfaces/PermissionEnforcerProps.md +11 -11
  154. package/docs/api/interfaces/ProtectedRouteProps.md +6 -6
  155. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  156. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  157. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  158. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  159. package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
  160. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  161. package/docs/api/interfaces/RBACConfig.md +1 -1
  162. package/docs/api/interfaces/RBACLogger.md +1 -1
  163. package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
  164. package/docs/api/interfaces/RoleBasedRouterContextType.md +8 -8
  165. package/docs/api/interfaces/RoleBasedRouterProps.md +10 -10
  166. package/docs/api/interfaces/RoleManagementResult.md +1 -1
  167. package/docs/api/interfaces/RouteAccessRecord.md +10 -10
  168. package/docs/api/interfaces/RouteConfig.md +10 -10
  169. package/docs/api/interfaces/SecureDataContextType.md +9 -9
  170. package/docs/api/interfaces/SecureDataProviderProps.md +8 -8
  171. package/docs/api/interfaces/SessionRestorationLoaderProps.md +21 -0
  172. package/docs/api/interfaces/StorageConfig.md +1 -1
  173. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  174. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  175. package/docs/api/interfaces/StorageListOptions.md +1 -1
  176. package/docs/api/interfaces/StorageListResult.md +1 -1
  177. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  178. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  179. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  180. package/docs/api/interfaces/StyleImport.md +1 -1
  181. package/docs/api/interfaces/SwitchProps.md +1 -1
  182. package/docs/api/interfaces/ToastActionElement.md +1 -1
  183. package/docs/api/interfaces/ToastProps.md +1 -1
  184. package/docs/api/interfaces/UnifiedAuthContextType.md +53 -53
  185. package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
  186. package/docs/api/interfaces/UseInactivityTrackerOptions.md +9 -9
  187. package/docs/api/interfaces/UseInactivityTrackerReturn.md +8 -8
  188. package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
  189. package/docs/api/interfaces/UsePublicEventReturn.md +5 -5
  190. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +4 -4
  191. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +9 -9
  192. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  193. package/docs/api/interfaces/UseResolvedScopeOptions.md +4 -4
  194. package/docs/api/interfaces/UseResolvedScopeReturn.md +4 -4
  195. package/docs/api/interfaces/UserEventAccess.md +11 -11
  196. package/docs/api/interfaces/UserMenuProps.md +1 -1
  197. package/docs/api/interfaces/UserProfile.md +1 -1
  198. package/docs/api/modules.md +514 -212
  199. package/docs/api-reference/components.md +106 -26
  200. package/docs/architecture/README.md +0 -2
  201. package/docs/implementation-guides/data-tables.md +277 -13
  202. package/docs/implementation-guides/forms.md +1 -16
  203. package/docs/implementation-guides/permission-enforcement.md +8 -2
  204. package/examples/README.md +30 -14
  205. package/examples/STRUCTURE.md +125 -0
  206. package/examples/components/DataTable/HierarchicalActionsExample.tsx +421 -0
  207. package/examples/components/DataTable/HierarchicalExample.tsx +475 -0
  208. package/examples/components/DataTable/InitialPageSizeExample.tsx +177 -0
  209. package/examples/components/DataTable/PerformanceExample.tsx +506 -0
  210. package/examples/components/DataTable/index.ts +13 -0
  211. package/examples/components/Dialog/BasicHtmlTest.tsx +55 -0
  212. package/examples/components/Dialog/DebugHtmlExample.tsx +68 -0
  213. package/examples/components/Dialog/HtmlDialogExample.tsx +202 -0
  214. package/examples/components/Dialog/ScrollableDialogExample.tsx +290 -0
  215. package/examples/components/Dialog/SimpleHtmlTest.tsx +61 -0
  216. package/examples/components/Dialog/SmartDialogExample.tsx +322 -0
  217. package/examples/components/Dialog/index.ts +15 -0
  218. package/examples/components/index.ts +11 -0
  219. package/examples/features/index.ts +12 -0
  220. package/examples/{public-pages → features/public-pages}/CorrectPublicPageImplementation.tsx +1 -1
  221. package/examples/{public-pages → features/public-pages}/PublicEventPage.tsx +1 -1
  222. package/examples/{public-pages → features/public-pages}/PublicPageApp.tsx +1 -1
  223. package/examples/{public-pages → features/public-pages}/PublicPageUsageExample.tsx +1 -1
  224. package/examples/index.ts +11 -3
  225. package/package.json +30 -10
  226. package/src/components/Alert/Alert.tsx +1 -1
  227. package/src/components/Avatar/Avatar.tsx +1 -1
  228. package/src/components/Button/Button.tsx +1 -1
  229. package/src/components/Card/Card.tsx +1 -1
  230. package/src/components/Checkbox/Checkbox.tsx +1 -1
  231. package/src/components/DataTable/DataTable.test.tsx +1 -1
  232. package/src/components/DataTable/DataTable.tsx +1 -30
  233. package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +562 -0
  234. package/src/components/DataTable/__tests__/styles.test.ts +2 -2
  235. package/src/components/DataTable/components/ActionButtons.tsx +0 -15
  236. package/src/components/DataTable/components/DataTableCore.tsx +4 -185
  237. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +1 -1
  238. package/src/components/DataTable/components/DataTableModals.tsx +1 -27
  239. package/src/components/DataTable/components/EditableRow.tsx +1 -1
  240. package/src/components/DataTable/components/ImportModal.tsx +2 -14
  241. package/src/components/DataTable/components/PaginationControls.tsx +1 -1
  242. package/src/components/DataTable/components/UnifiedTableBody.tsx +109 -82
  243. package/src/components/DataTable/components/__tests__/ActionButtons.test.tsx +1 -1
  244. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +1 -1
  245. package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +1 -1
  246. package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +1 -1
  247. package/src/components/DataTable/examples/GroupingAggregationExample.tsx +273 -0
  248. package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +1 -1
  249. package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +1 -1
  250. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +1 -1
  251. package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +1 -1
  252. package/src/components/DataTable/hooks/useDataTablePermissions.ts +2 -23
  253. package/src/components/DataTable/index.ts +4 -0
  254. package/src/components/DataTable/styles.ts +1 -1
  255. package/src/components/DataTable/types.ts +13 -0
  256. package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +1 -1
  257. package/src/components/DataTable/utils/aggregationUtils.ts +161 -0
  258. package/src/components/DataTable/utils/exportUtils.ts +1 -1
  259. package/src/components/DataTable/utils/flexibleImport.ts +1 -11
  260. package/src/components/DataTable/utils/index.ts +1 -0
  261. package/src/components/DataTable/utils/paginationUtils.ts +1 -1
  262. package/src/components/Dialog/Dialog.tsx +2 -2
  263. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +35 -7
  264. package/src/components/ErrorBoundary/ErrorBoundary.tsx +5 -4
  265. package/src/components/EventSelector/EventSelector.tsx +3 -2
  266. package/src/components/FileDisplay/FileDisplay.tsx +2 -36
  267. package/src/components/FileUpload/FileUpload.test.tsx +2 -2
  268. package/src/components/FileUpload/FileUpload.tsx +2 -2
  269. package/src/components/Footer/Footer.tsx +1 -1
  270. package/src/components/Form/Form.test.tsx +4 -509
  271. package/src/components/Form/Form.tsx +1 -1
  272. package/src/components/Form/FormField.tsx +1 -1
  273. package/src/components/Form/index.ts +0 -12
  274. package/src/components/Header/Header.tsx +1 -1
  275. package/src/components/Input/Input.tsx +1 -1
  276. package/src/components/Label/Label.tsx +1 -1
  277. package/src/components/LoginForm/LoginForm.tsx +1 -1
  278. package/src/components/NavigationMenu/NavigationMenu.test.tsx +19 -3
  279. package/src/components/NavigationMenu/NavigationMenu.tsx +9 -8
  280. package/src/components/OrganisationSelector/OrganisationSelector.tsx +4 -3
  281. package/src/components/PaceAppLayout/PaceAppLayout.tsx +14 -12
  282. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +0 -16
  283. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +0 -1
  284. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -9
  285. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +35 -3
  286. package/src/components/PaceLoginPage/PaceLoginPage.tsx +13 -12
  287. package/src/components/PasswordReset/PasswordChangeForm.tsx +1 -1
  288. package/src/components/PasswordReset/index.ts +0 -2
  289. package/src/components/Progress/Progress.tsx +1 -1
  290. package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +35 -8
  291. package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -2
  292. package/src/components/PublicLayout/PublicErrorBoundary.tsx +1 -1
  293. package/src/components/PublicLayout/PublicLoadingSpinner.tsx +1 -1
  294. package/src/components/PublicLayout/PublicPageContextChecker.tsx +44 -43
  295. package/src/components/PublicLayout/PublicPageFooter.tsx +1 -1
  296. package/src/components/PublicLayout/PublicPageHeader.tsx +1 -15
  297. package/src/components/PublicLayout/PublicPageProvider.tsx +3 -2
  298. package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +2 -0
  299. package/src/components/PublicLayout/index.ts +4 -2
  300. package/src/components/Select/Select.tsx +1 -1
  301. package/src/components/{SessionRestorationLoader.tsx → SessionRestorationLoader/SessionRestorationLoader.tsx} +3 -2
  302. package/src/components/SessionRestorationLoader/index.ts +3 -0
  303. package/src/components/Switch/Switch.tsx +1 -1
  304. package/src/components/Table/Table.tsx +1 -1
  305. package/src/components/Toast/Toast.tsx +1 -1
  306. package/src/components/Tooltip/Tooltip.tsx +1 -1
  307. package/src/components/index.ts +4 -10
  308. package/src/hooks/__tests__/hooks.integration.test.tsx +37 -22
  309. package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +33 -17
  310. package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +28 -3
  311. package/src/hooks/__tests__/useFileDisplay.unit.test.ts +36 -9
  312. package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +26 -2
  313. package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +19 -6
  314. package/src/hooks/__tests__/usePermissionCache.simple.test.ts +17 -4
  315. package/src/hooks/__tests__/usePermissionCache.unit.test.ts +17 -4
  316. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +26 -6
  317. package/src/hooks/__tests__/usePublicFileDisplay.test.ts +16 -6
  318. package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +3 -3
  319. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +17 -3
  320. package/src/hooks/public/usePublicEvent.ts +7 -6
  321. package/src/hooks/public/usePublicEventLogo.ts +7 -4
  322. package/src/hooks/public/usePublicFileDisplay.ts +6 -150
  323. package/src/hooks/useComponentPerformance.ts +4 -1
  324. package/src/hooks/useDataTablePerformance.ts +4 -3
  325. package/src/hooks/useEventTheme.test.ts +18 -5
  326. package/src/hooks/useEventTheme.ts +4 -1
  327. package/src/hooks/useEvents.ts +2 -0
  328. package/src/hooks/useFileDisplay.ts +9 -8
  329. package/src/hooks/useFileReference.ts +4 -1
  330. package/src/hooks/useFileUrl.ts +4 -1
  331. package/src/hooks/useInactivityTracker.ts +5 -4
  332. package/src/hooks/useOrganisationSecurity.test.ts +33 -12
  333. package/src/hooks/useOrganisationSecurity.ts +8 -7
  334. package/src/hooks/usePerformanceMonitor.ts +6 -3
  335. package/src/hooks/usePermissionCache.ts +13 -6
  336. package/src/hooks/useSecureDataAccess.test.ts +2 -2
  337. package/src/hooks/useSecureDataAccess.ts +9 -8
  338. package/src/hooks/useSessionRestoration.ts +4 -1
  339. package/src/hooks/useStorage.ts +4 -1
  340. package/src/index.ts +16 -7
  341. package/src/providers/services/AuthServiceProvider.tsx +3 -2
  342. package/src/providers/services/EventServiceProvider.tsx +2 -1
  343. package/src/providers/services/InactivityServiceProvider.tsx +2 -1
  344. package/src/providers/services/OrganisationServiceProvider.tsx +2 -1
  345. package/src/providers/services/UnifiedAuthProvider.tsx +4 -3
  346. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +22 -2
  347. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +24 -2
  348. package/src/rbac/__tests__/cache-invalidation.test.ts +20 -6
  349. package/src/rbac/api.ts +5 -2
  350. package/src/rbac/audit-enhanced.ts +6 -6
  351. package/src/rbac/audit.test.ts +60 -38
  352. package/src/rbac/audit.ts +8 -8
  353. package/src/rbac/cache-invalidation.ts +7 -4
  354. package/src/rbac/components/EnhancedNavigationMenu.tsx +11 -5
  355. package/src/rbac/components/NavigationGuard.tsx +7 -3
  356. package/src/rbac/components/NavigationProvider.tsx +6 -3
  357. package/src/rbac/components/PagePermissionGuard.tsx +28 -16
  358. package/src/rbac/components/PagePermissionProvider.tsx +4 -1
  359. package/src/rbac/components/PermissionEnforcer.tsx +9 -3
  360. package/src/rbac/components/RoleBasedRouter.tsx +3 -1
  361. package/src/rbac/components/SecureDataProvider.tsx +7 -3
  362. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +87 -61
  363. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +83 -33
  364. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +36 -13
  365. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +2 -2
  366. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +22 -8
  367. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +19 -6
  368. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +43 -17
  369. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +42 -17
  370. package/src/rbac/engine.ts +15 -7
  371. package/src/rbac/hooks/usePermissions.ts +7 -3
  372. package/src/rbac/hooks/useResolvedScope.test.ts +2 -2
  373. package/src/rbac/hooks/useResolvedScope.ts +10 -7
  374. package/src/rbac/permissions.ts +5 -2
  375. package/src/rbac/security.test.ts +27 -16
  376. package/src/rbac/security.ts +5 -4
  377. package/src/services/AuthService.ts +22 -21
  378. package/src/services/EventService.ts +12 -12
  379. package/src/services/InactivityService.ts +5 -4
  380. package/src/services/OrganisationService.ts +26 -25
  381. package/src/services/__tests__/AuthService.test.ts +51 -19
  382. package/src/services/__tests__/EventService.test.ts +37 -5
  383. package/src/services/__tests__/InactivityService.test.ts +38 -4
  384. package/src/services/__tests__/OrganisationService.test.ts +3 -8
  385. package/src/services/base/BaseService.ts +3 -1
  386. package/src/theming/__tests__/runtime.test.ts +21 -12
  387. package/src/theming/parseEventColours.ts +5 -19
  388. package/src/theming/runtime.ts +8 -4
  389. package/src/types/validation.ts +2 -29
  390. package/src/utils/__tests__/appConfig.unit.test.ts +1 -1
  391. package/src/utils/__tests__/audit.unit.test.ts +1 -1
  392. package/src/utils/__tests__/auth-utils.unit.test.ts +1 -1
  393. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +19 -19
  394. package/src/utils/__tests__/cn.unit.test.ts +1 -1
  395. package/src/utils/__tests__/debugLogger.test.ts +1 -1
  396. package/src/utils/__tests__/deviceFingerprint.unit.test.ts +1 -1
  397. package/src/utils/__tests__/dynamicUtils.unit.test.ts +1 -1
  398. package/src/utils/__tests__/formatting.unit.test.ts +1 -1
  399. package/src/utils/__tests__/lazyLoad.unit.test.tsx +1 -1
  400. package/src/utils/__tests__/logger.unit.test.ts +1 -1
  401. package/src/utils/__tests__/organisationContext.unit.test.ts +1 -1
  402. package/src/utils/__tests__/performanceBenchmark.test.ts +1 -1
  403. package/src/utils/__tests__/performanceBudgets.unit.test.ts +1 -1
  404. package/src/utils/__tests__/permissionTypes.unit.test.ts +1 -1
  405. package/src/utils/__tests__/permissionUtils.unit.test.ts +1 -1
  406. package/src/utils/__tests__/sanitization.unit.test.ts +1 -1
  407. package/src/utils/__tests__/schemaUtils.unit.test.ts +1 -1
  408. package/src/utils/__tests__/secureDataAccess.unit.test.ts +1 -1
  409. package/src/utils/__tests__/secureErrors.unit.test.ts +33 -15
  410. package/src/utils/__tests__/secureStorage.unit.test.ts +1 -1
  411. package/src/utils/__tests__/security.unit.test.ts +40 -18
  412. package/src/utils/__tests__/securityMonitor.unit.test.ts +1 -1
  413. package/src/utils/__tests__/sessionTracking.unit.test.ts +40 -29
  414. package/src/utils/__tests__/validationUtils.unit.test.ts +19 -6
  415. package/src/utils/{appIdResolver.test.ts → app/appIdResolver.test.ts} +28 -30
  416. package/src/utils/{appIdResolver.ts → app/appIdResolver.ts} +8 -5
  417. package/src/utils/{appNameResolver.test.ts → app/appNameResolver.test.ts} +1 -1
  418. package/src/utils/{appNameResolver.ts → app/appNameResolver.ts} +5 -1
  419. package/src/utils/{organisationContext.ts → context/organisationContext.ts} +6 -3
  420. package/src/utils/{sessionTracking.ts → context/sessionTracking.ts} +11 -12
  421. package/src/utils/{logger.ts → core/logger.ts} +4 -2
  422. package/src/utils/{deviceFingerprint.ts → device/deviceFingerprint.ts} +1 -1
  423. package/src/utils/{lazyLoad.tsx → dynamic/lazyLoad.tsx} +2 -2
  424. package/src/utils/{file-reference.test.ts → file-reference/__tests__/file-reference.test.ts} +5 -5
  425. package/src/utils/{file-reference.ts → file-reference/index.ts} +20 -38
  426. package/src/utils/index.ts +32 -54
  427. package/src/utils/{secureErrors.ts → security/secureErrors.ts} +6 -3
  428. package/src/utils/{security.ts → security/security.ts} +5 -2
  429. package/src/utils/storage/__tests__/helpers.unit.test.ts +1 -4
  430. package/src/utils/storage/helpers.ts +15 -8
  431. package/src/{components/Dialog/utils/__tests__/safeHtml.unit.test.ts → utils/validation/__tests__/htmlSanitization.unit.test.ts} +9 -15
  432. package/src/{validation → utils/validation}/csrf.ts +1 -1
  433. package/src/{components/Dialog/utils/safeHtml.ts → utils/validation/htmlSanitization.ts} +9 -10
  434. package/src/utils/validation/index.ts +79 -0
  435. package/src/utils/{sanitization.ts → validation/sanitization.ts} +71 -2
  436. package/src/{validation/schemaUtils.ts → utils/validation/schema.ts} +11 -6
  437. package/src/{validation → utils/validation}/sqlInjectionProtection.ts +2 -0
  438. package/src/utils/{validationUtils.ts → validation/validationUtils.ts} +4 -1
  439. package/src/validation/index.ts +3 -34
  440. package/dist/UnifiedAuthProvider-CQDZRJIS.js +0 -16
  441. package/dist/chunk-24MKLB7U.js +0 -81
  442. package/dist/chunk-24MKLB7U.js.map +0 -1
  443. package/dist/chunk-3CG5L6RN.js.map +0 -1
  444. package/dist/chunk-3DBFLLLU.js.map +0 -1
  445. package/dist/chunk-5F3NDPJV.js.map +0 -1
  446. package/dist/chunk-66C4BSAY.js.map +0 -1
  447. package/dist/chunk-BDZUMRBD.js.map +0 -1
  448. package/dist/chunk-BYXRHAIF.js.map +0 -1
  449. package/dist/chunk-CDQ3PX7L.js +0 -18
  450. package/dist/chunk-CDQ3PX7L.js.map +0 -1
  451. package/dist/chunk-CQZU6TFE.js.map +0 -1
  452. package/dist/chunk-F64FFPOZ.js.map +0 -1
  453. package/dist/chunk-GEVIB2UB.js.map +0 -1
  454. package/dist/chunk-GKHF54DI.js.map +0 -1
  455. package/dist/chunk-GVDR7WNV.js.map +0 -1
  456. package/dist/chunk-HMNOSGVA.js.map +0 -1
  457. package/dist/chunk-JCQZ6LA7.js.map +0 -1
  458. package/dist/chunk-M6DDYFUD.js.map +0 -1
  459. package/dist/chunk-O3NWNXDY.js.map +0 -1
  460. package/dist/chunk-PYUXFQJ3.js.map +0 -1
  461. package/dist/chunk-UJI6WSMD.js.map +0 -1
  462. package/dist/chunk-VZ5OR6HD.js.map +0 -1
  463. package/dist/chunk-WP5I5GLN.js.map +0 -1
  464. package/dist/chunk-ZYZCRSBD.js.map +0 -1
  465. package/src/components/Dialog/README.md +0 -804
  466. package/src/components/Form/FormErrorSummary.tsx +0 -113
  467. package/src/components/Form/FormFieldset.tsx +0 -127
  468. package/src/components/Form/FormLiveRegion.tsx +0 -198
  469. package/src/components/PasswordReset/PasswordResetForm.test.tsx +0 -597
  470. package/src/components/PasswordReset/PasswordResetForm.tsx +0 -201
  471. package/src/components/PublicLayout/PublicPageDebugger.tsx +0 -104
  472. package/src/components/PublicLayout/PublicPageDiagnostic.tsx +0 -162
  473. package/src/components/PublicLayout/__tests__/PublicPageDebugger.test.tsx +0 -185
  474. package/src/examples/CorrectPublicPageImplementation.tsx +0 -304
  475. package/src/examples/PublicEventPage.tsx +0 -287
  476. package/src/examples/PublicPageApp.tsx +0 -321
  477. package/src/examples/PublicPageUsageExample.tsx +0 -218
  478. package/src/utils/schemaUtils.ts +0 -37
  479. package/src/validation/__tests__/common.unit.test.ts +0 -101
  480. package/src/validation/__tests__/csrf.unit.test.ts +0 -365
  481. package/src/validation/__tests__/passwordSchema.unit.test.ts +0 -203
  482. package/src/validation/__tests__/sanitization.unit.test.ts +0 -250
  483. package/src/validation/__tests__/schemaUtils.unit.test.ts +0 -451
  484. package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +0 -462
  485. package/src/validation/__tests__/user.unit.test.ts +0 -440
  486. package/src/validation/sanitization.ts +0 -96
  487. /package/dist/{DataTable-A36PJG6N.js.map → DataTable-CYOHOX3O.js.map} +0 -0
  488. /package/dist/{UnifiedAuthProvider-CQDZRJIS.js.map → UnifiedAuthProvider-5E5TUNMS.js.map} +0 -0
  489. /package/dist/{api-TNIBJWLM.js.map → api-45XYYO2A.js.map} +0 -0
  490. /package/dist/{audit-T36HM7IM.js.map → audit-64X3VJXB.js.map} +0 -0
  491. /package/dist/{chunk-CTJRBUX2.js.map → chunk-2TWNJ46Y.js.map} +0 -0
  492. /package/dist/{chunk-ZV77RZMU.js.map → chunk-XARJS7CD.js.map} +0 -0
  493. /package/dist/{useInactivityTracker-MRUU55XI.js.map → useInactivityTracker-TO6ZOF35.js.map} +0 -0
  494. /package/examples/{public-pages → features/public-pages}/index.ts +0 -0
  495. /package/examples/{RBAC → features/rbac}/CompleteRBACExample.tsx +0 -0
  496. /package/examples/{RBAC → features/rbac}/EventBasedApp.tsx +0 -0
  497. /package/examples/{RBAC → features/rbac}/PermissionExample.tsx +0 -0
  498. /package/examples/{RBAC → features/rbac}/index.ts +0 -0
  499. /package/src/utils/{appConfig.ts → app/appConfig.ts} +0 -0
  500. /package/src/utils/{appNameResolver.simple.test.ts → app/appNameResolver.simple.test.ts} +0 -0
  501. /package/src/utils/{audit.ts → audit/audit.ts} +0 -0
  502. /package/src/utils/{organisationContext.test.ts → context/organisationContext.test.ts} +0 -0
  503. /package/src/utils/{cn.ts → core/cn.ts} +0 -0
  504. /package/src/utils/{debugLogger.ts → core/debugLogger.ts} +0 -0
  505. /package/src/utils/{dynamicUtils.ts → dynamic/dynamicUtils.ts} +0 -0
  506. /package/src/utils/{formatDate.test.ts → formatting/formatDate.test.ts} +0 -0
  507. /package/src/utils/{formatting.ts → formatting/formatting.ts} +0 -0
  508. /package/src/utils/{bundleAnalysis.ts → performance/bundleAnalysis.ts} +0 -0
  509. /package/src/utils/{performanceBenchmark.ts → performance/performanceBenchmark.ts} +0 -0
  510. /package/src/utils/{performanceBudgets.ts → performance/performanceBudgets.ts} +0 -0
  511. /package/src/utils/{permissionTypes.ts → permissions/permissionTypes.ts} +0 -0
  512. /package/src/utils/{permissionUtils.test.ts → permissions/permissionUtils.test.ts} +0 -0
  513. /package/src/utils/{permissionUtils.ts → permissions/permissionUtils.ts} +0 -0
  514. /package/src/utils/{auth-utils.ts → security/auth-utils.ts} +0 -0
  515. /package/src/utils/{secureDataAccess.test.ts → security/secureDataAccess.test.ts} +0 -0
  516. /package/src/utils/{secureDataAccess.ts → security/secureDataAccess.ts} +0 -0
  517. /package/src/utils/{secureStorage.ts → security/secureStorage.ts} +0 -0
  518. /package/src/utils/{securityMonitor.ts → security/securityMonitor.ts} +0 -0
  519. /package/src/{validation → utils/validation}/common.ts +0 -0
  520. /package/src/{validation → utils/validation}/passwordSchema.ts +0 -0
  521. /package/src/{validation → utils/validation}/user.ts +0 -0
  522. /package/src/utils/{validation.ts → validation/validation.ts} +0 -0
@@ -1,201 +0,0 @@
1
- /**
2
- * @file Password Reset Form Component
3
- * @package @jmruthers/pace-core
4
- * @module Components/PasswordReset
5
- * @since 0.1.0
6
- *
7
- * A comprehensive password reset form component that handles email-based password recovery
8
- * with proper validation, loading states, and success feedback.
9
- *
10
- * Features:
11
- * - Email validation and submission
12
- * - Loading states with disabled form
13
- * - Success state with confirmation message
14
- * - Error handling and display
15
- * - Resend functionality
16
- * - Accessibility compliant
17
- * - Responsive design
18
- * - Integration with UnifiedAuthProvider
19
- * - Form validation
20
- * - Success and error callbacks
21
- *
22
- * @example
23
- * ```tsx
24
- * // Basic password reset form
25
- * <PasswordResetForm
26
- * onSuccess={() => {
27
- * toast.success('Password reset email sent!');
28
- * }}
29
- * onError={(error) => {
30
- * toast.error(`Failed to send reset email: ${error.message}`);
31
- * }}
32
- * />
33
- *
34
- * // Password reset form with custom styling
35
- * <PasswordResetForm
36
- * className="max-w-md mx-auto p-6 bg-main-50 rounded-lg shadow-md"
37
- * onSuccess={() => {
38
- * console.log('Reset email sent successfully');
39
- * navigate('/check-email');
40
- * }}
41
- * onError={(error) => {
42
- * console.error('Password reset failed:', error);
43
- * }}
44
- * />
45
- *
46
- * // Password reset form in a modal
47
- * <Modal isOpen={showResetForm} onClose={() => setShowResetForm(false)}>
48
- * <ModalContent>
49
- * <PasswordResetForm
50
- * onSuccess={() => {
51
- * setShowResetForm(false);
52
- * toast.success('Check your email for reset instructions');
53
- * }}
54
- * onError={(error) => {
55
- * toast.error(error.message);
56
- * }}
57
- * />
58
- * </ModalContent>
59
- * </Modal>
60
- * ```
61
- *
62
- * @accessibility
63
- * - WCAG 2.1 AA compliant
64
- * - Proper form labels and associations
65
- * - Screen reader friendly error messages
66
- * - Keyboard navigation support
67
- * - Focus management
68
- * - High contrast support
69
- * - Clear error identification
70
- * - Role="alert" for error announcements
71
- *
72
- * @dependencies
73
- * - React 18+ - Hooks and state
74
- * - UnifiedAuthProvider - Authentication context
75
- * - Button component
76
- * - Input component
77
- * - Label component
78
- * - Tailwind CSS - Styling
79
- */
80
-
81
- import React, { useState } from 'react';
82
- import { Button } from '../Button/Button';
83
- import { Input } from '../Input/Input';
84
- import { Label } from '../Label';
85
- import { cn } from '../../utils/cn';
86
- import { useUnifiedAuth } from '../../providers/UnifiedAuthProvider';
87
-
88
- export interface PasswordResetFormProps {
89
- onSuccess?: () => void;
90
- onError?: (error: Error) => void;
91
- className?: string;
92
- }
93
-
94
- export function PasswordResetForm({
95
- onSuccess,
96
- onError,
97
- className
98
- }: PasswordResetFormProps) {
99
- const { resetPassword } = useUnifiedAuth();
100
- const [email, setEmail] = useState('');
101
- const [isLoading, setIsLoading] = useState(false);
102
- const [isSuccess, setIsSuccess] = useState(false);
103
- const [error, setError] = useState<string | null>(null);
104
-
105
- const handleSubmit = async (e: React.FormEvent) => {
106
- e.preventDefault();
107
-
108
- if (!email.trim()) {
109
- return;
110
- }
111
-
112
- setIsLoading(true);
113
- setError(null);
114
-
115
- try {
116
- const { error: resetError } = await resetPassword(email);
117
-
118
- if (resetError) {
119
- const errorObj = new Error(resetError.message || 'Failed to send reset email');
120
- setError(errorObj.message);
121
- onError?.(errorObj);
122
- } else {
123
- setIsSuccess(true);
124
- onSuccess?.();
125
- }
126
- } catch (err) {
127
- const errorObj = err instanceof Error ? err : new Error('An unexpected error occurred');
128
- setError(errorObj.message);
129
- onError?.(errorObj);
130
- } finally {
131
- setIsLoading(false);
132
- }
133
- };
134
-
135
- const handleSendAnother = () => {
136
- setIsSuccess(false);
137
- setError(null);
138
- };
139
-
140
- if (isSuccess) {
141
- return (
142
- <div className={cn('', className)} role="form">
143
- <div className="space-y-4 text-center">
144
- <h2>Check your email</h2>
145
- <p className="text-sec-600">
146
- We have sent a password reset link to {email}
147
- </p>
148
- <Button
149
- variant="outline"
150
- onClick={handleSendAnother}
151
- className="w-full"
152
- >
153
- Send another email
154
- </Button>
155
- </div>
156
- </div>
157
- );
158
- }
159
-
160
- return (
161
- <div className={cn('', className)} role="form">
162
- <div className="space-y-4">
163
- <div className="space-y-2">
164
- <h2>Reset Password</h2>
165
- <p className="text-sec-600">
166
- Enter your email address and we'll send you a reset link.
167
- </p>
168
- </div>
169
-
170
- <form onSubmit={handleSubmit} className="space-y-4">
171
- <div className="space-y-2">
172
- <Label htmlFor="email">Email Address</Label>
173
- <Input
174
- id="email"
175
- type="email"
176
- value={email}
177
- onChange={(e) => setEmail(e.target.value)}
178
- placeholder="Enter your email"
179
- required
180
- disabled={isLoading}
181
- />
182
- </div>
183
-
184
- {error && (
185
- <div className="text-sm text-destructive" role="alert">
186
- {error}
187
- </div>
188
- )}
189
-
190
- <Button
191
- type="submit"
192
- className="w-full"
193
- disabled={!email.trim() || isLoading}
194
- >
195
- {isLoading ? 'Sending...' : 'Send Reset Link'}
196
- </Button>
197
- </form>
198
- </div>
199
- </div>
200
- );
201
- }
@@ -1,104 +0,0 @@
1
- /**
2
- * @file Public Page Debugger
3
- * @package @jmruthers/pace-core
4
- * @module Components/PublicLayout
5
- * @since 1.0.0
6
- *
7
- * A debugging component that helps identify why authentication context
8
- * is being triggered in public pages.
9
- */
10
-
11
- import React, { useEffect } from 'react';
12
- import { usePublicPageContext } from './PublicPageProvider';
13
-
14
- export interface PublicPageDebuggerProps {
15
- /** Whether to enable debugging */
16
- enabled?: boolean;
17
- /** Custom label for this debugger instance */
18
- label?: string;
19
- }
20
-
21
- /**
22
- * Debugger component that logs context information
23
- *
24
- * This component helps identify why authentication context
25
- * is being triggered in public pages.
26
- */
27
- export function PublicPageDebugger({ enabled = true, label = 'PublicPage' }: PublicPageDebuggerProps) {
28
- useEffect(() => {
29
- if (!enabled) return;
30
-
31
- console.log(`[${label}] Component mounted`);
32
-
33
- // Check if we're in a public page context
34
- try {
35
- // This will throw if we're not in PublicPageProvider
36
- const { isPublicPage } = usePublicPageContext();
37
- console.log(`[${label}] Public page context detected:`, isPublicPage);
38
- } catch (error) {
39
- console.warn(`[${label}] Not in PublicPageProvider context:`, error instanceof Error ? error.message : String(error));
40
- }
41
-
42
- // Check for authentication context
43
- try {
44
- // This will throw if we're not in UnifiedAuthProvider
45
- const { isAuthenticated } = require('../../providers/UnifiedAuthProvider').useUnifiedAuth();
46
- console.warn(`[${label}] AUTHENTICATION CONTEXT DETECTED! This should not happen in public pages.`);
47
- console.warn(`[${label}] isAuthenticated:`, isAuthenticated);
48
- } catch (error) {
49
- console.log(`[${label}] No authentication context detected (good for public pages)`);
50
- }
51
-
52
- // Check for organisation context
53
- try {
54
- // This will throw if we're not in OrganisationProvider
55
- const { selectedOrganisation } = require('../../providers/OrganisationProvider').useOrganisations();
56
- console.warn(`[${label}] ORGANISATION CONTEXT DETECTED! This should not happen in public pages.`);
57
- console.warn(`[${label}] selectedOrganisation:`, selectedOrganisation);
58
- } catch (error) {
59
- console.log(`[${label}] No organisation context detected (good for public pages)`);
60
- }
61
-
62
- // Check for event context
63
- try {
64
- // This will throw if we're not in EventProvider
65
- const { events } = require('../../providers/EventProvider').useEvents();
66
- console.warn(`[${label}] EVENT CONTEXT DETECTED! This should not happen in public pages.`);
67
- console.warn(`[${label}] events:`, events);
68
- } catch (error) {
69
- console.log(`[${label}] No event context detected (good for public pages)`);
70
- }
71
-
72
- // Check environment variables
73
- const supabaseUrl = (import.meta as any).env?.VITE_SUPABASE_URL;
74
- const supabaseKey = (import.meta as any).env?.VITE_SUPABASE_ANON_KEY;
75
-
76
- console.log(`[${label}] Environment variables:`, {
77
- supabaseUrl: supabaseUrl ? 'Present' : 'Missing',
78
- supabaseKey: supabaseKey ? 'Present' : 'Missing'
79
- });
80
-
81
- return () => {
82
- console.log(`[${label}] Component unmounted`);
83
- };
84
- }, [enabled, label]);
85
-
86
- if (!enabled) return null;
87
-
88
- return (
89
- <div style={{
90
- position: 'fixed',
91
- top: 0,
92
- right: 0,
93
- background: 'rgba(0,0,0,0.8)',
94
- color: 'white',
95
- padding: '8px',
96
- fontSize: '12px',
97
- zIndex: 9999,
98
- fontFamily: 'monospace'
99
- }}>
100
- <div>Public Page Debugger</div>
101
- <div>Check console for context analysis</div>
102
- </div>
103
- );
104
- }
@@ -1,162 +0,0 @@
1
- /**
2
- * @file Public Page Diagnostic Component
3
- * @package @jmruthers/pace-core
4
- * @module Components/PublicLayout
5
- * @since 1.0.0
6
- *
7
- * A diagnostic component that helps identify exactly where authentication
8
- * context is being triggered in public pages.
9
- */
10
-
11
- import React, { useEffect, useState } from 'react';
12
- import { usePublicPageContext } from './PublicPageProvider';
13
-
14
- export interface PublicPageDiagnosticProps {
15
- /** Whether to enable diagnostics */
16
- enabled?: boolean;
17
- /** Custom label for this diagnostic instance */
18
- label?: string;
19
- }
20
-
21
- /**
22
- * Diagnostic component that identifies authentication context issues
23
- *
24
- * This component will help you identify exactly where the problem is
25
- * in your public page implementation.
26
- */
27
- export function PublicPageDiagnostic({ enabled = true, label = 'PublicPage' }: PublicPageDiagnosticProps) {
28
- const [diagnostics, setDiagnostics] = useState<{
29
- hasPublicPageContext: boolean;
30
- hasAuthContext: boolean;
31
- hasOrgContext: boolean;
32
- hasEventContext: boolean;
33
- hasEnvironmentVars: boolean;
34
- routeParams: any;
35
- }>({
36
- hasPublicPageContext: false,
37
- hasAuthContext: false,
38
- hasOrgContext: false,
39
- hasEventContext: false,
40
- hasEnvironmentVars: false,
41
- routeParams: null
42
- });
43
-
44
- useEffect(() => {
45
- if (!enabled) return;
46
-
47
- const runDiagnostics = () => {
48
- const newDiagnostics = {
49
- hasPublicPageContext: false,
50
- hasAuthContext: false,
51
- hasOrgContext: false,
52
- hasEventContext: false,
53
- hasEnvironmentVars: false,
54
- routeParams: null
55
- };
56
-
57
- // Check for PublicPageProvider context
58
- try {
59
- const { isPublicPage } = usePublicPageContext();
60
- newDiagnostics.hasPublicPageContext = isPublicPage === true;
61
- } catch (error) {
62
- newDiagnostics.hasPublicPageContext = false;
63
- }
64
-
65
- // Check for authentication context
66
- try {
67
- const { isAuthenticated } = require('../../providers/UnifiedAuthProvider').useUnifiedAuth();
68
- newDiagnostics.hasAuthContext = true;
69
- } catch (error) {
70
- newDiagnostics.hasAuthContext = false;
71
- }
72
-
73
- // Check for organisation context
74
- try {
75
- const { selectedOrganisation } = require('../../providers/OrganisationProvider').useOrganisations();
76
- newDiagnostics.hasOrgContext = true;
77
- } catch (error) {
78
- newDiagnostics.hasOrgContext = false;
79
- }
80
-
81
- // Check for event context
82
- try {
83
- const { events } = require('../../providers/EventProvider').useEvents();
84
- newDiagnostics.hasEventContext = true;
85
- } catch (error) {
86
- newDiagnostics.hasEventContext = false;
87
- }
88
-
89
- // Check environment variables
90
- const supabaseUrl = (import.meta as any).env?.VITE_SUPABASE_URL;
91
- const supabaseKey = (import.meta as any).env?.VITE_SUPABASE_ANON_KEY;
92
- newDiagnostics.hasEnvironmentVars = !!(supabaseUrl && supabaseKey);
93
-
94
- // Check route parameters
95
- try {
96
- const { useParams } = require('react-router-dom');
97
- const params = useParams();
98
- newDiagnostics.routeParams = params;
99
- } catch (error) {
100
- newDiagnostics.routeParams = null;
101
- }
102
-
103
- setDiagnostics(newDiagnostics);
104
-
105
- // Log results
106
- console.group(`🔍 [${label}] Public Page Diagnostics`);
107
- console.log('✅ Public Page Context:', newDiagnostics.hasPublicPageContext ? 'PRESENT' : 'MISSING');
108
- console.log('❌ Auth Context:', newDiagnostics.hasAuthContext ? 'PRESENT (BAD!)' : 'ABSENT (GOOD!)');
109
- console.log('❌ Org Context:', newDiagnostics.hasOrgContext ? 'PRESENT (BAD!)' : 'ABSENT (GOOD!)');
110
- console.log('❌ Event Context:', newDiagnostics.hasEventContext ? 'PRESENT (BAD!)' : 'ABSENT (GOOD!)');
111
- console.log('✅ Environment Vars:', newDiagnostics.hasEnvironmentVars ? 'PRESENT' : 'MISSING');
112
- console.log('✅ Route Params:', newDiagnostics.routeParams);
113
- console.groupEnd();
114
-
115
- // Provide specific guidance
116
- if (newDiagnostics.hasAuthContext || newDiagnostics.hasOrgContext || newDiagnostics.hasEventContext) {
117
- console.error(`🚨 [${label}] PROBLEM DETECTED: Public page is inside authentication context!`);
118
- console.error('🔧 SOLUTION: Move public routes outside of UnifiedAuthProvider, OrganisationProvider, and EventProvider');
119
- console.error('📖 See: packages/core/docs/emergency-public-pages-fix.md');
120
- } else if (!newDiagnostics.hasPublicPageContext) {
121
- console.warn(`⚠️ [${label}] WARNING: Not in PublicPageProvider context`);
122
- console.warn('🔧 SOLUTION: Wrap your public page component in <PublicPageProvider>');
123
- } else if (!newDiagnostics.hasEnvironmentVars) {
124
- console.warn(`⚠️ [${label}] WARNING: Missing environment variables`);
125
- console.warn('🔧 SOLUTION: Set VITE_SUPABASE_URL and VITE_SUPABASE_ANON_KEY in your environment');
126
- } else {
127
- console.log(`✅ [${label}] All diagnostics passed! Public page should work correctly.`);
128
- }
129
- };
130
-
131
- runDiagnostics();
132
- }, [enabled, label]);
133
-
134
- if (!enabled) return null;
135
-
136
- return (
137
- <div style={{
138
- position: 'fixed',
139
- top: 0,
140
- left: 0,
141
- background: 'rgba(0,0,0,0.9)',
142
- color: 'white',
143
- padding: '12px',
144
- fontSize: '11px',
145
- zIndex: 9999,
146
- fontFamily: 'monospace',
147
- maxWidth: '300px',
148
- borderRadius: '0 0 8px 0'
149
- }}>
150
- <div style={{ fontWeight: 'bold', marginBottom: '8px' }}>🔍 Public Page Diagnostics</div>
151
- <div>Public Context: {diagnostics.hasPublicPageContext ? '✅' : '❌'}</div>
152
- <div>Auth Context: {diagnostics.hasAuthContext ? '❌ BAD' : '✅ GOOD'}</div>
153
- <div>Org Context: {diagnostics.hasOrgContext ? '❌ BAD' : '✅ GOOD'}</div>
154
- <div>Event Context: {diagnostics.hasEventContext ? '❌ BAD' : '✅ GOOD'}</div>
155
- <div>Env Vars: {diagnostics.hasEnvironmentVars ? '✅' : '❌'}</div>
156
- <div>Route Params: {diagnostics.routeParams ? '✅' : '❌'}</div>
157
- <div style={{ marginTop: '8px', fontSize: '10px', opacity: 0.8 }}>
158
- Check console for detailed analysis
159
- </div>
160
- </div>
161
- );
162
- }
@@ -1,185 +0,0 @@
1
- /**
2
- * @file PublicPageDebugger Component Tests
3
- * @package @jmruthers/pace-core
4
- * @module Components/PublicLayout/__tests__
5
- * @since 1.0.0
6
- *
7
- * Comprehensive tests for the PublicPageDebugger component
8
- */
9
-
10
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
11
- import { render, screen } from '@testing-library/react';
12
- import { PublicPageDebugger } from '../PublicPageDebugger';
13
- import { PublicPageProvider } from '../PublicPageProvider';
14
-
15
- describe('PublicPageDebugger', () => {
16
- const consoleLogSpy = vi.spyOn(console, 'log');
17
- const consoleWarnSpy = vi.spyOn(console, 'warn');
18
-
19
- beforeEach(() => {
20
- vi.clearAllMocks();
21
- consoleLogSpy.mockImplementation(() => {});
22
- consoleWarnSpy.mockImplementation(() => {});
23
- });
24
-
25
- afterEach(() => {
26
- consoleLogSpy.mockRestore();
27
- consoleWarnSpy.mockRestore();
28
- });
29
-
30
- describe('Rendering', () => {
31
- it('renders debugger UI when enabled', () => {
32
- render(
33
- <PublicPageProvider>
34
- <PublicPageDebugger enabled={true} />
35
- </PublicPageProvider>
36
- );
37
-
38
- expect(screen.getByText('Public Page Debugger')).toBeInTheDocument();
39
- expect(screen.getByText('Check console for context analysis')).toBeInTheDocument();
40
- });
41
-
42
- it('does not render when disabled', () => {
43
- render(
44
- <PublicPageProvider>
45
- <PublicPageDebugger enabled={false} />
46
- </PublicPageProvider>
47
- );
48
-
49
- expect(screen.queryByText('Public Page Debugger')).not.toBeInTheDocument();
50
- });
51
-
52
- it('renders with default enabled state', () => {
53
- render(
54
- <PublicPageProvider>
55
- <PublicPageDebugger />
56
- </PublicPageProvider>
57
- );
58
-
59
- expect(screen.getByText('Public Page Debugger')).toBeInTheDocument();
60
- });
61
-
62
- it('renders with custom label', () => {
63
- render(
64
- <PublicPageProvider>
65
- <PublicPageDebugger label="CustomLabel" />
66
- </PublicPageProvider>
67
- );
68
-
69
- expect(screen.getByText('Public Page Debugger')).toBeInTheDocument();
70
- });
71
- });
72
-
73
- describe('Console Logging', () => {
74
- it('renders with debugging enabled', () => {
75
- render(
76
- <PublicPageProvider>
77
- <PublicPageDebugger enabled={true} label="TestLabel" />
78
- </PublicPageProvider>
79
- );
80
-
81
- expect(screen.getByText('Public Page Debugger')).toBeInTheDocument();
82
- });
83
-
84
- it('does not render when disabled', () => {
85
- render(
86
- <PublicPageProvider>
87
- <PublicPageDebugger enabled={false} label="TestLabel" />
88
- </PublicPageProvider>
89
- );
90
-
91
- expect(screen.queryByText('Public Page Debugger')).not.toBeInTheDocument();
92
- });
93
- });
94
-
95
- describe('Context Detection', () => {
96
- it('renders within public page context', () => {
97
- render(
98
- <PublicPageProvider>
99
- <PublicPageDebugger enabled={true} label="TestLabel" />
100
- </PublicPageProvider>
101
- );
102
-
103
- expect(screen.getByText('Public Page Debugger')).toBeInTheDocument();
104
- });
105
- });
106
-
107
- describe('Visual Debugger', () => {
108
- it('displays fixed position debugger', () => {
109
- render(
110
- <PublicPageProvider>
111
- <PublicPageDebugger enabled={true} />
112
- </PublicPageProvider>
113
- );
114
-
115
- // Visual debugger should be rendered
116
- expect(screen.getByText('Public Page Debugger')).toBeInTheDocument();
117
- });
118
-
119
- it('renders debugger with correct text content', () => {
120
- render(
121
- <PublicPageProvider>
122
- <PublicPageDebugger enabled={true} />
123
- </PublicPageProvider>
124
- );
125
-
126
- expect(screen.getByText('Public Page Debugger')).toBeInTheDocument();
127
- expect(screen.getByText('Check console for context analysis')).toBeInTheDocument();
128
- });
129
- });
130
-
131
- describe('Edge Cases', () => {
132
- it('renders without crashing', () => {
133
- render(
134
- <PublicPageProvider>
135
- <PublicPageDebugger enabled={true} />
136
- </PublicPageProvider>
137
- );
138
-
139
- expect(screen.getByText('Public Page Debugger')).toBeInTheDocument();
140
- });
141
-
142
- it('handles multiple instances', () => {
143
- render(
144
- <PublicPageProvider>
145
- <PublicPageDebugger enabled={true} label="FirstDebugger" />
146
- <PublicPageDebugger enabled={true} label="SecondDebugger" />
147
- </PublicPageProvider>
148
- );
149
-
150
- expect(screen.getAllByText('Public Page Debugger')).toHaveLength(2);
151
- });
152
-
153
- it('handles label changes on re-render', () => {
154
- const { rerender } = render(
155
- <PublicPageProvider>
156
- <PublicPageDebugger enabled={true} label="Label1" />
157
- </PublicPageProvider>
158
- );
159
-
160
- expect(screen.getByText('Public Page Debugger')).toBeInTheDocument();
161
-
162
- rerender(
163
- <PublicPageProvider>
164
- <PublicPageDebugger enabled={true} label="Label2" />
165
- </PublicPageProvider>
166
- );
167
-
168
- // Component should still render
169
- expect(screen.getByText('Public Page Debugger')).toBeInTheDocument();
170
- });
171
- });
172
-
173
- describe('Performance', () => {
174
- it('renders quickly without performance issues', () => {
175
- const { container } = render(
176
- <PublicPageProvider>
177
- <PublicPageDebugger enabled={true} label="TestLabel" />
178
- </PublicPageProvider>
179
- );
180
-
181
- expect(container).toBeInTheDocument();
182
- });
183
- });
184
- });
185
-