@jmruthers/pace-core 0.6.1 → 0.6.3

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 (549) hide show
  1. package/CHANGELOG.md +88 -10
  2. package/cursor-rules/00-pace-core-compliance.mdc +46 -87
  3. package/cursor-rules/01-standards-compliance.mdc +16 -47
  4. package/cursor-rules/02-project-structure.mdc +4 -4
  5. package/cursor-rules/03-solid-principles.mdc +45 -164
  6. package/cursor-rules/04-testing-standards.mdc +22 -69
  7. package/cursor-rules/05-bug-reports-and-features.mdc +2 -2
  8. package/cursor-rules/06-code-quality.mdc +42 -125
  9. package/cursor-rules/07-tech-stack-compliance.mdc +33 -128
  10. package/cursor-rules/08-markup-quality.mdc +452 -0
  11. package/cursor-rules/CHANGELOG.md +18 -0
  12. package/cursor-rules/README.md +2 -1
  13. package/dist/{AuthService-DjnJHDtC.d.ts → AuthService-Cb34EQs3.d.ts} +63 -1
  14. package/dist/{DataTable-CH1U5Tpy.d.ts → DataTable-BMRU8a1j.d.ts} +33 -1
  15. package/dist/{DataTable-DQ7RSOHE.js → DataTable-THFPBKTP.js} +12 -10
  16. package/dist/{PublicPageProvider-ce4xlHYA.d.ts → PublicPageProvider-DEMpysFR.d.ts} +394 -171
  17. package/dist/{UnifiedAuthProvider-185Ih4dj.d.ts → UnifiedAuthProvider-CKvHP1MK.d.ts} +30 -8
  18. package/dist/{UnifiedAuthProvider-ATAP5UTR.js → UnifiedAuthProvider-KAGUYQ4J.js} +5 -4
  19. package/dist/{api-N774RPUA.js → api-IAGWF3ZG.js} +10 -10
  20. package/dist/{audit-B5P6FFIR.js → audit-V53FV5AG.js} +2 -2
  21. package/dist/{chunk-JBKQ3SAO.js → chunk-2T2IG7T7.js} +107 -57
  22. package/dist/chunk-2T2IG7T7.js.map +1 -0
  23. package/dist/{chunk-3QRJFVBR.js → chunk-6SOIHG6Z.js} +1 -1
  24. package/dist/chunk-6SOIHG6Z.js.map +1 -0
  25. package/dist/{chunk-3XTALGJF.js → chunk-6Z7LTB3D.js} +69 -240
  26. package/dist/chunk-6Z7LTB3D.js.map +1 -0
  27. package/dist/{chunk-4ZC4GX36.js → chunk-CNCQDFLN.js} +199 -46
  28. package/dist/chunk-CNCQDFLN.js.map +1 -0
  29. package/dist/chunk-DGUM43GV.js +11 -0
  30. package/dist/{chunk-BYFSK72L.js → chunk-DWUBLJJM.js} +361 -187
  31. package/dist/chunk-DWUBLJJM.js.map +1 -0
  32. package/dist/{chunk-LXQLPRQ2.js → chunk-FFQEQTNW.js} +6 -8
  33. package/dist/chunk-FFQEQTNW.js.map +1 -0
  34. package/dist/chunk-FMUCXFII.js +76 -0
  35. package/dist/chunk-FMUCXFII.js.map +1 -0
  36. package/dist/{chunk-4N5C5XZU.js → chunk-HFZBI76P.js} +4 -4
  37. package/dist/chunk-HFZBI76P.js.map +1 -0
  38. package/dist/{chunk-SQGMNID3.js → chunk-L4OXEN46.js} +4 -5
  39. package/dist/chunk-L4OXEN46.js.map +1 -0
  40. package/dist/{chunk-R77UEZ4E.js → chunk-M43Y4SSO.js} +1 -1
  41. package/dist/chunk-M43Y4SSO.js.map +1 -0
  42. package/dist/{chunk-I7PSE6JW.js → chunk-M7MPQISP.js} +3 -76
  43. package/dist/chunk-M7MPQISP.js.map +1 -0
  44. package/dist/chunk-PQBSKX33.js +7793 -0
  45. package/dist/chunk-PQBSKX33.js.map +1 -0
  46. package/dist/chunk-QRPVRXYT.js +226 -0
  47. package/dist/chunk-QRPVRXYT.js.map +1 -0
  48. package/dist/{chunk-KNC55RTG.js → chunk-RWEBCB47.js} +194 -416
  49. package/dist/chunk-RWEBCB47.js.map +1 -0
  50. package/dist/{chunk-XM25TVIE.js → chunk-YDQHOZNA.js} +843 -388
  51. package/dist/chunk-YDQHOZNA.js.map +1 -0
  52. package/dist/{chunk-GLK6VM3F.js → chunk-ZNIWI3UC.js} +739 -737
  53. package/dist/chunk-ZNIWI3UC.js.map +1 -0
  54. package/dist/components.d.ts +5 -5
  55. package/dist/components.js +18 -16
  56. package/dist/components.js.map +1 -1
  57. package/dist/contextValidator-3JNZKUTX.js +9 -0
  58. package/dist/contextValidator-3JNZKUTX.js.map +1 -0
  59. package/dist/eslint-rules/pace-core-compliance.cjs +106 -0
  60. package/dist/{functions-D_kgHktt.d.ts → functions-DHebl8-F.d.ts} +1 -1
  61. package/dist/hooks.d.ts +55 -122
  62. package/dist/hooks.js +10 -13
  63. package/dist/hooks.js.map +1 -1
  64. package/dist/index.d.ts +60 -13
  65. package/dist/index.js +30 -25
  66. package/dist/index.js.map +1 -1
  67. package/dist/providers.d.ts +21 -3
  68. package/dist/providers.js +4 -3
  69. package/dist/rbac/index.d.ts +210 -139
  70. package/dist/rbac/index.js +17 -13
  71. package/dist/styles/index.js +1 -1
  72. package/dist/theming/runtime.d.ts +1 -13
  73. package/dist/theming/runtime.js +2 -2
  74. package/dist/{timezone-_pgH8qrY.d.ts → timezone-CHhWg6b4.d.ts} +3 -10
  75. package/dist/{types-UU913iLA.d.ts → types-BeoeWV5I.d.ts} +8 -0
  76. package/dist/{types-CEpcvwwF.d.ts → types-CkbwOr4Y.d.ts} +6 -0
  77. package/dist/types.d.ts +2 -2
  78. package/dist/types.js +1 -1
  79. package/dist/{usePublicRouteParams-BJAlWfuJ.d.ts → usePublicRouteParams-i3qtoBgg.d.ts} +38 -17
  80. package/dist/utils.d.ts +4 -5
  81. package/dist/utils.js +17 -19
  82. package/dist/utils.js.map +1 -1
  83. package/docs/api/README.md +21 -17
  84. package/docs/api/modules.md +4191 -2967
  85. package/docs/architecture/database-schema-requirements.md +161 -0
  86. package/docs/components/context-selector.md +126 -0
  87. package/docs/core-concepts/rbac-system.md +3 -3
  88. package/docs/documentation-index.md +2 -4
  89. package/docs/getting-started/cursor-rules.md +2 -1
  90. package/docs/migration/DOCUMENTATION_STRUCTURE.md +441 -0
  91. package/docs/migration/MIGRATION_GUIDE.md +2 -24
  92. package/docs/migration/RBAC_SCOPE_MIGRATION.md +385 -0
  93. package/docs/migration/README.md +52 -6
  94. package/docs/migration/V0.5.190_TO_V0.6.1_MIGRATION.md +1153 -0
  95. package/docs/migration/database-changes-december-2025.md +3 -3
  96. package/docs/pace-mint-fix-auto-selection.md +218 -0
  97. package/docs/pace-mint-rbac-setup.md +391 -0
  98. package/docs/rbac/event-based-apps.md +1 -1
  99. package/docs/rbac/getting-started.md +1 -1
  100. package/docs/rbac/quick-start.md +1 -1
  101. package/docs/rbac/secure-client-protection.md +330 -0
  102. package/docs/standards/README.md +1 -0
  103. package/package.json +4 -3
  104. package/scripts/audit/core/checks/accessibility.cjs +197 -0
  105. package/scripts/audit/core/checks/api-usage.cjs +191 -0
  106. package/scripts/audit/core/checks/bundle.cjs +142 -0
  107. package/scripts/{check-pace-core-compliance.cjs → audit/core/checks/compliance.cjs} +784 -685
  108. package/scripts/audit/core/checks/config.cjs +54 -0
  109. package/scripts/audit/core/checks/coverage.cjs +84 -0
  110. package/scripts/audit/core/checks/dependencies.cjs +985 -0
  111. package/scripts/audit/core/checks/documentation.cjs +268 -0
  112. package/scripts/audit/core/checks/environment.cjs +116 -0
  113. package/scripts/audit/core/checks/error-handling.cjs +340 -0
  114. package/scripts/audit/core/checks/forms.cjs +172 -0
  115. package/scripts/audit/core/checks/heuristics.cjs +68 -0
  116. package/scripts/audit/core/checks/hooks.cjs +334 -0
  117. package/scripts/audit/core/checks/imports.cjs +244 -0
  118. package/scripts/audit/core/checks/performance.cjs +325 -0
  119. package/scripts/audit/core/checks/routes.cjs +117 -0
  120. package/scripts/audit/core/checks/state.cjs +130 -0
  121. package/scripts/audit/core/checks/structure.cjs +65 -0
  122. package/scripts/audit/core/checks/style.cjs +584 -0
  123. package/scripts/audit/core/checks/testing.cjs +122 -0
  124. package/scripts/audit/core/checks/typescript.cjs +61 -0
  125. package/scripts/audit/core/scanner.cjs +199 -0
  126. package/scripts/audit/core/utils.cjs +137 -0
  127. package/scripts/audit/index.cjs +223 -0
  128. package/scripts/audit/reporters/console.cjs +151 -0
  129. package/scripts/audit/reporters/json.cjs +54 -0
  130. package/scripts/audit/reporters/markdown.cjs +124 -0
  131. package/scripts/audit-consuming-app.cjs +61 -936
  132. package/scripts/build-docs/build-decision.js +240 -0
  133. package/scripts/build-docs/cache-utils.js +105 -0
  134. package/scripts/build-docs/content-normalization.js +150 -0
  135. package/scripts/build-docs/file-utils.js +105 -0
  136. package/scripts/build-docs/git-utils.js +86 -0
  137. package/scripts/build-docs/hash-utils.js +116 -0
  138. package/scripts/build-docs/typedoc-runner.js +220 -0
  139. package/scripts/build-docs-incremental.js +77 -913
  140. package/scripts/utils/command-runner.js +16 -11
  141. package/scripts/validate-formats.js +61 -56
  142. package/scripts/validate-master.js +74 -69
  143. package/scripts/validate-pre-publish.js +70 -65
  144. package/src/__tests__/hooks/usePermissions.test.ts +2 -2
  145. package/src/components/Alert/Alert.test.tsx +12 -18
  146. package/src/components/Alert/Alert.tsx +5 -7
  147. package/src/components/Avatar/Avatar.test.tsx +4 -4
  148. package/src/components/Badge/Badge.tsx +14 -0
  149. package/src/components/Button/Button.tsx +22 -0
  150. package/src/components/Calendar/Calendar.tsx +8 -2
  151. package/src/components/Card/Card.tsx +4 -0
  152. package/src/components/Checkbox/Checkbox.test.tsx +12 -12
  153. package/src/components/Checkbox/Checkbox.tsx +2 -2
  154. package/src/components/ContextSelector/ContextSelector.tsx +384 -0
  155. package/src/components/ContextSelector/index.ts +3 -0
  156. package/src/components/DataTable/DataTable.tsx +38 -4
  157. package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +5 -6
  158. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +18 -4
  159. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +2 -3
  160. package/src/components/DataTable/components/AccessDeniedPage.tsx +16 -25
  161. package/src/components/DataTable/components/ActionButtons.tsx +10 -7
  162. package/src/components/DataTable/components/BulkOperationsDropdown.tsx +1 -1
  163. package/src/components/DataTable/components/ColumnFilter.tsx +10 -0
  164. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +12 -0
  165. package/src/components/DataTable/components/DataTableBody.tsx +8 -0
  166. package/src/components/DataTable/components/DataTableCore.tsx +196 -554
  167. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +11 -0
  168. package/src/components/DataTable/components/DataTableLayout.tsx +559 -0
  169. package/src/components/DataTable/components/DataTableModals.tsx +8 -0
  170. package/src/components/DataTable/components/DataTableToolbar.tsx +8 -0
  171. package/src/components/DataTable/components/DraggableColumnHeader.tsx +12 -0
  172. package/src/components/DataTable/components/EditFields.tsx +307 -0
  173. package/src/components/DataTable/components/EditableRow.tsx +8 -0
  174. package/src/components/DataTable/components/EmptyState.tsx +10 -0
  175. package/src/components/DataTable/components/FilterRow.tsx +12 -0
  176. package/src/components/DataTable/components/GroupHeader.tsx +12 -0
  177. package/src/components/DataTable/components/GroupingDropdown.tsx +12 -0
  178. package/src/components/DataTable/components/ImportModal.tsx +7 -0
  179. package/src/components/DataTable/components/LoadingState.tsx +6 -0
  180. package/src/components/DataTable/components/PaginationControls.tsx +16 -1
  181. package/src/components/DataTable/components/RowComponent.tsx +391 -0
  182. package/src/components/DataTable/components/UnifiedTableBody.tsx +63 -851
  183. package/src/components/DataTable/components/VirtualizedDataTable.tsx +16 -4
  184. package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +4 -2
  185. package/src/components/DataTable/components/cellValueUtils.ts +40 -0
  186. package/src/components/DataTable/components/hooks/useImportModalFocus.ts +53 -0
  187. package/src/components/DataTable/components/hooks/usePermissionTracking.ts +126 -0
  188. package/src/components/DataTable/context/DataTableContext.tsx +50 -0
  189. package/src/components/DataTable/core/ColumnFactory.ts +31 -0
  190. package/src/components/DataTable/core/DataTableContext.tsx +32 -1
  191. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +10 -0
  192. package/src/components/DataTable/hooks/useColumnReordering.ts +12 -0
  193. package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +10 -0
  194. package/src/components/DataTable/hooks/useDataTableDataPipeline.ts +16 -0
  195. package/src/components/DataTable/hooks/useDataTablePermissions.ts +127 -33
  196. package/src/components/DataTable/hooks/useDataTableState.ts +35 -1
  197. package/src/components/DataTable/hooks/useEffectiveColumnOrder.ts +12 -0
  198. package/src/components/DataTable/hooks/useServerSideDataEffect.ts +11 -0
  199. package/src/components/DataTable/hooks/useTableColumns.ts +8 -0
  200. package/src/components/DataTable/hooks/useTableHandlers.ts +14 -0
  201. package/src/components/DataTable/styles.ts +6 -6
  202. package/src/components/DataTable/types.ts +6 -10
  203. package/src/components/DataTable/utils/a11yUtils.ts +7 -0
  204. package/src/components/DataTable/utils/debugTools.ts +18 -113
  205. package/src/components/DataTable/utils/errorHandling.ts +12 -0
  206. package/src/components/DataTable/utils/exportUtils.ts +9 -0
  207. package/src/components/DataTable/utils/flexibleImport.ts +12 -48
  208. package/src/components/DataTable/utils/paginationUtils.ts +8 -0
  209. package/src/components/DataTable/utils/performanceUtils.ts +5 -1
  210. package/src/components/Dialog/Dialog.tsx +31 -3
  211. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +180 -1
  212. package/src/components/ErrorBoundary/ErrorBoundary.tsx +45 -5
  213. package/src/components/ErrorBoundary/ErrorBoundaryContext.tsx +129 -0
  214. package/src/components/ErrorBoundary/index.ts +27 -2
  215. package/src/components/FileDisplay/FileDisplay.tsx +74 -28
  216. package/src/components/FileUpload/FileUpload.tsx +22 -2
  217. package/src/components/Footer/Footer.test.tsx +16 -16
  218. package/src/components/Footer/Footer.tsx +14 -11
  219. package/src/components/Form/Form.tsx +1 -0
  220. package/src/components/Header/Header.test.tsx +43 -73
  221. package/src/components/Header/Header.tsx +59 -49
  222. package/src/components/Input/Input.test.tsx +2 -2
  223. package/src/components/Input/Input.tsx +8 -4
  224. package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +4 -4
  225. package/src/components/LoginForm/LoginForm.tsx +4 -0
  226. package/src/components/NavigationMenu/NavigationMenu.tsx +14 -513
  227. package/src/components/NavigationMenu/types.ts +56 -0
  228. package/src/components/NavigationMenu/useNavigationFiltering.ts +390 -0
  229. package/src/components/PaceAppLayout/PaceAppLayout.integration.test.tsx +10 -19
  230. package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +2 -2
  231. package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +5 -5
  232. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +13 -11
  233. package/src/components/PaceAppLayout/PaceAppLayout.tsx +167 -44
  234. package/src/components/PaceAppLayout/README.md +14 -17
  235. package/src/components/PaceAppLayout/test-setup.tsx +3 -4
  236. package/src/components/PaceLoginPage/PaceLoginPage.tsx +3 -0
  237. package/src/components/PasswordChange/PasswordChangeForm.tsx +9 -0
  238. package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -9
  239. package/src/components/PublicLayout/PublicPageLayout.tsx +2 -5
  240. package/src/components/PublicLayout/PublicPageProvider.tsx +4 -0
  241. package/src/components/Select/Select.tsx +80 -434
  242. package/src/components/Select/context.ts +23 -0
  243. package/src/components/Select/hooks/useSelectEvents.ts +87 -0
  244. package/src/components/Select/hooks/useSelectSearch.ts +91 -0
  245. package/src/components/Select/hooks/useSelectState.ts +104 -0
  246. package/src/components/Select/index.ts +9 -1
  247. package/src/components/Select/types.ts +123 -0
  248. package/src/components/Select/utils/text.ts +26 -0
  249. package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +4 -5
  250. package/src/components/Switch/Switch.tsx +4 -4
  251. package/src/components/Tabs/Tabs.tsx +1 -1
  252. package/src/components/Toast/Toast.tsx +4 -0
  253. package/src/components/Tooltip/Tooltip.tsx +2 -2
  254. package/src/components/UserMenu/UserMenu.test.tsx +24 -11
  255. package/src/components/UserMenu/UserMenu.tsx +21 -18
  256. package/src/components/index.ts +7 -7
  257. package/src/eslint-rules/pace-core-compliance.cjs +106 -0
  258. package/src/hooks/__tests__/index.unit.test.ts +2 -5
  259. package/src/hooks/__tests__/useAppConfig.unit.test.ts +4 -98
  260. package/src/hooks/index.ts +1 -2
  261. package/src/hooks/public/usePublicEvent.ts +4 -0
  262. package/src/hooks/public/usePublicEventLogo.ts +4 -0
  263. package/src/hooks/public/usePublicFileDisplay.ts +4 -0
  264. package/src/hooks/public/usePublicRouteParams.ts +4 -0
  265. package/src/hooks/services/useAuth.ts +32 -0
  266. package/src/hooks/services/useCurrentEvent.ts +6 -0
  267. package/src/hooks/services/useCurrentOrganisation.ts +6 -0
  268. package/src/hooks/useAppConfig.ts +15 -30
  269. package/src/hooks/useDebounce.ts +9 -0
  270. package/src/hooks/useEventTheme.ts +6 -0
  271. package/src/hooks/useFileDisplay.ts +81 -50
  272. package/src/hooks/useFileReference.ts +25 -7
  273. package/src/hooks/useFileUrl.ts +11 -1
  274. package/src/hooks/useFocusManagement.ts +14 -0
  275. package/src/hooks/useFocusTrap.ts +3 -0
  276. package/src/hooks/useInactivityTracker.ts +3 -0
  277. package/src/hooks/useKeyboardShortcuts.ts +4 -0
  278. package/src/hooks/useOrganisationPermissions.ts +4 -0
  279. package/src/hooks/useOrganisationSecurity.ts +4 -0
  280. package/src/hooks/usePerformanceMonitor.ts +4 -0
  281. package/src/hooks/usePermissionCache.ts +7 -0
  282. package/src/hooks/useQueryCache.ts +12 -1
  283. package/src/hooks/useSessionRestoration.ts +4 -0
  284. package/src/hooks/useStorage.ts +4 -0
  285. package/src/hooks/useToast.ts +1 -1
  286. package/src/index.ts +6 -6
  287. package/src/providers/__tests__/OrganisationProvider.test.tsx +92 -70
  288. package/src/providers/services/AuthServiceProvider.tsx +35 -7
  289. package/src/providers/services/EventServiceProvider.tsx +51 -5
  290. package/src/providers/services/InactivityServiceProvider.tsx +18 -0
  291. package/src/providers/services/OrganisationServiceProvider.tsx +18 -0
  292. package/src/providers/services/UnifiedAuthProvider.tsx +126 -134
  293. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +29 -13
  294. package/src/rbac/README.md +1 -1
  295. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +1 -1
  296. package/src/rbac/__tests__/scenarios.user-role.test.tsx +4 -5
  297. package/src/rbac/adapters.tsx +12 -3
  298. package/src/rbac/api.test.ts +59 -51
  299. package/src/rbac/api.ts +246 -167
  300. package/src/rbac/components/NavigationProvider.tsx +4 -1
  301. package/src/rbac/components/PagePermissionGuard.tsx +185 -17
  302. package/src/rbac/components/RoleBasedRouter.tsx +5 -1
  303. package/src/rbac/components/SecureDataProvider.test.tsx +84 -49
  304. package/src/rbac/components/SecureDataProvider.tsx +20 -5
  305. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +24 -14
  306. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +7 -0
  307. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +14 -6
  308. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +15 -4
  309. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +148 -24
  310. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +81 -15
  311. package/src/rbac/engine.ts +38 -14
  312. package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +32 -21
  313. package/src/rbac/hooks/permissions/index.ts +7 -0
  314. package/src/rbac/hooks/permissions/useAccessLevel.ts +105 -0
  315. package/src/rbac/hooks/permissions/useCachedPermissions.ts +79 -0
  316. package/src/rbac/hooks/permissions/useCan.ts +377 -0
  317. package/src/rbac/hooks/permissions/useHasAllPermissions.ts +90 -0
  318. package/src/rbac/hooks/permissions/useHasAnyPermission.ts +90 -0
  319. package/src/rbac/hooks/permissions/useMultiplePermissions.ts +93 -0
  320. package/src/rbac/hooks/permissions/usePermissions.ts +253 -0
  321. package/src/rbac/hooks/useCan.test.ts +64 -66
  322. package/src/rbac/hooks/usePermissions.ts +14 -995
  323. package/src/rbac/hooks/useRBAC.test.ts +1 -5
  324. package/src/rbac/hooks/useRBAC.ts +36 -37
  325. package/src/rbac/hooks/useResolvedScope.test.ts +120 -35
  326. package/src/rbac/hooks/useResolvedScope.ts +35 -40
  327. package/src/rbac/hooks/useResourcePermissions.test.ts +54 -18
  328. package/src/rbac/hooks/useResourcePermissions.ts +14 -4
  329. package/src/rbac/hooks/useSecureSupabase.ts +27 -7
  330. package/src/rbac/index.ts +7 -0
  331. package/src/rbac/permissions.ts +0 -30
  332. package/src/rbac/secureClient.test.ts +22 -18
  333. package/src/rbac/secureClient.ts +294 -68
  334. package/src/rbac/security.ts +0 -17
  335. package/src/rbac/types.ts +9 -0
  336. package/src/rbac/utils/__tests__/contextValidator.test.ts +64 -86
  337. package/src/rbac/utils/clientSecurity.ts +93 -0
  338. package/src/rbac/utils/contextValidator.ts +77 -168
  339. package/src/services/AuthService.ts +39 -7
  340. package/src/services/EventService.ts +186 -54
  341. package/src/services/OrganisationService.ts +81 -14
  342. package/src/services/__tests__/EventService.test.ts +1 -2
  343. package/src/services/base/BaseService.ts +3 -0
  344. package/src/theming/__tests__/parseEventColours.test.ts +6 -9
  345. package/src/theming/parseEventColours.ts +5 -19
  346. package/src/types/vitest-globals.d.ts +51 -26
  347. package/src/utils/__mocks__/supabaseMock.ts +1 -3
  348. package/src/utils/__tests__/formatting.unit.test.ts +4 -4
  349. package/src/utils/__tests__/index.unit.test.ts +2 -2
  350. package/src/utils/audit/audit.ts +0 -3
  351. package/src/utils/core/cn.ts +1 -1
  352. package/src/utils/dynamic/dynamicUtils.ts +7 -4
  353. package/src/utils/file-reference/index.ts +53 -1
  354. package/src/utils/formatting/formatting.ts +8 -18
  355. package/src/utils/index.ts +0 -1
  356. package/dist/chunk-3QRJFVBR.js.map +0 -1
  357. package/dist/chunk-3XTALGJF.js.map +0 -1
  358. package/dist/chunk-4N5C5XZU.js.map +0 -1
  359. package/dist/chunk-4ZC4GX36.js.map +0 -1
  360. package/dist/chunk-7D4SUZUM.js +0 -38
  361. package/dist/chunk-BYFSK72L.js.map +0 -1
  362. package/dist/chunk-EXUD6RNJ.js +0 -451
  363. package/dist/chunk-EXUD6RNJ.js.map +0 -1
  364. package/dist/chunk-GLK6VM3F.js.map +0 -1
  365. package/dist/chunk-I7PSE6JW.js.map +0 -1
  366. package/dist/chunk-JBKQ3SAO.js.map +0 -1
  367. package/dist/chunk-KNC55RTG.js.map +0 -1
  368. package/dist/chunk-LXQLPRQ2.js.map +0 -1
  369. package/dist/chunk-R77UEZ4E.js.map +0 -1
  370. package/dist/chunk-SQGMNID3.js.map +0 -1
  371. package/dist/chunk-T33XF5ZC.js +0 -12922
  372. package/dist/chunk-T33XF5ZC.js.map +0 -1
  373. package/dist/chunk-XM25TVIE.js.map +0 -1
  374. package/docs/api/classes/ColumnFactory.md +0 -243
  375. package/docs/api/classes/ErrorBoundary.md +0 -144
  376. package/docs/api/classes/InvalidScopeError.md +0 -73
  377. package/docs/api/classes/Logger.md +0 -178
  378. package/docs/api/classes/MissingUserContextError.md +0 -66
  379. package/docs/api/classes/OrganisationContextRequiredError.md +0 -66
  380. package/docs/api/classes/PermissionDeniedError.md +0 -73
  381. package/docs/api/classes/RBACAuditManager.md +0 -297
  382. package/docs/api/classes/RBACCache.md +0 -322
  383. package/docs/api/classes/RBACEngine.md +0 -171
  384. package/docs/api/classes/RBACError.md +0 -76
  385. package/docs/api/classes/RBACNotInitializedError.md +0 -66
  386. package/docs/api/classes/SecureSupabaseClient.md +0 -160
  387. package/docs/api/classes/StorageUtils.md +0 -328
  388. package/docs/api/enums/FileCategory.md +0 -184
  389. package/docs/api/enums/LogLevel.md +0 -54
  390. package/docs/api/enums/RBACErrorCode.md +0 -228
  391. package/docs/api/enums/RPCFunction.md +0 -118
  392. package/docs/api/interfaces/AddressFieldProps.md +0 -241
  393. package/docs/api/interfaces/AddressFieldRef.md +0 -94
  394. package/docs/api/interfaces/AggregateConfig.md +0 -43
  395. package/docs/api/interfaces/AutocompleteOptions.md +0 -75
  396. package/docs/api/interfaces/AvatarProps.md +0 -128
  397. package/docs/api/interfaces/BadgeProps.md +0 -27
  398. package/docs/api/interfaces/ButtonProps.md +0 -53
  399. package/docs/api/interfaces/CalendarProps.md +0 -70
  400. package/docs/api/interfaces/CardProps.md +0 -66
  401. package/docs/api/interfaces/ColorPalette.md +0 -7
  402. package/docs/api/interfaces/ColorShade.md +0 -66
  403. package/docs/api/interfaces/ComplianceResult.md +0 -30
  404. package/docs/api/interfaces/DataAccessRecord.md +0 -96
  405. package/docs/api/interfaces/DataRecord.md +0 -11
  406. package/docs/api/interfaces/DataTableAction.md +0 -249
  407. package/docs/api/interfaces/DataTableColumn.md +0 -504
  408. package/docs/api/interfaces/DataTableProps.md +0 -625
  409. package/docs/api/interfaces/DataTableToolbarButton.md +0 -96
  410. package/docs/api/interfaces/DatabaseComplianceResult.md +0 -85
  411. package/docs/api/interfaces/DatabaseIssue.md +0 -41
  412. package/docs/api/interfaces/EmptyStateConfig.md +0 -61
  413. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +0 -235
  414. package/docs/api/interfaces/EventAppRoleData.md +0 -71
  415. package/docs/api/interfaces/ExportColumn.md +0 -90
  416. package/docs/api/interfaces/ExportOptions.md +0 -126
  417. package/docs/api/interfaces/FileDisplayProps.md +0 -249
  418. package/docs/api/interfaces/FileMetadata.md +0 -129
  419. package/docs/api/interfaces/FileReference.md +0 -118
  420. package/docs/api/interfaces/FileSizeLimits.md +0 -7
  421. package/docs/api/interfaces/FileUploadOptions.md +0 -139
  422. package/docs/api/interfaces/FileUploadProps.md +0 -293
  423. package/docs/api/interfaces/FooterProps.md +0 -105
  424. package/docs/api/interfaces/FormFieldProps.md +0 -166
  425. package/docs/api/interfaces/FormProps.md +0 -113
  426. package/docs/api/interfaces/GrantEventAppRoleParams.md +0 -122
  427. package/docs/api/interfaces/InactivityWarningModalProps.md +0 -115
  428. package/docs/api/interfaces/InputProps.md +0 -53
  429. package/docs/api/interfaces/LabelProps.md +0 -107
  430. package/docs/api/interfaces/LoggerConfig.md +0 -62
  431. package/docs/api/interfaces/LoginFormProps.md +0 -184
  432. package/docs/api/interfaces/NavigationAccessRecord.md +0 -107
  433. package/docs/api/interfaces/NavigationContextType.md +0 -164
  434. package/docs/api/interfaces/NavigationGuardProps.md +0 -139
  435. package/docs/api/interfaces/NavigationItem.md +0 -120
  436. package/docs/api/interfaces/NavigationMenuProps.md +0 -221
  437. package/docs/api/interfaces/NavigationProviderProps.md +0 -117
  438. package/docs/api/interfaces/Organisation.md +0 -140
  439. package/docs/api/interfaces/OrganisationContextType.md +0 -388
  440. package/docs/api/interfaces/OrganisationMembership.md +0 -140
  441. package/docs/api/interfaces/OrganisationProviderProps.md +0 -76
  442. package/docs/api/interfaces/OrganisationSecurityError.md +0 -62
  443. package/docs/api/interfaces/PaceAppLayoutProps.md +0 -406
  444. package/docs/api/interfaces/PaceLoginPageProps.md +0 -47
  445. package/docs/api/interfaces/PageAccessRecord.md +0 -85
  446. package/docs/api/interfaces/PagePermissionContextType.md +0 -140
  447. package/docs/api/interfaces/PagePermissionGuardProps.md +0 -153
  448. package/docs/api/interfaces/PagePermissionProviderProps.md +0 -119
  449. package/docs/api/interfaces/PaletteData.md +0 -41
  450. package/docs/api/interfaces/ParsedAddress.md +0 -120
  451. package/docs/api/interfaces/PermissionEnforcerProps.md +0 -153
  452. package/docs/api/interfaces/ProgressProps.md +0 -42
  453. package/docs/api/interfaces/ProtectedRouteProps.md +0 -97
  454. package/docs/api/interfaces/PublicPageFooterProps.md +0 -112
  455. package/docs/api/interfaces/PublicPageHeaderProps.md +0 -125
  456. package/docs/api/interfaces/PublicPageLayoutProps.md +0 -198
  457. package/docs/api/interfaces/QuickFix.md +0 -52
  458. package/docs/api/interfaces/RBACAccessValidateParams.md +0 -52
  459. package/docs/api/interfaces/RBACAccessValidateResult.md +0 -41
  460. package/docs/api/interfaces/RBACAuditLogParams.md +0 -85
  461. package/docs/api/interfaces/RBACAuditLogResult.md +0 -52
  462. package/docs/api/interfaces/RBACConfig.md +0 -133
  463. package/docs/api/interfaces/RBACContext.md +0 -52
  464. package/docs/api/interfaces/RBACLogger.md +0 -112
  465. package/docs/api/interfaces/RBACPageAccessCheckParams.md +0 -74
  466. package/docs/api/interfaces/RBACPerformanceMetrics.md +0 -138
  467. package/docs/api/interfaces/RBACPermissionCheckParams.md +0 -74
  468. package/docs/api/interfaces/RBACPermissionCheckResult.md +0 -52
  469. package/docs/api/interfaces/RBACPermissionsGetParams.md +0 -63
  470. package/docs/api/interfaces/RBACPermissionsGetResult.md +0 -63
  471. package/docs/api/interfaces/RBACResult.md +0 -58
  472. package/docs/api/interfaces/RBACRoleGrantParams.md +0 -63
  473. package/docs/api/interfaces/RBACRoleGrantResult.md +0 -52
  474. package/docs/api/interfaces/RBACRoleRevokeParams.md +0 -63
  475. package/docs/api/interfaces/RBACRoleRevokeResult.md +0 -52
  476. package/docs/api/interfaces/RBACRoleValidateParams.md +0 -52
  477. package/docs/api/interfaces/RBACRoleValidateResult.md +0 -63
  478. package/docs/api/interfaces/RBACRolesListParams.md +0 -52
  479. package/docs/api/interfaces/RBACRolesListResult.md +0 -74
  480. package/docs/api/interfaces/RBACSessionTrackParams.md +0 -74
  481. package/docs/api/interfaces/RBACSessionTrackResult.md +0 -52
  482. package/docs/api/interfaces/ResourcePermissions.md +0 -155
  483. package/docs/api/interfaces/RevokeEventAppRoleParams.md +0 -100
  484. package/docs/api/interfaces/RoleBasedRouterContextType.md +0 -151
  485. package/docs/api/interfaces/RoleBasedRouterProps.md +0 -156
  486. package/docs/api/interfaces/RoleManagementResult.md +0 -52
  487. package/docs/api/interfaces/RouteAccessRecord.md +0 -107
  488. package/docs/api/interfaces/RouteConfig.md +0 -134
  489. package/docs/api/interfaces/RuntimeComplianceResult.md +0 -55
  490. package/docs/api/interfaces/SecureDataContextType.md +0 -168
  491. package/docs/api/interfaces/SecureDataProviderProps.md +0 -132
  492. package/docs/api/interfaces/SessionRestorationLoaderProps.md +0 -34
  493. package/docs/api/interfaces/SetupIssue.md +0 -41
  494. package/docs/api/interfaces/StorageConfig.md +0 -41
  495. package/docs/api/interfaces/StorageFileInfo.md +0 -74
  496. package/docs/api/interfaces/StorageFileMetadata.md +0 -151
  497. package/docs/api/interfaces/StorageListOptions.md +0 -99
  498. package/docs/api/interfaces/StorageListResult.md +0 -41
  499. package/docs/api/interfaces/StorageUploadOptions.md +0 -101
  500. package/docs/api/interfaces/StorageUploadResult.md +0 -63
  501. package/docs/api/interfaces/StorageUrlOptions.md +0 -60
  502. package/docs/api/interfaces/StyleImport.md +0 -19
  503. package/docs/api/interfaces/SwitchProps.md +0 -34
  504. package/docs/api/interfaces/TabsContentProps.md +0 -9
  505. package/docs/api/interfaces/TabsListProps.md +0 -9
  506. package/docs/api/interfaces/TabsProps.md +0 -9
  507. package/docs/api/interfaces/TabsTriggerProps.md +0 -50
  508. package/docs/api/interfaces/TextareaProps.md +0 -53
  509. package/docs/api/interfaces/ToastActionElement.md +0 -9
  510. package/docs/api/interfaces/ToastProps.md +0 -9
  511. package/docs/api/interfaces/UnifiedAuthContextType.md +0 -820
  512. package/docs/api/interfaces/UnifiedAuthProviderProps.md +0 -171
  513. package/docs/api/interfaces/UseFormDialogOptions.md +0 -62
  514. package/docs/api/interfaces/UseFormDialogReturn.md +0 -117
  515. package/docs/api/interfaces/UseInactivityTrackerOptions.md +0 -136
  516. package/docs/api/interfaces/UseInactivityTrackerReturn.md +0 -123
  517. package/docs/api/interfaces/UsePublicEventLogoOptions.md +0 -87
  518. package/docs/api/interfaces/UsePublicEventLogoReturn.md +0 -81
  519. package/docs/api/interfaces/UsePublicEventOptions.md +0 -34
  520. package/docs/api/interfaces/UsePublicEventReturn.md +0 -68
  521. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +0 -47
  522. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +0 -120
  523. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +0 -94
  524. package/docs/api/interfaces/UseResolvedScopeOptions.md +0 -47
  525. package/docs/api/interfaces/UseResolvedScopeReturn.md +0 -47
  526. package/docs/api/interfaces/UseResourcePermissionsOptions.md +0 -34
  527. package/docs/api/interfaces/UserEventAccess.md +0 -118
  528. package/docs/api/interfaces/UserMenuProps.md +0 -86
  529. package/docs/api/interfaces/UserProfile.md +0 -63
  530. package/docs/migration/quick-migration-guide.md +0 -356
  531. package/docs/migration/service-architecture.md +0 -281
  532. package/src/components/EventSelector/EventSelector.test.tsx +0 -720
  533. package/src/components/EventSelector/EventSelector.tsx +0 -420
  534. package/src/components/EventSelector/index.ts +0 -3
  535. package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +0 -784
  536. package/src/components/OrganisationSelector/OrganisationSelector.tsx +0 -324
  537. package/src/components/OrganisationSelector/index.ts +0 -9
  538. package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +0 -680
  539. package/src/hooks/useSecureDataAccess.test.ts +0 -559
  540. package/src/hooks/useSecureDataAccess.ts +0 -681
  541. /package/dist/{DataTable-DQ7RSOHE.js.map → DataTable-THFPBKTP.js.map} +0 -0
  542. /package/dist/{UnifiedAuthProvider-ATAP5UTR.js.map → UnifiedAuthProvider-KAGUYQ4J.js.map} +0 -0
  543. /package/dist/{api-N774RPUA.js.map → api-IAGWF3ZG.js.map} +0 -0
  544. /package/dist/{audit-B5P6FFIR.js.map → audit-V53FV5AG.js.map} +0 -0
  545. /package/dist/{chunk-7D4SUZUM.js.map → chunk-DGUM43GV.js.map} +0 -0
  546. /package/docs/migration/{organisation-context-timing-fix.md → V0.3.44_organisation-context-timing-fix.md} +0 -0
  547. /package/docs/migration/{rbac-migration.md → V0.4.0_rbac-migration.md} +0 -0
  548. /package/docs/migration/{person-scoped-profiles-migration-guide.md → V0.5.190_person-scoped-profiles-migration-guide.md} +0 -0
  549. /package/docs/migration/{REACT_19_MIGRATION.md → V0.6.0_REACT_19_MIGRATION.md} +0 -0
@@ -4,6 +4,10 @@ import { SupabaseClient, User, Session, AuthError } from '@supabase/supabase-js'
4
4
  import { O as Organisation, a as OrganisationMembership, E as Event } from './event-CW5YB_2p.js';
5
5
  import { S as SessionRestorationState } from './auth-BZOJqrdd.js';
6
6
 
7
+ /**
8
+ * User event access interface.
9
+ * Represents a user's access to a specific event.
10
+ */
7
11
  interface UserEventAccess {
8
12
  event_id: string;
9
13
  event_name: string;
@@ -16,6 +20,10 @@ interface UserEventAccess {
16
20
  granted_at: string;
17
21
  organisation_id: string;
18
22
  }
23
+ /**
24
+ * Unified auth context type.
25
+ * Provides combined authentication, organisation, event, and inactivity state and methods.
26
+ */
19
27
  interface UnifiedAuthContextType {
20
28
  user: User | null;
21
29
  session: Session | null;
@@ -77,17 +85,28 @@ interface UnifiedAuthContextType {
77
85
  handleIdleLogout: () => Promise<void>;
78
86
  handleStaySignedIn: () => void;
79
87
  handleSignOutNow: () => Promise<void>;
80
- appConfig: {
81
- requires_event: boolean;
82
- } | null;
83
88
  isLoading: boolean;
84
89
  hasErrors: boolean;
85
90
  sessionRestoration: SessionRestorationState;
86
91
  sessionRestorationTimedOut: boolean;
87
92
  sessionRestorationTimeoutMs: number;
88
93
  }
94
+ /**
95
+ * Context for unified authentication.
96
+ * Provides combined authentication, organisation, event, and inactivity functionality.
97
+ */
89
98
  declare const UnifiedAuthContext: React__default.Context<UnifiedAuthContextType | undefined>;
99
+ /**
100
+ * Hook to access unified authentication context.
101
+ * Must be used within a UnifiedAuthProvider.
102
+ *
103
+ * @returns Unified authentication context
104
+ * @throws Error if used outside UnifiedAuthProvider
105
+ */
90
106
  declare const useUnifiedAuth: () => UnifiedAuthContextType;
107
+ /**
108
+ * Props for the UnifiedAuthProvider component.
109
+ */
91
110
  interface UnifiedAuthProviderProps {
92
111
  children: React__default.ReactNode;
93
112
  supabaseClient: SupabaseClient;
@@ -95,9 +114,6 @@ interface UnifiedAuthProviderProps {
95
114
  persistState?: boolean;
96
115
  enablePersistence?: boolean;
97
116
  requireOrganisationContext?: boolean;
98
- appConfig?: {
99
- requires_event: boolean;
100
- } | null;
101
117
  idleTimeoutMs: number;
102
118
  warnBeforeMs: number;
103
119
  onIdleLogout: (reason: 'inactivity') => void;
@@ -108,8 +124,14 @@ interface UnifiedAuthProviderProps {
108
124
  }) => React__default.ReactNode;
109
125
  dangerouslyDisableInactivity?: boolean;
110
126
  }
111
- declare function UnifiedAuthProvider({ children, supabaseClient, appName, appConfig, // Default to requiring events
112
- persistState, enablePersistence, requireOrganisationContext, idleTimeoutMs, // REQUIRED: No default - must be explicitly provided
127
+ /**
128
+ * Unified authentication provider.
129
+ * Provides authentication, organisation, event, and inactivity tracking services.
130
+ *
131
+ * @param props - Unified auth provider configuration
132
+ * @returns The unified auth provider
133
+ */
134
+ declare function UnifiedAuthProvider({ children, supabaseClient, appName, persistState, enablePersistence, requireOrganisationContext, idleTimeoutMs, // REQUIRED: No default - must be explicitly provided
113
135
  warnBeforeMs, // REQUIRED: No default - must be explicitly provided
114
136
  onIdleLogout, // REQUIRED: No default - must be explicitly provided
115
137
  renderInactivityWarning, dangerouslyDisableInactivity }: UnifiedAuthProviderProps): react_jsx_runtime.JSX.Element;
@@ -2,16 +2,17 @@ import {
2
2
  UnifiedAuthContext,
3
3
  UnifiedAuthProvider,
4
4
  useUnifiedAuth
5
- } from "./chunk-BYFSK72L.js";
6
- import "./chunk-KNC55RTG.js";
5
+ } from "./chunk-DWUBLJJM.js";
6
+ import "./chunk-RWEBCB47.js";
7
7
  import "./chunk-63FOKYGO.js";
8
+ import "./chunk-QRPVRXYT.js";
8
9
  import "./chunk-QXHPKYJV.js";
9
10
  import "./chunk-VBXEHIUJ.js";
10
11
  import "./chunk-PWLANIRT.js";
11
- import "./chunk-7D4SUZUM.js";
12
+ import "./chunk-DGUM43GV.js";
12
13
  export {
13
14
  UnifiedAuthContext,
14
15
  UnifiedAuthProvider,
15
16
  useUnifiedAuth
16
17
  };
17
- //# sourceMappingURL=UnifiedAuthProvider-ATAP5UTR.js.map
18
+ //# sourceMappingURL=UnifiedAuthProvider-KAGUYQ4J.js.map
@@ -1,10 +1,7 @@
1
1
  import {
2
- OrganisationContextRequiredError,
3
2
  clearCache,
4
3
  getAccessLevel,
5
- getAppConfig,
6
- getAppConfigByName,
7
- getAppConfigWithClient,
4
+ getPageScopeType,
8
5
  getPermissionMap,
9
6
  getRoleContext,
10
7
  hasAllPermissions,
@@ -18,20 +15,22 @@ import {
18
15
  isOrganisationAdmin,
19
16
  isPermitted,
20
17
  isPermittedCached,
18
+ isRBACInitialized,
21
19
  isSuperAdmin,
22
20
  resolveAppContext,
23
21
  setupRBAC
24
- } from "./chunk-KNC55RTG.js";
22
+ } from "./chunk-RWEBCB47.js";
25
23
  import "./chunk-63FOKYGO.js";
24
+ import {
25
+ OrganisationContextRequiredError
26
+ } from "./chunk-QRPVRXYT.js";
26
27
  import "./chunk-PWLANIRT.js";
27
- import "./chunk-7D4SUZUM.js";
28
+ import "./chunk-DGUM43GV.js";
28
29
  export {
29
30
  OrganisationContextRequiredError,
30
31
  clearCache,
31
32
  getAccessLevel,
32
- getAppConfig,
33
- getAppConfigByName,
34
- getAppConfigWithClient,
33
+ getPageScopeType,
35
34
  getPermissionMap,
36
35
  getRoleContext,
37
36
  hasAllPermissions,
@@ -45,8 +44,9 @@ export {
45
44
  isOrganisationAdmin,
46
45
  isPermitted,
47
46
  isPermittedCached,
47
+ isRBACInitialized,
48
48
  isSuperAdmin,
49
49
  resolveAppContext,
50
50
  setupRBAC
51
51
  };
52
- //# sourceMappingURL=api-N774RPUA.js.map
52
+ //# sourceMappingURL=api-IAGWF3ZG.js.map
@@ -6,7 +6,7 @@ import {
6
6
  setGlobalAuditManager
7
7
  } from "./chunk-63FOKYGO.js";
8
8
  import "./chunk-PWLANIRT.js";
9
- import "./chunk-7D4SUZUM.js";
9
+ import "./chunk-DGUM43GV.js";
10
10
  export {
11
11
  RBACAuditManager,
12
12
  createAuditManager,
@@ -14,4 +14,4 @@ export {
14
14
  getGlobalAuditManager,
15
15
  setGlobalAuditManager
16
16
  };
17
- //# sourceMappingURL=audit-B5P6FFIR.js.map
17
+ //# sourceMappingURL=audit-V53FV5AG.js.map
@@ -1,6 +1,9 @@
1
1
  import {
2
2
  useEvents
3
- } from "./chunk-3XTALGJF.js";
3
+ } from "./chunk-6Z7LTB3D.js";
4
+ import {
5
+ isSuperAdmin
6
+ } from "./chunk-RWEBCB47.js";
4
7
  import {
5
8
  assertAppId
6
9
  } from "./chunk-QXHPKYJV.js";
@@ -17,7 +20,7 @@ import {
17
20
  applyPalette,
18
21
  clearPalette,
19
22
  parseAndNormalizeEventColours
20
- } from "./chunk-SQGMNID3.js";
23
+ } from "./chunk-L4OXEN46.js";
21
24
  import {
22
25
  createLogger,
23
26
  logger
@@ -1207,7 +1210,7 @@ function getPublicFileDisplayCacheStats() {
1207
1210
  }
1208
1211
 
1209
1212
  // src/hooks/useFileDisplay.ts
1210
- import { useState as useState4, useEffect as useEffect5, useCallback as useCallback4 } from "react";
1213
+ import { useState as useState4, useEffect as useEffect5, useCallback as useCallback4, useRef as useRef3 } from "react";
1211
1214
 
1212
1215
  // src/utils/file-reference/index.ts
1213
1216
  var log3 = createLogger("FileReferenceService");
@@ -1215,6 +1218,20 @@ var FileReferenceServiceImpl = class {
1215
1218
  constructor(supabase) {
1216
1219
  this.supabase = supabase;
1217
1220
  }
1221
+ /**
1222
+ * Helper method to get app name from app ID
1223
+ */
1224
+ async getAppName(appId) {
1225
+ try {
1226
+ const { data, error } = await this.supabase.from("rbac_apps").select("name").eq("id", appId).single();
1227
+ if (error || !data) {
1228
+ return "unknown";
1229
+ }
1230
+ return data.name || "unknown";
1231
+ } catch {
1232
+ return "unknown";
1233
+ }
1234
+ }
1218
1235
  /**
1219
1236
  * Creates a file reference by uploading a file to storage and linking it in the database.
1220
1237
  *
@@ -1306,8 +1323,27 @@ var FileReferenceServiceImpl = class {
1306
1323
  throw new Error(`Failed to create file reference: ${error.message}`);
1307
1324
  }
1308
1325
  if (!data || data === null) {
1326
+ let isSuperAdminUser = false;
1327
+ try {
1328
+ const { data: { user: authUser } } = await this.supabase.auth.getUser();
1329
+ if (authUser) {
1330
+ isSuperAdminUser = await isSuperAdmin(authUser.id);
1331
+ }
1332
+ } catch (superAdminCheckError) {
1333
+ log3.warn("Failed to check super-admin status", superAdminCheckError);
1334
+ }
1309
1335
  await deleteFile(this.supabase, filePath, options.is_public || false);
1310
- throw new Error(`File upload denied: insufficient permissions. You need 'create:page.${options.pageContext}' or 'update:page.${options.pageContext}' permission for the '${options.pageContext}' page. Make sure the page exists in rbac_app_pages table.`);
1336
+ const appName = await this.getAppName(options.app_id).catch(() => "unknown");
1337
+ const pageContextDisplay = options.pageContext || "undefined";
1338
+ if (isSuperAdminUser) {
1339
+ throw new Error(
1340
+ `File upload failed for super-admin user. This may indicate a database issue. Page context: '${pageContextDisplay}', App: '${appName}'. Please check that the page '${pageContextDisplay}' exists in rbac_app_pages table for app '${appName}'.`
1341
+ );
1342
+ } else {
1343
+ throw new Error(
1344
+ `File upload denied: insufficient permissions. You need 'create:page.${pageContextDisplay}' or 'update:page.${pageContextDisplay}' permission for the '${pageContextDisplay}' page. Make sure the page exists in rbac_app_pages table for app '${appName}'.`
1345
+ );
1346
+ }
1311
1347
  }
1312
1348
  const { data: fileRef, error: fetchError } = await this.supabase.from("core_file_references").select("id, table_name, record_id, file_path, file_metadata, organisation_id, app_id, is_public, created_at, updated_at").eq("id", data).single();
1313
1349
  if (fetchError || !fileRef) {
@@ -1655,14 +1691,20 @@ function useFileDisplay(table_name, record_id, organisation_id, category, option
1655
1691
  const [fileCount, setFileCount] = useState4(0);
1656
1692
  const [isLoading, setIsLoading] = useState4(false);
1657
1693
  const [error, setError] = useState4(null);
1694
+ const isMountedRef = useRef3(true);
1695
+ const safeSetState = (setter, value) => {
1696
+ if (isMountedRef.current) {
1697
+ setter(value);
1698
+ }
1699
+ };
1658
1700
  const fetchFiles = useCallback4(async () => {
1659
1701
  if (!table_name || !record_id || !supabase) {
1660
- setFileUrl(null);
1661
- setFileReference(null);
1662
- setFileReferences([]);
1663
- setFileUrls(/* @__PURE__ */ new Map());
1664
- setFileCount(0);
1665
- setIsLoading(false);
1702
+ safeSetState(setFileUrl, null);
1703
+ safeSetState(setFileReference, null);
1704
+ safeSetState(setFileReferences, []);
1705
+ safeSetState(setFileUrls, /* @__PURE__ */ new Map());
1706
+ safeSetState(setFileCount, 0);
1707
+ safeSetState(setIsLoading, false);
1666
1708
  return;
1667
1709
  }
1668
1710
  if (organisation_id) {
@@ -1685,31 +1727,31 @@ function useFileDisplay(table_name, record_id, organisation_id, category, option
1685
1727
  expiresIn: 3600
1686
1728
  });
1687
1729
  const regeneratedUrl = signedUrlResult?.url || null;
1688
- setFileUrl(regeneratedUrl);
1689
- setFileReference(cachedData.fileReference);
1690
- setFileReferences(cachedData.fileReferences || []);
1691
- setFileUrls(cachedData.fileUrls || /* @__PURE__ */ new Map());
1692
- setFileCount(cachedData.fileCount || 0);
1693
- setIsLoading(false);
1694
- setError(null);
1730
+ safeSetState(setFileUrl, regeneratedUrl);
1731
+ safeSetState(setFileReference, cachedData.fileReference);
1732
+ safeSetState(setFileReferences, cachedData.fileReferences || []);
1733
+ safeSetState(setFileUrls, cachedData.fileUrls || /* @__PURE__ */ new Map());
1734
+ safeSetState(setFileCount, cachedData.fileCount || 0);
1735
+ safeSetState(setIsLoading, false);
1736
+ safeSetState(setError, null);
1695
1737
  return;
1696
1738
  } catch (err) {
1697
1739
  logger.warn("useFileDisplay", "Failed to regenerate signed URL from cache, falling back to fetch:", err);
1698
1740
  }
1699
1741
  }
1700
- setFileUrl(cachedData.fileUrl || null);
1701
- setFileReference(cachedData.fileReference || null);
1702
- setFileReferences(cachedData.fileReferences || []);
1703
- setFileUrls(cachedData.fileUrls || /* @__PURE__ */ new Map());
1704
- setFileCount(cachedData.fileCount || 0);
1705
- setIsLoading(false);
1706
- setError(null);
1742
+ safeSetState(setFileUrl, cachedData.fileUrl || null);
1743
+ safeSetState(setFileReference, cachedData.fileReference || null);
1744
+ safeSetState(setFileReferences, cachedData.fileReferences || []);
1745
+ safeSetState(setFileUrls, cachedData.fileUrls || /* @__PURE__ */ new Map());
1746
+ safeSetState(setFileCount, cachedData.fileCount || 0);
1747
+ safeSetState(setIsLoading, false);
1748
+ safeSetState(setError, null);
1707
1749
  return;
1708
1750
  }
1709
1751
  }
1710
1752
  try {
1711
- setIsLoading(true);
1712
- setError(null);
1753
+ safeSetState(setIsLoading, true);
1754
+ safeSetState(setError, null);
1713
1755
  const service = createFileReferenceService(supabase);
1714
1756
  let files = [];
1715
1757
  const shouldSearchBothScopes = organisation_id === void 0;
@@ -1907,11 +1949,11 @@ function useFileDisplay(table_name, record_id, organisation_id, category, option
1907
1949
  }
1908
1950
  }
1909
1951
  if (files.length === 0) {
1910
- setFileUrl(null);
1911
- setFileReference(null);
1912
- setFileReferences([]);
1913
- setFileUrls(/* @__PURE__ */ new Map());
1914
- setFileCount(0);
1952
+ safeSetState(setFileUrl, null);
1953
+ safeSetState(setFileReference, null);
1954
+ safeSetState(setFileReferences, []);
1955
+ safeSetState(setFileUrls, /* @__PURE__ */ new Map());
1956
+ safeSetState(setFileCount, 0);
1915
1957
  if (enableCache) {
1916
1958
  authenticatedFileCache.set(cacheKey, {
1917
1959
  data: { fileUrl: null, fileReference: null, fileReferences: [], fileUrls: /* @__PURE__ */ new Map(), fileCount: 0 },
@@ -1922,11 +1964,11 @@ function useFileDisplay(table_name, record_id, organisation_id, category, option
1922
1964
  }
1923
1965
  return;
1924
1966
  }
1925
- setFileReferences(files);
1926
- setFileCount(files.length);
1967
+ safeSetState(setFileReferences, files);
1968
+ safeSetState(setFileCount, files.length);
1927
1969
  if (category && files.length > 0) {
1928
1970
  const firstFile = files[0];
1929
- setFileReference(firstFile);
1971
+ safeSetState(setFileReference, firstFile);
1930
1972
  let url = null;
1931
1973
  if (firstFile.is_public) {
1932
1974
  url = getPublicUrl(supabase, firstFile.file_path, true);
@@ -1946,7 +1988,7 @@ function useFileDisplay(table_name, record_id, organisation_id, category, option
1946
1988
  });
1947
1989
  }
1948
1990
  }
1949
- setFileUrl(url);
1991
+ safeSetState(setFileUrl, url);
1950
1992
  } else {
1951
1993
  const urlMap = await generateFileUrlsBatch(supabase, files, {
1952
1994
  appName: "pace-core",
@@ -1954,9 +1996,9 @@ function useFileDisplay(table_name, record_id, organisation_id, category, option
1954
1996
  userId: organisation_id ? void 0 : record_id,
1955
1997
  expiresIn: 3600
1956
1998
  });
1957
- setFileUrls(urlMap);
1958
- setFileReference(null);
1959
- setFileUrl(null);
1999
+ safeSetState(setFileUrls, urlMap);
2000
+ safeSetState(setFileReference, null);
2001
+ safeSetState(setFileUrl, null);
1960
2002
  }
1961
2003
  if (enableCache) {
1962
2004
  let cacheData = {
@@ -1994,28 +2036,36 @@ function useFileDisplay(table_name, record_id, organisation_id, category, option
1994
2036
  } catch (err) {
1995
2037
  logger.error("useFileDisplay", "Error fetching files:", err);
1996
2038
  const error2 = err instanceof Error ? err : new Error("Unknown error occurred");
1997
- setError(error2);
1998
- setFileUrl(null);
1999
- setFileReference(null);
2000
- setFileReferences([]);
2001
- setFileUrls(/* @__PURE__ */ new Map());
2002
- setFileCount(0);
2039
+ safeSetState(setError, error2);
2040
+ safeSetState(setFileUrl, null);
2041
+ safeSetState(setFileReference, null);
2042
+ safeSetState(setFileReferences, []);
2043
+ safeSetState(setFileUrls, /* @__PURE__ */ new Map());
2044
+ safeSetState(setFileCount, 0);
2003
2045
  } finally {
2004
- setIsLoading(false);
2046
+ safeSetState(setIsLoading, false);
2005
2047
  }
2006
2048
  }, [table_name, record_id, organisation_id, category, supabase, cacheTtl, enableCache]);
2007
2049
  useEffect5(() => {
2050
+ isMountedRef.current = true;
2008
2051
  if (table_name && record_id && supabase) {
2009
- fetchFiles();
2052
+ fetchFiles().catch((err) => {
2053
+ if (isMountedRef.current) {
2054
+ safeSetState(setError, err instanceof Error ? err : new Error("Unknown error"));
2055
+ }
2056
+ });
2010
2057
  } else {
2011
- setFileUrl(null);
2012
- setFileReference(null);
2013
- setFileReferences([]);
2014
- setFileUrls(/* @__PURE__ */ new Map());
2015
- setFileCount(0);
2016
- setIsLoading(false);
2017
- setError(null);
2058
+ safeSetState(setFileUrl, null);
2059
+ safeSetState(setFileReference, null);
2060
+ safeSetState(setFileReferences, []);
2061
+ safeSetState(setFileUrls, /* @__PURE__ */ new Map());
2062
+ safeSetState(setFileCount, 0);
2063
+ safeSetState(setIsLoading, false);
2064
+ safeSetState(setError, null);
2018
2065
  }
2066
+ return () => {
2067
+ isMountedRef.current = false;
2068
+ };
2019
2069
  }, [table_name, record_id, organisation_id, supabase]);
2020
2070
  const refetch = useCallback4(async () => {
2021
2071
  if (!table_name || !record_id || !supabase) return;
@@ -2107,11 +2157,11 @@ function useEventTheme(event) {
2107
2157
  }
2108
2158
 
2109
2159
  // src/hooks/usePreventTabReload.ts
2110
- import { useEffect as useEffect7, useRef as useRef3 } from "react";
2160
+ import { useEffect as useEffect7, useRef as useRef4 } from "react";
2111
2161
  function usePreventTabReload(options = {}) {
2112
2162
  const { enabled = true, gracePeriodMs = 2e3 } = options;
2113
- const isRestoringFromCacheRef = useRef3(false);
2114
- const gracePeriodTimeoutRef = useRef3(null);
2163
+ const isRestoringFromCacheRef = useRef4(false);
2164
+ const gracePeriodTimeoutRef = useRef4(null);
2115
2165
  useEffect7(() => {
2116
2166
  if (!enabled || typeof window === "undefined") return;
2117
2167
  const handlePageShow = (event) => {
@@ -2184,4 +2234,4 @@ export {
2184
2234
  useEventTheme,
2185
2235
  usePreventTabReload
2186
2236
  };
2187
- //# sourceMappingURL=chunk-JBKQ3SAO.js.map
2237
+ //# sourceMappingURL=chunk-2T2IG7T7.js.map