@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,304 +0,0 @@
1
- /**
2
- * @file Correct Public Page Implementation
3
- * @package @jmruthers/pace-core
4
- * @module Examples/PublicPages
5
- * @since 1.0.0
6
- *
7
- * This example shows the CORRECT way to implement public pages
8
- * that are completely isolated from the authentication context.
9
- *
10
- * CRITICAL: Public pages MUST be completely separate from the main app's
11
- * authentication context. They cannot be rendered inside the same component
12
- * tree as UnifiedAuthProvider, OrganisationProvider, or EventProvider.
13
- */
14
-
15
- import React from 'react';
16
- import { BrowserRouter, Routes, Route } from 'react-router-dom';
17
- import {
18
- PublicPageProvider,
19
- PublicPageLayout,
20
- PublicPageHeader,
21
- PublicPageFooter,
22
- FileDisplay,
23
- usePublicEvent,
24
- usePublicRouteParams,
25
- PublicLoadingSpinner
26
- } from '../index';
27
- import { FileCategory } from '../types/file-reference';
28
-
29
- /**
30
- * MAIN APPLICATION - This is your main app with authentication
31
- *
32
- * This should be completely separate from public pages.
33
- * All authenticated routes go here.
34
- */
35
- function MainApp() {
36
- return (
37
- <div>
38
- <h1>Main Application (Requires Authentication)</h1>
39
- <p>This is your main app with all the authenticated features.</p>
40
- {/* Your main app content here */}
41
- </div>
42
- );
43
- }
44
-
45
- /**
46
- * PUBLIC PAGE APPLICATION - This is completely separate
47
- *
48
- * This handles ALL public pages and is completely isolated
49
- * from the main application's authentication context.
50
- */
51
- function PublicPageApp() {
52
- return (
53
- <PublicPageProvider>
54
- <Routes>
55
- {/* All public routes go here */}
56
- <Route path="/events/:eventCode/recipe-grid-report" element={<PublicRecipeGridReportPage />} />
57
- <Route path="/events/:eventCode" element={<PublicEventPage />} />
58
- <Route path="/public-info/:pageId" element={<PublicInfoPage />} />
59
- </Routes>
60
- </PublicPageProvider>
61
- );
62
- }
63
-
64
- /**
65
- * ROOT APPLICATION - This decides which app to render
66
- *
67
- * This is the key: public pages and authenticated pages
68
- * are completely separate applications.
69
- */
70
- function RootApp() {
71
- return (
72
- <BrowserRouter>
73
- <Routes>
74
- {/* Public routes - NO authentication context */}
75
- <Route path="/events/*" element={<PublicPageApp />} />
76
- <Route path="/public-info/*" element={<PublicPageApp />} />
77
-
78
- {/* Authenticated routes - WITH authentication context */}
79
- <Route path="/*" element={<MainApp />} />
80
- </Routes>
81
- </BrowserRouter>
82
- );
83
- }
84
-
85
- /**
86
- * Public Recipe Grid Report Page
87
- *
88
- * This demonstrates the correct usage pattern.
89
- * Notice: NO authentication context is triggered.
90
- */
91
- function PublicRecipeGridReportPage() {
92
- // Step 1: Extract event code from URL
93
- const { eventCode } = usePublicRouteParams({ fetchEventData: false });
94
-
95
- // Step 2: Fetch event data
96
- const { event, isLoading, error, refetch } = usePublicEvent(eventCode || '');
97
-
98
- // Step 3: Handle loading state
99
- if (isLoading) {
100
- return (
101
- <PublicLoadingSpinner
102
- message="Loading recipe grid report..."
103
- />
104
- );
105
- }
106
-
107
- // Step 4: Handle error state
108
- if (error) {
109
- return (
110
- <div className="min-h-screen bg-main-50 flex items-center justify-center">
111
- <div className="max-w-md mx-auto text-center px-4">
112
- <div className="mb-6">
113
- <div className="mx-auto flex items-center justify-center h-12 w-12 rounded-full bg-acc-100 mb-4">
114
- <svg className="h-6 w-6 text-acc-600" fill="none" viewBox="0 0 24 24" stroke="currentColor">
115
- <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z" />
116
- </svg>
117
- </div>
118
- <h1 className="text-2xl font-bold text-sec-900 mb-2">
119
- Recipe Grid Report Not Found
120
- </h1>
121
- <p className="text-sec-600 mb-6">
122
- The event code "{eventCode}" is invalid or the recipe grid report is not available for public viewing.
123
- </p>
124
- <button
125
- onClick={refetch}
126
- className="px-4 py-2 bg-main-600 text-main-50 rounded-md hover:bg-main-700 transition-colors"
127
- >
128
- Try Again
129
- </button>
130
- </div>
131
- </div>
132
- </div>
133
- );
134
- }
135
-
136
- // Step 5: Handle missing event
137
- if (!event) {
138
- return (
139
- <div className="min-h-screen bg-main-50 flex items-center justify-center">
140
- <div className="max-w-md mx-auto text-center px-4">
141
- <h1 className="text-2xl font-bold text-sec-900 mb-4">
142
- Recipe Grid Report Not Available
143
- </h1>
144
- <p className="text-sec-600 mb-6">
145
- This recipe grid report is not available for public viewing.
146
- </p>
147
- <button
148
- onClick={refetch}
149
- className="px-4 py-2 bg-main-600 text-main-50 rounded-md hover:bg-main-700 transition-colors"
150
- >
151
- Try Again
152
- </button>
153
- </div>
154
- </div>
155
- );
156
- }
157
-
158
- // Step 6: Render the public page
159
- return (
160
- <PublicPageLayout eventCode={eventCode || ''} event={event}>
161
- <PublicPageHeader
162
- event={event}
163
- eventCode={eventCode || ''}
164
- title="Recipe Grid Report"
165
- description="Public recipe grid report for this event"
166
- />
167
-
168
- <main className="max-w-6xl mx-auto px-4 py-8">
169
- {/* Recipe Grid Report Content */}
170
- <div className="mb-12">
171
- <div className="bg-main-50 border border-main-200 rounded-lg p-6">
172
- <h3 className="font-semibold text-main-900 mb-2">Recipe Grid Report</h3>
173
- <p className="text-main-800">
174
- This is where your recipe grid report content would go.
175
- The public page is now working correctly without authentication context conflicts.
176
- </p>
177
- <div className="mt-4 text-sm text-main-700">
178
- <p><strong>Event Code:</strong> {eventCode}</p>
179
- <p><strong>Event ID:</strong> {event.event_id}</p>
180
- <p><strong>Event Name:</strong> {event.event_name}</p>
181
- </div>
182
- </div>
183
- </div>
184
-
185
- {/* Event Information */}
186
- <div className="grid grid-cols-1 lg:grid-cols-3 gap-8 mb-12">
187
- <div className="lg:col-span-2 space-y-6">
188
- <div>
189
- <h2 className="text-2xl font-bold text-sec-900 mb-4">Event Information</h2>
190
- <div className="bg-sec-50 rounded-lg p-6 space-y-4">
191
- <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
192
- <div>
193
- <h3 className="font-semibold text-sec-700">Date</h3>
194
- <p className="text-sec-900">
195
- {event.event_date ? new Date(event.event_date).toLocaleDateString('en-AU', {
196
- weekday: 'long',
197
- year: 'numeric',
198
- month: 'long',
199
- day: 'numeric'
200
- }) : 'TBA'}
201
- </p>
202
- </div>
203
- <div>
204
- <h3 className="font-semibold text-sec-700">Venue</h3>
205
- <p className="text-sec-900">{event.event_venue || 'TBA'}</p>
206
- </div>
207
- <div>
208
- <h3 className="font-semibold text-sec-700">Participants</h3>
209
- <p className="text-sec-900">{event.event_participants || 'TBA'}</p>
210
- </div>
211
- <div>
212
- <h3 className="font-semibold text-sec-700">Event Code</h3>
213
- <p className="text-sec-900 font-mono">{event.event_code}</p>
214
- </div>
215
- </div>
216
- </div>
217
- </div>
218
- </div>
219
-
220
- {/* Event Logo */}
221
- <div className="flex justify-center lg:justify-start">
222
- <div className="text-center">
223
- <FileDisplay
224
- table_name="event"
225
- record_id={event.event_id}
226
- organisation_id={event.organisation_id}
227
- category={FileCategory.EVENT_LOGOS}
228
- showDelete={false}
229
- className="rounded-lg shadow-lg [&_img]:h-20 [&_img]:w-20 [&_img]:object-contain"
230
- />
231
- <p className="mt-4 text-sm text-sec-600">Event Logo</p>
232
- </div>
233
- </div>
234
- </div>
235
- </main>
236
-
237
- <PublicPageFooter event={event} />
238
- </PublicPageLayout>
239
- );
240
- }
241
-
242
- /**
243
- * Generic public event page
244
- */
245
- function PublicEventPage() {
246
- const { eventCode } = usePublicRouteParams({ fetchEventData: false });
247
- const { event, isLoading, error, refetch } = usePublicEvent(eventCode || '');
248
-
249
- if (isLoading) return <PublicLoadingSpinner message="Loading event..." />;
250
- if (error) return <div>Error: {error.message}</div>;
251
- if (!event) return <div>Event not found</div>;
252
-
253
- return (
254
- <PublicPageLayout eventCode={eventCode || ''} event={event}>
255
- <PublicPageHeader
256
- event={event}
257
- eventCode={eventCode || ''}
258
- title="Event Details"
259
- description="Public information about this event"
260
- />
261
-
262
- <main className="max-w-4xl mx-auto px-4 py-6">
263
- <div className="text-center mb-6">
264
- <FileDisplay
265
- table_name="event"
266
- record_id={event.event_id}
267
- organisation_id={event.organisation_id}
268
- category={FileCategory.EVENT_LOGOS}
269
- showDelete={false}
270
- className="mx-auto mb-4 [&_img]:h-16 [&_img]:w-16 [&_img]:object-contain"
271
- />
272
- <h1 className="text-2xl font-bold text-sec-900">{event.event_name}</h1>
273
- {event.event_date && (
274
- <p className="text-sec-600 mt-2">
275
- {new Date(event.event_date).toLocaleDateString('en-AU')}
276
- </p>
277
- )}
278
- </div>
279
- </main>
280
-
281
- <PublicPageFooter event={event} />
282
- </PublicPageLayout>
283
- );
284
- }
285
-
286
- /**
287
- * Generic public info page
288
- */
289
- function PublicInfoPage() {
290
- return (
291
- <div className="min-h-screen bg-main-50 flex items-center justify-center">
292
- <div className="max-w-md mx-auto text-center px-4">
293
- <h1 className="text-2xl font-bold text-sec-900 mb-4">
294
- Public Information Page
295
- </h1>
296
- <p className="text-sec-600">
297
- This is a public information page that doesn't require authentication.
298
- </p>
299
- </div>
300
- </div>
301
- );
302
- }
303
-
304
- export default RootApp;
@@ -1,287 +0,0 @@
1
- /**
2
- * @file Public Event Page Example
3
- * @package @jmruthers/pace-core
4
- * @module Examples/PublicPages
5
- * @since 1.0.0
6
- *
7
- * A complete example of how to implement a public event page using the public pages feature.
8
- * This example demonstrates all the key components and hooks working together.
9
- *
10
- * @example
11
- * ```tsx
12
- * import { PublicEventPage } from '@jmruthers/pace-core/examples';
13
- *
14
- * function App() {
15
- * return (
16
- * <BrowserRouter>
17
- * <Routes>
18
- * <Route path="/public/event/:eventCode" element={<PublicEventPage />} />
19
- * </Routes>
20
- * </BrowserRouter>
21
- * );
22
- * }
23
- * ```
24
- *
25
- * @dependencies
26
- * - React 18+ - Component framework
27
- * - React Router - Routing
28
- * - Public pages components - Layout and data access
29
- * - Tailwind CSS - Styling
30
- */
31
-
32
- import React from 'react';
33
- import {
34
- PublicPageLayout,
35
- PublicPageHeader,
36
- PublicPageFooter,
37
- FileDisplay,
38
- usePublicEvent,
39
- usePublicRouteParams,
40
- PublicLoadingSpinner,
41
- PublicErrorBoundary
42
- } from '../index';
43
- import { FileCategory } from '../types/file-reference';
44
-
45
- /**
46
- * Complete public event page example
47
- *
48
- * This component demonstrates how to create a public event page that displays
49
- * event information, dishes, and branding without requiring authentication.
50
- *
51
- * @returns React element with complete public event page
52
- */
53
- export function PublicEventPage() {
54
- const { eventCode } = usePublicRouteParams();
55
- const { event, isLoading: eventLoading, error: eventError, refetch: refetchEvent } = usePublicEvent(eventCode || '');
56
-
57
- // Handle loading state
58
- if (eventLoading) {
59
- return (
60
- <PublicLoadingSpinner
61
- message="Loading event details..."
62
- />
63
- );
64
- }
65
-
66
- // Handle error state
67
- if (eventError) {
68
- return (
69
- <div className="min-h-screen bg-main-50 flex items-center justify-center">
70
- <div className="max-w-md mx-auto text-center px-4">
71
- <div className="mb-6">
72
- <div className="mx-auto flex items-center justify-center h-12 w-12 rounded-full bg-acc-100 mb-4">
73
- <svg className="h-6 w-6 text-acc-600" fill="none" viewBox="0 0 24 24" stroke="currentColor">
74
- <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z" />
75
- </svg>
76
- </div>
77
- <h1 className="text-2xl font-bold text-sec-900 mb-2">
78
- Event Not Found
79
- </h1>
80
- <p className="text-sec-600 mb-6">
81
- The event code "{eventCode}" is invalid or the event is not available for public viewing.
82
- </p>
83
- <button
84
- onClick={refetchEvent}
85
- className="px-4 py-2 bg-main-600 text-main-50 rounded-md hover:bg-main-700 transition-colors"
86
- >
87
- Try Again
88
- </button>
89
- </div>
90
- </div>
91
- </div>
92
- );
93
- }
94
-
95
- // Handle missing event
96
- if (!event) {
97
- return (
98
- <div className="min-h-screen bg-main-50 flex items-center justify-center">
99
- <div className="max-w-md mx-auto text-center px-4">
100
- <h1 className="text-2xl font-bold text-sec-900 mb-4">
101
- Event Not Available
102
- </h1>
103
- <p className="text-sec-600 mb-6">
104
- This event is not available for public viewing.
105
- </p>
106
- <button
107
- onClick={refetchEvent}
108
- className="px-4 py-2 bg-main-600 text-main-50 rounded-md hover:bg-main-700 transition-colors"
109
- >
110
- Try Again
111
- </button>
112
- </div>
113
- </div>
114
- );
115
- }
116
-
117
- return (
118
- <PublicErrorBoundary>
119
- <PublicPageLayout eventCode={eventCode || ''} event={event}>
120
- <PublicPageHeader
121
- event={event}
122
- eventCode={eventCode || ''}
123
- title="Event Details"
124
- description="Public information about this event"
125
- />
126
-
127
- <main className="max-w-6xl mx-auto px-4 py-8">
128
- {/* Event Overview */}
129
- <div className="grid grid-cols-1 lg:grid-cols-3 gap-8 mb-12">
130
- {/* Event Information */}
131
- <div className="lg:col-span-2 space-y-6">
132
- <div>
133
- <h2 className="text-2xl font-bold text-sec-900 mb-4">Event Information</h2>
134
- <div className="bg-sec-50 rounded-lg p-6 space-y-4">
135
- <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
136
- <div>
137
- <h3 className="font-semibold text-sec-700">Date</h3>
138
- <p className="text-sec-900">
139
- {event.event_date ? new Date(event.event_date).toLocaleDateString('en-AU', {
140
- weekday: 'long',
141
- year: 'numeric',
142
- month: 'long',
143
- day: 'numeric'
144
- }) : 'TBA'}
145
- </p>
146
- </div>
147
- <div>
148
- <h3 className="font-semibold text-sec-700">Venue</h3>
149
- <p className="text-sec-900">{event.event_venue || 'TBA'}</p>
150
- </div>
151
- <div>
152
- <h3 className="font-semibold text-sec-700">Participants</h3>
153
- <p className="text-sec-900">{event.event_participants || 'TBA'}</p>
154
- </div>
155
- <div>
156
- <h3 className="font-semibold text-sec-700">Event Code</h3>
157
- <p className="text-sec-900 font-mono">{event.event_code}</p>
158
- </div>
159
- </div>
160
-
161
- {event.event_news && (
162
- <div>
163
- <h3 className="font-semibold text-sec-700 mb-2">Event News</h3>
164
- <p className="text-sec-900">{event.event_news}</p>
165
- </div>
166
- )}
167
- </div>
168
- </div>
169
- </div>
170
-
171
- {/* Event Logo */}
172
- <div className="flex justify-center lg:justify-start">
173
- <div className="text-center">
174
- <FileDisplay
175
- table_name="event"
176
- record_id={event.event_id}
177
- organisation_id={event.organisation_id}
178
- category={FileCategory.EVENT_LOGOS}
179
- showDelete={false}
180
- className="rounded-lg shadow-lg [&_img]:h-20 [&_img]:w-20 [&_img]:object-contain"
181
- />
182
- <p className="mt-4 text-sm text-sec-600">Event Logo</p>
183
- </div>
184
- </div>
185
- </div>
186
-
187
- {/* Note about dishes */}
188
- <div className="mb-12">
189
- <div className="bg-main-50 border border-main-200 rounded-lg p-6">
190
- <h3 className="font-semibold text-main-900 mb-2">Event Dishes</h3>
191
- <p className="text-main-800">
192
- For CAKE applications, implement your own dishes functionality using the
193
- <code className="bg-main-100 px-1 rounded">usePublicDishes</code> hook
194
- as described in the CAKE implementation guide.
195
- </p>
196
- </div>
197
- </div>
198
-
199
- {/* Event Footer Information */}
200
- {event.event_footer && (
201
- <div className="bg-sec-50 rounded-lg p-6">
202
- <h3 className="font-semibold text-sec-900 mb-2">Additional Information</h3>
203
- <p className="text-sec-700">{event.event_footer}</p>
204
- </div>
205
- )}
206
- </main>
207
-
208
- <PublicPageFooter event={event} />
209
- </PublicPageLayout>
210
- </PublicErrorBoundary>
211
- );
212
- }
213
-
214
- /**
215
- * Compact version of the public event page for smaller displays
216
- */
217
- export function PublicEventPageCompact() {
218
- const { eventCode } = usePublicRouteParams();
219
- const { event, isLoading, error } = usePublicEvent(eventCode || '');
220
-
221
- if (isLoading) return <PublicLoadingSpinner message="Loading..." />;
222
- if (error || !event) return <div>Event not found</div>;
223
-
224
- return (
225
- <PublicErrorBoundary>
226
- <PublicPageLayout eventCode={eventCode || ''} event={event}>
227
- <PublicPageHeader
228
- event={event}
229
- eventCode={eventCode || ''}
230
- showEventLogo={true}
231
- showAppLogo={true}
232
- />
233
-
234
- <main className="max-w-4xl mx-auto px-4 py-6">
235
- <div className="text-center mb-6">
236
- <FileDisplay
237
- table_name="event"
238
- record_id={event.event_id}
239
- organisation_id={event.organisation_id}
240
- category={FileCategory.EVENT_LOGOS}
241
- displayOnly={true}
242
- showFallback={true}
243
- fallbackSize="xl"
244
- className="h-24 w-24 mx-auto mb-4 object-contain rounded"
245
- generateFallbackText={(fileName) => {
246
- if (!event.event_name) return 'EV';
247
- return event.event_name
248
- .split(/[\s\-_]+/)
249
- .map(word => word.charAt(0).toUpperCase())
250
- .join('')
251
- .substring(0, 3);
252
- }}
253
- />
254
- <h1 className="text-2xl font-bold text-sec-900">{event.event_name}</h1>
255
- {event.event_date && (
256
- <p className="text-sec-600 mt-2">
257
- {new Date(event.event_date).toLocaleDateString('en-AU')}
258
- </p>
259
- )}
260
- </div>
261
-
262
- <div className="grid grid-cols-1 md:grid-cols-2 gap-4 mb-6">
263
- <div className="bg-sec-50 rounded p-4">
264
- <h3 className="font-semibold text-sec-700">Venue</h3>
265
- <p className="text-sec-900">{event.event_venue || 'TBA'}</p>
266
- </div>
267
- <div className="bg-sec-50 rounded p-4">
268
- <h3 className="font-semibold text-sec-700">Participants</h3>
269
- <p className="text-sec-900">{event.event_participants || 'TBA'}</p>
270
- </div>
271
- </div>
272
-
273
- {event.event_news && (
274
- <div className="bg-main-50 border border-main-200 rounded p-4">
275
- <h3 className="font-semibold text-main-900 mb-2">Event News</h3>
276
- <p className="text-main-800">{event.event_news}</p>
277
- </div>
278
- )}
279
- </main>
280
-
281
- <PublicPageFooter event={event} />
282
- </PublicPageLayout>
283
- </PublicErrorBoundary>
284
- );
285
- }
286
-
287
- export default PublicEventPage;