@jmruthers/pace-core 0.5.134 → 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 +219 -9
  71. package/dist/index.js +49 -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 +3 -3
  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 +90 -0
  122. package/docs/api/interfaces/ExportOptions.md +126 -0
  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 +648 -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 +25 -8
  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
@@ -17,7 +17,7 @@ const mockLogger = {
17
17
  info: vi.fn(),
18
18
  };
19
19
 
20
- vi.mock('../../../utils/logger', () => ({
20
+ vi.mock('../../../utils/core/logger', () => ({
21
21
  createLogger: () => mockLogger,
22
22
  }));
23
23
 
@@ -0,0 +1,161 @@
1
+ /**
2
+ * @file Aggregation Utility Functions
3
+ * @package @jmruthers/pace-core
4
+ * @module Components/DataTable/Utils
5
+ * @since 0.6.0
6
+ *
7
+ * Utility functions for common aggregation operations in grouped DataTable rows.
8
+ * These functions can be used as the `aggregateFn` property in column definitions.
9
+ */
10
+
11
+ import type { DataTableColumn, DataRecord } from '../types';
12
+
13
+ /**
14
+ * Creates a sum aggregation function for a specific field.
15
+ *
16
+ * @param accessorKey - The field key to sum (e.g., 'cost', 'quantity')
17
+ * @returns An aggregation function that sums the specified field across all rows
18
+ *
19
+ * @example
20
+ * ```tsx
21
+ * {
22
+ * accessorKey: 'cost',
23
+ * header: 'Total Cost',
24
+ * aggregateFn: sum('cost'),
25
+ * }
26
+ * ```
27
+ */
28
+ export function sum<TData extends DataRecord = DataRecord>(accessorKey: keyof TData | string) {
29
+ return <TRow extends DataRecord = TData>(rows: TRow[], column: DataTableColumn<TRow>): number => {
30
+ return rows.reduce((total, row) => {
31
+ const value = (row as any)[accessorKey];
32
+ const numValue = typeof value === 'number' ? value : parseFloat(String(value || 0));
33
+ return total + (isNaN(numValue) ? 0 : numValue);
34
+ }, 0);
35
+ };
36
+ }
37
+
38
+ /**
39
+ * Creates an average aggregation function for a specific field.
40
+ *
41
+ * @param accessorKey - The field key to average (e.g., 'price', 'rating')
42
+ * @returns An aggregation function that calculates the average of the specified field across all rows
43
+ *
44
+ * @example
45
+ * ```tsx
46
+ * {
47
+ * accessorKey: 'price',
48
+ * header: 'Avg Price',
49
+ * aggregateFn: average('price'),
50
+ * }
51
+ * ```
52
+ */
53
+ export function average<TData extends DataRecord = DataRecord>(accessorKey: keyof TData | string) {
54
+ return <TRow extends DataRecord = TData>(rows: TRow[], column: DataTableColumn<TRow>): number => {
55
+ if (rows.length === 0) return 0;
56
+
57
+ const validValues = rows
58
+ .map(row => (row as any)[accessorKey])
59
+ .filter(value => value != null && value !== '')
60
+ .map(value => {
61
+ const numValue = typeof value === 'number' ? value : parseFloat(String(value));
62
+ return isNaN(numValue) ? null : numValue;
63
+ })
64
+ .filter((value): value is number => value !== null);
65
+
66
+ if (validValues.length === 0) return 0;
67
+
68
+ const sum = validValues.reduce((total, value) => total + value, 0);
69
+ return sum / validValues.length;
70
+ };
71
+ }
72
+
73
+ /**
74
+ * Creates a count aggregation function.
75
+ * Returns the number of rows in the group.
76
+ *
77
+ * @returns An aggregation function that counts the number of rows
78
+ *
79
+ * @example
80
+ * ```tsx
81
+ * {
82
+ * accessorKey: 'id',
83
+ * header: 'Count',
84
+ * aggregateFn: count(),
85
+ * }
86
+ * ```
87
+ */
88
+ export function count<TData extends DataRecord = DataRecord>() {
89
+ return <TRow extends DataRecord = TData>(rows: TRow[], column: DataTableColumn<TRow>): number => {
90
+ return rows.length;
91
+ };
92
+ }
93
+
94
+ /**
95
+ * Creates a minimum aggregation function for a specific field.
96
+ *
97
+ * @param accessorKey - The field key to find the minimum of (e.g., 'price', 'date')
98
+ * @returns An aggregation function that returns the minimum value of the specified field
99
+ *
100
+ * @example
101
+ * ```tsx
102
+ * {
103
+ * accessorKey: 'price',
104
+ * header: 'Min Price',
105
+ * aggregateFn: min('price'),
106
+ * }
107
+ * ```
108
+ */
109
+ export function min<TData extends DataRecord = DataRecord>(accessorKey: keyof TData | string) {
110
+ return <TRow extends DataRecord = TData>(rows: TRow[], column: DataTableColumn<TRow>): number | null => {
111
+ if (rows.length === 0) return null;
112
+
113
+ const validValues = rows
114
+ .map(row => (row as any)[accessorKey])
115
+ .filter(value => value != null && value !== '')
116
+ .map(value => {
117
+ const numValue = typeof value === 'number' ? value : parseFloat(String(value));
118
+ return isNaN(numValue) ? null : numValue;
119
+ })
120
+ .filter((value): value is number => value !== null);
121
+
122
+ if (validValues.length === 0) return null;
123
+
124
+ return Math.min(...validValues);
125
+ };
126
+ }
127
+
128
+ /**
129
+ * Creates a maximum aggregation function for a specific field.
130
+ *
131
+ * @param accessorKey - The field key to find the maximum of (e.g., 'price', 'date')
132
+ * @returns An aggregation function that returns the maximum value of the specified field
133
+ *
134
+ * @example
135
+ * ```tsx
136
+ * {
137
+ * accessorKey: 'price',
138
+ * header: 'Max Price',
139
+ * aggregateFn: max('price'),
140
+ * }
141
+ * ```
142
+ */
143
+ export function max<TData extends DataRecord = DataRecord>(accessorKey: keyof TData | string) {
144
+ return <TRow extends DataRecord = TData>(rows: TRow[], column: DataTableColumn<TRow>): number | null => {
145
+ if (rows.length === 0) return null;
146
+
147
+ const validValues = rows
148
+ .map(row => (row as any)[accessorKey])
149
+ .filter(value => value != null && value !== '')
150
+ .map(value => {
151
+ const numValue = typeof value === 'number' ? value : parseFloat(String(value));
152
+ return isNaN(numValue) ? null : numValue;
153
+ })
154
+ .filter((value): value is number => value !== null);
155
+
156
+ if (validValues.length === 0) return null;
157
+
158
+ return Math.max(...validValues);
159
+ };
160
+ }
161
+
@@ -15,7 +15,7 @@
15
15
  * - Browser download handling
16
16
  */
17
17
 
18
- import { createLogger } from '../../../utils/logger';
18
+ import { createLogger } from '../../../utils/core/logger';
19
19
  import type { DataRecord } from '../types';
20
20
 
21
21
  /**
@@ -8,7 +8,7 @@
8
8
  * This utility can be used across different data tables with different column structures.
9
9
  */
10
10
 
11
- import { createLogger } from '../../../utils/logger';
11
+ import { createLogger } from '../../../utils/core/logger';
12
12
  import type { CellValue } from '../types';
13
13
 
14
14
  export interface ColumnMapping {
@@ -273,10 +273,6 @@ export function flexibleImport<T extends Record<string, unknown>>(
273
273
  };
274
274
  } {
275
275
  const logger = createLogger('FlexibleImport');
276
- logger.info('Starting flexible import...');
277
- logger.debug('Available CSV columns:', Object.keys(csvData[0] || {}));
278
- logger.debug('Target fields:', targetFields);
279
-
280
276
  const maxRows = options.maxRows || 10000;
281
277
 
282
278
  // Check row limit
@@ -354,7 +350,6 @@ export function flexibleImport<T extends Record<string, unknown>>(
354
350
  normalizedPossible.includes(normalizedCol);
355
351
  });
356
352
  if (found) {
357
- logger.debug(`Mapped ${targetField} -> ${found}`);
358
353
  return found;
359
354
  }
360
355
  }
@@ -368,8 +363,6 @@ export function flexibleImport<T extends Record<string, unknown>>(
368
363
  mappings[field] = findColumn(field);
369
364
  });
370
365
 
371
- logger.debug('Column mappings:', mappings);
372
-
373
366
  // Enhanced date parsing with multiple format support
374
367
  const parseDate = (dateStr: string, fieldName?: string): Date | null => {
375
368
  if (!dateStr || typeof dateStr !== 'string') return null;
@@ -530,7 +523,6 @@ export function flexibleImport<T extends Record<string, unknown>>(
530
523
 
531
524
  for (let index = 0; index < csvData.length; index++) {
532
525
  const row = csvData[index];
533
- logger.debug(`Processing row ${index + 1}:`, row);
534
526
 
535
527
  const transformedRow: Record<string, unknown> = {};
536
528
  let hasErrors = false;
@@ -563,8 +555,6 @@ export function flexibleImport<T extends Record<string, unknown>>(
563
555
  if (!options.schemaValidation || !hasErrors) {
564
556
  mappedData.push(transformedRow as T);
565
557
  }
566
-
567
- logger.debug(`Transformed row ${index + 1}:`, transformedRow);
568
558
  }
569
559
 
570
560
  // Calculate unique error rows (multiple errors per row still count as 1 error row)
@@ -1,3 +1,4 @@
1
+ export * from './aggregationUtils';
1
2
  export * from './exportUtils';
2
3
  export * from './rowUtils';
3
4
  export * from './hierarchicalUtils';
@@ -9,7 +9,7 @@
9
9
 
10
10
  import { Table } from '@tanstack/react-table';
11
11
  import type { PaginationMode, ServerSideResponse, DataRecord } from '../types';
12
- import { createLogger } from '../../../utils/logger';
12
+ import { createLogger } from '../../../utils/core/logger';
13
13
 
14
14
  // ============================================================================
15
15
  // TYPES
@@ -156,8 +156,8 @@
156
156
  import * as React from 'react';
157
157
  import * as DialogPrimitive from '@radix-ui/react-dialog';
158
158
  import { X } from 'lucide-react';
159
- import { cn } from '../../utils/cn';
160
- import { renderSafeHtml } from './utils/safeHtml';
159
+ import { cn } from '../../utils/core/cn';
160
+ import { renderSafeHtml } from '../../utils/validation/htmlSanitization';
161
161
  import { useState, useEffect } from 'react';
162
162
  import { debounce } from 'lodash';
163
163
 
@@ -12,7 +12,7 @@ import { ErrorBoundary } from './ErrorBoundary';
12
12
  import { renderWithProviders } from '../../__tests__/helpers/test-utils';
13
13
 
14
14
  // Mock the performance budget monitor
15
- vi.mock('../../utils/performanceBudgets', () => ({
15
+ vi.mock('../../utils/performance/performanceBudgets', () => ({
16
16
  performanceBudgetMonitor: {
17
17
  measure: vi.fn()
18
18
  }
@@ -76,7 +76,21 @@ const RecoverableComponent = ({ shouldThrow = true }: { shouldThrow?: boolean })
76
76
  };
77
77
 
78
78
  describe('ErrorBoundary Component', () => {
79
+ let originalMode: string | undefined;
80
+
79
81
  beforeEach(() => {
82
+ // Ensure logger is enabled by setting MODE to development
83
+ originalMode = import.meta.env.MODE;
84
+ (import.meta.env as any).MODE = 'development';
85
+
86
+ import('../../utils/core/logger').then(({ Logger, LogLevel }) => {
87
+ Logger.configure({
88
+ level: LogLevel.DEBUG,
89
+ includeTimestamp: false,
90
+ includeComponent: true,
91
+ });
92
+ });
93
+
80
94
  vi.clearAllMocks();
81
95
  // Mock console methods to avoid noise in tests
82
96
  vi.spyOn(console, 'error').mockImplementation(() => {});
@@ -354,7 +368,7 @@ describe('ErrorBoundary Component', () => {
354
368
 
355
369
  it('calls performance monitor when error occurs', async () => {
356
370
  const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
357
- const { performanceBudgetMonitor } = await import('../../utils/performanceBudgets');
371
+ const { performanceBudgetMonitor } = await import('../../utils/performance/performanceBudgets');
358
372
 
359
373
  renderWithProviders(
360
374
  <ErrorBoundary componentName="TestComponent">
@@ -387,12 +401,18 @@ describe('ErrorBoundary Component', () => {
387
401
  );
388
402
 
389
403
  await waitFor(() => {
390
- expect(consoleSpy).toHaveBeenCalledWith(
391
- expect.stringContaining('ErrorBoundary [TestComponent] caught error'),
392
- expect.any(Error),
393
- expect.any(Object)
404
+ // React logs its own error message first, then our logger logs
405
+ // Check that our logger was called with the correct format
406
+ const calls = consoleSpy.mock.calls;
407
+ const ourLogCall = calls.find(call =>
408
+ call[0] && typeof call[0] === 'string' &&
409
+ call[0].includes('[ERROR] [ErrorBoundary]') &&
410
+ call[0].includes('[TestComponent] Caught error')
394
411
  );
395
- }, { interval: 10 });
412
+ expect(ourLogCall).toBeDefined();
413
+ expect(ourLogCall![1]).toBeInstanceOf(Error);
414
+ expect(ourLogCall![2]).toBeDefined();
415
+ }, { timeout: 2000 });
396
416
 
397
417
  consoleSpy.mockRestore();
398
418
  });
@@ -745,4 +765,12 @@ describe('ErrorBoundary Component', () => {
745
765
  consoleSpy.mockRestore();
746
766
  });
747
767
  });
768
+
769
+ afterEach(() => {
770
+ // Restore original mode
771
+ if (originalMode !== undefined) {
772
+ (import.meta.env as any).MODE = originalMode;
773
+ }
774
+ vi.clearAllMocks();
775
+ });
748
776
  });
@@ -81,7 +81,8 @@
81
81
  */
82
82
 
83
83
  import React, { Component, ReactNode } from 'react';
84
- import { performanceBudgetMonitor } from '../../utils/performanceBudgets';
84
+ import { performanceBudgetMonitor } from '../../utils/performance/performanceBudgets';
85
+ import { logger } from '../../utils/core/logger';
85
86
 
86
87
  /**
87
88
  * State interface for the ErrorBoundary component
@@ -165,7 +166,7 @@ export class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundarySt
165
166
  this.setState({ errorInfo });
166
167
 
167
168
  // Enhanced logging with component name and error ID
168
- console.error(`ErrorBoundary [${componentName}] caught error ${errorId}:`, error, errorInfo);
169
+ logger.error('ErrorBoundary', `[${componentName}] Caught error ${errorId}:`, error, errorInfo);
169
170
 
170
171
  // Performance monitoring - track error occurrence
171
172
  performanceBudgetMonitor.measure('ERROR_BOUNDARY_TRIGGER', 1, {
@@ -191,7 +192,7 @@ export class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundarySt
191
192
  if (import.meta.env.MODE === 'production') {
192
193
  // Example: Send to error reporting service
193
194
  // errorReportingService.report({ error, errorInfo, errorId, componentName });
194
- console.warn('Error reporting would be triggered in production:', { errorId, componentName });
195
+ logger.warn('ErrorBoundary', 'Error reporting would be triggered in production:', { errorId, componentName });
195
196
  }
196
197
  };
197
198
 
@@ -200,7 +201,7 @@ export class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundarySt
200
201
  const { retryCount } = this.state;
201
202
 
202
203
  if (retryCount < maxRetries) {
203
- console.log(`Retrying component render (attempt ${retryCount + 1}/${maxRetries})`);
204
+ logger.debug('ErrorBoundary', `Retrying component render (attempt ${retryCount + 1}/${maxRetries})`);
204
205
 
205
206
  this.setState(prevState => ({
206
207
  hasError: false,
@@ -92,7 +92,8 @@ import { RefreshCw, AlertCircle, Lock, Calendar, Star } from 'lucide-react';
92
92
  import { useEvents } from '../../hooks/useEvents';
93
93
  import { Event } from '../../types';
94
94
  import { useEffect, useMemo } from 'react';
95
- import { cn } from '../../utils/cn';
95
+ import { cn } from '../../utils/core/cn';
96
+ import { logger } from '../../utils/core/logger';
96
97
 
97
98
  export interface EventSelectorProps {
98
99
  /** Placeholder text for the dropdown */
@@ -145,7 +146,7 @@ export function EventSelector({
145
146
  refreshEvents,
146
147
  } = useEvents();
147
148
 
148
- console.log('[EventSelector] Component render:', {
149
+ logger.debug('EventSelector', 'Component render:', {
149
150
  eventsCount: events.length,
150
151
  events: events.map(e => ({ id: e.event_id, name: e.event_name })),
151
152
  selectedEvent: selectedEvent ? { id: selectedEvent.event_id, name: selectedEvent.event_name } : null,
@@ -7,6 +7,7 @@ import { PublicPageContext, useIsPublicPage } from '../PublicLayout/PublicPagePr
7
7
  import { useUnifiedAuth } from '../../providers/services/UnifiedAuthProvider';
8
8
  import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogBody, DialogFooter } from '../Dialog/Dialog';
9
9
  import { Button } from '../Button/Button';
10
+ import { logger } from '../../utils/core/logger';
10
11
 
11
12
  /**
12
13
  * Size classes for fallback display
@@ -502,21 +503,6 @@ function FileDisplayPublic({
502
503
  const publicPageContext = useContext(PublicPageContext);
503
504
  const supabase = publicPageContext?.supabase ?? null;
504
505
 
505
- // Step 4: Log Supabase client context
506
- console.log('[FileDisplayPublic] Supabase Client Context:', {
507
- hasPublicPageContext: !!publicPageContext,
508
- hasSupabaseClient: !!supabase,
509
- supabaseUrl: publicPageContext?.environment?.supabaseUrl || 'not available',
510
- hasAnonKey: !!publicPageContext?.environment?.supabaseKey,
511
- hasAuth: !!supabase?.auth,
512
- organisation_id,
513
- table_name,
514
- record_id,
515
- category,
516
- context: 'public_page_anonymous_user',
517
- note: 'Public pages use anonymous Supabase client (no user session)'
518
- });
519
-
520
506
  if (!supabase) {
521
507
  // If fallback is enabled, show fallback UI instead of error
522
508
  if (showFallback) {
@@ -573,7 +559,7 @@ function FileDisplayPublic({
573
559
 
574
560
  // Log errors for debugging public file display issues
575
561
  if (error) {
576
- console.error('[FileDisplayPublic] Error fetching file:', {
562
+ logger.error('FileDisplayPublic', 'Error fetching file', {
577
563
  table_name,
578
564
  record_id,
579
565
  organisation_id,
@@ -583,26 +569,6 @@ function FileDisplayPublic({
583
569
  });
584
570
  }
585
571
 
586
- // Log when file is successfully loaded
587
- if (fileUrl && !isLoading && !error) {
588
- console.log('[FileDisplayPublic] File loaded successfully:', {
589
- table_name,
590
- record_id,
591
- category,
592
- fileUrl: fileUrl.substring(0, 50) + '...' // Truncate URL for logging
593
- });
594
- }
595
-
596
- // Log when no file is found (but not an error - might be expected)
597
- if (!isLoading && !error && !fileUrl && !fileReference) {
598
- console.log('[FileDisplayPublic] No file found (will show fallback if enabled):', {
599
- table_name,
600
- record_id,
601
- category,
602
- showFallback
603
- });
604
- }
605
-
606
572
  // Public context doesn't support delete operations
607
573
  const handleDelete = async () => {
608
574
  // Delete operations are not available in public context for security reasons
@@ -161,8 +161,8 @@ import { renderWithProviders, createMockSupabaseClient } from '../../__tests__/h
161
161
 
162
162
  // Mock dependencies
163
163
  import * as useFileReferenceModule from '../../hooks/useFileReference';
164
- import * as appNameResolver from '../../utils/appNameResolver';
165
- import * as appIdResolver from '../../utils/appIdResolver';
164
+ import * as appNameResolver from '../../utils/app/appNameResolver';
165
+ import * as appIdResolver from '../../utils/app/appIdResolver';
166
166
 
167
167
  const mockUseFileReference = vi.fn();
168
168
  const mockGetCurrentAppName = vi.fn();
@@ -5,8 +5,8 @@ import React, { useState, useCallback, useRef, useEffect, useMemo } from 'react'
5
5
  import { SupabaseClient } from '@supabase/supabase-js';
6
6
  import { FileCategory, FileUploadResult, UploadProgress } from '../../types/file-reference';
7
7
  import { useFileReference } from '../../hooks/useFileReference';
8
- import { getCurrentAppName } from '../../utils/appNameResolver';
9
- import { getAppId } from '../../utils/appIdResolver';
8
+ import { getCurrentAppName } from '../../utils/app/appNameResolver';
9
+ import { getAppId } from '../../utils/app/appIdResolver';
10
10
 
11
11
  export interface FileUploadProps {
12
12
  supabase: SupabaseClient;
@@ -85,7 +85,7 @@
85
85
  * - Tailwind CSS - Styling
86
86
  */
87
87
  import React from 'react';
88
- import { cn } from '../../utils/cn';
88
+ import { cn } from '../../utils/core/cn';
89
89
 
90
90
  export interface FooterProps {
91
91
  /**