@jmruthers/pace-core 0.5.189 → 0.5.190

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 (420) hide show
  1. package/core-usage-manifest.json +0 -4
  2. package/dist/{AuthService-B-cd2MA4.d.ts → AuthService-CbP_utw2.d.ts} +7 -3
  3. package/dist/{DataTable-GUFUNZ3N.js → DataTable-ON3IXISJ.js} +8 -8
  4. package/dist/{PublicPageProvider-B8HaLe69.d.ts → PublicPageProvider-C4uxosp6.d.ts} +83 -24
  5. package/dist/{UnifiedAuthProvider-BG0AL5eE.d.ts → UnifiedAuthProvider-BYA9qB-o.d.ts} +4 -3
  6. package/dist/{UnifiedAuthProvider-643PUAIM.js → UnifiedAuthProvider-X5NXANVI.js} +4 -2
  7. package/dist/{api-YP7XD5L6.js → api-I6UCQ5S6.js} +4 -2
  8. package/dist/{chunk-DDM4CCYT.js → chunk-4QYC5L4K.js} +60 -35
  9. package/dist/chunk-4QYC5L4K.js.map +1 -0
  10. package/dist/{chunk-IM4QE42D.js → chunk-73HSNNOQ.js} +141 -326
  11. package/dist/chunk-73HSNNOQ.js.map +1 -0
  12. package/dist/{chunk-YHCN776L.js → chunk-DZWK57KZ.js} +2 -75
  13. package/dist/chunk-DZWK57KZ.js.map +1 -0
  14. package/dist/{chunk-3GOZZZYH.js → chunk-HQVPB5MZ.js} +238 -301
  15. package/dist/chunk-HQVPB5MZ.js.map +1 -0
  16. package/dist/{chunk-THRPYOFK.js → chunk-HW3OVDUF.js} +5 -5
  17. package/dist/chunk-HW3OVDUF.js.map +1 -0
  18. package/dist/{chunk-F2IMUDXZ.js → chunk-I7PSE6JW.js} +75 -2
  19. package/dist/chunk-I7PSE6JW.js.map +1 -0
  20. package/dist/{chunk-VGZZXKBR.js → chunk-J2XXC7R5.js} +280 -52
  21. package/dist/chunk-J2XXC7R5.js.map +1 -0
  22. package/dist/{chunk-UCQSRW7Z.js → chunk-NIU6J6OX.js} +425 -378
  23. package/dist/chunk-NIU6J6OX.js.map +1 -0
  24. package/dist/{chunk-HESYZWZW.js → chunk-QWWZ5CAQ.js} +2 -2
  25. package/dist/{chunk-HEHYGYOX.js → chunk-RUYZKXOD.js} +401 -46
  26. package/dist/chunk-RUYZKXOD.js.map +1 -0
  27. package/dist/{chunk-2UUZZJFT.js → chunk-SDMHPX3X.js} +176 -160
  28. package/dist/{chunk-2UUZZJFT.js.map → chunk-SDMHPX3X.js.map} +1 -1
  29. package/dist/{chunk-MX64ZF6I.js → chunk-STYK4OH2.js} +11 -11
  30. package/dist/chunk-STYK4OH2.js.map +1 -0
  31. package/dist/{chunk-YGPFYGA6.js → chunk-VVBAW5A5.js} +822 -498
  32. package/dist/chunk-VVBAW5A5.js.map +1 -0
  33. package/dist/chunk-Y4BUBBHD.js +614 -0
  34. package/dist/chunk-Y4BUBBHD.js.map +1 -0
  35. package/dist/{chunk-SAUPYVLF.js → chunk-ZSAAAMVR.js} +1 -1
  36. package/dist/chunk-ZSAAAMVR.js.map +1 -0
  37. package/dist/components.d.ts +3 -4
  38. package/dist/components.js +19 -19
  39. package/dist/components.js.map +1 -1
  40. package/dist/eslint-rules/pace-core-compliance.cjs +0 -2
  41. package/dist/{file-reference-D037xOFK.d.ts → file-reference-BavO2eQj.d.ts} +13 -10
  42. package/dist/hooks.d.ts +10 -5
  43. package/dist/hooks.js +14 -8
  44. package/dist/hooks.js.map +1 -1
  45. package/dist/index.d.ts +13 -11
  46. package/dist/index.js +79 -69
  47. package/dist/index.js.map +1 -1
  48. package/dist/providers.d.ts +3 -3
  49. package/dist/providers.js +3 -1
  50. package/dist/rbac/index.d.ts +76 -12
  51. package/dist/rbac/index.js +12 -9
  52. package/dist/types.d.ts +1 -1
  53. package/dist/types.js +1 -1
  54. package/dist/{usePublicRouteParams-CTDELQ7H.d.ts → usePublicRouteParams-DxIDS4bC.d.ts} +16 -9
  55. package/dist/utils.js +16 -16
  56. package/docs/README.md +2 -2
  57. package/docs/api/classes/ColumnFactory.md +1 -1
  58. package/docs/api/classes/ErrorBoundary.md +1 -1
  59. package/docs/api/classes/InvalidScopeError.md +2 -2
  60. package/docs/api/classes/Logger.md +1 -1
  61. package/docs/api/classes/MissingUserContextError.md +2 -2
  62. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  63. package/docs/api/classes/PermissionDeniedError.md +1 -1
  64. package/docs/api/classes/RBACAuditManager.md +1 -1
  65. package/docs/api/classes/RBACCache.md +1 -1
  66. package/docs/api/classes/RBACEngine.md +4 -4
  67. package/docs/api/classes/RBACError.md +1 -1
  68. package/docs/api/classes/RBACNotInitializedError.md +2 -2
  69. package/docs/api/classes/SecureSupabaseClient.md +21 -16
  70. package/docs/api/classes/StorageUtils.md +7 -4
  71. package/docs/api/enums/FileCategory.md +1 -1
  72. package/docs/api/enums/LogLevel.md +1 -1
  73. package/docs/api/enums/RBACErrorCode.md +1 -1
  74. package/docs/api/enums/RPCFunction.md +1 -1
  75. package/docs/api/interfaces/AddressFieldProps.md +1 -1
  76. package/docs/api/interfaces/AddressFieldRef.md +1 -1
  77. package/docs/api/interfaces/AggregateConfig.md +1 -1
  78. package/docs/api/interfaces/AutocompleteOptions.md +1 -1
  79. package/docs/api/interfaces/AvatarProps.md +1 -1
  80. package/docs/api/interfaces/BadgeProps.md +1 -1
  81. package/docs/api/interfaces/ButtonProps.md +1 -1
  82. package/docs/api/interfaces/CalendarProps.md +20 -6
  83. package/docs/api/interfaces/CardProps.md +1 -1
  84. package/docs/api/interfaces/ColorPalette.md +1 -1
  85. package/docs/api/interfaces/ColorShade.md +1 -1
  86. package/docs/api/interfaces/ComplianceResult.md +1 -1
  87. package/docs/api/interfaces/DataAccessRecord.md +9 -9
  88. package/docs/api/interfaces/DataRecord.md +1 -1
  89. package/docs/api/interfaces/DataTableAction.md +1 -1
  90. package/docs/api/interfaces/DataTableColumn.md +1 -1
  91. package/docs/api/interfaces/DataTableProps.md +1 -1
  92. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  93. package/docs/api/interfaces/DatabaseComplianceResult.md +1 -1
  94. package/docs/api/interfaces/DatabaseIssue.md +1 -1
  95. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  96. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  97. package/docs/api/interfaces/EventAppRoleData.md +1 -1
  98. package/docs/api/interfaces/ExportColumn.md +1 -1
  99. package/docs/api/interfaces/ExportOptions.md +1 -1
  100. package/docs/api/interfaces/FileDisplayProps.md +62 -16
  101. package/docs/api/interfaces/FileMetadata.md +1 -1
  102. package/docs/api/interfaces/FileReference.md +2 -2
  103. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  104. package/docs/api/interfaces/FileUploadOptions.md +26 -12
  105. package/docs/api/interfaces/FileUploadProps.md +30 -19
  106. package/docs/api/interfaces/FooterProps.md +1 -1
  107. package/docs/api/interfaces/FormFieldProps.md +1 -1
  108. package/docs/api/interfaces/FormProps.md +1 -1
  109. package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
  110. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  111. package/docs/api/interfaces/InputProps.md +1 -1
  112. package/docs/api/interfaces/LabelProps.md +1 -1
  113. package/docs/api/interfaces/LoggerConfig.md +1 -1
  114. package/docs/api/interfaces/LoginFormProps.md +1 -1
  115. package/docs/api/interfaces/NavigationAccessRecord.md +10 -10
  116. package/docs/api/interfaces/NavigationContextType.md +9 -9
  117. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  118. package/docs/api/interfaces/NavigationItem.md +1 -1
  119. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  120. package/docs/api/interfaces/NavigationProviderProps.md +7 -7
  121. package/docs/api/interfaces/Organisation.md +1 -1
  122. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  123. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  124. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  125. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  126. package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
  127. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  128. package/docs/api/interfaces/PageAccessRecord.md +8 -8
  129. package/docs/api/interfaces/PagePermissionContextType.md +8 -8
  130. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  131. package/docs/api/interfaces/PagePermissionProviderProps.md +7 -7
  132. package/docs/api/interfaces/PaletteData.md +1 -1
  133. package/docs/api/interfaces/ParsedAddress.md +1 -1
  134. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  135. package/docs/api/interfaces/ProgressProps.md +3 -11
  136. package/docs/api/interfaces/ProtectedRouteProps.md +1 -1
  137. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  138. package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
  139. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  140. package/docs/api/interfaces/QuickFix.md +1 -1
  141. package/docs/api/interfaces/RBACAccessValidateParams.md +1 -1
  142. package/docs/api/interfaces/RBACAccessValidateResult.md +1 -1
  143. package/docs/api/interfaces/RBACAuditLogParams.md +1 -1
  144. package/docs/api/interfaces/RBACAuditLogResult.md +1 -1
  145. package/docs/api/interfaces/RBACConfig.md +1 -1
  146. package/docs/api/interfaces/RBACContext.md +1 -1
  147. package/docs/api/interfaces/RBACLogger.md +1 -1
  148. package/docs/api/interfaces/RBACPageAccessCheckParams.md +1 -1
  149. package/docs/api/interfaces/RBACPerformanceMetrics.md +1 -1
  150. package/docs/api/interfaces/RBACPermissionCheckParams.md +1 -1
  151. package/docs/api/interfaces/RBACPermissionCheckResult.md +1 -1
  152. package/docs/api/interfaces/RBACPermissionsGetParams.md +1 -1
  153. package/docs/api/interfaces/RBACPermissionsGetResult.md +1 -1
  154. package/docs/api/interfaces/RBACResult.md +1 -1
  155. package/docs/api/interfaces/RBACRoleGrantParams.md +1 -1
  156. package/docs/api/interfaces/RBACRoleGrantResult.md +1 -1
  157. package/docs/api/interfaces/RBACRoleRevokeParams.md +1 -1
  158. package/docs/api/interfaces/RBACRoleRevokeResult.md +1 -1
  159. package/docs/api/interfaces/RBACRoleValidateParams.md +1 -1
  160. package/docs/api/interfaces/RBACRoleValidateResult.md +1 -1
  161. package/docs/api/interfaces/RBACRolesListParams.md +1 -1
  162. package/docs/api/interfaces/RBACRolesListResult.md +1 -1
  163. package/docs/api/interfaces/RBACSessionTrackParams.md +1 -1
  164. package/docs/api/interfaces/RBACSessionTrackResult.md +1 -1
  165. package/docs/api/interfaces/ResourcePermissions.md +1 -1
  166. package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
  167. package/docs/api/interfaces/RoleBasedRouterContextType.md +8 -8
  168. package/docs/api/interfaces/RoleBasedRouterProps.md +10 -10
  169. package/docs/api/interfaces/RoleManagementResult.md +1 -1
  170. package/docs/api/interfaces/RouteAccessRecord.md +10 -10
  171. package/docs/api/interfaces/RouteConfig.md +10 -10
  172. package/docs/api/interfaces/RuntimeComplianceResult.md +1 -1
  173. package/docs/api/interfaces/SecureDataContextType.md +9 -9
  174. package/docs/api/interfaces/SecureDataProviderProps.md +8 -8
  175. package/docs/api/interfaces/SessionRestorationLoaderProps.md +1 -1
  176. package/docs/api/interfaces/SetupIssue.md +1 -1
  177. package/docs/api/interfaces/StorageConfig.md +4 -4
  178. package/docs/api/interfaces/StorageFileInfo.md +7 -7
  179. package/docs/api/interfaces/StorageFileMetadata.md +25 -14
  180. package/docs/api/interfaces/StorageListOptions.md +22 -9
  181. package/docs/api/interfaces/StorageListResult.md +4 -4
  182. package/docs/api/interfaces/StorageUploadOptions.md +21 -8
  183. package/docs/api/interfaces/StorageUploadResult.md +6 -6
  184. package/docs/api/interfaces/StorageUrlOptions.md +19 -6
  185. package/docs/api/interfaces/StyleImport.md +1 -1
  186. package/docs/api/interfaces/SwitchProps.md +1 -1
  187. package/docs/api/interfaces/TabsContentProps.md +1 -1
  188. package/docs/api/interfaces/TabsListProps.md +1 -1
  189. package/docs/api/interfaces/TabsProps.md +1 -1
  190. package/docs/api/interfaces/TabsTriggerProps.md +1 -1
  191. package/docs/api/interfaces/TextareaProps.md +1 -1
  192. package/docs/api/interfaces/ToastActionElement.md +1 -1
  193. package/docs/api/interfaces/ToastProps.md +1 -1
  194. package/docs/api/interfaces/UnifiedAuthContextType.md +53 -53
  195. package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
  196. package/docs/api/interfaces/UseFormDialogOptions.md +1 -1
  197. package/docs/api/interfaces/UseFormDialogReturn.md +1 -1
  198. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  199. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  200. package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
  201. package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
  202. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  203. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  204. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +1 -1
  205. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
  206. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  207. package/docs/api/interfaces/UseResolvedScopeOptions.md +4 -4
  208. package/docs/api/interfaces/UseResolvedScopeReturn.md +4 -4
  209. package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
  210. package/docs/api/interfaces/UserEventAccess.md +11 -11
  211. package/docs/api/interfaces/UserMenuProps.md +1 -1
  212. package/docs/api/interfaces/UserProfile.md +1 -1
  213. package/docs/api/modules.md +151 -92
  214. package/docs/api-reference/components.md +15 -7
  215. package/docs/api-reference/providers.md +2 -2
  216. package/docs/api-reference/rpc-functions.md +1 -0
  217. package/docs/best-practices/README.md +1 -1
  218. package/docs/best-practices/deployment.md +8 -8
  219. package/docs/getting-started/examples/README.md +2 -2
  220. package/docs/getting-started/installation-guide.md +4 -4
  221. package/docs/getting-started/quick-start.md +3 -3
  222. package/docs/migration/MIGRATION_GUIDE.md +3 -3
  223. package/docs/rbac/compliance/compliance-guide.md +2 -2
  224. package/docs/rbac/event-based-apps.md +2 -2
  225. package/docs/rbac/getting-started.md +2 -2
  226. package/docs/rbac/quick-start.md +2 -2
  227. package/docs/security/README.md +4 -4
  228. package/docs/standards/07-rbac-and-rls-standard.md +430 -7
  229. package/docs/troubleshooting/README.md +2 -2
  230. package/docs/troubleshooting/migration.md +3 -3
  231. package/package.json +1 -3
  232. package/scripts/check-pace-core-compliance.cjs +1 -1
  233. package/scripts/check-pace-core-compliance.js +1 -1
  234. package/src/__tests__/fixtures/supabase.ts +301 -0
  235. package/src/__tests__/public-recipe-view.test.ts +9 -9
  236. package/src/__tests__/rls-policies.test.ts +197 -61
  237. package/src/components/AddressField/AddressField.test.tsx +42 -0
  238. package/src/components/AddressField/AddressField.tsx +71 -60
  239. package/src/components/AddressField/README.md +1 -0
  240. package/src/components/Alert/Alert.test.tsx +50 -10
  241. package/src/components/Alert/Alert.tsx +5 -3
  242. package/src/components/Avatar/Avatar.test.tsx +95 -43
  243. package/src/components/Avatar/Avatar.tsx +16 -16
  244. package/src/components/Button/Button.test.tsx +2 -1
  245. package/src/components/Button/Button.tsx +3 -3
  246. package/src/components/Calendar/Calendar.test.tsx +53 -37
  247. package/src/components/Calendar/Calendar.tsx +409 -82
  248. package/src/components/Card/Card.test.tsx +7 -4
  249. package/src/components/Card/Card.tsx +3 -6
  250. package/src/components/Checkbox/Checkbox.tsx +2 -2
  251. package/src/components/DataTable/components/ActionButtons.tsx +5 -5
  252. package/src/components/DataTable/components/BulkOperationsDropdown.tsx +2 -2
  253. package/src/components/DataTable/components/ColumnFilter.tsx +1 -1
  254. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +3 -3
  255. package/src/components/DataTable/components/DataTableBody.tsx +12 -12
  256. package/src/components/DataTable/components/DataTableCore.tsx +3 -3
  257. package/src/components/DataTable/components/DataTableToolbar.tsx +5 -5
  258. package/src/components/DataTable/components/DraggableColumnHeader.tsx +3 -3
  259. package/src/components/DataTable/components/EditableRow.tsx +2 -2
  260. package/src/components/DataTable/components/EmptyState.tsx +3 -3
  261. package/src/components/DataTable/components/GroupHeader.tsx +2 -2
  262. package/src/components/DataTable/components/GroupingDropdown.tsx +1 -1
  263. package/src/components/DataTable/components/ImportModal.tsx +4 -4
  264. package/src/components/DataTable/components/LoadingState.tsx +1 -1
  265. package/src/components/DataTable/components/PaginationControls.tsx +11 -11
  266. package/src/components/DataTable/components/UnifiedTableBody.tsx +9 -9
  267. package/src/components/DataTable/components/ViewRowModal.tsx +2 -2
  268. package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +11 -37
  269. package/src/components/DataTable/components/__tests__/DataTableToolbar.test.tsx +157 -0
  270. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +2 -1
  271. package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +128 -0
  272. package/src/components/DataTable/core/__tests__/ActionManager.test.ts +19 -0
  273. package/src/components/DataTable/core/__tests__/ColumnFactory.test.ts +51 -0
  274. package/src/components/DataTable/core/__tests__/ColumnManager.test.ts +84 -0
  275. package/src/components/DataTable/core/__tests__/DataManager.test.ts +14 -0
  276. package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +136 -0
  277. package/src/components/DataTable/core/__tests__/LocalDataAdapter.test.ts +16 -0
  278. package/src/components/DataTable/core/__tests__/PluginRegistry.test.ts +18 -0
  279. package/src/components/DataTable/hooks/useDataTablePermissions.ts +28 -7
  280. package/src/components/DataTable/utils/__tests__/hierarchicalUtils.test.ts +30 -1
  281. package/src/components/DataTable/utils/hierarchicalUtils.ts +38 -10
  282. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +8 -3
  283. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +4 -4
  284. package/src/components/Dialog/Dialog.tsx +2 -2
  285. package/src/components/EventSelector/EventSelector.tsx +7 -7
  286. package/src/components/FileDisplay/FileDisplay.tsx +291 -179
  287. package/src/components/FileUpload/FileUpload.tsx +7 -4
  288. package/src/components/Header/Header.test.tsx +28 -0
  289. package/src/components/Header/Header.tsx +22 -9
  290. package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +2 -2
  291. package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +19 -14
  292. package/src/components/LoadingSpinner/LoadingSpinner.tsx +5 -5
  293. package/src/components/NavigationMenu/NavigationMenu.test.tsx +127 -1
  294. package/src/components/OrganisationSelector/OrganisationSelector.tsx +8 -8
  295. package/src/components/PaceAppLayout/PaceAppLayout.integration.test.tsx +4 -0
  296. package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +3 -0
  297. package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +3 -0
  298. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +16 -6
  299. package/src/components/PaceAppLayout/PaceAppLayout.tsx +37 -3
  300. package/src/components/PaceAppLayout/test-setup.tsx +1 -0
  301. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +66 -45
  302. package/src/components/PaceLoginPage/PaceLoginPage.tsx +6 -4
  303. package/src/components/Progress/Progress.test.tsx +18 -19
  304. package/src/components/Progress/Progress.tsx +31 -32
  305. package/src/components/PublicLayout/PublicLayout.test.tsx +6 -6
  306. package/src/components/PublicLayout/PublicPageProvider.tsx +5 -3
  307. package/src/components/Select/Select.tsx +5 -5
  308. package/src/components/Switch/Switch.test.tsx +2 -1
  309. package/src/components/Switch/Switch.tsx +1 -1
  310. package/src/components/Toast/Toast.tsx +1 -1
  311. package/src/components/Tooltip/Tooltip.test.tsx +8 -2
  312. package/src/components/UserMenu/UserMenu.tsx +3 -3
  313. package/src/eslint-rules/pace-core-compliance.cjs +0 -2
  314. package/src/eslint-rules/pace-core-compliance.js +0 -2
  315. package/src/hooks/__tests__/hooks.integration.test.tsx +4 -1
  316. package/src/hooks/__tests__/useAppConfig.unit.test.ts +76 -5
  317. package/src/hooks/__tests__/useDataTableState.test.ts +76 -0
  318. package/src/hooks/__tests__/useFileUrl.unit.test.ts +25 -69
  319. package/src/hooks/__tests__/useFileUrlCache.test.ts +129 -0
  320. package/src/hooks/__tests__/usePreventTabReload.test.ts +88 -0
  321. package/src/hooks/__tests__/{usePublicEvent.unit.test.ts → usePublicEvent.test.ts} +28 -1
  322. package/src/hooks/__tests__/useQueryCache.test.ts +144 -0
  323. package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +58 -16
  324. package/src/hooks/index.ts +1 -1
  325. package/src/hooks/public/usePublicEvent.ts +2 -2
  326. package/src/hooks/public/usePublicFileDisplay.ts +173 -87
  327. package/src/hooks/useAppConfig.ts +24 -5
  328. package/src/hooks/useFileDisplay.ts +297 -34
  329. package/src/hooks/useFileReference.ts +56 -11
  330. package/src/hooks/useFileUrl.ts +1 -1
  331. package/src/hooks/useInactivityTracker.ts +16 -7
  332. package/src/hooks/usePermissionCache.test.ts +85 -8
  333. package/src/hooks/useQueryCache.ts +21 -0
  334. package/src/hooks/useSecureDataAccess.test.ts +80 -35
  335. package/src/hooks/useSecureDataAccess.ts +80 -37
  336. package/src/providers/services/EventServiceProvider.tsx +37 -17
  337. package/src/providers/services/InactivityServiceProvider.tsx +4 -4
  338. package/src/providers/services/OrganisationServiceProvider.tsx +8 -1
  339. package/src/providers/services/UnifiedAuthProvider.tsx +115 -29
  340. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +451 -0
  341. package/src/rbac/__tests__/engine.comprehensive.test.ts +12 -0
  342. package/src/rbac/__tests__/rbac-engine-core-logic.test.ts +8 -0
  343. package/src/rbac/__tests__/rbac-engine-simplified.test.ts +4 -0
  344. package/src/rbac/api.ts +240 -36
  345. package/src/rbac/cache-invalidation.ts +21 -7
  346. package/src/rbac/compliance/quick-fix-suggestions.ts +1 -1
  347. package/src/rbac/components/NavigationGuard.tsx +23 -63
  348. package/src/rbac/components/NavigationProvider.test.tsx +52 -23
  349. package/src/rbac/components/NavigationProvider.tsx +13 -11
  350. package/src/rbac/components/PagePermissionGuard.tsx +77 -203
  351. package/src/rbac/components/PagePermissionProvider.tsx +13 -11
  352. package/src/rbac/components/PermissionEnforcer.tsx +24 -62
  353. package/src/rbac/components/RoleBasedRouter.tsx +14 -12
  354. package/src/rbac/components/SecureDataProvider.tsx +13 -11
  355. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +104 -41
  356. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +49 -12
  357. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +22 -1
  358. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +161 -82
  359. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +22 -1
  360. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +77 -30
  361. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +39 -5
  362. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +47 -4
  363. package/src/rbac/engine.ts +4 -2
  364. package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +144 -52
  365. package/src/rbac/hooks/index.ts +3 -0
  366. package/src/rbac/hooks/useCan.test.ts +101 -53
  367. package/src/rbac/hooks/usePermissions.ts +108 -41
  368. package/src/rbac/hooks/useRBAC.test.ts +11 -3
  369. package/src/rbac/hooks/useRBAC.ts +83 -40
  370. package/src/rbac/hooks/useResolvedScope.test.ts +189 -63
  371. package/src/rbac/hooks/useResolvedScope.ts +128 -70
  372. package/src/rbac/hooks/useSecureSupabase.ts +36 -19
  373. package/src/rbac/hooks/useSuperAdminBypass.ts +126 -0
  374. package/src/rbac/request-deduplication.ts +1 -1
  375. package/src/rbac/secureClient.ts +72 -12
  376. package/src/rbac/security.ts +29 -23
  377. package/src/rbac/types.ts +10 -0
  378. package/src/rbac/utils/__tests__/contextValidator.test.ts +150 -0
  379. package/src/rbac/utils/__tests__/deep-equal.test.ts +53 -0
  380. package/src/rbac/utils/__tests__/eventContext.test.ts +6 -1
  381. package/src/rbac/utils/contextValidator.ts +288 -0
  382. package/src/rbac/utils/eventContext.ts +48 -2
  383. package/src/services/EventService.ts +165 -21
  384. package/src/services/OrganisationService.ts +37 -2
  385. package/src/services/__tests__/EventService.test.ts +26 -21
  386. package/src/types/file-reference.ts +13 -10
  387. package/src/utils/app/appNameResolver.test.ts +346 -73
  388. package/src/utils/context/superAdminOverride.ts +58 -0
  389. package/src/utils/file-reference/index.ts +61 -33
  390. package/src/utils/google-places/googlePlacesUtils.test.ts +98 -0
  391. package/src/utils/google-places/loadGoogleMapsScript.test.ts +83 -0
  392. package/src/utils/storage/helpers.test.ts +1 -1
  393. package/src/utils/storage/helpers.ts +38 -19
  394. package/src/utils/storage/types.ts +15 -8
  395. package/src/utils/validation/__tests__/csrf.test.ts +105 -0
  396. package/src/utils/validation/__tests__/sqlInjectionProtection.test.ts +92 -0
  397. package/src/vite-env.d.ts +2 -2
  398. package/dist/chunk-3GOZZZYH.js.map +0 -1
  399. package/dist/chunk-DDM4CCYT.js.map +0 -1
  400. package/dist/chunk-E7UAOUMY.js +0 -75
  401. package/dist/chunk-E7UAOUMY.js.map +0 -1
  402. package/dist/chunk-F2IMUDXZ.js.map +0 -1
  403. package/dist/chunk-HEHYGYOX.js.map +0 -1
  404. package/dist/chunk-IM4QE42D.js.map +0 -1
  405. package/dist/chunk-MX64ZF6I.js.map +0 -1
  406. package/dist/chunk-SAUPYVLF.js.map +0 -1
  407. package/dist/chunk-THRPYOFK.js.map +0 -1
  408. package/dist/chunk-UCQSRW7Z.js.map +0 -1
  409. package/dist/chunk-VGZZXKBR.js.map +0 -1
  410. package/dist/chunk-YGPFYGA6.js.map +0 -1
  411. package/dist/chunk-YHCN776L.js.map +0 -1
  412. package/src/hooks/__tests__/usePermissionCache.simple.test.ts +0 -192
  413. package/src/hooks/__tests__/usePermissionCache.unit.test.ts +0 -741
  414. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +0 -703
  415. package/src/rbac/hooks/useRBAC.simple.test.ts +0 -95
  416. package/src/rbac/utils/__tests__/eventContext.unit.test.ts +0 -428
  417. /package/dist/{DataTable-GUFUNZ3N.js.map → DataTable-ON3IXISJ.js.map} +0 -0
  418. /package/dist/{UnifiedAuthProvider-643PUAIM.js.map → UnifiedAuthProvider-X5NXANVI.js.map} +0 -0
  419. /package/dist/{api-YP7XD5L6.js.map → api-I6UCQ5S6.js.map} +0 -0
  420. /package/dist/{chunk-HESYZWZW.js.map → chunk-QWWZ5CAQ.js.map} +0 -0
@@ -213,10 +213,6 @@
213
213
  "module": "@radix-ui/react-label",
214
214
  "reason": "Use Label component from pace-core instead"
215
215
  },
216
- {
217
- "module": "@radix-ui/react-progress",
218
- "reason": "Use Progress component from pace-core instead"
219
- },
220
216
  {
221
217
  "module": "@radix-ui/react-slot",
222
218
  "reason": "Use Button component from pace-core which handles slot composition"
@@ -103,6 +103,8 @@ declare class EventService extends BaseService implements IEventService {
103
103
  private appName;
104
104
  private selectedOrganisation;
105
105
  private setSelectedEventId;
106
+ private isSuperAdmin;
107
+ private appConfig;
106
108
  private isInitializedRef;
107
109
  private isFetchingRef;
108
110
  private hasAutoSelectedRef;
@@ -349,11 +351,13 @@ interface InactivityServiceProviderProps {
349
351
  supabaseClient: SupabaseClient;
350
352
  user: User | null;
351
353
  session: Session | null;
352
- idleTimeoutMs?: number;
353
- warnBeforeMs?: number;
354
+ idleTimeoutMs: number;
355
+ warnBeforeMs: number;
354
356
  onIdleLogout: (reason: 'inactivity') => void;
355
357
  }
356
- declare function InactivityServiceProvider({ children, supabaseClient, user, session, idleTimeoutMs, warnBeforeMs, onIdleLogout }: InactivityServiceProviderProps): react_jsx_runtime.JSX.Element;
358
+ declare function InactivityServiceProvider({ children, supabaseClient, user, session, idleTimeoutMs, // REQUIRED: No default - must be explicitly provided
359
+ warnBeforeMs, // REQUIRED: No default - must be explicitly provided
360
+ onIdleLogout }: InactivityServiceProviderProps): react_jsx_runtime.JSX.Element;
357
361
 
358
362
  /**
359
363
  * @file Authentication Service Interface
@@ -60,10 +60,8 @@ import {
60
60
  sum,
61
61
  validateHierarchicalData,
62
62
  validatePaginationConfig
63
- } from "./chunk-2UUZZJFT.js";
64
- import "./chunk-3GOZZZYH.js";
65
- import "./chunk-HEHYGYOX.js";
66
- import "./chunk-63FOKYGO.js";
63
+ } from "./chunk-SDMHPX3X.js";
64
+ import "./chunk-HQVPB5MZ.js";
67
65
  import {
68
66
  CircuitBreaker,
69
67
  DEFAULT_FALLBACK_CONFIG,
@@ -82,11 +80,13 @@ import {
82
80
  throttle,
83
81
  useDataTablePerformance
84
82
  } from "./chunk-6C4YBBJM.js";
85
- import "./chunk-E7UAOUMY.js";
86
- import "./chunk-VGZZXKBR.js";
83
+ import "./chunk-Y4BUBBHD.js";
84
+ import "./chunk-J2XXC7R5.js";
85
+ import "./chunk-RUYZKXOD.js";
86
+ import "./chunk-63FOKYGO.js";
87
87
  import "./chunk-QXHPKYJV.js";
88
88
  import "./chunk-R77UEZ4E.js";
89
- import "./chunk-F2IMUDXZ.js";
89
+ import "./chunk-I7PSE6JW.js";
90
90
  import "./chunk-VBXEHIUJ.js";
91
91
  import "./chunk-PWLANIRT.js";
92
92
  import "./chunk-7D4SUZUM.js";
@@ -169,4 +169,4 @@ export {
169
169
  validateHierarchicalData,
170
170
  validatePaginationConfig
171
171
  };
172
- //# sourceMappingURL=DataTable-GUFUNZ3N.js.map
172
+ //# sourceMappingURL=DataTable-ON3IXISJ.js.map
@@ -2,14 +2,13 @@ import * as React$1 from 'react';
2
2
  import React__default, { Component, ReactNode } from 'react';
3
3
  import { P as ParsedAddress, A as AutocompleteOptions } from './types-Bwgl--Xo.js';
4
4
  import * as LabelPrimitive from '@radix-ui/react-label';
5
- import { F as FileCategory, e as FileUploadResult, U as UploadProgress, c as FileUploadOptions, a as FileReference } from './file-reference-D037xOFK.js';
5
+ import { F as FileCategory, e as FileUploadResult, U as UploadProgress, c as FileUploadOptions, a as FileReference } from './file-reference-BavO2eQj.js';
6
6
  import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
7
7
  import * as SwitchPrimitive from '@radix-ui/react-switch';
8
- import * as ProgressPrimitive from '@radix-ui/react-progress';
9
8
  import * as react_jsx_runtime from 'react/jsx-runtime';
10
9
  import * as DialogPrimitive from '@radix-ui/react-dialog';
11
10
  import * as TabsPrimitive from '@radix-ui/react-tabs';
12
- import { DayPickerProps } from 'react-day-picker';
11
+ import { DayPickerProps, DateRange } from 'react-day-picker';
13
12
  import * as ToastPrimitives from '@radix-ui/react-toast';
14
13
  import * as TooltipPrimitive from '@radix-ui/react-tooltip';
15
14
  import { FieldValues, DefaultValues, SubmitHandler, SubmitErrorHandler, UseFormReturn, FieldPath, ControllerRenderProps, ControllerFieldState, UseFormStateReturn } from 'react-hook-form';
@@ -296,8 +295,15 @@ interface AddressFieldRef {
296
295
  * - Debounced input with caching
297
296
  * - Keyboard navigation (Arrow keys, Enter, Escape)
298
297
  * - Accessible ARIA attributes
298
+ * - Semantic HTML (description list for suggestions)
299
299
  * - Loading and error states
300
300
  * - place_id storage for later retrieval
301
+ *
302
+ * @accessibility
303
+ * - Uses semantic HTML: `<dl>`, `<dt>`, `<dd>` for address suggestions
304
+ * - Proper ARIA attributes for combobox pattern
305
+ * - Keyboard navigation support
306
+ * - Screen reader friendly
301
307
  */
302
308
 
303
309
  /**
@@ -532,6 +538,7 @@ declare const Textarea: React$1.ForwardRefExoticComponent<TextareaProps & React$
532
538
  * Features:
533
539
  * - Multiple visual variants (default, destructive, inline)
534
540
  * - Title and description support
541
+ * - Semantic HTML: renders as `<aside>` element
535
542
  * - ARIA role="alert" for accessibility
536
543
  * - Keyboard and screen reader accessible
537
544
  * - Composable with icons and actions
@@ -562,14 +569,15 @@ declare const Textarea: React$1.ForwardRefExoticComponent<TextareaProps & React$
562
569
  * ```
563
570
  *
564
571
  * @accessibility
572
+ * - Uses semantic HTML: `<aside>` element for better semantic meaning
565
573
  * - Uses role="alert" for screen reader announcement
566
574
  * - Title and description are semantically structured
567
575
  * - Supports keyboard navigation and focus
568
576
  */
569
577
 
570
- declare const Alert: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLDivElement> & {
578
+ declare const Alert: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLElement> & {
571
579
  variant?: "default" | "destructive" | "inline";
572
- } & React$1.RefAttributes<HTMLDivElement>>;
580
+ } & React$1.RefAttributes<HTMLElement>>;
573
581
  declare const AlertTitle: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLHeadingElement> & React$1.RefAttributes<HTMLHeadingElement>>;
574
582
  declare const AlertDescription: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLParagraphElement> & React$1.RefAttributes<HTMLParagraphElement>>;
575
583
 
@@ -862,16 +870,16 @@ declare const Switch: React$1.ForwardRefExoticComponent<SwitchProps & React$1.Re
862
870
  * @module Components/Progress
863
871
  * @since 0.1.0
864
872
  *
865
- * An accessible progress bar component built on top of Radix UI primitives.
873
+ * An accessible progress bar component built on the native HTML `<progress>` element.
866
874
  * Provides smooth animations and proper ARIA attributes for screen readers.
867
875
  *
868
876
  * Features:
869
877
  * - Smooth progress animations
870
878
  * - Customizable value and max range
871
- * - Proper ARIA attributes for accessibility
879
+ * - Native accessibility support (role="progressbar" automatically applied)
872
880
  * - Customizable styling and appearance
873
881
  * - Responsive design
874
- * - Keyboard accessible
882
+ * - Indeterminate state support
875
883
  *
876
884
  * @example
877
885
  * ```tsx
@@ -898,22 +906,23 @@ declare const Switch: React$1.ForwardRefExoticComponent<SwitchProps & React$1.Re
898
906
  * }, []);
899
907
  *
900
908
  * <Progress value={progress} />
909
+ *
910
+ * // Indeterminate progress (no value)
911
+ * <Progress />
901
912
  * ```
902
913
  *
903
914
  * @accessibility
904
915
  * - WCAG 2.1 AA compliant
905
- * - Proper ARIA attributes (aria-valuenow, aria-valuemax, aria-valuemin)
916
+ * - Native `<progress>` element provides role="progressbar" automatically
906
917
  * - Screen reader announcements for progress changes
907
- * - Keyboard navigation support
908
918
  * - High contrast support
909
919
  *
910
920
  * @performance
911
921
  * - CSS transitions for smooth animations
912
922
  * - Efficient re-rendering
913
- * - Minimal DOM structure
923
+ * - Minimal DOM structure (native HTML element)
914
924
  *
915
925
  * @dependencies
916
- * - @radix-ui/react-progress - Core progress functionality
917
926
  * - React 18+ - Hooks and refs
918
927
  * - Tailwind CSS - Styling
919
928
  */
@@ -921,15 +930,15 @@ declare const Switch: React$1.ForwardRefExoticComponent<SwitchProps & React$1.Re
921
930
  /**
922
931
  * Props for the Progress component
923
932
  */
924
- interface ProgressProps extends React$1.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root> {
925
- /** Current progress value (0 to max) */
933
+ interface ProgressProps extends React$1.HTMLAttributes<HTMLProgressElement> {
934
+ /** Current progress value (0 to max). Omit for indeterminate state. */
926
935
  value?: number;
927
936
  /** Maximum progress value (default: 100) */
928
937
  max?: number;
929
938
  }
930
939
  /**
931
940
  * Progress component
932
- * An accessible progress bar with smooth animations
941
+ * An accessible progress bar with smooth animations using native HTML `<progress>` element
933
942
  *
934
943
  * @param props - Progress configuration and styling
935
944
  * @param ref - Forwarded ref to the progress element
@@ -940,7 +949,7 @@ interface ProgressProps extends React$1.ComponentPropsWithoutRef<typeof Progress
940
949
  * <Progress value={75} max={100} />
941
950
  * ```
942
951
  */
943
- declare const Progress: React$1.ForwardRefExoticComponent<ProgressProps & React$1.RefAttributes<HTMLDivElement>>;
952
+ declare const Progress: React$1.ForwardRefExoticComponent<ProgressProps & React$1.RefAttributes<HTMLProgressElement>>;
944
953
 
945
954
  /**
946
955
  * Dialog size variants
@@ -1359,7 +1368,7 @@ declare const TabsContent: React$1.ForwardRefExoticComponent<TabsContentProps &
1359
1368
  * Features:
1360
1369
  * - Single, range, and multiple date selection modes
1361
1370
  * - Date disabling (past dates, weekends, etc.)
1362
- * - Localization support
1371
+ * - Localization support (defaults to Australian locale with Monday as first day of week)
1363
1372
  * - Keyboard navigation
1364
1373
  * - Accessible date selection
1365
1374
  * - Customizable styling
@@ -1406,13 +1415,18 @@ declare const TabsContent: React$1.ForwardRefExoticComponent<TabsContentProps &
1406
1415
 
1407
1416
  interface CalendarProps extends Omit<DayPickerProps, 'className' | 'classNames' | 'styles' | 'onSelect'> {
1408
1417
  /**
1409
- * Additional CSS classes to apply to the calendar wrapper
1418
+ * Additional CSS classes to apply to the calendar table
1410
1419
  */
1411
1420
  className?: string;
1412
1421
  /**
1413
1422
  * Custom classNames for DayPicker sub-components
1414
1423
  */
1415
1424
  classNames?: DayPickerProps['classNames'];
1425
+ /**
1426
+ * Currently selected value; mirrors DayPicker's `selected` prop so callers
1427
+ * can control the selection state.
1428
+ */
1429
+ selected?: Date | Date[] | DateRange | undefined;
1416
1430
  /**
1417
1431
  * Date selection handler. Signature depends on mode:
1418
1432
  * - mode="single": (date: Date | undefined) => void
@@ -1429,13 +1443,22 @@ interface CalendarProps extends Omit<DayPickerProps, 'className' | 'classNames'
1429
1443
  * A flexible, accessible calendar component for date selection.
1430
1444
  * Built on react-day-picker with pace-core styling.
1431
1445
  *
1446
+ * Defaults to Australian locale (en-AU) with Monday as the first day of the week.
1447
+ * The locale can be overridden by passing a `locale` prop.
1448
+ *
1449
+ * Month navigation is automatically managed internally when `month` and `onMonthChange` props
1450
+ * are not provided. The displayed month will sync with the selected date when available,
1451
+ * or default to the current month. Navigation buttons (prev/next) work automatically.
1452
+ *
1453
+ * For controlled month state, pass `month` and `onMonthChange` props.
1454
+ *
1432
1455
  * @param props - Calendar configuration and styling
1433
1456
  * @param ref - Forwarded ref (not used directly, but maintained for API consistency)
1434
1457
  * @returns JSX.Element - The rendered calendar element
1435
1458
  *
1436
1459
  * @example
1437
1460
  * ```tsx
1438
- * // Single date selection
1461
+ * // Single date selection (uses default Australian locale)
1439
1462
  * <Calendar
1440
1463
  * mode="single"
1441
1464
  * selected={date}
@@ -1449,9 +1472,28 @@ interface CalendarProps extends Omit<DayPickerProps, 'className' | 'classNames'
1449
1472
  * onSelect={setDate}
1450
1473
  * disabled={(date) => date < new Date()}
1451
1474
  * />
1475
+ *
1476
+ * // Override locale (e.g., US locale with Sunday as first day)
1477
+ * import { enUS } from 'date-fns/locale';
1478
+ * <Calendar
1479
+ * mode="single"
1480
+ * selected={date}
1481
+ * onSelect={setDate}
1482
+ * locale={enUS}
1483
+ * />
1484
+ *
1485
+ * // Controlled month state (optional - month is auto-managed if not provided)
1486
+ * const [month, setMonth] = useState(new Date());
1487
+ * <Calendar
1488
+ * mode="single"
1489
+ * selected={date}
1490
+ * onSelect={setDate}
1491
+ * month={month}
1492
+ * onMonthChange={setMonth}
1493
+ * />
1452
1494
  * ```
1453
1495
  */
1454
- declare const Calendar: React$1.ForwardRefExoticComponent<CalendarProps & React$1.RefAttributes<HTMLDivElement>>;
1496
+ declare const Calendar: React$1.ForwardRefExoticComponent<CalendarProps & React$1.RefAttributes<HTMLTableElement>>;
1455
1497
 
1456
1498
  declare const ToastProvider: React$1.FC<ToastPrimitives.ToastProviderProps>;
1457
1499
  /**
@@ -3625,7 +3667,8 @@ interface FileUploadProps {
3625
3667
  supabase: SupabaseClient;
3626
3668
  table_name: string;
3627
3669
  record_id: string;
3628
- organisation_id: string;
3670
+ organisation_id?: string | null;
3671
+ userId?: string;
3629
3672
  app_id?: string;
3630
3673
  category: FileCategory;
3631
3674
  folder: string;
@@ -3644,13 +3687,19 @@ interface FileUploadProps {
3644
3687
  onProgress?: (progress: UploadProgress) => void;
3645
3688
  children?: React__default.ReactNode;
3646
3689
  }
3647
- declare function FileUpload({ supabase, table_name, record_id, organisation_id, app_id, category, folder, pageContext, event_id, accept, maxSize, // 10MB default
3690
+ declare function FileUpload({ supabase, table_name, record_id, organisation_id, userId, app_id, category, folder, pageContext, event_id, accept, maxSize, // 10MB default
3648
3691
  multiple, disabled, isPublic, className, showPreview, showProgress, onUploadSuccess, onUploadError, onProgress, children }: FileUploadProps): react_jsx_runtime.JSX.Element;
3649
3692
 
3650
3693
  interface FileDisplayProps {
3651
3694
  table_name: string;
3652
3695
  record_id: string;
3653
- organisation_id: string;
3696
+ /**
3697
+ * Optional organisation ID. When not provided (undefined), the component will automatically
3698
+ * search for files in both user-scoped (organisation_id = null) and organisation-scoped contexts.
3699
+ * If both types of files exist, organisation-scoped files are preferred.
3700
+ * When explicitly set to null, only user-scoped files are searched.
3701
+ */
3702
+ organisation_id?: string;
3654
3703
  category?: FileCategory;
3655
3704
  /** Display only a single file instead of all files. Uses first file (prefers images) from all files, without category filtering */
3656
3705
  displayOnly?: boolean;
@@ -3670,8 +3719,18 @@ interface FileDisplayProps {
3670
3719
  generateFallbackText?: (fileName?: string) => string;
3671
3720
  /** Explicit fallback text to display (overrides generateFallbackText) */
3672
3721
  fallbackText?: string;
3722
+ /** Source text to use for generating fallback text (overrides filename) */
3723
+ fallbackSourceText?: string;
3673
3724
  /** Size variant for fallback display (only applies when showFallback is true) */
3674
3725
  fallbackSize?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';
3726
+ /**
3727
+ * Enable children rendering in displayOnly mode. When true, uses standard display path
3728
+ * (with children support) even if showDelete is false. The delete button will only appear
3729
+ * if showDelete is also true.
3730
+ */
3731
+ enableChildren?: boolean;
3732
+ /** Whether to show metadata (filename, filesize, mimetype) in figcaption. Defaults to true. */
3733
+ showMetadata?: boolean;
3675
3734
  }
3676
3735
  /**
3677
3736
  * Component for displaying file references with context-awareness
@@ -3691,7 +3750,7 @@ interface FileDisplayProps {
3691
3750
  * @param props.category - Optional category filter. When specified, only displays files matching this category and uses single file display variant.
3692
3751
  * @returns React element with file display
3693
3752
  */
3694
- declare function FileDisplay({ table_name, record_id, organisation_id, category, displayOnly, showDelete, className, children, loadingComponent, errorComponent, showFallback, generateFallbackText, fallbackText, fallbackSize }: FileDisplayProps): react_jsx_runtime.JSX.Element;
3753
+ declare function FileDisplay({ table_name, record_id, organisation_id, category, displayOnly, showDelete, className, children, loadingComponent, errorComponent, showFallback, generateFallbackText, fallbackText, fallbackSourceText, fallbackSize, enableChildren, showMetadata }: FileDisplayProps): react_jsx_runtime.JSX.Element;
3695
3754
 
3696
3755
  declare function useFileReference(supabase: SupabaseClient): {
3697
3756
  isLoading: boolean;
@@ -107,8 +107,9 @@ interface UnifiedAuthProviderProps {
107
107
  dangerouslyDisableInactivity?: boolean;
108
108
  }
109
109
  declare function UnifiedAuthProvider({ children, supabaseClient, appName, appConfig, // Default to requiring events
110
- persistState, enablePersistence, requireOrganisationContext, idleTimeoutMs, // 30 minutes
111
- warnBeforeMs, // 60 seconds
112
- onIdleLogout, renderInactivityWarning, dangerouslyDisableInactivity }: UnifiedAuthProviderProps): react_jsx_runtime.JSX.Element;
110
+ persistState, enablePersistence, requireOrganisationContext, idleTimeoutMs, // REQUIRED: No default - must be explicitly provided
111
+ warnBeforeMs, // REQUIRED: No default - must be explicitly provided
112
+ onIdleLogout, // REQUIRED: No default - must be explicitly provided
113
+ renderInactivityWarning, dangerouslyDisableInactivity }: UnifiedAuthProviderProps): react_jsx_runtime.JSX.Element;
113
114
 
114
115
  export { type UserEventAccess as U, type UnifiedAuthContextType as a, UnifiedAuthContext as b, type UnifiedAuthProviderProps as c, UnifiedAuthProvider as d, useUnifiedAuth as u };
@@ -2,7 +2,9 @@ import {
2
2
  UnifiedAuthContext,
3
3
  UnifiedAuthProvider,
4
4
  useUnifiedAuth
5
- } from "./chunk-VGZZXKBR.js";
5
+ } from "./chunk-J2XXC7R5.js";
6
+ import "./chunk-RUYZKXOD.js";
7
+ import "./chunk-63FOKYGO.js";
6
8
  import "./chunk-QXHPKYJV.js";
7
9
  import "./chunk-VBXEHIUJ.js";
8
10
  import "./chunk-PWLANIRT.js";
@@ -12,4 +14,4 @@ export {
12
14
  UnifiedAuthProvider,
13
15
  useUnifiedAuth
14
16
  };
15
- //# sourceMappingURL=UnifiedAuthProvider-643PUAIM.js.map
17
+ //# sourceMappingURL=UnifiedAuthProvider-X5NXANVI.js.map
@@ -3,6 +3,7 @@ import {
3
3
  clearCache,
4
4
  getAccessLevel,
5
5
  getAppConfig,
6
+ getAppConfigByName,
6
7
  getAppConfigWithClient,
7
8
  getPermissionMap,
8
9
  getRoleContext,
@@ -20,7 +21,7 @@ import {
20
21
  isSuperAdmin,
21
22
  resolveAppContext,
22
23
  setupRBAC
23
- } from "./chunk-HEHYGYOX.js";
24
+ } from "./chunk-RUYZKXOD.js";
24
25
  import "./chunk-63FOKYGO.js";
25
26
  import "./chunk-PWLANIRT.js";
26
27
  import "./chunk-7D4SUZUM.js";
@@ -29,6 +30,7 @@ export {
29
30
  clearCache,
30
31
  getAccessLevel,
31
32
  getAppConfig,
33
+ getAppConfigByName,
32
34
  getAppConfigWithClient,
33
35
  getPermissionMap,
34
36
  getRoleContext,
@@ -47,4 +49,4 @@ export {
47
49
  resolveAppContext,
48
50
  setupRBAC
49
51
  };
50
- //# sourceMappingURL=api-YP7XD5L6.js.map
52
+ //# sourceMappingURL=api-I6UCQ5S6.js.map
@@ -1,10 +1,11 @@
1
1
  import {
2
- useOrganisations
3
- } from "./chunk-E7UAOUMY.js";
2
+ useResolvedScope,
3
+ useSuperAdminBypass
4
+ } from "./chunk-Y4BUBBHD.js";
4
5
  import {
5
6
  EventServiceContext,
6
7
  useUnifiedAuth
7
- } from "./chunk-VGZZXKBR.js";
8
+ } from "./chunk-J2XXC7R5.js";
8
9
  import {
9
10
  setOrganisationContext
10
11
  } from "./chunk-VBXEHIUJ.js";
@@ -15,10 +16,16 @@ import {
15
16
  // src/hooks/useSecureDataAccess.ts
16
17
  import { useCallback, useState, useContext } from "react";
17
18
  function useSecureDataAccess() {
18
- const { supabase, user, session } = useUnifiedAuth();
19
- const { ensureOrganisationContext } = useOrganisations();
19
+ const { supabase, user, session, selectedOrganisation, selectedEvent } = useUnifiedAuth();
20
20
  const eventServiceContext = useContext(EventServiceContext);
21
- const selectedEvent = eventServiceContext?.eventService?.getSelectedEvent() || null;
21
+ const eventFromContext = eventServiceContext?.eventService?.getSelectedEvent() || null;
22
+ const effectiveSelectedEvent = selectedEvent || eventFromContext;
23
+ const { isSuperAdmin } = useSuperAdminBypass();
24
+ const { resolvedScope } = useResolvedScope({
25
+ supabase,
26
+ selectedOrganisationId: selectedOrganisation?.id || null,
27
+ selectedEventId: effectiveSelectedEvent?.event_id || null
28
+ });
22
29
  const validateContext = useCallback(() => {
23
30
  if (!supabase) {
24
31
  throw new Error("No Supabase client available");
@@ -26,26 +33,30 @@ function useSecureDataAccess() {
26
33
  if (!user || !session) {
27
34
  throw new Error("User must be authenticated with valid session");
28
35
  }
29
- try {
30
- ensureOrganisationContext();
31
- } catch (error) {
36
+ if (isSuperAdmin) {
37
+ return;
38
+ }
39
+ if (!resolvedScope?.organisationId) {
32
40
  throw new Error("Organisation context is required for data access");
33
41
  }
34
- }, [supabase, user, session, ensureOrganisationContext]);
42
+ }, [supabase, user, session, resolvedScope, isSuperAdmin]);
35
43
  const getCurrentOrganisationId = useCallback(() => {
44
+ if (isSuperAdmin) {
45
+ return resolvedScope?.organisationId || selectedOrganisation?.id || "";
46
+ }
36
47
  validateContext();
37
- const currentOrg = ensureOrganisationContext();
38
- return currentOrg.id;
39
- }, [validateContext, ensureOrganisationContext]);
48
+ return resolvedScope?.organisationId || "";
49
+ }, [validateContext, resolvedScope, selectedOrganisation, isSuperAdmin]);
40
50
  const setOrganisationContextInSession = useCallback(async (organisationId) => {
41
- if (!supabase) {
42
- throw new Error("No Supabase client available");
51
+ if (!supabase || !organisationId) {
52
+ return;
43
53
  }
44
54
  await setOrganisationContext(supabase, organisationId);
45
55
  }, [supabase]);
46
56
  const secureQuery = useCallback(async (table, columns, filters = {}, options = {}) => {
47
57
  validateContext();
48
- const organisationId = getCurrentOrganisationId();
58
+ const bypassOrganisationFilter = isSuperAdmin;
59
+ const organisationId = bypassOrganisationFilter ? void 0 : getCurrentOrganisationId();
49
60
  await setOrganisationContextInSession(organisationId);
50
61
  let query = supabase.from(table).select(columns);
51
62
  const tablesWithOrganisation = [
@@ -98,10 +109,15 @@ function useSecureDataAccess() {
98
109
  "cake_unit",
99
110
  "event_app_access",
100
111
  "base_application",
101
- "base_questions"
112
+ "base_questions",
113
+ // rbac_user_profiles has organisation_id but uses conditional filtering
114
+ "rbac_user_profiles"
102
115
  ];
103
- if (tablesWithOrganisation.includes(table)) {
104
- query = query.eq("organisation_id", organisationId);
116
+ if (!bypassOrganisationFilter && organisationId && tablesWithOrganisation.includes(table)) {
117
+ if (table === "rbac_user_profiles" && isSuperAdmin) {
118
+ } else {
119
+ query = query.eq("organisation_id", organisationId);
120
+ }
105
121
  }
106
122
  Object.entries(filters).forEach(([key, value]) => {
107
123
  if (value !== void 0 && value !== null) {
@@ -129,12 +145,13 @@ function useSecureDataAccess() {
129
145
  }
130
146
  recordDataAccess(table, "read", true, `SELECT ${columns} FROM ${table}`, filters);
131
147
  return data || [];
132
- }, [validateContext, getCurrentOrganisationId, setOrganisationContextInSession, supabase]);
148
+ }, [validateContext, getCurrentOrganisationId, setOrganisationContextInSession, supabase, isSuperAdmin]);
133
149
  const secureInsert = useCallback(async (table, data) => {
134
150
  validateContext();
135
- const organisationId = getCurrentOrganisationId();
151
+ const bypassOrganisationFilter = isSuperAdmin;
152
+ const organisationId = bypassOrganisationFilter ? void 0 : getCurrentOrganisationId();
136
153
  await setOrganisationContextInSession(organisationId);
137
- const secureData = {
154
+ const secureData = bypassOrganisationFilter ? { ...data } : {
138
155
  ...data,
139
156
  organisation_id: organisationId
140
157
  };
@@ -144,10 +161,11 @@ function useSecureDataAccess() {
144
161
  throw error;
145
162
  }
146
163
  return insertData;
147
- }, [validateContext, getCurrentOrganisationId, setOrganisationContextInSession, supabase]);
164
+ }, [validateContext, getCurrentOrganisationId, setOrganisationContextInSession, supabase, isSuperAdmin]);
148
165
  const secureUpdate = useCallback(async (table, data, filters) => {
149
166
  validateContext();
150
- const organisationId = getCurrentOrganisationId();
167
+ const bypassOrganisationFilter = isSuperAdmin;
168
+ const organisationId = bypassOrganisationFilter ? void 0 : getCurrentOrganisationId();
151
169
  await setOrganisationContextInSession(organisationId);
152
170
  const { organisation_id, ...secureData } = data;
153
171
  let query = supabase.from(table).update(secureData);
@@ -166,7 +184,7 @@ function useSecureDataAccess() {
166
184
  "pace_person",
167
185
  "pace_member"
168
186
  ];
169
- if (tablesWithOrganisation.includes(table)) {
187
+ if (!bypassOrganisationFilter && organisationId && tablesWithOrganisation.includes(table)) {
170
188
  query = query.eq("organisation_id", organisationId);
171
189
  }
172
190
  Object.entries(filters).forEach(([key, value]) => {
@@ -180,10 +198,11 @@ function useSecureDataAccess() {
180
198
  throw error;
181
199
  }
182
200
  return updateData || [];
183
- }, [validateContext, getCurrentOrganisationId, setOrganisationContextInSession, supabase]);
201
+ }, [validateContext, getCurrentOrganisationId, setOrganisationContextInSession, supabase, isSuperAdmin]);
184
202
  const secureDelete = useCallback(async (table, filters) => {
185
203
  validateContext();
186
- const organisationId = getCurrentOrganisationId();
204
+ const bypassOrganisationFilter = isSuperAdmin;
205
+ const organisationId = bypassOrganisationFilter ? void 0 : getCurrentOrganisationId();
187
206
  await setOrganisationContextInSession(organisationId);
188
207
  let query = supabase.from(table).delete();
189
208
  const tablesWithOrganisation = [
@@ -238,7 +257,7 @@ function useSecureDataAccess() {
238
257
  "base_application",
239
258
  "base_questions"
240
259
  ];
241
- if (tablesWithOrganisation.includes(table)) {
260
+ if (!bypassOrganisationFilter && organisationId && tablesWithOrganisation.includes(table)) {
242
261
  query = query.eq("organisation_id", organisationId);
243
262
  }
244
263
  Object.entries(filters).forEach(([key, value]) => {
@@ -251,10 +270,11 @@ function useSecureDataAccess() {
251
270
  logger.error("useSecureDataAccess", "Delete failed", { table, filters, error });
252
271
  throw error;
253
272
  }
254
- }, [validateContext, getCurrentOrganisationId, setOrganisationContextInSession, supabase]);
273
+ }, [validateContext, getCurrentOrganisationId, setOrganisationContextInSession, supabase, isSuperAdmin]);
255
274
  const secureRpc = useCallback(async (functionName, params = {}) => {
256
275
  validateContext();
257
- const organisationId = getCurrentOrganisationId();
276
+ const bypassOrganisationFilter = isSuperAdmin;
277
+ const organisationId = bypassOrganisationFilter ? void 0 : getCurrentOrganisationId();
258
278
  await setOrganisationContextInSession(organisationId);
259
279
  const functionsWithPOrganisationId = [
260
280
  "data_cake_diners_list",
@@ -297,7 +317,11 @@ function useSecureDataAccess() {
297
317
  if (user?.id) {
298
318
  secureParams.p_user_id = user.id;
299
319
  }
300
- secureParams[paramName] = organisationId;
320
+ if (!bypassOrganisationFilter && organisationId) {
321
+ secureParams[paramName] = organisationId;
322
+ } else if (organisationId && !(paramName in params)) {
323
+ secureParams[paramName] = organisationId;
324
+ }
301
325
  if (functionsNeedingEventId.includes(functionName) && selectedEvent?.event_id) {
302
326
  secureParams.p_event_id = selectedEvent.event_id;
303
327
  }
@@ -311,7 +335,7 @@ function useSecureDataAccess() {
311
335
  throw error;
312
336
  }
313
337
  return data;
314
- }, [validateContext, getCurrentOrganisationId, setOrganisationContextInSession, supabase, selectedEvent?.event_id, user?.id]);
338
+ }, [validateContext, getCurrentOrganisationId, setOrganisationContextInSession, supabase, selectedEvent?.event_id, user?.id, isSuperAdmin]);
315
339
  const [dataAccessHistory, setDataAccessHistory] = useState([]);
316
340
  const [isStrictMode] = useState(true);
317
341
  const [isAuditLogEnabled] = useState(true);
@@ -342,11 +366,12 @@ function useSecureDataAccess() {
342
366
  }, [user?.id, validateContext, isDataAccessAllowed]);
343
367
  const recordDataAccess = useCallback((table, operation, allowed, query, filters) => {
344
368
  if (!isAuditLogEnabled || !user?.id) return;
369
+ const auditOrganisationId = getCurrentOrganisationId() || "super-admin-bypass";
345
370
  const record = {
346
371
  table,
347
372
  operation,
348
373
  userId: user.id,
349
- organisationId: getCurrentOrganisationId(),
374
+ organisationId: auditOrganisationId,
350
375
  allowed,
351
376
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
352
377
  query,
@@ -361,7 +386,7 @@ function useSecureDataAccess() {
361
386
  table,
362
387
  operation,
363
388
  userId: user.id,
364
- organisationId: getCurrentOrganisationId(),
389
+ organisationId: auditOrganisationId,
365
390
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
366
391
  });
367
392
  }
@@ -388,4 +413,4 @@ function useSecureDataAccess() {
388
413
  export {
389
414
  useSecureDataAccess
390
415
  };
391
- //# sourceMappingURL=chunk-DDM4CCYT.js.map
416
+ //# sourceMappingURL=chunk-4QYC5L4K.js.map