@jmruthers/pace-core 0.5.181 → 0.5.183

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 (756) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +16 -2
  3. package/dist/{AuthService-DYuQPJj6.d.ts → AuthService-B-cd2MA4.d.ts} +9 -11
  4. package/dist/{DataTable-CWAZZcXC.d.ts → DataTable-Bz8ffqyA.d.ts} +1 -1
  5. package/dist/{DataTable-UA6CL4JI.js → DataTable-QAB34V6K.js} +14 -15
  6. package/dist/UnifiedAuthProvider-7F6T4B6K.js +13 -0
  7. package/dist/{UnifiedAuthProvider-DJxGTftH.d.ts → UnifiedAuthProvider-F86d7dSi.d.ts} +5 -6
  8. package/dist/{api-45XYYO2A.js → api-ROMBCNKU.js} +5 -5
  9. package/dist/{audit-64X3VJXB.js → audit-WRS3KJKI.js} +4 -4
  10. package/dist/auth-BZOJqrdd.d.ts +49 -0
  11. package/dist/{chunk-CX5M4ZAG.js → chunk-5DRSZLL2.js} +1 -1
  12. package/dist/chunk-5DRSZLL2.js.map +1 -0
  13. package/dist/{chunk-BESYRHQM.js → chunk-6C4YBBJM.js} +10 -7
  14. package/dist/chunk-6C4YBBJM.js.map +1 -0
  15. package/dist/{chunk-PLDDJCW6.js → chunk-7D4SUZUM.js} +2 -13
  16. package/dist/{chunk-HRO5HWN2.js → chunk-CSOFYHAG.js} +55 -162
  17. package/dist/chunk-CSOFYHAG.js.map +1 -0
  18. package/dist/{chunk-ANBQRTPX.js → chunk-E66EQZE6.js} +3 -5
  19. package/dist/{chunk-ANBQRTPX.js.map → chunk-E66EQZE6.js.map} +1 -1
  20. package/dist/{chunk-Q5QRDWKI.js → chunk-F2IMUDXZ.js} +4 -6
  21. package/dist/chunk-F2IMUDXZ.js.map +1 -0
  22. package/dist/{chunk-SBVILCCA.js → chunk-FSFQFJCU.js} +28 -6
  23. package/dist/chunk-FSFQFJCU.js.map +1 -0
  24. package/dist/chunk-FUEYYMX5.js +2296 -0
  25. package/dist/chunk-FUEYYMX5.js.map +1 -0
  26. package/dist/{chunk-FFKNH6U5.js → chunk-HKIT6O7W.js} +3 -5
  27. package/dist/{chunk-FFKNH6U5.js.map → chunk-HKIT6O7W.js.map} +1 -1
  28. package/dist/chunk-KQCRWDSA.js +1 -0
  29. package/dist/{chunk-S5OFRT4M.js → chunk-KUEN3HFB.js} +6 -6
  30. package/dist/chunk-KUEN3HFB.js.map +1 -0
  31. package/dist/chunk-LMC26NLJ.js +84 -0
  32. package/dist/chunk-LMC26NLJ.js.map +1 -0
  33. package/dist/{chunk-BVYWGZVV.js → chunk-M7W4CP3M.js} +52 -19
  34. package/dist/chunk-M7W4CP3M.js.map +1 -0
  35. package/dist/{chunk-HZLDFOE4.js → chunk-MI7HBHN3.js} +164 -243
  36. package/dist/chunk-MI7HBHN3.js.map +1 -0
  37. package/dist/{chunk-PPMP5J6T.js → chunk-PWAHJW4G.js} +180 -29
  38. package/dist/chunk-PWAHJW4G.js.map +1 -0
  39. package/dist/chunk-PWLANIRT.js +127 -0
  40. package/dist/{chunk-XDNLUEXI.js.map → chunk-PWLANIRT.js.map} +1 -1
  41. package/dist/chunk-QCDXODCA.js +75 -0
  42. package/dist/chunk-QCDXODCA.js.map +1 -0
  43. package/dist/{chunk-D7LCGMVS.js → chunk-QETLRQI6.js} +526 -887
  44. package/dist/chunk-QETLRQI6.js.map +1 -0
  45. package/dist/{chunk-5MT24GKJ.js → chunk-QUVSNGIP.js} +264 -262
  46. package/dist/chunk-QUVSNGIP.js.map +1 -0
  47. package/dist/chunk-QXHPKYJV.js +113 -0
  48. package/dist/chunk-QXHPKYJV.js.map +1 -0
  49. package/dist/{chunk-OWAG3GSU.js → chunk-R77UEZ4E.js} +11 -1
  50. package/dist/chunk-R77UEZ4E.js.map +1 -0
  51. package/dist/{chunk-ZYTYSTO5.js → chunk-RA3JUFMW.js} +314 -161
  52. package/dist/chunk-RA3JUFMW.js.map +1 -0
  53. package/dist/{chunk-ERISIBYU.js → chunk-SQGMNID3.js} +3 -8
  54. package/dist/chunk-SQGMNID3.js.map +1 -0
  55. package/dist/{chunk-XJ2HZOBU.js → chunk-UHNYIBXL.js} +1 -1
  56. package/dist/chunk-UHNYIBXL.js.map +1 -0
  57. package/{src/utils/secureStorage.ts → dist/chunk-VBXEHIUJ.js} +113 -88
  58. package/dist/{chunk-7QCC6MCP.js.map → chunk-VBXEHIUJ.js.map} +1 -1
  59. package/dist/{chunk-VZ4VDGTB.js → chunk-W22JP75J.js} +5 -13
  60. package/dist/{chunk-VZ4VDGTB.js.map → chunk-W22JP75J.js.map} +1 -1
  61. package/dist/components.d.ts +12 -93
  62. package/dist/components.js +23 -106
  63. package/dist/components.js.map +1 -1
  64. package/dist/core-CUElvH_C.d.ts +164 -0
  65. package/dist/database.generated-CBmg2950.d.ts +8284 -0
  66. package/dist/event-CW5YB_2p.d.ts +239 -0
  67. package/dist/{file-reference-C6Gkn77H.d.ts → file-reference-D06mEEWW.d.ts} +7 -5
  68. package/dist/functions-D_kgHktt.d.ts +208 -0
  69. package/dist/hooks.d.ts +54 -7
  70. package/dist/hooks.js +204 -17
  71. package/dist/hooks.js.map +1 -1
  72. package/dist/{EventLogo-B3V3otev.d.ts → index-Bl--n7-T.d.ts} +387 -397
  73. package/dist/index.d.ts +94 -261
  74. package/dist/index.js +314 -126
  75. package/dist/index.js.map +1 -1
  76. package/dist/providers.d.ts +7 -8
  77. package/dist/providers.js +6 -13
  78. package/dist/rbac/index.d.ts +171 -101
  79. package/dist/rbac/index.js +23 -17
  80. package/dist/styles/index.d.ts +1 -3
  81. package/dist/styles/index.js +2 -17
  82. package/dist/theming/runtime.js +3 -3
  83. package/dist/types-UU913iLA.d.ts +102 -0
  84. package/dist/{types-Dfz9dmVH.d.ts → types-_x1f4QBF.d.ts} +6 -6
  85. package/dist/types.d.ts +88 -227
  86. package/dist/types.js +64 -112
  87. package/dist/types.js.map +1 -1
  88. package/dist/{usePublicRouteParams-B7PabvuH.d.ts → usePublicRouteParams-JJczomYq.d.ts} +203 -6
  89. package/dist/utils.d.ts +299 -13
  90. package/dist/utils.js +481 -55
  91. package/dist/utils.js.map +1 -1
  92. package/dist/validation-643vUDZW.d.ts +177 -0
  93. package/docs/DOCUMENTATION_REVIEW_TRACKER.md +511 -0
  94. package/docs/README.md +9 -8
  95. package/docs/api/README.md +16 -2
  96. package/docs/api/classes/ColumnFactory.md +1 -1
  97. package/docs/api/classes/ErrorBoundary.md +1 -1
  98. package/docs/api/classes/InvalidScopeError.md +4 -4
  99. package/docs/api/classes/MissingUserContextError.md +4 -4
  100. package/docs/api/classes/OrganisationContextRequiredError.md +4 -4
  101. package/docs/api/classes/PermissionDeniedError.md +4 -4
  102. package/docs/api/classes/RBACAuditManager.md +14 -14
  103. package/docs/api/classes/RBACCache.md +1 -1
  104. package/docs/api/classes/RBACEngine.md +2 -2
  105. package/docs/api/classes/RBACError.md +4 -4
  106. package/docs/api/classes/RBACNotInitializedError.md +4 -4
  107. package/docs/api/classes/SecureSupabaseClient.md +29 -9
  108. package/docs/api/classes/StorageUtils.md +1 -1
  109. package/docs/api/enums/FileCategory.md +17 -17
  110. package/docs/api/enums/RBACErrorCode.md +228 -0
  111. package/docs/api/enums/RPCFunction.md +118 -0
  112. package/docs/api/interfaces/AggregateConfig.md +1 -1
  113. package/docs/api/interfaces/BadgeProps.md +1 -1
  114. package/docs/api/interfaces/ButtonProps.md +2 -2
  115. package/docs/api/interfaces/CalendarProps.md +1 -1
  116. package/docs/api/interfaces/CardProps.md +29 -3
  117. package/docs/api/interfaces/ColorPalette.md +1 -1
  118. package/docs/api/interfaces/ColorShade.md +1 -1
  119. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  120. package/docs/api/interfaces/DataRecord.md +1 -1
  121. package/docs/api/interfaces/DataTableAction.md +2 -2
  122. package/docs/api/interfaces/DataTableColumn.md +6 -6
  123. package/docs/api/interfaces/DataTableProps.md +1 -1
  124. package/docs/api/interfaces/DataTableToolbarButton.md +2 -2
  125. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  126. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  127. package/docs/api/interfaces/EventAppRoleData.md +1 -1
  128. package/docs/api/interfaces/ExportColumn.md +5 -5
  129. package/docs/api/interfaces/ExportOptions.md +4 -4
  130. package/docs/api/interfaces/FileDisplayProps.md +1 -1
  131. package/docs/api/interfaces/FileMetadata.md +13 -13
  132. package/docs/api/interfaces/FileReference.md +12 -12
  133. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  134. package/docs/api/interfaces/FileUploadOptions.md +10 -10
  135. package/docs/api/interfaces/FileUploadProps.md +19 -19
  136. package/docs/api/interfaces/FooterProps.md +1 -1
  137. package/docs/api/interfaces/FormFieldProps.md +166 -0
  138. package/docs/api/interfaces/FormProps.md +113 -0
  139. package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
  140. package/docs/api/interfaces/InactivityWarningModalProps.md +8 -8
  141. package/docs/api/interfaces/InputProps.md +2 -2
  142. package/docs/api/interfaces/LabelProps.md +8 -8
  143. package/docs/api/interfaces/LoginFormProps.md +1 -1
  144. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  145. package/docs/api/interfaces/NavigationContextType.md +1 -1
  146. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  147. package/docs/api/interfaces/NavigationItem.md +17 -73
  148. package/docs/api/interfaces/NavigationMenuProps.md +38 -53
  149. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  150. package/docs/api/interfaces/Organisation.md +13 -13
  151. package/docs/api/interfaces/OrganisationContextType.md +21 -21
  152. package/docs/api/interfaces/OrganisationMembership.md +15 -15
  153. package/docs/api/interfaces/OrganisationProviderProps.md +59 -2
  154. package/docs/api/interfaces/OrganisationSecurityError.md +5 -5
  155. package/docs/api/interfaces/PaceAppLayoutProps.md +26 -39
  156. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  157. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  158. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  159. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  160. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  161. package/docs/api/interfaces/PaletteData.md +1 -1
  162. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  163. package/docs/api/interfaces/ProgressProps.md +50 -0
  164. package/docs/api/interfaces/ProtectedRouteProps.md +1 -1
  165. package/docs/api/interfaces/PublicPageFooterProps.md +9 -9
  166. package/docs/api/interfaces/PublicPageHeaderProps.md +10 -10
  167. package/docs/api/interfaces/PublicPageLayoutProps.md +15 -15
  168. package/docs/api/interfaces/RBACAccessValidateParams.md +52 -0
  169. package/docs/api/interfaces/RBACAccessValidateResult.md +41 -0
  170. package/docs/api/interfaces/RBACAuditLogParams.md +85 -0
  171. package/docs/api/interfaces/RBACAuditLogResult.md +52 -0
  172. package/docs/api/interfaces/RBACConfig.md +2 -2
  173. package/docs/api/interfaces/RBACContext.md +52 -0
  174. package/docs/api/interfaces/RBACLogger.md +1 -1
  175. package/docs/api/interfaces/RBACPageAccessCheckParams.md +74 -0
  176. package/docs/api/interfaces/RBACPermissionCheckParams.md +74 -0
  177. package/docs/api/interfaces/RBACPermissionCheckResult.md +52 -0
  178. package/docs/api/interfaces/RBACPermissionsGetParams.md +63 -0
  179. package/docs/api/interfaces/RBACPermissionsGetResult.md +63 -0
  180. package/docs/api/interfaces/RBACResult.md +58 -0
  181. package/docs/api/interfaces/RBACRoleGrantParams.md +63 -0
  182. package/docs/api/interfaces/RBACRoleGrantResult.md +52 -0
  183. package/docs/api/interfaces/RBACRoleRevokeParams.md +63 -0
  184. package/docs/api/interfaces/RBACRoleRevokeResult.md +52 -0
  185. package/docs/api/interfaces/RBACRoleValidateParams.md +52 -0
  186. package/docs/api/interfaces/RBACRoleValidateResult.md +63 -0
  187. package/docs/api/interfaces/RBACRolesListParams.md +52 -0
  188. package/docs/api/interfaces/RBACRolesListResult.md +74 -0
  189. package/docs/api/interfaces/RBACSessionTrackParams.md +74 -0
  190. package/docs/api/interfaces/RBACSessionTrackResult.md +52 -0
  191. package/docs/api/interfaces/ResourcePermissions.md +1 -1
  192. package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
  193. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  194. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  195. package/docs/api/interfaces/RoleManagementResult.md +1 -1
  196. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  197. package/docs/api/interfaces/RouteConfig.md +1 -1
  198. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  199. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  200. package/docs/api/interfaces/SessionRestorationLoaderProps.md +15 -2
  201. package/docs/api/interfaces/StorageConfig.md +1 -1
  202. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  203. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  204. package/docs/api/interfaces/StorageListOptions.md +1 -1
  205. package/docs/api/interfaces/StorageListResult.md +1 -1
  206. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  207. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  208. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  209. package/docs/api/interfaces/StyleImport.md +1 -1
  210. package/docs/api/interfaces/SwitchProps.md +1 -1
  211. package/docs/api/interfaces/TabsContentProps.md +1 -1
  212. package/docs/api/interfaces/TabsListProps.md +1 -1
  213. package/docs/api/interfaces/TabsProps.md +1 -1
  214. package/docs/api/interfaces/TabsTriggerProps.md +43 -2
  215. package/docs/api/interfaces/TextareaProps.md +2 -2
  216. package/docs/api/interfaces/ToastActionElement.md +1 -1
  217. package/docs/api/interfaces/ToastProps.md +1 -1
  218. package/docs/api/interfaces/UnifiedAuthContextType.md +61 -61
  219. package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
  220. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  221. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  222. package/docs/api/interfaces/UsePublicEventLogoOptions.md +87 -0
  223. package/docs/api/interfaces/UsePublicEventLogoReturn.md +81 -0
  224. package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
  225. package/docs/api/interfaces/UsePublicEventReturn.md +5 -5
  226. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +2 -2
  227. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
  228. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  229. package/docs/api/interfaces/UseResolvedScopeOptions.md +2 -2
  230. package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
  231. package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
  232. package/docs/api/interfaces/UserEventAccess.md +1 -1
  233. package/docs/api/interfaces/UserMenuProps.md +4 -4
  234. package/docs/api/interfaces/UserProfile.md +7 -7
  235. package/docs/api/modules.md +484 -462
  236. package/docs/api-reference/components.md +186 -15
  237. package/docs/api-reference/deprecated.md +376 -0
  238. package/docs/api-reference/hooks.md +149 -19
  239. package/docs/api-reference/providers.md +61 -6
  240. package/docs/api-reference/rpc-functions.md +397 -0
  241. package/docs/api-reference/types.md +135 -78
  242. package/docs/api-reference/utilities.md +51 -380
  243. package/docs/architecture/README.md +49 -3
  244. package/docs/architecture/database-schema-requirements.md +40 -3
  245. package/docs/architecture/rbac-security-architecture.md +41 -4
  246. package/docs/architecture/services.md +127 -42
  247. package/docs/best-practices/README.md +51 -5
  248. package/docs/best-practices/accessibility.md +32 -3
  249. package/docs/best-practices/common-patterns.md +50 -3
  250. package/docs/best-practices/deployment.md +50 -4
  251. package/docs/best-practices/performance.md +50 -3
  252. package/docs/best-practices/security.md +94 -41
  253. package/docs/best-practices/testing.md +33 -4
  254. package/docs/core-concepts/authentication.md +5 -5
  255. package/docs/core-concepts/events.md +3 -3
  256. package/docs/core-concepts/organisations.md +3 -3
  257. package/docs/core-concepts/permissions.md +3 -3
  258. package/docs/core-concepts/rbac-system.md +5 -5
  259. package/docs/documentation-index.md +30 -8
  260. package/docs/getting-started/documentation-index.md +1 -1
  261. package/docs/getting-started/examples/README.md +7 -5
  262. package/docs/getting-started/examples/basic-auth-app.md +3 -0
  263. package/docs/getting-started/examples/full-featured-app.md +5 -3
  264. package/docs/getting-started/faq.md +6 -6
  265. package/docs/getting-started/installation-guide.md +192 -13
  266. package/docs/getting-started/local-development.md +303 -0
  267. package/docs/getting-started/quick-reference.md +3 -3
  268. package/docs/getting-started/quick-start.md +517 -0
  269. package/docs/implementation-guides/app-layout.md +45 -3
  270. package/docs/implementation-guides/authentication.md +66 -7
  271. package/docs/implementation-guides/component-styling.md +53 -3
  272. package/docs/implementation-guides/data-tables.md +76 -7
  273. package/docs/implementation-guides/datatable-filtering.md +1 -2
  274. package/docs/implementation-guides/datatable-rbac-usage.md +0 -1
  275. package/docs/implementation-guides/dynamic-colors.md +155 -4
  276. package/docs/implementation-guides/file-reference-system.md +72 -3
  277. package/docs/implementation-guides/file-upload-storage.md +72 -3
  278. package/docs/implementation-guides/forms.md +53 -3
  279. package/docs/implementation-guides/inactivity-tracking.md +53 -3
  280. package/docs/implementation-guides/large-datasets.md +1 -1
  281. package/docs/implementation-guides/navigation.md +55 -5
  282. package/docs/implementation-guides/organisation-security.md +72 -3
  283. package/docs/implementation-guides/performance.md +57 -1
  284. package/docs/implementation-guides/permission-enforcement.md +81 -8
  285. package/docs/implementation-guides/public-pages.md +560 -14
  286. package/docs/migration/MIGRATION_GUIDE.md +409 -50
  287. package/docs/migration/README.md +37 -3
  288. package/docs/migration/organisation-context-timing-fix.md +39 -4
  289. package/docs/migration/quick-migration-guide.md +41 -5
  290. package/docs/migration/rbac-migration.md +59 -3
  291. package/docs/migration/service-architecture.md +77 -14
  292. package/docs/rbac/README.md +79 -3
  293. package/docs/rbac/advanced-patterns.md +47 -3
  294. package/docs/rbac/api-reference.md +77 -8
  295. package/docs/rbac/event-based-apps.md +50 -5
  296. package/docs/rbac/examples/rbac-rls-integration-example.md +3 -3
  297. package/docs/rbac/examples.md +39 -3
  298. package/docs/rbac/getting-started.md +63 -4
  299. package/docs/rbac/quick-start.md +57 -5
  300. package/docs/rbac/rbac-rls-integration.md +68 -6
  301. package/docs/rbac/super-admin-guide.md +47 -3
  302. package/docs/rbac/troubleshooting.md +3 -3
  303. package/docs/security/README.md +68 -3
  304. package/docs/security/checklist.md +50 -3
  305. package/docs/standards/01-architecture-standard.md +39 -0
  306. package/docs/standards/02-api-and-rpc-standard.md +39 -0
  307. package/docs/standards/03-component-standard.md +32 -0
  308. package/docs/standards/04-code-style-standard.md +32 -0
  309. package/docs/standards/05-security-standard.md +30 -0
  310. package/docs/standards/06-testing-and-docs-standard.md +29 -0
  311. package/docs/standards/README.md +35 -0
  312. package/docs/styles/README.md +89 -8
  313. package/docs/testing/README.md +175 -24
  314. package/docs/troubleshooting/README.md +50 -3
  315. package/docs/troubleshooting/common-issues.md +271 -5
  316. package/docs/troubleshooting/debugging.md +54 -1
  317. package/docs/troubleshooting/migration.md +54 -1
  318. package/docs/troubleshooting/organisation-context-setup.md +29 -3
  319. package/docs/troubleshooting/styling-issues.md +246 -4
  320. package/{src/components/DataTable/examples → examples/DataTable}/GroupingAggregationExample.tsx +1 -1
  321. package/examples/{components 2/DataTable/HierarchicalActionsExample.tsx → DataTable/HierarchicalActionsExample.tsx} +7 -6
  322. package/{src/components/DataTable/examples → examples/DataTable}/HierarchicalExample.tsx +8 -6
  323. package/examples/{components 2/DataTable/PerformanceExample.tsx → DataTable/PerformanceExample.tsx} +2 -2
  324. package/examples/{components 2/DataTable/index.ts → DataTable/index.ts} +1 -0
  325. package/{src/components/Dialog/examples → examples/Dialog}/HtmlDialogExample.tsx +3 -3
  326. package/examples/{components 2/Dialog/ScrollableDialogExample.tsx → Dialog/ScrollableDialogExample.tsx} +1 -1
  327. package/{src/components/Dialog/examples → examples/Dialog}/SmartDialogExample.tsx +1 -1
  328. package/examples/{components 2/Dialog/index.ts → Dialog/index.ts} +0 -3
  329. package/examples/{features/public-pages → PublicPages}/CorrectPublicPageImplementation.tsx +52 -17
  330. package/examples/{features/public-pages → PublicPages}/PublicEventPage.tsx +65 -35
  331. package/examples/{features/public-pages → PublicPages}/PublicPageApp.tsx +52 -18
  332. package/examples/{features/public-pages → PublicPages}/PublicPageUsageExample.tsx +28 -15
  333. package/examples/README.md +81 -33
  334. package/examples/index.ts +14 -12
  335. package/examples/{RBAC → rbac}/CompleteRBACExample.tsx +1 -1
  336. package/examples/{features/rbac → rbac}/EventBasedApp.tsx +4 -4
  337. package/examples/{features/rbac → rbac}/PermissionExample.tsx +5 -3
  338. package/package.json +21 -27
  339. package/src/__tests__/helpers/test-utils.tsx +29 -3
  340. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +7 -5
  341. package/src/components/Alert/Alert.test.tsx +2 -2
  342. package/src/components/Alert/Alert.tsx +4 -4
  343. package/src/components/Avatar/Avatar.test.tsx +17 -6
  344. package/src/components/Badge/Badge.test.tsx +1 -1
  345. package/src/components/Badge/Badge.tsx +2 -2
  346. package/src/components/Button/Button.test.tsx +2 -2
  347. package/src/components/Button/Button.tsx +11 -7
  348. package/src/components/Calendar/Calendar.test.tsx +41 -8
  349. package/src/components/Calendar/Calendar.tsx +39 -36
  350. package/src/components/Card/Card.tsx +51 -13
  351. package/src/components/Checkbox/Checkbox.test.tsx +36 -12
  352. package/src/components/DataTable/DataTable.test.tsx +1 -1
  353. package/src/components/DataTable/__tests__/DataTable.comprehensive.test.tsx +13 -7
  354. package/src/components/DataTable/__tests__/DataTable.default-state.test.tsx +14 -42
  355. package/src/components/DataTable/__tests__/DataTable.export.test.tsx +13 -10
  356. package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +14 -11
  357. package/src/components/DataTable/__tests__/DataTable.hooks.test.tsx +4 -2
  358. package/src/components/DataTable/__tests__/DataTable.test.tsx +13 -7
  359. package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +13 -10
  360. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +15 -11
  361. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +12 -6
  362. package/src/components/DataTable/__tests__/keyboard.test.tsx +12 -6
  363. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +10 -6
  364. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +1 -1
  365. package/src/components/DataTable/components/DataTableBody.tsx +10 -25
  366. package/src/components/DataTable/components/DataTableCore.tsx +1 -1
  367. package/src/components/DataTable/components/FilterRow.tsx +3 -1
  368. package/src/components/DataTable/components/ImportModal.tsx +1 -1
  369. package/src/components/DataTable/components/VirtualizedDataTable.tsx +9 -9
  370. package/src/components/DataTable/core/ColumnFactory.ts +6 -6
  371. package/src/components/DataTable/core/DataTableContext.tsx +14 -10
  372. package/src/components/DataTable/core/LocalDataAdapter.ts +2 -1
  373. package/src/components/DataTable/core/PluginRegistry.ts +3 -3
  374. package/src/components/DataTable/core/StateManager.ts +12 -11
  375. package/src/components/DataTable/core/__tests__/ActionManager.test.ts +104 -0
  376. package/src/components/DataTable/core/__tests__/DataManager.test.ts +101 -0
  377. package/src/components/DataTable/core/__tests__/LocalDataAdapter.test.ts +84 -0
  378. package/src/components/DataTable/core/__tests__/PluginRegistry.test.ts +102 -0
  379. package/src/components/DataTable/core/__tests__/StateManager.test.ts +104 -0
  380. package/src/components/DataTable/core/interfaces.ts +17 -17
  381. package/src/components/DataTable/hooks/__tests__/useDataTableConfiguration.test.ts +124 -0
  382. package/src/components/DataTable/hooks/__tests__/useDataTableDataPipeline.test.ts +117 -0
  383. package/src/components/DataTable/hooks/__tests__/useDataTablePermissions.test.ts +102 -0
  384. package/src/components/DataTable/hooks/__tests__/useEffectiveColumnOrder.test.ts +53 -0
  385. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +0 -2
  386. package/src/components/DataTable/hooks/useDataTablePermissions.ts +9 -8
  387. package/src/components/DataTable/types.ts +5 -5
  388. package/src/components/DataTable/utils/aggregationUtils.ts +4 -4
  389. package/src/components/DataTable/utils/columnUtils.ts +3 -2
  390. package/src/components/DataTable/utils/debugTools.ts +1 -1
  391. package/src/components/DataTable/utils/exportUtils.ts +6 -6
  392. package/src/components/DataTable/utils/hierarchicalSorting.ts +6 -6
  393. package/src/components/DataTable/utils/hierarchicalUtils.ts +0 -8
  394. package/src/components/DataTable/utils/index.ts +0 -1
  395. package/src/components/DataTable/utils/performanceUtils.ts +9 -4
  396. package/src/components/Dialog/Dialog.test.tsx +49 -27
  397. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +13 -8
  398. package/src/components/EventSelector/EventSelector.test.tsx +60 -12
  399. package/src/components/EventSelector/EventSelector.tsx +38 -15
  400. package/src/components/EventSelector/index.ts +2 -2
  401. package/src/components/FileDisplay/FileDisplay.test.tsx +143 -85
  402. package/src/components/FileDisplay/FileDisplay.tsx +1 -0
  403. package/src/components/FileUpload/FileUpload.test.tsx +532 -152
  404. package/src/components/FileUpload/FileUpload.tsx +43 -8
  405. package/src/components/Footer/Footer.test.tsx +19 -14
  406. package/src/components/Form/Form.test.tsx +96 -14
  407. package/src/components/Form/Form.tsx +210 -1
  408. package/src/components/Form/index.ts +3 -7
  409. package/src/components/Header/Header.test.tsx +24 -17
  410. package/src/components/Header/Header.tsx +3 -1
  411. package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +2 -4
  412. package/src/components/Input/Input.test.tsx +61 -36
  413. package/src/components/Label/{__tests__/Label.test.tsx → Label.test.tsx} +2 -2
  414. package/src/components/Label/Label.tsx +2 -3
  415. package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +6 -5
  416. package/src/components/LoadingSpinner/LoadingSpinner.tsx +6 -2
  417. package/src/components/LoginForm/LoginForm.test.tsx +14 -13
  418. package/src/components/LoginForm/LoginForm.tsx +1 -1
  419. package/src/components/LoginForm/index.ts +7 -0
  420. package/src/components/NavigationMenu/NavigationMenu.test.tsx +233 -20
  421. package/src/components/NavigationMenu/NavigationMenu.tsx +191 -55
  422. package/src/components/NavigationMenu/index.ts +1 -1
  423. package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +20 -11
  424. package/src/components/OrganisationSelector/OrganisationSelector.tsx +1 -1
  425. package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.integration.test.tsx → PaceAppLayout.integration.test.tsx} +272 -79
  426. package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.performance.test.tsx → PaceAppLayout.performance.test.tsx} +155 -32
  427. package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.security.test.tsx → PaceAppLayout.security.test.tsx} +211 -65
  428. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +498 -210
  429. package/src/components/PaceAppLayout/PaceAppLayout.tsx +63 -64
  430. package/src/components/PaceAppLayout/test-setup.tsx +192 -0
  431. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +193 -39
  432. package/src/components/{PasswordReset → PasswordChange}/PasswordChangeForm.test.tsx +2 -2
  433. package/src/components/{PasswordReset → PasswordChange}/PasswordChangeForm.tsx +10 -4
  434. package/src/components/PasswordChange/index.ts +2 -0
  435. package/src/components/Progress/Progress.test.tsx +11 -0
  436. package/src/components/Progress/Progress.tsx +1 -1
  437. package/src/components/Progress/index.ts +10 -0
  438. package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +2 -1
  439. package/src/components/PublicLayout/PublicLayout.test.tsx +1210 -0
  440. package/src/components/PublicLayout/PublicPageLayout.tsx +190 -36
  441. package/src/components/PublicLayout/PublicPageProvider.tsx +8 -7
  442. package/src/components/PublicLayout/index.ts +10 -28
  443. package/src/components/Select/Select.test.tsx +7 -7
  444. package/src/components/Select/Select.tsx +277 -11
  445. package/src/components/Select/index.ts +1 -2
  446. package/src/components/SessionRestorationLoader/SessionRestorationLoader.test.tsx +232 -0
  447. package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +40 -19
  448. package/src/components/Table/{__tests__/Table.test.tsx → Table.test.tsx} +94 -41
  449. package/src/components/Tabs/Tabs.test.tsx +10 -9
  450. package/src/components/Tabs/Tabs.tsx +61 -33
  451. package/src/components/Textarea/Textarea.test.tsx +31 -18
  452. package/src/components/Toast/Toast.tsx +2 -2
  453. package/src/components/Tooltip/Tooltip.test.tsx +1 -1
  454. package/src/components/UserMenu/UserMenu.test.tsx +7 -6
  455. package/src/components/UserMenu/UserMenu.tsx +2 -2
  456. package/src/components/index.ts +5 -4
  457. package/src/constants/performance.ts +19 -8
  458. package/src/hooks/__tests__/useAppConfig.unit.test.ts +21 -22
  459. package/src/hooks/__tests__/useEvents.unit.test.ts +5 -4
  460. package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +2 -2
  461. package/src/hooks/__tests__/usePermissionCache.simple.test.ts +17 -0
  462. package/src/hooks/__tests__/usePermissionCache.unit.test.ts +16 -11
  463. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +1 -3
  464. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +1 -3
  465. package/src/hooks/__tests__/useRBAC.unit.test.ts +24 -2
  466. package/src/hooks/index.ts +4 -0
  467. package/src/hooks/public/index.ts +2 -0
  468. package/src/hooks/public/usePublicEvent.ts +4 -6
  469. package/src/hooks/public/usePublicEventLogo.test.ts +147 -0
  470. package/src/hooks/public/usePublicRouteParams.ts +1 -1
  471. package/src/hooks/services/useAuth.ts +2 -4
  472. package/src/hooks/services/useCurrentEvent.ts +1 -1
  473. package/src/hooks/useAppConfig.ts +1 -1
  474. package/src/hooks/useDataTablePerformance.ts +2 -2
  475. package/src/hooks/useEventTheme.ts +1 -1
  476. package/src/hooks/useEvents.ts +51 -10
  477. package/src/hooks/useOrganisationPermissions.test.ts +3 -3
  478. package/src/hooks/useOrganisationPermissions.ts +1 -1
  479. package/src/hooks/useOrganisationSecurity.ts +2 -2
  480. package/src/hooks/usePermissionCache.test.ts +9 -9
  481. package/src/hooks/usePermissionCache.ts +2 -2
  482. package/src/index.ts +19 -12
  483. package/src/providers/OrganisationProvider.tsx +73 -9
  484. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +113 -13
  485. package/src/providers/__tests__/AuthProvider.test.tsx +2 -1
  486. package/src/providers/__tests__/EventProvider.test.tsx +24 -15
  487. package/src/providers/__tests__/OrganisationProvider.test.tsx +87 -36
  488. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +80 -24
  489. package/src/providers/index.ts +0 -3
  490. package/src/providers/services/AuthServiceProvider.tsx +2 -17
  491. package/src/providers/services/EventServiceProvider.tsx +11 -16
  492. package/src/providers/services/InactivityServiceProvider.tsx +9 -12
  493. package/src/providers/services/OrganisationServiceProvider.tsx +9 -12
  494. package/src/providers/services/UnifiedAuthProvider.tsx +85 -18
  495. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +11 -4
  496. package/src/rbac/__tests__/scenarios.user-role.test.tsx +105 -21
  497. package/src/rbac/adapters.tsx +1 -1
  498. package/src/rbac/api.ts +20 -4
  499. package/src/rbac/audit-enhanced.ts +47 -2
  500. package/src/rbac/audit.ts +47 -2
  501. package/src/rbac/components/NavigationGuard.tsx +1 -1
  502. package/src/rbac/components/NavigationProvider.test.tsx +7 -6
  503. package/src/rbac/components/NavigationProvider.tsx +1 -1
  504. package/src/rbac/components/PagePermissionGuard.tsx +1 -1
  505. package/src/rbac/components/PagePermissionProvider.test.tsx +7 -6
  506. package/src/rbac/components/PagePermissionProvider.tsx +1 -1
  507. package/src/rbac/components/PermissionEnforcer.tsx +1 -1
  508. package/src/rbac/components/RoleBasedRouter.tsx +1 -1
  509. package/src/rbac/components/SecureDataProvider.test.tsx +7 -6
  510. package/src/rbac/components/SecureDataProvider.tsx +1 -1
  511. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +6 -6
  512. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +11 -10
  513. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +10 -11
  514. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +19 -15
  515. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +13 -12
  516. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +19 -15
  517. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +18 -18
  518. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +11 -10
  519. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +8 -7
  520. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +10 -11
  521. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +48 -19
  522. package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +476 -0
  523. package/src/rbac/hooks/index.ts +3 -0
  524. package/src/rbac/hooks/usePermissions.ts +31 -85
  525. package/src/rbac/hooks/useRBAC.test.ts +13 -1
  526. package/src/rbac/hooks/useRBAC.ts +13 -67
  527. package/src/rbac/hooks/useResolvedScope.ts +11 -0
  528. package/src/rbac/hooks/useSecureSupabase.ts +308 -0
  529. package/src/rbac/index.ts +3 -0
  530. package/src/rbac/secureClient.ts +53 -6
  531. package/src/rbac/security.ts +37 -1
  532. package/src/{types/rbac-functions.ts → rbac/types/functions.ts} +30 -30
  533. package/src/rbac/types.ts +3 -2
  534. package/src/services/AuthService.ts +33 -25
  535. package/src/services/EventService.ts +56 -44
  536. package/src/services/InactivityService.ts +33 -53
  537. package/src/services/OrganisationService.ts +36 -40
  538. package/src/services/__tests__/AuthService.restoreSession.test.ts +6 -2
  539. package/src/services/__tests__/EventService.test.ts +67 -33
  540. package/src/services/interfaces/IEventService.ts +1 -1
  541. package/src/styles/core.css +2 -2
  542. package/src/styles/index.test.ts +21 -0
  543. package/src/styles/index.ts +1 -5
  544. package/src/types/__tests__/guards.test.ts +1 -1
  545. package/src/types/__tests__/organisation.roles.test.ts +55 -0
  546. package/src/types/__tests__/type-validation.test.ts +0 -1
  547. package/src/types/auth.ts +42 -2
  548. package/src/types/core.ts +251 -0
  549. package/src/types/database.ts +11 -496
  550. package/src/types/event.ts +102 -0
  551. package/src/types/file-reference.ts +6 -4
  552. package/src/types/guards.ts +2 -1
  553. package/src/types/index.ts +48 -14
  554. package/src/types/lodash.debounce.d.ts +15 -0
  555. package/src/types/organisation.ts +14 -10
  556. package/src/types/supabase.ts +15 -17
  557. package/src/utils/__tests__/secureErrors.unit.test.ts +1 -1
  558. package/src/utils/__tests__/validationUtils.unit.test.ts +0 -29
  559. package/src/utils/app/appNameResolver.ts +1 -1
  560. package/src/utils/audit/audit.test.ts +65 -0
  561. package/src/utils/device/deviceFingerprint.test.ts +171 -0
  562. package/src/utils/dynamic/dynamicUtils.ts +3 -2
  563. package/src/utils/file-reference/index.ts +25 -6
  564. package/src/utils/security/secureErrors.ts +1 -1
  565. package/src/utils/validation/__tests__/validationUtils.test.ts +72 -0
  566. package/src/utils/validation/index.ts +6 -12
  567. package/src/utils/validation/validationUtils.ts +0 -13
  568. package/dist/UnifiedAuthProvider-B37ATQHE.js +0 -16
  569. package/dist/auth-DReDSLq9.d.ts +0 -16
  570. package/dist/chunk-3JI76CYK.js +0 -2444
  571. package/dist/chunk-3JI76CYK.js.map +0 -1
  572. package/dist/chunk-56XJ3TU6.js +0 -11
  573. package/dist/chunk-56XJ3TU6.js.map +0 -1
  574. package/dist/chunk-5MT24GKJ.js.map +0 -1
  575. package/dist/chunk-7QCC6MCP.js +0 -288
  576. package/dist/chunk-BESYRHQM.js.map +0 -1
  577. package/dist/chunk-BJPBT3CU.js +0 -21
  578. package/dist/chunk-BJPBT3CU.js.map +0 -1
  579. package/dist/chunk-BVYWGZVV.js.map +0 -1
  580. package/dist/chunk-CX5M4ZAG.js.map +0 -1
  581. package/dist/chunk-D7LCGMVS.js.map +0 -1
  582. package/dist/chunk-EGI6MUL6.js +0 -27
  583. package/dist/chunk-EGI6MUL6.js.map +0 -1
  584. package/dist/chunk-ERISIBYU.js.map +0 -1
  585. package/dist/chunk-HRO5HWN2.js.map +0 -1
  586. package/dist/chunk-HZLDFOE4.js.map +0 -1
  587. package/dist/chunk-JISYG63F.js +0 -70
  588. package/dist/chunk-JISYG63F.js.map +0 -1
  589. package/dist/chunk-LIMSTKYD.js +0 -61
  590. package/dist/chunk-LIMSTKYD.js.map +0 -1
  591. package/dist/chunk-OWAG3GSU.js.map +0 -1
  592. package/dist/chunk-PPMP5J6T.js.map +0 -1
  593. package/dist/chunk-Q5QRDWKI.js.map +0 -1
  594. package/dist/chunk-S5OFRT4M.js.map +0 -1
  595. package/dist/chunk-SBVILCCA.js.map +0 -1
  596. package/dist/chunk-TUMEWN34.js +0 -15
  597. package/dist/chunk-TUMEWN34.js.map +0 -1
  598. package/dist/chunk-XDNLUEXI.js +0 -138
  599. package/dist/chunk-XJ2HZOBU.js.map +0 -1
  600. package/dist/chunk-ZYTYSTO5.js.map +0 -1
  601. package/dist/chunk-ZZ2SS7NI.js +0 -237
  602. package/dist/chunk-ZZ2SS7NI.js.map +0 -1
  603. package/dist/database-C6jy7EOu.d.ts +0 -500
  604. package/dist/organisation-D6qRDtbF.d.ts +0 -93
  605. package/dist/schema-DTDZQe2u.d.ts +0 -28
  606. package/dist/unified-DQ4VcT7H.d.ts +0 -198
  607. package/dist/useInactivityTracker-TO6ZOF35.js +0 -11
  608. package/dist/validation.d.ts +0 -47
  609. package/dist/validation.js +0 -24
  610. package/dist/validation.js.map +0 -1
  611. package/docs/DOCUMENTATION_AUDIT.md +0 -172
  612. package/docs/DOCUMENTATION_STANDARD.md +0 -137
  613. package/docs/api/classes/PublicErrorBoundary.md +0 -132
  614. package/docs/api/interfaces/EventLogoProps.md +0 -152
  615. package/docs/api/interfaces/PublicErrorBoundaryProps.md +0 -94
  616. package/docs/api/interfaces/PublicErrorBoundaryState.md +0 -68
  617. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +0 -86
  618. package/docs/architecture/rpc-function-standards.md +0 -1106
  619. package/docs/getting-started/consuming-app-vite-config.md +0 -239
  620. package/docs/implementation-guides/event-theming-summary.md +0 -226
  621. package/docs/implementation-guides/public-pages-advanced.md +0 -1038
  622. package/docs/migration/v0.4.15-tailwind-scanning.md +0 -278
  623. package/docs/migration/v0.4.16-css-first-approach.md +0 -312
  624. package/docs/migration/v0.4.17-source-path-fix.md +0 -235
  625. package/docs/rbac/RBAC_EVENT_CONTEXT_LOADING.md +0 -222
  626. package/docs/rbac/RBAC_LOGIN_SAFETY_FIX.md +0 -95
  627. package/docs/rbac/RBAC_V0.5.147_FIX.md +0 -117
  628. package/docs/rbac/README-rbac-rls-integration.md +0 -374
  629. package/docs/styles/usage.md +0 -227
  630. package/docs/testing/visual-testing.md +0 -120
  631. package/docs/troubleshooting/DEBUG_NETWORK_ERROR.md +0 -152
  632. package/docs/troubleshooting/FIX_SUPABASE_CORS.md +0 -184
  633. package/docs/troubleshooting/cake-page-permission-guard-issue-summary.md +0 -193
  634. package/docs/troubleshooting/database-view-compatibility.md +0 -125
  635. package/docs/troubleshooting/react-hooks-issue-analysis.md +0 -172
  636. package/docs/troubleshooting/tailwind-content-scanning.md +0 -219
  637. package/examples/RBAC/EventBasedApp.tsx +0 -239
  638. package/examples/RBAC/PermissionExample.tsx +0 -151
  639. package/examples/STRUCTURE.md +0 -125
  640. package/examples/components 2/DataTable/HierarchicalExample.tsx +0 -475
  641. package/examples/components 2/Dialog/BasicHtmlTest.tsx +0 -55
  642. package/examples/components 2/Dialog/DebugHtmlExample.tsx +0 -68
  643. package/examples/components 2/Dialog/HtmlDialogExample.tsx +0 -202
  644. package/examples/components 2/Dialog/SimpleHtmlTest.tsx +0 -61
  645. package/examples/components 2/Dialog/SmartDialogExample.tsx +0 -322
  646. package/examples/components 2/index.ts +0 -11
  647. package/examples/features/index.ts +0 -12
  648. package/examples/features/rbac/CompleteRBACExample.tsx +0 -324
  649. package/examples/features/rbac/index.ts +0 -13
  650. package/examples/public-pages/CorrectPublicPageImplementation.tsx +0 -301
  651. package/examples/public-pages/PublicEventPage.tsx +0 -274
  652. package/examples/public-pages/PublicPageApp.tsx +0 -308
  653. package/examples/public-pages/PublicPageUsageExample.tsx +0 -216
  654. package/examples/public-pages/index.ts +0 -14
  655. package/src/__tests__/TEST_STANDARD.md +0 -1008
  656. package/src/components/Checkbox/__mocks__/Checkbox.tsx +0 -2
  657. package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +0 -421
  658. package/src/components/DataTable/examples/InitialPageSizeExample.tsx +0 -177
  659. package/src/components/DataTable/examples/PerformanceExample.tsx +0 -506
  660. package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +0 -316
  661. package/src/components/DataTable/examples/__tests__/HierarchicalExample.test.tsx +0 -45
  662. package/src/components/DataTable/examples/__tests__/InitialPageSizeExample.test.tsx +0 -211
  663. package/src/components/DataTable/examples/__tests__/PerformanceExample.test.tsx +0 -126
  664. package/src/components/Dialog/README.md +0 -804
  665. package/src/components/Dialog/examples/BasicHtmlTest.tsx +0 -55
  666. package/src/components/Dialog/examples/DebugHtmlExample.tsx +0 -68
  667. package/src/components/Dialog/examples/ScrollableDialogExample.tsx +0 -290
  668. package/src/components/Dialog/examples/SimpleHtmlTest.tsx +0 -61
  669. package/src/components/Dialog/examples/__tests__/HtmlDialogExample.test.tsx +0 -71
  670. package/src/components/Dialog/examples/__tests__/SimpleHtmlTest.test.tsx +0 -122
  671. package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +0 -147
  672. package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +0 -611
  673. package/src/components/Dialog/utils/safeHtml.ts +0 -185
  674. package/src/components/EventSelector/types.ts +0 -79
  675. package/src/components/Form/FormErrorSummary.tsx +0 -113
  676. package/src/components/Form/FormField.tsx +0 -249
  677. package/src/components/Form/FormFieldset.tsx +0 -127
  678. package/src/components/Form/FormLiveRegion.tsx +0 -198
  679. package/src/components/Input/__mocks__/Input.tsx +0 -2
  680. package/src/components/NavigationMenu/types.ts +0 -85
  681. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +0 -326
  682. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -1078
  683. package/src/components/PasswordReset/PasswordResetForm.test.tsx +0 -597
  684. package/src/components/PasswordReset/PasswordResetForm.tsx +0 -201
  685. package/src/components/PasswordReset/index.ts +0 -2
  686. package/src/components/ProtectedRoute/README.md +0 -164
  687. package/src/components/PublicLayout/EventLogo.tsx +0 -175
  688. package/src/components/PublicLayout/PublicErrorBoundary.tsx +0 -282
  689. package/src/components/PublicLayout/PublicLoadingSpinner.tsx +0 -216
  690. package/src/components/PublicLayout/PublicPageContextChecker.tsx +0 -131
  691. package/src/components/PublicLayout/PublicPageDebugger.tsx +0 -104
  692. package/src/components/PublicLayout/PublicPageDiagnostic.tsx +0 -162
  693. package/src/components/PublicLayout/PublicPageFooter.tsx +0 -124
  694. package/src/components/PublicLayout/PublicPageHeader.tsx +0 -209
  695. package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +0 -449
  696. package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +0 -393
  697. package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +0 -192
  698. package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +0 -351
  699. package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +0 -402
  700. package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +0 -460
  701. package/src/components/PublicLayout/__tests__/PublicPageProvider.test.tsx +0 -313
  702. package/src/components/Select/hooks.ts +0 -289
  703. package/src/hooks/useCounter.test.ts +0 -131
  704. package/src/hooks/useDebounce.test.ts +0 -375
  705. package/src/providers/AuthProvider.tsx +0 -15
  706. package/src/providers/EventProvider.tsx +0 -16
  707. package/src/providers/InactivityProvider.tsx +0 -15
  708. package/src/providers/OrganisationProvider.context.test.tsx +0 -169
  709. package/src/providers/UnifiedAuthProvider.tsx +0 -15
  710. package/src/types/theme.ts +0 -6
  711. package/src/types/unified.ts +0 -265
  712. package/src/utils/appConfig.ts +0 -47
  713. package/src/utils/appIdResolver.test.ts +0 -499
  714. package/src/utils/appIdResolver.ts +0 -130
  715. package/src/utils/appNameResolver.simple.test.ts +0 -212
  716. package/src/utils/appNameResolver.test.ts +0 -121
  717. package/src/utils/appNameResolver.ts +0 -191
  718. package/src/utils/audit.ts +0 -127
  719. package/src/utils/auth-utils.ts +0 -96
  720. package/src/utils/bundleAnalysis.ts +0 -129
  721. package/src/utils/debugLogger.ts +0 -67
  722. package/src/utils/deviceFingerprint.ts +0 -215
  723. package/src/utils/dynamicUtils.ts +0 -105
  724. package/src/utils/file-reference.test.ts +0 -788
  725. package/src/utils/file-reference.ts +0 -519
  726. package/src/utils/formatDate.test.ts +0 -237
  727. package/src/utils/formatting.ts +0 -170
  728. package/src/utils/lazyLoad.tsx +0 -44
  729. package/src/utils/logger.ts +0 -179
  730. package/src/utils/organisationContext.test.ts +0 -322
  731. package/src/utils/organisationContext.ts +0 -153
  732. package/src/utils/performanceBenchmark.ts +0 -64
  733. package/src/utils/performanceBudgets.ts +0 -110
  734. package/src/utils/permissionTypes.ts +0 -37
  735. package/src/utils/permissionUtils.test.ts +0 -393
  736. package/src/utils/permissionUtils.ts +0 -34
  737. package/src/utils/sanitization.ts +0 -264
  738. package/src/utils/schemaUtils.ts +0 -37
  739. package/src/utils/secureDataAccess.test.ts +0 -711
  740. package/src/utils/secureDataAccess.ts +0 -377
  741. package/src/utils/secureErrors.ts +0 -79
  742. package/src/utils/security.ts +0 -156
  743. package/src/utils/securityMonitor.ts +0 -45
  744. package/src/utils/sessionTracking.ts +0 -126
  745. package/src/utils/validation.ts +0 -111
  746. package/src/utils/validationUtils.ts +0 -120
  747. package/src/validation/index.ts +0 -12
  748. /package/dist/{DataTable-UA6CL4JI.js.map → DataTable-QAB34V6K.js.map} +0 -0
  749. /package/dist/{UnifiedAuthProvider-B37ATQHE.js.map → UnifiedAuthProvider-7F6T4B6K.js.map} +0 -0
  750. /package/dist/{api-45XYYO2A.js.map → api-ROMBCNKU.js.map} +0 -0
  751. /package/dist/{audit-64X3VJXB.js.map → audit-WRS3KJKI.js.map} +0 -0
  752. /package/dist/{chunk-PLDDJCW6.js.map → chunk-7D4SUZUM.js.map} +0 -0
  753. /package/dist/{useInactivityTracker-TO6ZOF35.js.map → chunk-KQCRWDSA.js.map} +0 -0
  754. /package/examples/{components 2/DataTable → DataTable}/InitialPageSizeExample.tsx +0 -0
  755. /package/examples/{features/public-pages → PublicPages}/index.ts +0 -0
  756. /package/examples/{RBAC → rbac}/index.ts +0 -0
@@ -194,16 +194,69 @@
194
194
  import * as React from "react";
195
195
  import { Menu, ChevronDown } from "lucide-react";
196
196
  import { cn } from "../../utils/core/cn";
197
- import { NavigationMenuProps, NavigationItem } from "./types";
198
197
  import { Button } from "../Button";
199
198
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../Select";
200
- import { useUnifiedAuth } from "../../providers/UnifiedAuthProvider";
199
+ import { useUnifiedAuth } from "../../providers/services/UnifiedAuthProvider";
201
200
  import { useRBAC } from "../../rbac/hooks/useRBAC";
202
201
  import { useResolvedScope } from "../../rbac/hooks";
203
202
  import { usePermissions } from "../../rbac/hooks/usePermissions";
204
- import type { Permission, AccessLevel as RBACAccessLevel } from "../../rbac/types";
203
+ import type { Permission, AccessLevel as RBACAccessLevel, UUID } from "../../rbac/types";
205
204
  import { logger } from "../../utils/core/logger";
206
205
 
206
+ /**
207
+ * Navigation mode type
208
+ */
209
+ export type NavigationMode = 'dropdown' | 'hierarchical';
210
+
211
+ /**
212
+ * Navigation item metadata
213
+ */
214
+ export interface NavigationItemMeta {
215
+ hidden?: boolean;
216
+ [key: string]: unknown;
217
+ }
218
+
219
+ /**
220
+ * Navigation item interface
221
+ */
222
+ export interface NavigationItem {
223
+ id: string;
224
+ label: string;
225
+ href?: string;
226
+ icon?: string;
227
+ children?: NavigationItem[];
228
+ permissions?: (Permission | string)[];
229
+ roles?: string[];
230
+ accessLevel?: RBACAccessLevel | string;
231
+ meta?: NavigationItemMeta;
232
+ pageId?: string;
233
+ }
234
+
235
+ /**
236
+ * Navigation menu component props
237
+ */
238
+ export interface NavigationMenuProps extends React.HTMLAttributes<HTMLDivElement> {
239
+ items: NavigationItem[];
240
+ mode?: NavigationMode;
241
+ currentPath?: string;
242
+ onNavigate?: (item: NavigationItem) => void;
243
+ className?: string;
244
+ disabled?: boolean;
245
+ buttonText?: string;
246
+ showIcons?: boolean;
247
+ navigationLabel?: string;
248
+ strictMode?: boolean;
249
+ auditLog?: boolean;
250
+ onNavigationAccessDenied?: (item: NavigationItem) => void;
251
+ onStrictModeViolation?: (item: NavigationItem, reason: string) => void;
252
+ /**
253
+ * If true, indicates that items have already been filtered by the parent component (e.g., PaceAppLayout).
254
+ * When true, NavigationMenu will skip expensive permission checks and trust the provided items.
255
+ * This significantly improves performance when items are pre-filtered.
256
+ */
257
+ itemsPreFiltered?: boolean;
258
+ }
259
+
207
260
  /**
208
261
  * Unified NavigationMenu component that supports both dropdown and hierarchical navigation modes.
209
262
  *
@@ -346,7 +399,7 @@ import { logger } from "../../utils/core/logger";
346
399
  * onNavigate={(item) => navigate(item.href)}
347
400
  * buttonText="Navigation"
348
401
  * navigationLabel="Main application navigation"
349
- * filterByPermissions={true}
402
+ * // Permission filtering is always enabled - no prop needed
350
403
  * auditLog={true}
351
404
  * />
352
405
  * );
@@ -413,7 +466,7 @@ export const NavigationMenu = React.forwardRef<
413
466
  auditLog = true,
414
467
  onNavigationAccessDenied,
415
468
  onStrictModeViolation,
416
- filterByPermissions = true,
469
+ itemsPreFiltered = false,
417
470
  ...props
418
471
  }, ref) => {
419
472
  const [expandedItems, setExpandedItems] = React.useState<Set<string>>(new Set());
@@ -448,13 +501,14 @@ export const NavigationMenu = React.forwardRef<
448
501
 
449
502
  // Get resolved scope for permission checks
450
503
  // Note: Always call useResolvedScope (hooks must be called unconditionally)
451
- // When filterByPermissions is false, we'll simply ignore the resolved scope
504
+ // However, if itemsPreFiltered is true, we'll skip using the results to avoid blocking
505
+ // Permission filtering is always enabled - scope is always needed (unless items are pre-filtered)
452
506
  const { supabase } = authContext || {};
453
507
  const { selectedOrganisation } = authContext || {};
454
508
  const { resolvedScope, isLoading: scopeLoading, error: scopeError } = useResolvedScope({
455
- supabase: filterByPermissions ? (supabase || null) : null,
456
- selectedOrganisationId: filterByPermissions ? (selectedOrganisation?.id || null) : null,
457
- selectedEventId: filterByPermissions ? (selectedEvent?.event_id || null) : null
509
+ supabase: itemsPreFiltered ? null : (supabase || null), // Skip expensive resolution if pre-filtered
510
+ selectedOrganisationId: itemsPreFiltered ? null : (selectedOrganisation?.id || null),
511
+ selectedEventId: itemsPreFiltered ? null : (selectedEvent?.event_id || null)
458
512
  });
459
513
 
460
514
  // Resolve appId when useResolvedScope fails but context is ready
@@ -500,13 +554,18 @@ export const NavigationMenu = React.forwardRef<
500
554
  // Build scope from resolvedScope if available, otherwise fall back to context values
501
555
  // This handles the case where useResolvedScope errored initially but context is now ready
502
556
  // IMPORTANT: We need appId for usePermissions to work correctly
557
+ // CRITICAL: Use selectedOrganisation?.id immediately when available, even during loading
558
+ // This prevents usePermissions from skipping fetch due to empty organisationId
503
559
  const effectiveScope = React.useMemo(() => {
504
- if (!scopeLoading && resolvedScope?.organisationId) {
505
- // Use resolved scope if available (includes appId)
560
+ // Prefer resolvedScope if available (includes appId)
561
+ if (resolvedScope?.organisationId) {
506
562
  return resolvedScope;
507
- } else if (!scopeLoading && selectedOrganisation?.id) {
508
- // Fall back to building scope from context if resolvedScope is null but context is ready
509
- // Use resolvedAppId if we've resolved it, otherwise undefined (usePermissions will try to resolve)
563
+ }
564
+
565
+ // Fall back to building scope from context if resolvedScope is not available yet
566
+ // Use selectedOrganisation?.id immediately when available, even if scopeLoading is true
567
+ // This prevents delay in permission fetching
568
+ if (selectedOrganisation?.id) {
510
569
  const fallbackScope = {
511
570
  organisationId: selectedOrganisation.id,
512
571
  eventId: selectedEvent?.event_id || undefined,
@@ -514,8 +573,9 @@ export const NavigationMenu = React.forwardRef<
514
573
  };
515
574
  return fallbackScope;
516
575
  }
576
+
517
577
  return null;
518
- }, [scopeLoading, resolvedScope, selectedOrganisation?.id, selectedEvent?.event_id, resolvedAppId]);
578
+ }, [resolvedScope, selectedOrganisation?.id, selectedEvent?.event_id, resolvedAppId]);
519
579
 
520
580
  // Create a stable scope object that changes when effectiveScope changes
521
581
  // This ensures usePermissions detects scope changes and re-runs
@@ -543,16 +603,21 @@ export const NavigationMenu = React.forwardRef<
543
603
  }, [scopeKey, effectiveScope]);
544
604
 
545
605
  // Get permissions map for synchronous permission checks
546
- const userId = authContext?.user?.id || '';
606
+ // Skip expensive permission fetching if items are pre-filtered
607
+ const userId = (authContext?.user?.id || '') as UUID;
547
608
 
548
609
  // Call usePermissions with primitive parameters
610
+ // If itemsPreFiltered is true, pass null/undefined to skip expensive permission fetching
611
+ // CRITICAL: Pass null for userId and undefined for organisationId to skip the 3-second timeout
612
+ // Empty string '' triggers the timeout, but null/undefined allows immediate early return
549
613
  const { permissions: permissionMap, hasAnyPermission, isLoading: permissionsLoading, error: permissionsError } = usePermissions(
550
- userId as any,
551
- stableScope.organisationId,
552
- stableScope.eventId,
553
- stableScope.appId
614
+ itemsPreFiltered ? (null as any) : userId, // Pass null to trigger early return (empty string would wait 3s)
615
+ itemsPreFiltered ? undefined : stableScope.organisationId, // Pass undefined to skip timeout
616
+ itemsPreFiltered ? undefined : stableScope.eventId, // Skip if pre-filtered
617
+ itemsPreFiltered ? undefined : stableScope.appId // Skip if pre-filtered
554
618
  );
555
619
 
620
+
556
621
 
557
622
  // NEW: Phase 2 - Enhanced Security Features
558
623
  // Filter navigation items based on permissions using RBAC hooks
@@ -560,10 +625,21 @@ export const NavigationMenu = React.forwardRef<
560
625
  const previousFilteredItemsRef = React.useRef<NavigationItem[]>([]);
561
626
 
562
627
  const filteredItems = React.useMemo(() => {
563
- // Security: If filtering is enabled but we're missing required context or still loading, show NO items
628
+ // PERFORMANCE OPTIMIZATION: If items are pre-filtered, skip all expensive permission checks
629
+ // This significantly improves load time when PaceAppLayout has already filtered items
630
+ if (itemsPreFiltered && items && items.length > 0) {
631
+ // Items are pre-filtered by parent (e.g., PaceAppLayout) - trust them and only filter hidden items
632
+ const visibleItems = (items || []).filter(item => !item.meta?.hidden);
633
+ previousFilteredItemsRef.current = visibleItems;
634
+ // Don't log here - logging happens in useEffect to avoid spam on re-renders
635
+ return visibleItems;
636
+ }
637
+
638
+ // SECURITY: Permission filtering is ALWAYS enabled - users only see navigation items they have permission to access
639
+ // Security: If we're missing required context or still loading, show NO items
564
640
  // This prevents security risk of showing items before permissions are verified
565
- if (filterByPermissions) {
566
- // CRITICAL: Wait for BOTH organisation AND event context to be ready before checking permissions
641
+
642
+ // CRITICAL: Wait for BOTH organisation AND event context to be ready before checking permissions
567
643
  // This prevents the error "No organisation or event context available" when event context is still loading
568
644
  const isOrgContextReady = orgContextReady && selectedOrganisation?.id;
569
645
  // Event context is ready when not loading
@@ -581,7 +657,22 @@ export const NavigationMenu = React.forwardRef<
581
657
  const shouldWaitForScope = scopeLoading || (!hasValidContext);
582
658
  const shouldRetryAfterError = scopeError && hasValidContext && !scopeLoading;
583
659
 
584
- // During initial load or when scope/context is loading, show nothing
660
+ // During initial load or when scope/context is loading, check if we can trust PaceAppLayout's filtering
661
+ // CRITICAL: If items are provided and we have valid context, trust PaceAppLayout's filtering
662
+ // This prevents delay - PaceAppLayout already filtered items, so show them immediately
663
+ // even if scope is still loading or rbacContext is not yet available
664
+ if (items && items.length > 0 && selectedOrganisation?.id) {
665
+ // Items are provided by PaceAppLayout - trust its filtering and show immediately
666
+ // This eliminates delay while usePermissions/useResolvedScope are still loading
667
+ // Items provided - trusting PaceAppLayout filtering (removed verbose logging)
668
+ // Filter out hidden items only - PaceAppLayout already did permission filtering
669
+ const visibleItems = (items || []).filter(item => !item.meta?.hidden);
670
+ // Store in ref for use during permission refetches
671
+ previousFilteredItemsRef.current = visibleItems;
672
+ return visibleItems;
673
+ }
674
+
675
+ // If no items provided or no valid context, wait for context to be ready
585
676
  if (!authContext || !rbacContext || (shouldWaitForScope && !shouldRetryAfterError)) {
586
677
  // Still loading - show nothing to prevent security risk
587
678
  // Note: We check both org and event context readiness to prevent premature permission checks
@@ -601,24 +692,58 @@ export const NavigationMenu = React.forwardRef<
601
692
  if (previousFilteredItemsRef.current.length > 0) {
602
693
  return previousFilteredItemsRef.current;
603
694
  }
695
+ // CRITICAL: If items are provided and we have valid scope, trust PaceAppLayout's filtering
696
+ // This prevents delay - PaceAppLayout already filtered items, so show them immediately
697
+ // even if usePermissions is still loading
698
+ if (items && items.length > 0 && stableScope.organisationId) {
699
+ // Permissions loading but items provided - trusting PaceAppLayout filtering (removed verbose logging)
700
+ // Filter out hidden items only - PaceAppLayout already did permission filtering
701
+ return (items || []).filter(item => !item.meta?.hidden);
702
+ }
604
703
  // Otherwise, show nothing during initial load
605
704
  return [];
606
705
  }
607
706
 
608
- // If there's an error or empty permission map after loading, show nothing
707
+ // If there's an error after loading, show nothing
609
708
  // Security: Better to show nothing than risk showing unauthorized items
610
- if (permissionsError || !permissionMap || Object.keys(permissionMap).length === 0) {
611
- logger.warn('NavigationMenu', 'Permission map is empty or has error - showing no items for security', {
612
- permissionsError: permissionsError?.message,
613
- permissionMapSize: permissionMap ? Object.keys(permissionMap).length : 0
709
+ if (permissionsError) {
710
+ logger.warn('NavigationMenu', 'Permission check error - showing no items for security', {
711
+ permissionsError: permissionsError?.message
614
712
  });
615
713
  return [];
616
714
  }
617
- } else {
618
- // Filtering disabled - only filter out hidden items
619
- return (items || []).filter(item => !item.meta?.hidden);
620
- }
715
+
716
+ // If permission map is empty after loading, we need to handle this carefully:
717
+ // 1. If items were already filtered by PaceAppLayout (which uses getPermissionMap directly),
718
+ // we should trust those items and show them (they've already been filtered)
719
+ // 2. If NavigationMenu is used standalone, we need permissions to filter - show nothing
720
+ //
721
+ // Since PaceAppLayout filters items before passing to NavigationMenu, and NavigationMenu
722
+ // uses usePermissions hook which may return empty map while PaceAppLayout gets permissions,
723
+ // we should trust items that are provided if permission map is empty but we have valid scope.
724
+ // This is safe because PaceAppLayout already filtered them using getPermissionMap.
725
+ if (!permissionMap || Object.keys(permissionMap).length === 0) {
726
+ // If we have valid scope and items are provided, they were likely already filtered by PaceAppLayout
727
+ // In this case, trust the items and show them (they've already been filtered for security)
728
+ if (stableScope.organisationId && items && items.length > 0) {
729
+ // Permission map empty but items provided - trusting PaceAppLayout filtering (removed verbose logging)
730
+ // Items were already filtered by PaceAppLayout - trust them and only filter hidden items
731
+ return (items || []).filter(item => !item.meta?.hidden);
732
+ }
733
+
734
+ // If no items provided or no valid scope, show nothing (can't verify permissions)
735
+ if (stableScope.organisationId) {
736
+ logger.warn('NavigationMenu', 'Permission map is empty and no items provided - showing nothing', {
737
+ permissionMapSize: 0,
738
+ organisationId: stableScope.organisationId,
739
+ eventId: stableScope.eventId,
740
+ appId: stableScope.appId
741
+ });
742
+ }
743
+ return [];
744
+ }
621
745
 
746
+ // SECURITY: Permission filtering is always enabled - filtering cannot be disabled
622
747
  // Helper function to derive page ID from href
623
748
  const getPageIdFromHref = (href?: string): string | null => {
624
749
  if (!href) return null;
@@ -780,7 +905,7 @@ export const NavigationMenu = React.forwardRef<
780
905
  return filtered;
781
906
  }, [
782
907
  items,
783
- filterByPermissions,
908
+ itemsPreFiltered, // Add itemsPreFiltered to dependencies
784
909
  authContext,
785
910
  rbacContext,
786
911
  permissionMap,
@@ -799,22 +924,8 @@ export const NavigationMenu = React.forwardRef<
799
924
  selectedOrganisation?.id
800
925
  ]);
801
926
 
802
- // Log navigation access attempts for debugging
803
- React.useEffect(() => {
804
- if (auditLog && authContext) {
805
- // Find the current navigation item to log its actual permissions
806
- const currentItem = items?.find(item => item.href === currentPath || item.id === 'navigation-menu');
807
- logger.debug('NavigationMenu', 'Navigation access attempt:', {
808
- itemId: currentItem?.id || 'navigation-menu',
809
- label: currentItem?.label || 'Navigation Menu',
810
- href: currentPath,
811
- permissions: currentItem?.permissions || null,
812
- roles: currentItem?.roles || null,
813
- accessLevel: currentItem?.accessLevel || null,
814
- timestamp: new Date().toISOString()
815
- });
816
- }
817
- }, [auditLog, authContext, currentPath, items]);
927
+ // Note: Navigation access attempts are logged in handleItemClick, not here
928
+ // This prevents excessive logging on every render
818
929
 
819
930
 
820
931
  // Handle keyboard navigation for hierarchical mode
@@ -851,7 +962,7 @@ export const NavigationMenu = React.forwardRef<
851
962
  // Handle navigation item click
852
963
  const handleItemClick = (item: NavigationItem) => {
853
964
  // NEW: Phase 2 - Enhanced Security Features
854
- // Log navigation access attempt for audit
965
+ // Log navigation access attempt for audit (minimal logging)
855
966
  if (auditLog) {
856
967
  logger.debug('NavigationMenu', 'Navigation access attempt:', {
857
968
  itemId: item.id,
@@ -876,12 +987,28 @@ export const NavigationMenu = React.forwardRef<
876
987
  }
877
988
 
878
989
  // Check if item should be visible (already filtered)
990
+ // If item is in filteredItems, it has already passed permission checks in PaceAppLayout
879
991
  const isItemVisible = filteredItems.some(filtered => filtered.id === item.id);
880
992
 
993
+ // If item is not visible, it was filtered out - don't allow navigation
994
+ if (!isItemVisible) {
995
+ logger.warn('NavigationMenu', 'Navigation attempt to filtered item blocked', {
996
+ itemId: item.id,
997
+ label: item.label,
998
+ href: item.href
999
+ });
1000
+ return;
1001
+ }
1002
+
881
1003
  // Check permissions if the item requires them using RBAC hooks
1004
+ // Only check if item has explicit permission requirements AND we have permission checking capability
882
1005
  let hasPermission = true; // Default to true if no permission requirements
883
1006
 
884
- if (item.permissions && item.permissions.length > 0 && rbacContext && hasAnyPermission) {
1007
+ // Only check permissions if:
1008
+ // 1. Item has explicit permission requirements
1009
+ // 2. We have RBAC context
1010
+ // 3. We have hasAnyPermission function AND permission map is loaded (not empty)
1011
+ if (item.permissions && item.permissions.length > 0 && rbacContext && hasAnyPermission && permissionMap && Object.keys(permissionMap).length > 0) {
885
1012
  // Convert string permissions to Permission type and check
886
1013
  const permissions = item.permissions
887
1014
  .filter((p): p is string => typeof p === 'string')
@@ -892,6 +1019,7 @@ export const NavigationMenu = React.forwardRef<
892
1019
  }
893
1020
  }
894
1021
 
1022
+ // If permission check failed, try role-based access
895
1023
  if (!hasPermission && rbacContext) {
896
1024
  // Check roles if permissions check failed or item has role requirements
897
1025
  if (item.roles && item.roles.length > 0) {
@@ -922,10 +1050,19 @@ export const NavigationMenu = React.forwardRef<
922
1050
  }
923
1051
  }
924
1052
 
1053
+ // If permission map is empty but item is in filteredItems, trust PaceAppLayout's filtering
1054
+ // This handles the case where NavigationMenu's usePermissions returns empty map
1055
+ // but PaceAppLayout already filtered items correctly
1056
+ if (!hasPermission && (!permissionMap || Object.keys(permissionMap).length === 0) && isItemVisible) {
1057
+ // Permission map is empty but item passed filtering - trust PaceAppLayout
1058
+ // Permission map empty but item passed filtering - trusting PaceAppLayout (removed verbose logging)
1059
+ hasPermission = true;
1060
+ }
1061
+
925
1062
  if (!hasPermission) {
926
1063
  // Handle access denied
927
1064
  if (onNavigationAccessDenied) {
928
- onNavigationAccessDenied(item.id, 'Insufficient permissions');
1065
+ onNavigationAccessDenied(item);
929
1066
  }
930
1067
 
931
1068
  if (strictMode) {
@@ -940,7 +1077,7 @@ export const NavigationMenu = React.forwardRef<
940
1077
  });
941
1078
 
942
1079
  if (onStrictModeViolation) {
943
- onStrictModeViolation(item.id, 'Insufficient permissions');
1080
+ onStrictModeViolation(item, 'Insufficient permissions');
944
1081
  }
945
1082
  }
946
1083
 
@@ -957,7 +1094,6 @@ export const NavigationMenu = React.forwardRef<
957
1094
 
958
1095
  // Check if item is currently active
959
1096
  const isActiveItem = (item: NavigationItem): boolean => {
960
- if (item.isActive !== undefined) return item.isActive;
961
1097
  if (currentPath === item.href) return true;
962
1098
  if (item.children && item.children.length > 0) {
963
1099
  return item.children.some(child => isActiveItem(child));
@@ -7,4 +7,4 @@
7
7
  */
8
8
 
9
9
  export { NavigationMenu } from './NavigationMenu';
10
- export type { NavigationMenuProps, NavigationItem, NavigationMode } from './types';
10
+ export type { NavigationMenuProps, NavigationItem, NavigationMode } from './NavigationMenu';
@@ -15,10 +15,19 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
15
15
  import { OrganisationSelector, OrganisationSelectorProps } from './OrganisationSelector';
16
16
  import { renderWithProviders } from '../../__tests__/helpers/test-utils';
17
17
  import type { Organisation } from '../../types/organisation';
18
+ import type { SelectProps, SelectContentProps, SelectItemProps, SelectTriggerProps, SelectValueProps } from '../Select';
19
+ import type { ButtonProps } from '../Button/Button';
20
+ import type { LoadingSpinnerProps } from '../LoadingSpinner/LoadingSpinner';
21
+
22
+ // Mock the useOrganisationService hook (used internally by useOrganisations)
23
+ const mockUseOrganisationService = vi.fn();
24
+ vi.mock('../../hooks/services/useOrganisationService', () => ({
25
+ useOrganisationService: () => mockUseOrganisationService(),
26
+ }));
18
27
 
19
28
  // Mock the useOrganisations hook
20
29
  const mockUseOrganisations = vi.fn();
21
- vi.mock('../../providers/OrganisationProvider', () => ({
30
+ vi.mock('../../hooks/useOrganisations', () => ({
22
31
  useOrganisations: () => mockUseOrganisations(),
23
32
  }));
24
33
 
@@ -26,19 +35,19 @@ vi.mock('../../providers/OrganisationProvider', () => ({
26
35
  let mockOnValueChange: ((value: string) => void) | null = null;
27
36
 
28
37
  vi.mock('../Select', () => ({
29
- Select: ({ children, value, onValueChange, disabled }: any) => {
38
+ Select: ({ children, value, onValueChange, disabled }: SelectProps & { value?: string; onValueChange?: (value: string) => void; disabled?: boolean }) => {
30
39
  // Store the onValueChange callback for SelectItem to use
31
- mockOnValueChange = onValueChange;
40
+ mockOnValueChange = onValueChange || null;
32
41
  return (
33
42
  <div data-testid="select" data-value={value} data-disabled={disabled}>
34
43
  {children}
35
44
  </div>
36
45
  );
37
46
  },
38
- SelectContent: ({ children }: any) => (
47
+ SelectContent: ({ children }: SelectContentProps) => (
39
48
  <div data-testid="select-content">{children}</div>
40
49
  ),
41
- SelectItem: ({ children, value, disabled, className }: any) => (
50
+ SelectItem: ({ children, value, disabled, className }: SelectItemProps) => (
42
51
  <div
43
52
  data-testid={`select-item-${value}`}
44
53
  data-disabled={disabled}
@@ -48,29 +57,29 @@ vi.mock('../Select', () => ({
48
57
  {children}
49
58
  </div>
50
59
  ),
51
- SelectTrigger: ({ children, className }: any) => (
60
+ SelectTrigger: ({ children, className }: SelectTriggerProps) => (
52
61
  <button data-testid="select-trigger" className={className}>
53
62
  {children}
54
63
  </button>
55
64
  ),
56
- SelectValue: ({ placeholder }: any) => (
65
+ SelectValue: ({ placeholder }: SelectValueProps) => (
57
66
  <span data-testid="select-value">{placeholder}</span>
58
67
  ),
59
68
  }));
60
69
 
61
70
  vi.mock('../Alert/Alert', () => ({
62
- Alert: ({ children, variant }: any) => (
71
+ Alert: ({ children, variant }: React.HTMLAttributes<HTMLDivElement> & { variant?: "default" | "destructive" | "inline" }) => (
63
72
  <div data-testid="alert" data-variant={variant}>
64
73
  {children}
65
74
  </div>
66
75
  ),
67
- AlertDescription: ({ children }: any) => (
76
+ AlertDescription: ({ children }: React.HTMLAttributes<HTMLDivElement>) => (
68
77
  <div data-testid="alert-description">{children}</div>
69
78
  ),
70
79
  }));
71
80
 
72
81
  vi.mock('../Button/Button', () => ({
73
- Button: ({ children, onClick, disabled, variant, size, className }: any) => (
82
+ Button: ({ children, onClick, disabled, variant, size, className }: ButtonProps) => (
74
83
  <button
75
84
  data-testid="button"
76
85
  onClick={onClick}
@@ -85,7 +94,7 @@ vi.mock('../Button/Button', () => ({
85
94
  }));
86
95
 
87
96
  vi.mock('../LoadingSpinner/LoadingSpinner', () => ({
88
- LoadingSpinner: ({ size }: any) => (
97
+ LoadingSpinner: ({ size }: LoadingSpinnerProps) => (
89
98
  <div data-testid="loading-spinner" data-size={size}>Loading...</div>
90
99
  ),
91
100
  }));
@@ -59,7 +59,7 @@ import { Alert, AlertDescription } from '../Alert/Alert';
59
59
  import { Button } from '../Button/Button';
60
60
  import { LoadingSpinner } from '../LoadingSpinner/LoadingSpinner';
61
61
  import { RefreshCw, AlertCircle, Building2, Shield } from 'lucide-react';
62
- import { useOrganisations } from '../../providers/OrganisationProvider';
62
+ import { useOrganisations } from '../../hooks/useOrganisations';
63
63
  import type { Organisation } from '../../types/organisation';
64
64
  import { logger } from '../../utils/core/logger';
65
65