@jmruthers/pace-core 0.5.135 → 0.5.137

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 (544) hide show
  1. package/dist/{DataTable-A36PJG6N.js → DataTable-6M4L6BI2.js} +26 -13
  2. package/dist/{DataTable-C7GaRZye.d.ts → DataTable-CWAZZcXC.d.ts} +1 -1
  3. package/dist/{PublicLoadingSpinner-CUAnTvcg.d.ts → EventLogo-rFL_kRjk.d.ts} +123 -135
  4. package/dist/{UnifiedAuthProvider-BVKmQd9u.d.ts → UnifiedAuthProvider-DJxGTftH.d.ts} +1 -1
  5. package/dist/{UnifiedAuthProvider-CQDZRJIS.js → UnifiedAuthProvider-XIQQ7LVU.js} +5 -5
  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-F64FFPOZ.js → chunk-22WKWKRX.js} +26 -20
  9. package/dist/chunk-22WKWKRX.js.map +1 -0
  10. package/dist/{chunk-VZ5OR6HD.js → chunk-4C7EXCAR.js} +62 -150
  11. package/dist/chunk-4C7EXCAR.js.map +1 -0
  12. package/dist/{chunk-PYUXFQJ3.js → chunk-56XJ3TU6.js} +2 -2
  13. package/dist/chunk-56XJ3TU6.js.map +1 -0
  14. package/dist/{chunk-CTJRBUX2.js → chunk-6LAAY47Q.js} +2 -2
  15. package/dist/{chunk-UJI6WSMD.js → chunk-7QCC6MCP.js} +90 -3
  16. package/dist/chunk-7QCC6MCP.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-CQZU6TFE.js → chunk-BCIBECNB.js} +100 -62
  20. package/dist/chunk-BCIBECNB.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-BJPBT3CU.js +21 -0
  24. package/dist/chunk-BJPBT3CU.js.map +1 -0
  25. package/dist/{chunk-BYXRHAIF.js → chunk-BLCXZEYF.js} +23 -14
  26. package/dist/chunk-BLCXZEYF.js.map +1 -0
  27. package/dist/{chunk-WP5I5GLN.js → chunk-BVYWGZVV.js} +112 -97
  28. package/dist/chunk-BVYWGZVV.js.map +1 -0
  29. package/dist/{chunk-GEVIB2UB.js → chunk-ERISIBYU.js} +14 -5
  30. package/dist/chunk-ERISIBYU.js.map +1 -0
  31. package/dist/{chunk-O3NWNXDY.js → chunk-FMUCXFII.js} +2 -2
  32. package/dist/chunk-FMUCXFII.js.map +1 -0
  33. package/dist/{chunk-GVDR7WNV.js → chunk-HAWZXGR2.js} +334 -614
  34. package/dist/chunk-HAWZXGR2.js.map +1 -0
  35. package/dist/{chunk-ZV77RZMU.js → chunk-INQLMHPF.js} +2 -2
  36. package/dist/chunk-JISYG63F.js +70 -0
  37. package/dist/chunk-JISYG63F.js.map +1 -0
  38. package/dist/{chunk-HMNOSGVA.js → chunk-KYRHUBIU.js} +576 -767
  39. package/dist/chunk-KYRHUBIU.js.map +1 -0
  40. package/dist/{chunk-M6DDYFUD.js → chunk-LS353YLY.js} +19 -16
  41. package/dist/chunk-LS353YLY.js.map +1 -0
  42. package/dist/{chunk-TGIY2AR2.js → chunk-MA6EPSGZ.js} +4 -3
  43. package/dist/{chunk-TGIY2AR2.js.map → chunk-MA6EPSGZ.js.map} +1 -1
  44. package/dist/chunk-OWAG3GSU.js +58 -0
  45. package/dist/chunk-OWAG3GSU.js.map +1 -0
  46. package/dist/{chunk-JCQZ6LA7.js → chunk-Q5QRDWKI.js} +9 -3
  47. package/dist/chunk-Q5QRDWKI.js.map +1 -0
  48. package/dist/chunk-S5OFRT4M.js +94 -0
  49. package/dist/chunk-S5OFRT4M.js.map +1 -0
  50. package/dist/{chunk-3DBFLLLU.js → chunk-SBVILCCA.js} +14 -9
  51. package/dist/chunk-SBVILCCA.js.map +1 -0
  52. package/dist/{chunk-ZYZCRSBD.js → chunk-T6JN6LH6.js} +16 -11
  53. package/dist/chunk-T6JN6LH6.js.map +1 -0
  54. package/dist/chunk-XDNLUEXI.js +138 -0
  55. package/dist/chunk-XDNLUEXI.js.map +1 -0
  56. package/dist/{chunk-3CG5L6RN.js → chunk-YCWDTTUK.js} +90 -75
  57. package/dist/chunk-YCWDTTUK.js.map +1 -0
  58. package/dist/{chunk-5F3NDPJV.js → chunk-ZZ2SS7NI.js} +10 -5
  59. package/dist/chunk-ZZ2SS7NI.js.map +1 -0
  60. package/dist/components.d.ts +7 -287
  61. package/dist/components.js +27 -157
  62. package/dist/components.js.map +1 -1
  63. package/dist/{file-reference-C9isKNPn.d.ts → file-reference-C6Gkn77H.d.ts} +1 -1
  64. package/dist/{formatting-DFcCxUEk.d.ts → formatting-CvUXy2mF.d.ts} +1 -1
  65. package/dist/hooks.d.ts +3 -3
  66. package/dist/hooks.js +21 -16
  67. package/dist/hooks.js.map +1 -1
  68. package/dist/index.d.ts +101 -9
  69. package/dist/index.js +44 -31
  70. package/dist/index.js.map +1 -1
  71. package/dist/providers.d.ts +1 -1
  72. package/dist/providers.js +4 -4
  73. package/dist/rbac/index.js +12 -12
  74. package/dist/schema-DTDZQe2u.d.ts +28 -0
  75. package/dist/styles/index.js +2 -1
  76. package/dist/theming/runtime.d.ts +2 -19
  77. package/dist/theming/runtime.js +2 -1
  78. package/dist/{types-D5rqZQXk.d.ts → types-Dfz9dmVH.d.ts} +12 -1
  79. package/dist/types.d.ts +153 -4
  80. package/dist/types.js +51 -16
  81. package/dist/types.js.map +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 +221 -173
  85. package/dist/utils.js +185 -225
  86. package/dist/utils.js.map +1 -1
  87. package/dist/validation.d.ts +24 -115
  88. package/dist/validation.js +19 -474
  89. package/dist/validation.js.map +1 -1
  90. package/docs/api/classes/ColumnFactory.md +1 -1
  91. package/docs/api/classes/ErrorBoundary.md +6 -6
  92. package/docs/api/classes/InvalidScopeError.md +1 -1
  93. package/docs/api/classes/MissingUserContextError.md +1 -1
  94. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  95. package/docs/api/classes/PermissionDeniedError.md +1 -1
  96. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  97. package/docs/api/classes/RBACAuditManager.md +6 -6
  98. package/docs/api/classes/RBACCache.md +1 -1
  99. package/docs/api/classes/RBACEngine.md +7 -7
  100. package/docs/api/classes/RBACError.md +1 -1
  101. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  102. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  103. package/docs/api/classes/StorageUtils.md +1 -1
  104. package/docs/api/enums/FileCategory.md +1 -1
  105. package/docs/api/interfaces/AggregateConfig.md +4 -4
  106. package/docs/api/interfaces/BadgeProps.md +27 -0
  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 +591 -220
  199. package/docs/api-reference/components.md +106 -26
  200. package/docs/architecture/README.md +0 -3
  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/docs/styles/README.md +0 -2
  205. package/examples/README.md +30 -14
  206. package/examples/STRUCTURE.md +125 -0
  207. package/examples/components 2/DataTable/HierarchicalActionsExample.tsx +421 -0
  208. package/examples/components 2/DataTable/HierarchicalExample.tsx +475 -0
  209. package/examples/components 2/DataTable/InitialPageSizeExample.tsx +177 -0
  210. package/examples/components 2/DataTable/PerformanceExample.tsx +506 -0
  211. package/examples/components 2/DataTable/index.ts +13 -0
  212. package/examples/components 2/Dialog/BasicHtmlTest.tsx +55 -0
  213. package/examples/components 2/Dialog/DebugHtmlExample.tsx +68 -0
  214. package/examples/components 2/Dialog/HtmlDialogExample.tsx +202 -0
  215. package/examples/components 2/Dialog/ScrollableDialogExample.tsx +290 -0
  216. package/examples/components 2/Dialog/SimpleHtmlTest.tsx +61 -0
  217. package/examples/components 2/Dialog/SmartDialogExample.tsx +322 -0
  218. package/examples/components 2/Dialog/index.ts +15 -0
  219. package/examples/components 2/index.ts +11 -0
  220. package/examples/features/index.ts +12 -0
  221. package/{src/examples → examples/features/public-pages}/CorrectPublicPageImplementation.tsx +14 -17
  222. package/{src/examples → examples/features/public-pages}/PublicEventPage.tsx +14 -27
  223. package/{src/examples → examples/features/public-pages}/PublicPageApp.tsx +15 -28
  224. package/{src/examples → examples/features/public-pages}/PublicPageUsageExample.tsx +8 -10
  225. package/examples/features/public-pages/index.ts +14 -0
  226. package/examples/features/rbac/CompleteRBACExample.tsx +324 -0
  227. package/examples/features/rbac/EventBasedApp.tsx +239 -0
  228. package/examples/features/rbac/PermissionExample.tsx +151 -0
  229. package/examples/features/rbac/index.ts +13 -0
  230. package/examples/index.ts +11 -3
  231. package/package.json +30 -19
  232. package/src/__tests__/TEST_STANDARD.md +92 -0
  233. package/src/components/Alert/Alert.tsx +1 -1
  234. package/src/components/Avatar/Avatar.tsx +1 -1
  235. package/src/components/Badge/Badge.test.tsx +314 -0
  236. package/src/components/Badge/Badge.tsx +304 -0
  237. package/src/components/Badge/index.ts +3 -0
  238. package/src/components/Button/Button.tsx +1 -1
  239. package/src/components/Card/Card.tsx +1 -1
  240. package/src/components/Checkbox/Checkbox.tsx +1 -1
  241. package/src/components/DataTable/DataTable.test.tsx +1 -1
  242. package/src/components/DataTable/DataTable.tsx +1 -30
  243. package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +562 -0
  244. package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +217 -0
  245. package/src/components/DataTable/__tests__/styles.test.ts +3 -3
  246. package/src/components/DataTable/components/ActionButtons.tsx +0 -15
  247. package/src/components/DataTable/components/ColumnFilter.tsx +8 -4
  248. package/src/components/DataTable/components/DataTableBody.tsx +461 -0
  249. package/src/components/DataTable/components/DataTableCore.tsx +4 -185
  250. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +1 -1
  251. package/src/components/DataTable/components/DataTableModals.tsx +1 -27
  252. package/src/components/DataTable/components/DraggableColumnHeader.tsx +144 -0
  253. package/src/components/DataTable/components/EditableRow.tsx +1 -1
  254. package/src/components/DataTable/components/FilterRow.tsx +9 -3
  255. package/src/components/DataTable/components/ImportModal.tsx +2 -14
  256. package/src/components/DataTable/components/PaginationControls.tsx +2 -1
  257. package/src/components/DataTable/components/UnifiedTableBody.tsx +109 -82
  258. package/src/components/DataTable/components/VirtualizedDataTable.tsx +513 -0
  259. package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +14 -68
  260. package/src/components/DataTable/components/__tests__/ActionButtons.test.tsx +1 -1
  261. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +62 -0
  262. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +1 -1
  263. package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +1 -1
  264. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +43 -0
  265. package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +1 -1
  266. package/src/components/DataTable/core/ActionManager.ts +235 -0
  267. package/src/components/DataTable/core/ColumnManager.ts +205 -0
  268. package/src/components/DataTable/core/DataManager.ts +188 -0
  269. package/src/components/DataTable/core/DataTableContext.tsx +181 -0
  270. package/src/components/DataTable/core/LocalDataAdapter.ts +273 -0
  271. package/src/components/DataTable/core/PluginRegistry.ts +229 -0
  272. package/src/components/DataTable/core/StateManager.ts +311 -0
  273. package/src/components/DataTable/core/interfaces.ts +338 -0
  274. package/src/components/DataTable/examples/GroupingAggregationExample.tsx +273 -0
  275. package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +1 -1
  276. package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +1 -1
  277. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +1 -1
  278. package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +1 -1
  279. package/src/components/DataTable/hooks/useDataTablePermissions.ts +2 -23
  280. package/src/components/DataTable/index.ts +4 -0
  281. package/src/components/DataTable/styles.ts +28 -7
  282. package/src/components/DataTable/types.ts +13 -0
  283. package/src/components/DataTable/utils/__tests__/columnUtils.test.ts +94 -0
  284. package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +1 -1
  285. package/src/components/DataTable/utils/aggregationUtils.ts +161 -0
  286. package/src/components/DataTable/utils/columnUtils.ts +40 -0
  287. package/src/components/DataTable/utils/debugTools.ts +609 -0
  288. package/src/components/DataTable/utils/exportUtils.ts +1 -1
  289. package/src/components/DataTable/utils/flexibleImport.ts +1 -11
  290. package/src/components/DataTable/utils/index.ts +2 -0
  291. package/src/components/DataTable/utils/paginationUtils.ts +1 -1
  292. package/src/components/Dialog/Dialog.tsx +2 -2
  293. package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +8 -1
  294. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +35 -7
  295. package/src/components/ErrorBoundary/ErrorBoundary.tsx +5 -4
  296. package/src/components/EventSelector/EventSelector.tsx +3 -2
  297. package/src/components/FileDisplay/FileDisplay.tsx +2 -36
  298. package/src/components/FileUpload/FileUpload.test.tsx +2 -2
  299. package/src/components/FileUpload/FileUpload.tsx +2 -2
  300. package/src/components/Footer/Footer.test.tsx +1 -1
  301. package/src/components/Footer/Footer.tsx +1 -1
  302. package/src/components/Form/Form.test.tsx +5 -510
  303. package/src/components/Form/Form.tsx +1 -1
  304. package/src/components/Form/FormField.tsx +1 -1
  305. package/src/components/Form/index.ts +0 -12
  306. package/src/components/Header/Header.tsx +1 -1
  307. package/src/components/Input/Input.tsx +1 -1
  308. package/src/components/Label/Label.tsx +1 -1
  309. package/src/components/LoginForm/LoginForm.test.tsx +1 -1
  310. package/src/components/LoginForm/LoginForm.tsx +1 -1
  311. package/src/components/NavigationMenu/NavigationMenu.test.tsx +19 -3
  312. package/src/components/NavigationMenu/NavigationMenu.tsx +9 -8
  313. package/src/components/OrganisationSelector/OrganisationSelector.tsx +4 -3
  314. package/src/components/PaceAppLayout/PaceAppLayout.tsx +14 -12
  315. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +0 -16
  316. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +76 -10
  317. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +0 -1
  318. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -9
  319. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +35 -3
  320. package/src/components/PaceLoginPage/PaceLoginPage.tsx +14 -13
  321. package/src/components/PasswordReset/PasswordChangeForm.tsx +1 -1
  322. package/src/components/PasswordReset/index.ts +0 -2
  323. package/src/components/Progress/Progress.tsx +1 -1
  324. package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +35 -8
  325. package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -2
  326. package/src/components/PublicLayout/PublicErrorBoundary.tsx +1 -1
  327. package/src/components/PublicLayout/PublicLoadingSpinner.tsx +1 -1
  328. package/src/components/PublicLayout/PublicPageContextChecker.tsx +44 -43
  329. package/src/components/PublicLayout/PublicPageFooter.tsx +1 -1
  330. package/src/components/PublicLayout/PublicPageHeader.tsx +1 -15
  331. package/src/components/PublicLayout/PublicPageProvider.tsx +3 -2
  332. package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +2 -0
  333. package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +1 -1
  334. package/src/components/PublicLayout/index.ts +4 -2
  335. package/src/components/Select/Select.test.tsx +1 -1
  336. package/src/components/Select/Select.tsx +21 -9
  337. package/src/components/{SessionRestorationLoader.tsx → SessionRestorationLoader/SessionRestorationLoader.tsx} +3 -2
  338. package/src/components/SessionRestorationLoader/index.ts +3 -0
  339. package/src/components/Switch/Switch.tsx +1 -1
  340. package/src/components/Table/Table.tsx +1 -1
  341. package/src/components/Table/__tests__/Table.test.tsx +1 -1
  342. package/src/components/Toast/Toast.tsx +1 -1
  343. package/src/components/Tooltip/Tooltip.tsx +1 -1
  344. package/src/components/index.ts +7 -10
  345. package/src/hooks/__tests__/hooks.integration.test.tsx +37 -22
  346. package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +33 -17
  347. package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +28 -3
  348. package/src/hooks/__tests__/useFileDisplay.unit.test.ts +36 -9
  349. package/src/hooks/__tests__/useFileUrl.unit.test.ts +83 -85
  350. package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +26 -2
  351. package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +19 -6
  352. package/src/hooks/__tests__/usePermissionCache.simple.test.ts +17 -4
  353. package/src/hooks/__tests__/usePermissionCache.unit.test.ts +17 -4
  354. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +26 -6
  355. package/src/hooks/__tests__/usePublicFileDisplay.test.ts +16 -6
  356. package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +3 -3
  357. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +17 -3
  358. package/src/hooks/public/usePublicEvent.ts +7 -6
  359. package/src/hooks/public/usePublicEventLogo.ts +7 -4
  360. package/src/hooks/public/usePublicFileDisplay.ts +6 -150
  361. package/src/hooks/useComponentPerformance.ts +4 -1
  362. package/src/hooks/useDataTablePerformance.ts +4 -3
  363. package/src/hooks/useEventTheme.test.ts +18 -5
  364. package/src/hooks/useEventTheme.ts +4 -1
  365. package/src/hooks/useEvents.ts +2 -0
  366. package/src/hooks/useFileDisplay.ts +9 -8
  367. package/src/hooks/useFileReference.ts +4 -1
  368. package/src/hooks/useFileUrl.ts +4 -1
  369. package/src/hooks/useInactivityTracker.ts +5 -4
  370. package/src/hooks/useOrganisationSecurity.test.ts +33 -12
  371. package/src/hooks/useOrganisationSecurity.ts +8 -7
  372. package/src/hooks/usePerformanceMonitor.ts +6 -3
  373. package/src/hooks/usePermissionCache.ts +13 -6
  374. package/src/hooks/useSecureDataAccess.test.ts +2 -2
  375. package/src/hooks/useSecureDataAccess.ts +9 -8
  376. package/src/hooks/useSessionRestoration.ts +4 -1
  377. package/src/hooks/useStorage.ts +4 -1
  378. package/src/index.ts +20 -7
  379. package/src/providers/services/AuthServiceProvider.tsx +3 -2
  380. package/src/providers/services/EventServiceProvider.tsx +2 -1
  381. package/src/providers/services/InactivityServiceProvider.tsx +2 -1
  382. package/src/providers/services/OrganisationServiceProvider.tsx +2 -1
  383. package/src/providers/services/UnifiedAuthProvider.tsx +4 -3
  384. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +22 -2
  385. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +24 -2
  386. package/src/rbac/__tests__/cache-invalidation.test.ts +20 -6
  387. package/src/rbac/api.ts +5 -2
  388. package/src/rbac/audit-enhanced.ts +6 -6
  389. package/src/rbac/audit.test.ts +60 -38
  390. package/src/rbac/audit.ts +8 -8
  391. package/src/rbac/cache-invalidation.ts +7 -4
  392. package/src/rbac/components/EnhancedNavigationMenu.tsx +11 -5
  393. package/src/rbac/components/NavigationGuard.tsx +7 -3
  394. package/src/rbac/components/NavigationProvider.tsx +6 -3
  395. package/src/rbac/components/PagePermissionGuard.tsx +28 -16
  396. package/src/rbac/components/PagePermissionProvider.tsx +4 -1
  397. package/src/rbac/components/PermissionEnforcer.tsx +9 -3
  398. package/src/rbac/components/RoleBasedRouter.tsx +3 -1
  399. package/src/rbac/components/SecureDataProvider.tsx +7 -3
  400. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +87 -61
  401. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +83 -33
  402. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +36 -13
  403. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +2 -2
  404. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +22 -8
  405. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +19 -6
  406. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +43 -17
  407. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +42 -17
  408. package/src/rbac/engine.ts +15 -7
  409. package/src/rbac/hooks/usePermissions.ts +7 -3
  410. package/src/rbac/hooks/useResolvedScope.test.ts +2 -2
  411. package/src/rbac/hooks/useResolvedScope.ts +10 -7
  412. package/src/rbac/permissions.ts +5 -2
  413. package/src/rbac/security.test.ts +27 -16
  414. package/src/rbac/security.ts +5 -4
  415. package/src/services/AuthService.ts +22 -21
  416. package/src/services/EventService.ts +12 -12
  417. package/src/services/InactivityService.ts +5 -4
  418. package/src/services/OrganisationService.ts +26 -25
  419. package/src/services/__tests__/AuthService.test.ts +51 -19
  420. package/src/services/__tests__/EventService.test.ts +37 -5
  421. package/src/services/__tests__/InactivityService.test.ts +38 -4
  422. package/src/services/__tests__/OrganisationService.test.ts +3 -8
  423. package/src/services/base/BaseService.ts +3 -1
  424. package/src/styles/core.css +3 -0
  425. package/src/theming/__tests__/runtime.test.ts +21 -12
  426. package/src/theming/parseEventColours.ts +5 -19
  427. package/src/theming/runtime.ts +8 -4
  428. package/src/types/validation.ts +2 -29
  429. package/src/utils/__tests__/appConfig.unit.test.ts +1 -1
  430. package/src/utils/__tests__/audit.unit.test.ts +1 -1
  431. package/src/utils/__tests__/auth-utils.unit.test.ts +1 -1
  432. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +19 -19
  433. package/src/utils/__tests__/cn.unit.test.ts +1 -1
  434. package/src/utils/__tests__/debugLogger.test.ts +1 -1
  435. package/src/utils/__tests__/deviceFingerprint.unit.test.ts +1 -1
  436. package/src/utils/__tests__/dynamicUtils.unit.test.ts +1 -1
  437. package/src/utils/__tests__/formatting.unit.test.ts +1 -1
  438. package/src/utils/__tests__/lazyLoad.unit.test.tsx +1 -1
  439. package/src/utils/__tests__/logger.unit.test.ts +1 -1
  440. package/src/utils/__tests__/organisationContext.unit.test.ts +1 -1
  441. package/src/utils/__tests__/performanceBenchmark.test.ts +1 -1
  442. package/src/utils/__tests__/performanceBudgets.unit.test.ts +1 -1
  443. package/src/utils/__tests__/permissionTypes.unit.test.ts +1 -1
  444. package/src/utils/__tests__/permissionUtils.unit.test.ts +1 -1
  445. package/src/utils/__tests__/sanitization.unit.test.ts +1 -1
  446. package/src/utils/__tests__/schemaUtils.unit.test.ts +1 -1
  447. package/src/utils/__tests__/secureDataAccess.unit.test.ts +1 -1
  448. package/src/utils/__tests__/secureErrors.unit.test.ts +33 -15
  449. package/src/utils/__tests__/secureStorage.unit.test.ts +1 -1
  450. package/src/utils/__tests__/security.unit.test.ts +40 -18
  451. package/src/utils/__tests__/securityMonitor.unit.test.ts +1 -1
  452. package/src/utils/__tests__/sessionTracking.unit.test.ts +40 -29
  453. package/src/utils/__tests__/validationUtils.unit.test.ts +19 -6
  454. package/src/utils/app/appConfig.ts +47 -0
  455. package/src/utils/app/appIdResolver.test.ts +497 -0
  456. package/src/utils/app/appIdResolver.ts +133 -0
  457. package/src/utils/app/appNameResolver.simple.test.ts +212 -0
  458. package/src/utils/app/appNameResolver.test.ts +121 -0
  459. package/src/utils/app/appNameResolver.ts +195 -0
  460. package/src/utils/audit/audit.ts +127 -0
  461. package/src/utils/context/organisationContext.test.ts +322 -0
  462. package/src/utils/context/organisationContext.ts +156 -0
  463. package/src/utils/context/sessionTracking.ts +125 -0
  464. package/src/utils/core/cn.ts +7 -0
  465. package/src/utils/core/debugLogger.ts +67 -0
  466. package/src/utils/core/logger.ts +181 -0
  467. package/src/utils/device/deviceFingerprint.ts +215 -0
  468. package/src/utils/dynamic/dynamicUtils.ts +105 -0
  469. package/src/utils/dynamic/lazyLoad.tsx +44 -0
  470. package/src/utils/file-reference/__tests__/file-reference.test.ts +788 -0
  471. package/src/utils/file-reference/index.ts +501 -0
  472. package/src/utils/formatting/formatDate.test.ts +237 -0
  473. package/src/utils/formatting/formatting.ts +133 -0
  474. package/src/utils/index.ts +39 -54
  475. package/src/utils/performance/bundleAnalysis.ts +129 -0
  476. package/src/utils/performance/performanceBenchmark.ts +64 -0
  477. package/src/utils/performance/performanceBudgets.ts +110 -0
  478. package/src/utils/permissions/permissionTypes.ts +37 -0
  479. package/src/utils/permissions/permissionUtils.test.ts +393 -0
  480. package/src/utils/permissions/permissionUtils.ts +34 -0
  481. package/src/utils/security/auth-utils.ts +96 -0
  482. package/src/utils/security/secureDataAccess.test.ts +711 -0
  483. package/src/utils/security/secureDataAccess.ts +377 -0
  484. package/src/utils/security/secureErrors.ts +82 -0
  485. package/src/utils/security/secureStorage.ts +244 -0
  486. package/src/utils/security/security.ts +159 -0
  487. package/src/utils/security/securityMonitor.ts +45 -0
  488. package/src/utils/storage/__tests__/helpers.unit.test.ts +1 -4
  489. package/src/utils/storage/helpers.ts +15 -8
  490. package/src/utils/validation/__tests__/htmlSanitization.unit.test.ts +598 -0
  491. package/src/{validation → utils/validation}/csrf.ts +1 -1
  492. package/src/utils/validation/htmlSanitization.ts +184 -0
  493. package/src/utils/validation/index.ts +79 -0
  494. package/src/utils/validation/sanitization.ts +333 -0
  495. package/src/{validation/schemaUtils.ts → utils/validation/schema.ts} +11 -6
  496. package/src/{validation → utils/validation}/sqlInjectionProtection.ts +2 -0
  497. package/src/utils/validation/validation.ts +111 -0
  498. package/src/utils/validation/validationUtils.ts +123 -0
  499. package/src/validation/index.ts +3 -34
  500. package/dist/chunk-24MKLB7U.js +0 -81
  501. package/dist/chunk-24MKLB7U.js.map +0 -1
  502. package/dist/chunk-3CG5L6RN.js.map +0 -1
  503. package/dist/chunk-3DBFLLLU.js.map +0 -1
  504. package/dist/chunk-5F3NDPJV.js.map +0 -1
  505. package/dist/chunk-66C4BSAY.js.map +0 -1
  506. package/dist/chunk-BDZUMRBD.js +0 -87
  507. package/dist/chunk-BDZUMRBD.js.map +0 -1
  508. package/dist/chunk-BYXRHAIF.js.map +0 -1
  509. package/dist/chunk-CDQ3PX7L.js +0 -18
  510. package/dist/chunk-CDQ3PX7L.js.map +0 -1
  511. package/dist/chunk-CQZU6TFE.js.map +0 -1
  512. package/dist/chunk-F64FFPOZ.js.map +0 -1
  513. package/dist/chunk-GEVIB2UB.js.map +0 -1
  514. package/dist/chunk-GKHF54DI.js.map +0 -1
  515. package/dist/chunk-GVDR7WNV.js.map +0 -1
  516. package/dist/chunk-HMNOSGVA.js.map +0 -1
  517. package/dist/chunk-JCQZ6LA7.js.map +0 -1
  518. package/dist/chunk-M6DDYFUD.js.map +0 -1
  519. package/dist/chunk-O3NWNXDY.js.map +0 -1
  520. package/dist/chunk-PYUXFQJ3.js.map +0 -1
  521. package/dist/chunk-UJI6WSMD.js.map +0 -1
  522. package/dist/chunk-VZ5OR6HD.js.map +0 -1
  523. package/dist/chunk-WP5I5GLN.js.map +0 -1
  524. package/dist/chunk-ZYZCRSBD.js.map +0 -1
  525. package/dist/validation-DnhrNMju.d.ts +0 -159
  526. package/src/components/PublicLayout/__tests__/PublicPageDebugger.test.tsx +0 -185
  527. package/src/validation/__tests__/common.unit.test.ts +0 -101
  528. package/src/validation/__tests__/csrf.unit.test.ts +0 -365
  529. package/src/validation/__tests__/passwordSchema.unit.test.ts +0 -203
  530. package/src/validation/__tests__/sanitization.unit.test.ts +0 -250
  531. package/src/validation/__tests__/schemaUtils.unit.test.ts +0 -451
  532. package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +0 -462
  533. package/src/validation/__tests__/user.unit.test.ts +0 -440
  534. package/src/validation/sanitization.ts +0 -96
  535. /package/dist/{DataTable-A36PJG6N.js.map → DataTable-6M4L6BI2.js.map} +0 -0
  536. /package/dist/{UnifiedAuthProvider-CQDZRJIS.js.map → UnifiedAuthProvider-XIQQ7LVU.js.map} +0 -0
  537. /package/dist/{api-TNIBJWLM.js.map → api-45XYYO2A.js.map} +0 -0
  538. /package/dist/{audit-T36HM7IM.js.map → audit-64X3VJXB.js.map} +0 -0
  539. /package/dist/{chunk-CTJRBUX2.js.map → chunk-6LAAY47Q.js.map} +0 -0
  540. /package/dist/{chunk-ZV77RZMU.js.map → chunk-INQLMHPF.js.map} +0 -0
  541. /package/dist/{useInactivityTracker-MRUU55XI.js.map → useInactivityTracker-TO6ZOF35.js.map} +0 -0
  542. /package/src/{validation → utils/validation}/common.ts +0 -0
  543. /package/src/{validation → utils/validation}/passwordSchema.ts +0 -0
  544. /package/src/{validation → utils/validation}/user.ts +0 -0
package/src/rbac/audit.ts CHANGED
@@ -14,6 +14,7 @@ import {
14
14
  AuditEventSource,
15
15
  RBACAuditEvent
16
16
  } from './types';
17
+ import { logger } from '../utils/core/logger';
17
18
 
18
19
  /**
19
20
  * Audit event payload for permission checks
@@ -155,7 +156,7 @@ export class RBACAuditManager {
155
156
  // Validate required fields before attempting to insert
156
157
  // MANDATORY: All audit events must have userId
157
158
  if (!event.userId) {
158
- console.error('[RBAC Audit] CRITICAL: Cannot log audit event without userId:', {
159
+ logger.error('RBAC Audit', 'CRITICAL: Cannot log audit event without userId:', {
159
160
  eventType: event.type,
160
161
  organisationId: event.organisationId
161
162
  });
@@ -165,7 +166,7 @@ export class RBACAuditManager {
165
166
  // WARNING: Some audit events may not have organisationId (e.g., global admin operations)
166
167
  // Log these for security monitoring even if organisationId is missing
167
168
  if (!event.organisationId) {
168
- console.warn('[RBAC Audit] Audit event without organisation context:', {
169
+ logger.warn('RBAC Audit', 'Audit event without organisation context:', {
169
170
  userId: event.userId,
170
171
  eventType: event.type,
171
172
  note: 'This should be investigated for security compliance'
@@ -176,7 +177,7 @@ export class RBACAuditManager {
176
177
  // Since organisationId is now required in SecurityContext, this should rarely happen
177
178
  // But we still handle the edge case properly without masking it
178
179
  if (!event.organisationId) {
179
- console.warn('[RBAC Audit] Audit event without organisation context - this should be investigated:', {
180
+ logger.warn('RBAC Audit', 'Audit event without organisation context - this should be investigated:', {
180
181
  userId: event.userId,
181
182
  eventType: event.type,
182
183
  note: 'Organisation context is required for RBAC operations. This may indicate a security issue or missing context derivation.'
@@ -222,7 +223,7 @@ export class RBACAuditManager {
222
223
 
223
224
  if (error) {
224
225
  // Log the error for debugging
225
- console.warn('[RBAC Audit] Failed to insert audit event:', {
226
+ logger.warn('RBAC Audit', 'Failed to insert audit event:', {
226
227
  error: error.message,
227
228
  code: error.code,
228
229
  details: error.details,
@@ -237,7 +238,7 @@ export class RBACAuditManager {
237
238
  }
238
239
  } catch (error) {
239
240
  // Log unexpected errors
240
- console.error('[RBAC Audit] Unexpected error during audit logging:', error);
241
+ logger.error('RBAC Audit', 'Unexpected error during audit logging:', error);
241
242
 
242
243
  // Use fallback logging if enabled
243
244
  if (this.fallbackEnabled) {
@@ -253,11 +254,10 @@ export class RBACAuditManager {
253
254
  * @param error - The error that occurred
254
255
  */
255
256
  private logFallbackEvent(event: AuditEventPayload, error: any): void {
256
- console.log('[RBAC Audit Fallback]', {
257
+ logger.debug('RBAC Audit Fallback', 'Database audit logging failed, using console fallback', {
257
258
  timestamp: new Date().toISOString(),
258
259
  event,
259
- error: error?.message || error,
260
- note: 'Database audit logging failed, using console fallback'
260
+ error: error?.message || error
261
261
  });
262
262
  }
263
263
 
@@ -12,6 +12,9 @@ import { Database } from '../types/database';
12
12
  import { rbacCache, CACHE_PATTERNS } from './cache';
13
13
  import { emitAuditEvent } from './audit';
14
14
  import { UUID } from './types';
15
+ import { createLogger } from '../utils/core/logger';
16
+
17
+ const log = createLogger('RBACCache');
15
18
 
16
19
  /**
17
20
  * Cache invalidation patterns for different RBAC changes
@@ -143,7 +146,7 @@ export class RBACCacheInvalidationManager {
143
146
  * @param reason - Reason for invalidation
144
147
  */
145
148
  private invalidatePatterns(patterns: string[], reason: string): void {
146
- console.log(`[RBAC Cache] Invalidating patterns: ${patterns.join(', ')} (${reason})`);
149
+ log.debug(`Invalidating patterns: ${patterns.join(', ')} (${reason})`);
147
150
 
148
151
  patterns.forEach(pattern => {
149
152
  rbacCache.invalidate(pattern);
@@ -170,7 +173,7 @@ export class RBACCacheInvalidationManager {
170
173
  cache_invalidation: true
171
174
  }
172
175
  }).catch(error => {
173
- console.warn('[RBAC Cache] Failed to log cache invalidation audit event:', error);
176
+ log.warn('Failed to log cache invalidation audit event:', error);
174
177
  });
175
178
  }
176
179
 
@@ -180,7 +183,7 @@ export class RBACCacheInvalidationManager {
180
183
  private setupRealtimeSubscriptions(): void {
181
184
  // Check if realtime is available (skip in test environments)
182
185
  if (!this.supabase.channel || typeof this.supabase.channel !== 'function') {
183
- console.log('[RBAC Cache] Realtime not available, skipping subscriptions');
186
+ log.debug('Realtime not available, skipping subscriptions');
184
187
  return;
185
188
  }
186
189
 
@@ -287,7 +290,7 @@ export class RBACCacheInvalidationManager {
287
290
  * Clear all cache entries
288
291
  */
289
292
  clearAllCache(): void {
290
- console.log('[RBAC Cache] Clearing all cache entries');
293
+ log.debug('Clearing all cache entries');
291
294
  rbacCache.clear();
292
295
  }
293
296
  }
@@ -58,6 +58,7 @@
58
58
  import React, { useMemo, useCallback, useEffect, useState } from 'react';
59
59
  import { useNavigationPermissions, NavigationItem } from './NavigationProvider';
60
60
  import NavigationGuard from './NavigationGuard';
61
+ import { getRBACLogger } from '../config';
61
62
 
62
63
  export interface EnhancedNavigationMenuProps {
63
64
  /** Navigation items to display */
@@ -148,7 +149,8 @@ export function EnhancedNavigationMenu({
148
149
  }
149
150
 
150
151
  if (auditLog) {
151
- console.log(`[EnhancedNavigationMenu] Navigation access attempt:`, {
152
+ const logger = getRBACLogger();
153
+ logger.debug('Navigation access attempt:', {
152
154
  item: item.id,
153
155
  allowed,
154
156
  strictMode,
@@ -164,7 +166,8 @@ export function EnhancedNavigationMenu({
164
166
  }
165
167
 
166
168
  if (strictMode) {
167
- console.error(`[EnhancedNavigationMenu] STRICT MODE VIOLATION: User attempted to access protected navigation item without permission`, {
169
+ const logger = getRBACLogger();
170
+ logger.error(`STRICT MODE VIOLATION: User attempted to access protected navigation item without permission`, {
168
171
  item: item.id,
169
172
  path: item.path,
170
173
  permissions: item.permissions,
@@ -187,7 +190,8 @@ export function EnhancedNavigationMenu({
187
190
 
188
191
  // Record navigation attempt
189
192
  if (auditLog) {
190
- console.log(`[EnhancedNavigationMenu] Navigation item clicked:`, {
193
+ const logger = getRBACLogger();
194
+ logger.debug('Navigation item clicked:', {
191
195
  item: item.id,
192
196
  path: item.path,
193
197
  permissions: item.permissions,
@@ -266,14 +270,16 @@ export function EnhancedNavigationMenu({
266
270
  // Log strict mode violations
267
271
  useEffect(() => {
268
272
  if (strictMode && auditLog) {
269
- console.log(`[EnhancedNavigationMenu] Strict mode enabled - all navigation access attempts will be logged and enforced`);
273
+ const logger = getRBACLogger();
274
+ logger.debug('Strict mode enabled - all navigation access attempts will be logged and enforced');
270
275
  }
271
276
  }, [strictMode, auditLog]);
272
277
 
273
278
  // Log navigation menu initialization
274
279
  useEffect(() => {
275
280
  if (auditLog) {
276
- console.log(`[EnhancedNavigationMenu] Navigation menu initialized:`, {
281
+ const logger = getRBACLogger();
282
+ logger.debug('Navigation menu initialized:', {
277
283
  totalItems: items.length,
278
284
  filteredItems: filteredItems.length,
279
285
  strictMode,
@@ -70,6 +70,7 @@ import { useUnifiedAuth } from '../../providers/UnifiedAuthProvider';
70
70
  import { UUID, Permission, Scope } from '../types';
71
71
  import { createScopeFromEvent } from '../utils/eventContext';
72
72
  import { NavigationItem } from './NavigationProvider';
73
+ import { getRBACLogger } from '../config';
73
74
 
74
75
  export interface NavigationGuardProps {
75
76
  /** Navigation item being protected */
@@ -215,7 +216,8 @@ export function NavigationGuard({
215
216
  // Log navigation access attempt for audit
216
217
  useEffect(() => {
217
218
  if (auditLog && hasChecked && !isLoading) {
218
- console.log(`[NavigationGuard] Navigation access attempt:`, {
219
+ const logger = getRBACLogger();
220
+ logger.debug('Navigation access attempt:', {
219
221
  navigationItem: navigationItem.id,
220
222
  permissions: navigationItem.permissions,
221
223
  userId: user?.id,
@@ -230,7 +232,8 @@ export function NavigationGuard({
230
232
  // Handle strict mode violations
231
233
  useEffect(() => {
232
234
  if (strictMode && hasChecked && !isLoading && !hasRequiredPermissions) {
233
- console.error(`[NavigationGuard] STRICT MODE VIOLATION: User attempted to access protected navigation item without permission`, {
235
+ const logger = getRBACLogger();
236
+ logger.error(`STRICT MODE VIOLATION: User attempted to access protected navigation item without permission`, {
234
237
  navigationItem: navigationItem.id,
235
238
  permissions: navigationItem.permissions,
236
239
  userId: user?.id,
@@ -248,7 +251,8 @@ export function NavigationGuard({
248
251
 
249
252
  // Show error state
250
253
  if (checkError) {
251
- console.error(`[NavigationGuard] Permission check failed for navigation item ${navigationItem.id}:`, checkError);
254
+ const logger = getRBACLogger();
255
+ logger.error(`Permission check failed for navigation item ${navigationItem.id}:`, checkError);
252
256
  return <>{fallback}</>;
253
257
  }
254
258
 
@@ -58,6 +58,8 @@ import React, { createContext, useContext, useState, useCallback, useMemo, useEf
58
58
  import { useUnifiedAuth } from '../../providers/UnifiedAuthProvider';
59
59
  import { useCan } from '../hooks';
60
60
  import { UUID, Scope, Permission } from '../types';
61
+ import { getRBACLogger } from '../config';
62
+ import { logger } from '../../utils/core/logger';
61
63
 
62
64
  export interface NavigationItem {
63
65
  /** Unique identifier for the navigation item */
@@ -199,7 +201,7 @@ export function NavigationProvider({
199
201
 
200
202
  // If no permissions are defined for the navigation item, deny access by default
201
203
  if (!item.permissions || item.permissions.length === 0) {
202
- console.warn(`[NavigationProvider] Navigation item "${item.id}" has no permissions defined - denying access`);
204
+ logger.warn('NavigationProvider', `Navigation item "${item.id}" has no permissions defined - denying access`);
203
205
  return false;
204
206
  }
205
207
 
@@ -218,7 +220,7 @@ export function NavigationProvider({
218
220
  // Handle errors gracefully - allow access when there are permission check errors (graceful degradation)
219
221
  // This ensures navigation doesn't break when the permission service has issues
220
222
  if (error) {
221
- console.warn(`[NavigationProvider] Permission check error for "${item.id}": ${error.message} - allowing access for graceful degradation`);
223
+ logger.warn('NavigationProvider', `Permission check error for "${item.id}": ${error.message} - allowing access for graceful degradation`);
222
224
  return true;
223
225
  }
224
226
 
@@ -308,7 +310,8 @@ export function NavigationProvider({
308
310
  // Log strict mode violations
309
311
  useEffect(() => {
310
312
  if (strictMode && auditLog) {
311
- console.log(`[NavigationProvider] Strict mode enabled - all navigation access attempts will be logged and enforced`);
313
+ const logger = getRBACLogger();
314
+ logger.debug('Strict mode enabled - all navigation access attempts will be logged and enforced');
312
315
  }
313
316
  }, [strictMode, auditLog]);
314
317
 
@@ -72,7 +72,8 @@ import { useCan } from '../hooks';
72
72
  import { useUnifiedAuth } from '../../providers/UnifiedAuthProvider';
73
73
  import { UUID, Permission, Scope } from '../types';
74
74
  import { createScopeFromEvent } from '../utils/eventContext';
75
- import { getCurrentAppName } from '../../utils/appNameResolver';
75
+ import { getCurrentAppName } from '../../utils/app/appNameResolver';
76
+ import { getRBACLogger } from '../config';
76
77
 
77
78
  export interface PagePermissionGuardProps {
78
79
  /** Name of the page being protected */
@@ -198,7 +199,8 @@ const PagePermissionGuardComponent = ({
198
199
  }
199
200
 
200
201
  if (error) {
201
- console.error('[PagePermissionGuard] Database error resolving app ID:', error);
202
+ const logger = getRBACLogger();
203
+ logger.error('Database error resolving app ID:', error);
202
204
  if (signal.aborted) {
203
205
  return;
204
206
  }
@@ -213,23 +215,26 @@ const PagePermissionGuardComponent = ({
213
215
  }
214
216
 
215
217
  if (inactiveApp) {
216
- console.error(`[PagePermissionGuard] App "${appName}" exists but is inactive (is_active: ${inactiveApp.is_active})`);
218
+ logger.error(`App "${appName}" exists but is inactive (is_active: ${inactiveApp.is_active})`);
217
219
  } else {
218
- console.error(`[PagePermissionGuard] App "${appName}" not found in rbac_apps table`);
220
+ logger.error(`App "${appName}" not found in rbac_apps table`);
219
221
  }
220
222
  } else if (app) {
221
223
  appId = app.id;
222
224
  } else {
223
- console.error('[PagePermissionGuard] No app data returned for:', appName);
225
+ const logger = getRBACLogger();
226
+ logger.error('No app data returned for:', appName);
224
227
  }
225
228
  } catch (error) {
226
229
  if (signal.aborted) {
227
230
  return;
228
231
  }
229
- console.error('[PagePermissionGuard] Unexpected error resolving app ID:', error);
232
+ const logger = getRBACLogger();
233
+ logger.error('Unexpected error resolving app ID:', error);
230
234
  }
231
235
  } else {
232
- console.error('[PagePermissionGuard] No app name found. Make sure to call setRBACAppName() in your app setup.');
236
+ const logger = getRBACLogger();
237
+ logger.error('No app name found. Make sure to call setRBACAppName() in your app setup.');
233
238
  }
234
239
  }
235
240
 
@@ -240,10 +245,11 @@ const PagePermissionGuardComponent = ({
240
245
  // If we have both organisation and event, use them directly
241
246
  if (selectedOrganisation && selectedEvent) {
242
247
  if (!appId) {
248
+ const logger = getRBACLogger();
243
249
  if (import.meta.env.MODE === 'test') {
244
- console.warn('[PagePermissionGuard] App ID not resolved in test environment, proceeding without it');
250
+ logger.warn('App ID not resolved in test environment, proceeding without it');
245
251
  } else {
246
- console.error('[PagePermissionGuard] CRITICAL: App ID not resolved. Check console for details.');
252
+ logger.error('CRITICAL: App ID not resolved. Check console for details.');
247
253
  safeSetCheckError(new Error('App ID not resolved. Check console for database errors.'));
248
254
  safeSetResolvedScope(null);
249
255
  return;
@@ -253,7 +259,8 @@ const PagePermissionGuardComponent = ({
253
259
  if (import.meta.env.MODE === 'production' && appId) {
254
260
  const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
255
261
  if (!uuidRegex.test(appId)) {
256
- console.error('[PagePermissionGuard] CRITICAL: App ID is not a valid UUID:', appId);
262
+ const logger = getRBACLogger();
263
+ logger.error('CRITICAL: App ID is not a valid UUID:', appId);
257
264
  safeSetCheckError(new Error(`Invalid app ID format: ${appId}. Expected UUID.`));
258
265
  safeSetResolvedScope(null);
259
266
  return;
@@ -276,10 +283,11 @@ const PagePermissionGuardComponent = ({
276
283
  // If we only have organisation, use it
277
284
  if (selectedOrganisation) {
278
285
  if (!appId) {
286
+ const logger = getRBACLogger();
279
287
  if (import.meta.env.MODE === 'test') {
280
- console.warn('[PagePermissionGuard] App ID not resolved in test environment, proceeding without it');
288
+ logger.warn('App ID not resolved in test environment, proceeding without it');
281
289
  } else {
282
- console.error('[PagePermissionGuard] CRITICAL: App ID not resolved. Check console for details.');
290
+ logger.error('CRITICAL: App ID not resolved. Check console for details.');
283
291
  safeSetCheckError(new Error('App ID not resolved. Check console for database errors.'));
284
292
  safeSetResolvedScope(null);
285
293
  return;
@@ -289,7 +297,8 @@ const PagePermissionGuardComponent = ({
289
297
  if (import.meta.env.MODE === 'production' && appId) {
290
298
  const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
291
299
  if (!uuidRegex.test(appId)) {
292
- console.error('[PagePermissionGuard] CRITICAL: App ID is not a valid UUID:', appId);
300
+ const logger = getRBACLogger();
301
+ logger.error('CRITICAL: App ID is not a valid UUID:', appId);
293
302
  safeSetCheckError(new Error(`Invalid app ID format: ${appId}. Expected UUID.`));
294
303
  safeSetResolvedScope(null);
295
304
  return;
@@ -346,7 +355,8 @@ const PagePermissionGuardComponent = ({
346
355
  ? 'Either organisation context or event context is required for page permission checking'
347
356
  : 'Insufficient context for permission checking. Please ensure you are properly authenticated and have selected an organisation or event.';
348
357
 
349
- console.error('[PagePermissionGuard] Context resolution failed:', {
358
+ const logger = getRBACLogger();
359
+ logger.error('Context resolution failed:', {
350
360
  selectedOrganisation: selectedOrganisation ? (selectedOrganisation as any).id : null,
351
361
  selectedEvent: selectedEvent ? (selectedEvent as any).event_id : null,
352
362
  appId,
@@ -425,7 +435,8 @@ const PagePermissionGuardComponent = ({
425
435
  // Log page access attempt for audit
426
436
  useEffect(() => {
427
437
  if (auditLog && hasChecked && !isLoading) {
428
- console.log(`[PagePermissionGuard] Page access attempt:`, {
438
+ const rbacLogger = getRBACLogger();
439
+ rbacLogger.debug('Page access attempt:', {
429
440
  pageName,
430
441
  operation,
431
442
  userId: user?.id,
@@ -440,7 +451,8 @@ const PagePermissionGuardComponent = ({
440
451
  // Handle strict mode violations
441
452
  useEffect(() => {
442
453
  if (strictMode && hasChecked && !isLoading && !can) {
443
- console.error(`[PagePermissionGuard] STRICT MODE VIOLATION: User attempted to access protected page without permission`, {
454
+ const logger = getRBACLogger();
455
+ logger.error(`STRICT MODE VIOLATION: User attempted to access protected page without permission`, {
444
456
  pageName,
445
457
  operation,
446
458
  permission: `${operation}:page.${pageName}`,
@@ -57,6 +57,9 @@
57
57
  import React, { createContext, useContext, useState, useCallback, useMemo, useEffect } from 'react';
58
58
  import { useUnifiedAuth } from '../../providers/UnifiedAuthProvider';
59
59
  import { UUID, Scope, Permission } from '../types';
60
+ import { createLogger } from '../../utils/core/logger';
61
+
62
+ const log = createLogger('PagePermissionProvider');
60
63
 
61
64
  export interface PagePermissionContextType {
62
65
  /** Check if user has permission for a page */
@@ -244,7 +247,7 @@ export function PagePermissionProvider({
244
247
  // Log strict mode violations
245
248
  useEffect(() => {
246
249
  if (strictMode && auditLog) {
247
- console.log(`[PagePermissionProvider] Strict mode enabled - all page access attempts will be logged and enforced`);
250
+ log.debug('Strict mode enabled - all page access attempts will be logged and enforced');
248
251
  }
249
252
  }, [strictMode, auditLog]);
250
253
 
@@ -71,6 +71,10 @@ import { useMultiplePermissions } from '../hooks/usePermissions';
71
71
  import { useUnifiedAuth } from '../../providers/UnifiedAuthProvider';
72
72
  import { UUID, Permission, Scope } from '../types';
73
73
  import { createScopeFromEvent } from '../utils/eventContext';
74
+ import { getRBACLogger } from '../config';
75
+ import { createLogger } from '../../utils/core/logger';
76
+
77
+ const log = createLogger('PermissionEnforcer');
74
78
 
75
79
  export interface PermissionEnforcerProps {
76
80
  /** Permissions required for access */
@@ -225,7 +229,7 @@ export function PermissionEnforcer({
225
229
  // Log permission check attempt for audit
226
230
  useEffect(() => {
227
231
  if (auditLog && hasChecked && !isLoading) {
228
- console.log(`[PermissionEnforcer] Permission check attempt:`, {
232
+ log.debug('Permission check attempt:', {
229
233
  permissions,
230
234
  operation,
231
235
  userId: user?.id,
@@ -240,7 +244,8 @@ export function PermissionEnforcer({
240
244
  // Handle strict mode violations
241
245
  useEffect(() => {
242
246
  if (strictMode && hasChecked && !isLoading && !hasRequiredPermissions) {
243
- console.error(`[PermissionEnforcer] STRICT MODE VIOLATION: User attempted to perform operation without permission`, {
247
+ const logger = getRBACLogger();
248
+ logger.error(`STRICT MODE VIOLATION: User attempted to perform operation without permission`, {
244
249
  permissions,
245
250
  operation,
246
251
  userId: user?.id,
@@ -258,7 +263,8 @@ export function PermissionEnforcer({
258
263
 
259
264
  // Show error state
260
265
  if (checkError) {
261
- console.error(`[PermissionEnforcer] Permission check failed for operation ${operation}:`, checkError);
266
+ const logger = getRBACLogger();
267
+ logger.error(`Permission check failed for operation ${operation}:`, checkError);
262
268
  return <>{fallback}</>;
263
269
  }
264
270
 
@@ -68,6 +68,7 @@ import { useLocation, useNavigate, Outlet } from 'react-router-dom';
68
68
  import { useCan } from '../hooks';
69
69
  import { useUnifiedAuth } from '../../providers/UnifiedAuthProvider';
70
70
  import { UUID, Permission, Scope, AccessLevel } from '../types';
71
+ import { getRBACLogger } from '../config';
71
72
 
72
73
  export interface RouteConfig {
73
74
  /** Route path */
@@ -307,7 +308,8 @@ export function RoleBasedRouter({
307
308
  if (!currentRouteConfig) {
308
309
  // Route not found in configuration
309
310
  if (strictMode) {
310
- console.error(`[RoleBasedRouter] STRICT MODE VIOLATION: Route not found in configuration`, {
311
+ const logger = getRBACLogger();
312
+ logger.error(`STRICT MODE VIOLATION: Route not found in configuration`, {
311
313
  route: currentPath,
312
314
  userId: user?.id,
313
315
  timestamp: new Date().toISOString()
@@ -60,6 +60,7 @@ import React, { createContext, useContext, useState, useCallback, useMemo, useEf
60
60
  import { useUnifiedAuth } from '../../providers/UnifiedAuthProvider';
61
61
  import { useSecureDataAccess } from '../../hooks/useSecureDataAccess';
62
62
  import { UUID, Scope, Permission } from '../types';
63
+ import { getRBACLogger } from '../config';
63
64
 
64
65
  export interface DataAccessRecord {
65
66
  table: string;
@@ -215,7 +216,8 @@ export function SecureDataProvider({
215
216
  try {
216
217
  validateContext();
217
218
  } catch (error) {
218
- console.error(`[SecureDataProvider] Organisation context validation failed:`, error);
219
+ const logger = getRBACLogger();
220
+ logger.error('Organisation context validation failed:', error);
219
221
  return false;
220
222
  }
221
223
 
@@ -282,14 +284,16 @@ export function SecureDataProvider({
282
284
  // Log strict mode violations
283
285
  useEffect(() => {
284
286
  if (strictMode && auditLog) {
285
- console.log(`[SecureDataProvider] Strict mode enabled - all data access attempts will be logged and enforced`);
287
+ const logger = getRBACLogger();
288
+ logger.debug('Strict mode enabled - all data access attempts will be logged and enforced');
286
289
  }
287
290
  }, [strictMode, auditLog]);
288
291
 
289
292
  // Log RLS enforcement
290
293
  useEffect(() => {
291
294
  if (enforceRLS && auditLog) {
292
- console.log(`[SecureDataProvider] RLS enforcement enabled - all queries will include organisation context`);
295
+ const logger = getRBACLogger();
296
+ logger.debug('RLS enforcement enabled - all queries will include organisation context');
293
297
  }
294
298
  }, [enforceRLS, auditLog]);
295
299