@jmruthers/pace-core 0.5.54 → 0.5.55

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 (396) hide show
  1. package/README.md +0 -4
  2. package/dist/{DataTable-7FMFXA7A.js → DataTable-4T627QFJ.js} +11 -11
  3. package/dist/{PublicLoadingSpinner-Bq_-BeK-.d.ts → PublicLoadingSpinner-SL8WaQN7.d.ts} +2 -21
  4. package/dist/{api-H5A3H4IR.js → api-LUNF5O6M.js} +3 -3
  5. package/dist/{appConfig-BVGyuvI7.d.ts → appConfig-DjpeG6P-.d.ts} +9 -1
  6. package/dist/{appNameResolver-7GHF5ED2.js → appNameResolver-UURKN7NF.js} +2 -2
  7. package/dist/{audit-BUW3LMJB.js → audit-6TOCAMKO.js} +2 -2
  8. package/dist/{chunk-MZBUOP4P.js → chunk-5BSLGBYI.js} +4 -3
  9. package/dist/chunk-5BSLGBYI.js.map +1 -0
  10. package/dist/{chunk-I5Z3QH5X.js → chunk-66C4BSAY.js} +2 -2
  11. package/dist/{chunk-I5Z3QH5X.js.map → chunk-66C4BSAY.js.map} +1 -1
  12. package/dist/{chunk-MYP2EGHX.js → chunk-AJ2KMES7.js} +21 -14
  13. package/dist/chunk-AJ2KMES7.js.map +1 -0
  14. package/dist/{chunk-EL2O4IUX.js → chunk-AQFRLC7K.js} +16 -24
  15. package/dist/{chunk-EL2O4IUX.js.map → chunk-AQFRLC7K.js.map} +1 -1
  16. package/dist/{chunk-7BNPOCLL.js → chunk-B2WTCLCV.js} +6 -2
  17. package/dist/chunk-B2WTCLCV.js.map +1 -0
  18. package/dist/{chunk-WJARTBCT.js → chunk-D7ARGIA3.js} +16 -7
  19. package/dist/chunk-D7ARGIA3.js.map +1 -0
  20. package/dist/{chunk-NRK4AIHQ.js → chunk-KBRACSJI.js} +3 -3
  21. package/dist/{chunk-NYUJ4FJR.js → chunk-KJDPSM64.js} +7 -7
  22. package/dist/chunk-KJDPSM64.js.map +1 -0
  23. package/dist/{chunk-GWSBHC4J.js → chunk-KLPVOPRI.js} +261 -38
  24. package/dist/chunk-KLPVOPRI.js.map +1 -0
  25. package/dist/{chunk-TRIZ7IB7.js → chunk-MPQDF75X.js} +148 -288
  26. package/dist/chunk-MPQDF75X.js.map +1 -0
  27. package/dist/{chunk-MSFACPQQ.js → chunk-PAEM3OWN.js} +11 -11
  28. package/dist/{chunk-MSFACPQQ.js.map → chunk-PAEM3OWN.js.map} +1 -1
  29. package/dist/{chunk-GIO7BFE7.js → chunk-RQD3D2CO.js} +66 -169
  30. package/dist/{chunk-GIO7BFE7.js.map → chunk-RQD3D2CO.js.map} +1 -1
  31. package/dist/{chunk-YDJW5XTN.js → chunk-STT7INZR.js} +25 -1
  32. package/dist/chunk-STT7INZR.js.map +1 -0
  33. package/dist/{chunk-6MTY77WU.js → chunk-TNMXZLDR.js} +3 -3
  34. package/dist/{chunk-BC3S53OZ.js → chunk-UQE2Y64H.js} +30 -14
  35. package/dist/chunk-UQE2Y64H.js.map +1 -0
  36. package/dist/{chunk-22KLBHPS.js → chunk-W66AZIOH.js} +2 -2
  37. package/dist/chunk-W66AZIOH.js.map +1 -0
  38. package/dist/{chunk-SS3E6QLB.js → chunk-YNUBMSMV.js} +2 -2
  39. package/dist/chunk-YNUBMSMV.js.map +1 -0
  40. package/dist/{chunk-NZ655MWE.js → chunk-ZOD2ZY6X.js} +5 -4
  41. package/dist/chunk-ZOD2ZY6X.js.map +1 -0
  42. package/dist/{chunk-74C6SNEC.js → chunk-ZPK5656W.js} +3 -3
  43. package/dist/{chunk-74C6SNEC.js.map → chunk-ZPK5656W.js.map} +1 -1
  44. package/dist/components.d.ts +22 -899
  45. package/dist/components.js +436 -3118
  46. package/dist/components.js.map +1 -1
  47. package/dist/file-reference-9xUOnwyt.d.ts +70 -0
  48. package/dist/hooks.d.ts +2 -2
  49. package/dist/hooks.js +10 -10
  50. package/dist/hooks.js.map +1 -1
  51. package/dist/index.d.ts +49 -9
  52. package/dist/index.js +190 -25
  53. package/dist/index.js.map +1 -1
  54. package/dist/{organisation-CO3Sh3_D.d.ts → organisation-t-vvQC3g.d.ts} +1 -8
  55. package/dist/providers.d.ts +2 -2
  56. package/dist/providers.js +5 -5
  57. package/dist/rbac/index.d.ts +65 -46
  58. package/dist/rbac/index.js +10 -12
  59. package/dist/styles/core.css +0 -125
  60. package/dist/types.d.ts +2 -1
  61. package/dist/types.js +3 -1
  62. package/dist/types.js.map +1 -1
  63. package/dist/{usePublicRouteParams-B2OcAsur.d.ts → usePublicRouteParams-CdoFxnJK.d.ts} +1 -1
  64. package/dist/utils.d.ts +3 -4
  65. package/dist/utils.js +44 -13
  66. package/dist/utils.js.map +1 -1
  67. package/docs/FILE_REFERENCE_SYSTEM.md +440 -0
  68. package/docs/INDEX.md +7 -5
  69. package/docs/README.md +0 -1
  70. package/docs/api/README.md +0 -4
  71. package/docs/api/classes/ErrorBoundary.md +1 -1
  72. package/docs/api/classes/InvalidScopeError.md +1 -1
  73. package/docs/api/classes/MissingUserContextError.md +1 -1
  74. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  75. package/docs/api/classes/PermissionDeniedError.md +2 -2
  76. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  77. package/docs/api/classes/RBACAuditManager.md +12 -12
  78. package/docs/api/classes/RBACCache.md +1 -1
  79. package/docs/api/classes/RBACEngine.md +6 -6
  80. package/docs/api/classes/RBACError.md +1 -1
  81. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  82. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  83. package/docs/api/classes/StorageUtils.md +281 -0
  84. package/docs/api/interfaces/AggregateConfig.md +1 -1
  85. package/docs/api/interfaces/ButtonProps.md +1 -1
  86. package/docs/api/interfaces/CardProps.md +1 -1
  87. package/docs/api/interfaces/ColorPalette.md +1 -1
  88. package/docs/api/interfaces/ColorShade.md +1 -1
  89. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  90. package/docs/api/interfaces/DataTableAction.md +1 -1
  91. package/docs/api/interfaces/DataTableColumn.md +1 -1
  92. package/docs/api/interfaces/DataTableProps.md +1 -1
  93. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  94. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  95. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  96. package/docs/api/interfaces/EventContextType.md +1 -1
  97. package/docs/api/interfaces/EventLogoProps.md +1 -1
  98. package/docs/api/interfaces/EventProviderProps.md +1 -1
  99. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  100. package/docs/api/interfaces/FileUploadProps.md +1 -1
  101. package/docs/api/interfaces/FooterProps.md +1 -1
  102. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  103. package/docs/api/interfaces/InputProps.md +1 -1
  104. package/docs/api/interfaces/LabelProps.md +1 -1
  105. package/docs/api/interfaces/LoginFormProps.md +1 -1
  106. package/docs/api/interfaces/NavigationAccessRecord.md +2 -2
  107. package/docs/api/interfaces/NavigationContextType.md +1 -1
  108. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  109. package/docs/api/interfaces/NavigationItem.md +1 -1
  110. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  111. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  112. package/docs/api/interfaces/Organisation.md +1 -1
  113. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  114. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  115. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  116. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  117. package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
  118. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  119. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  120. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  121. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  122. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  123. package/docs/api/interfaces/PaletteData.md +1 -1
  124. package/docs/api/interfaces/PermissionEnforcerProps.md +4 -4
  125. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  126. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  127. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  128. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  129. package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
  130. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  131. package/docs/api/interfaces/RBACConfig.md +1 -1
  132. package/docs/api/interfaces/RBACContextType.md +1 -1
  133. package/docs/api/interfaces/RBACLogger.md +1 -1
  134. package/docs/api/interfaces/RBACProviderProps.md +1 -1
  135. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  136. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  137. package/docs/api/interfaces/RouteAccessRecord.md +2 -2
  138. package/docs/api/interfaces/RouteConfig.md +2 -2
  139. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  140. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  141. package/docs/api/interfaces/StorageConfig.md +1 -1
  142. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  143. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  144. package/docs/api/interfaces/StorageListOptions.md +1 -1
  145. package/docs/api/interfaces/StorageListResult.md +1 -1
  146. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  147. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  148. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  149. package/docs/api/interfaces/StyleImport.md +1 -1
  150. package/docs/api/interfaces/ToastActionElement.md +1 -1
  151. package/docs/api/interfaces/ToastProps.md +1 -1
  152. package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
  153. package/docs/api/interfaces/UnifiedAuthProviderProps.md +1 -1
  154. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  155. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  156. package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
  157. package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
  158. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  159. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  160. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  161. package/docs/api/interfaces/UserEventAccess.md +1 -1
  162. package/docs/api/interfaces/UserMenuProps.md +1 -1
  163. package/docs/api/interfaces/UserProfile.md +1 -1
  164. package/docs/api/modules.md +204 -200
  165. package/docs/api-reference/components.md +141 -163
  166. package/docs/api-reference/hooks.md +347 -0
  167. package/docs/core-concepts/rbac-system.md +69 -16
  168. package/docs/getting-started/examples/basic-auth-app.md +0 -1
  169. package/docs/implementation-guides/datatable-rbac-usage.md +12 -11
  170. package/docs/implementation-guides/file-upload-storage.md +733 -0
  171. package/docs/implementation-guides/inactivity-tracking.md +779 -0
  172. package/docs/implementation-guides/organisation-security.md +748 -0
  173. package/docs/implementation-guides/public-pages-advanced.md +1022 -0
  174. package/docs/migration/MIGRATION_GUIDE.md +684 -0
  175. package/docs/migration/README.md +13 -2
  176. package/docs/migration/rbac-migration.md +73 -0
  177. package/docs/rbac/examples/rbac-rls-integration-example.md +11 -13
  178. package/docs/style-guide.md +269 -1
  179. package/package.json +1 -1
  180. package/src/__tests__/TESTING_GUIDELINES.md +331 -18
  181. package/src/__tests__/helpers/supabaseMock.ts +99 -0
  182. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +10 -7
  183. package/src/__tests__/shared.ts +6 -0
  184. package/src/components/DataTable/components/ActionButtons.tsx +2 -2
  185. package/src/components/DataTable/components/DataTableCore.tsx +2 -2
  186. package/src/components/DataTable/components/UnifiedTableBody.tsx +1 -1
  187. package/src/components/DataTable/utils/debugTools.ts +2 -2
  188. package/src/components/Dialog/Dialog.test.tsx +12 -2
  189. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +6 -6
  190. package/src/components/ErrorBoundary/ErrorBoundary.tsx +2 -2
  191. package/src/components/FileDisplay.tsx +233 -0
  192. package/src/components/FileUpload.tsx +176 -0
  193. package/src/components/Footer/Footer.test.tsx +7 -7
  194. package/src/components/NavigationMenu/NavigationMenu.test.tsx +13 -6
  195. package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +30 -3
  196. package/src/components/OrganisationSelector/OrganisationSelector.tsx +1 -1
  197. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.rbac.test.tsx +558 -0
  198. package/src/components/PublicLayout/PublicErrorBoundary.tsx +1 -1
  199. package/src/components/PublicLayout/PublicPageDebugger.tsx +2 -2
  200. package/src/components/PublicLayout/PublicPageDiagnostic.tsx +2 -2
  201. package/src/components/PublicLayout/PublicPageProvider.tsx +2 -2
  202. package/src/components/Select/Select.test.tsx +50 -15
  203. package/src/components/SuperAdminGuard.tsx +2 -2
  204. package/src/components/__tests__/SuperAdminGuard.test.tsx +559 -0
  205. package/src/components/index.ts +0 -183
  206. package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +2 -2
  207. package/src/hooks/__tests__/usePermissionCache.unit.test.ts +1 -1
  208. package/src/hooks/__tests__/useRBAC.unit.test.ts +191 -138
  209. package/src/hooks/public/usePublicEvent.ts +2 -2
  210. package/src/hooks/useAppConfig.ts +3 -3
  211. package/src/hooks/useComponentPerformance.ts +1 -1
  212. package/src/hooks/useDataTablePerformance.ts +1 -1
  213. package/src/hooks/useFileReference.ts +232 -0
  214. package/src/hooks/useOrganisationPermissions.test.ts +254 -344
  215. package/src/hooks/useOrganisationPermissions.ts +15 -7
  216. package/src/hooks/useOrganisationSecurity.test.ts +390 -402
  217. package/src/hooks/usePerformanceMonitor.ts +1 -1
  218. package/src/hooks/usePermissionCache.test.ts +264 -395
  219. package/src/hooks/usePermissionCache.ts +34 -4
  220. package/src/hooks/useSecureDataAccess.test.ts +486 -0
  221. package/src/hooks/useSecureDataAccess.ts +4 -1
  222. package/src/providers/InactivityProvider.tsx +2 -2
  223. package/src/providers/OrganisationProvider.test.simple.tsx +168 -0
  224. package/src/providers/OrganisationProvider.test.tsx +168 -0
  225. package/src/providers/OrganisationProvider.tsx +18 -31
  226. package/src/providers/UnifiedAuthProvider.test.simple.tsx +205 -0
  227. package/src/providers/UnifiedAuthProvider.test.tsx +128 -0
  228. package/src/providers/__tests__/InactivityProvider.test.tsx +3 -4
  229. package/src/providers/__tests__/OrganisationProvider.test.tsx +19 -14
  230. package/src/rbac/__tests__/integration.authflow.test.tsx +123 -0
  231. package/src/rbac/__tests__/integration.navigation.test.tsx +72 -0
  232. package/src/rbac/__tests__/integration.securedata.test.tsx +92 -0
  233. package/src/rbac/__tests__/integration.smoke.test.tsx +73 -0
  234. package/src/rbac/__tests__/rbac-core.test.tsx +26 -22
  235. package/src/rbac/__tests__/rbac-engine-core-logic.test.ts +411 -0
  236. package/src/rbac/__tests__/rbac-engine-simplified.test.ts +285 -0
  237. package/src/rbac/__tests__/rbac-functions.test.ts +655 -0
  238. package/src/rbac/__tests__/rbac-integration.test.ts +532 -0
  239. package/src/rbac/__tests__/scenarios.user-role.test.tsx +196 -0
  240. package/src/rbac/api.test.ts +6 -6
  241. package/src/rbac/api.ts +2 -2
  242. package/src/rbac/audit.test.ts +485 -0
  243. package/src/rbac/audit.ts +7 -1
  244. package/src/rbac/cache-invalidation.ts +318 -0
  245. package/src/rbac/cache.test.ts +286 -0
  246. package/src/rbac/components/EnhancedNavigationMenu.test.tsx +559 -0
  247. package/src/rbac/components/EnhancedNavigationMenu.tsx +29 -23
  248. package/src/rbac/components/NavigationProvider.test.tsx +449 -0
  249. package/src/rbac/components/PagePermissionGuard.tsx +4 -4
  250. package/src/rbac/components/PagePermissionProvider.test.tsx +479 -0
  251. package/src/rbac/components/SecureDataProvider.test.tsx +511 -0
  252. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +159 -430
  253. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +4 -5
  254. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +112 -118
  255. package/src/rbac/config.test.ts +410 -0
  256. package/src/rbac/engine.test.simple.ts +237 -0
  257. package/src/rbac/engine.test.ts +233 -0
  258. package/src/rbac/engine.ts +37 -41
  259. package/src/rbac/examples/CompleteRBACExample.tsx +3 -3
  260. package/src/rbac/examples/EventBasedApp.tsx +4 -4
  261. package/src/rbac/hooks/useRBAC.simple.test.ts +16 -0
  262. package/src/rbac/hooks/useRBAC.test.ts +207 -455
  263. package/src/rbac/hooks/useRBAC.ts +30 -22
  264. package/src/rbac/permissions.test.ts +128 -0
  265. package/src/rbac/permissions.ts +56 -141
  266. package/src/rbac/providers/RBACProvider.tsx +1 -1
  267. package/src/rbac/secureClient.test.ts +444 -0
  268. package/src/rbac/security.test.ts +390 -0
  269. package/src/rbac/security.ts +1 -1
  270. package/src/rbac/types.test.ts +382 -0
  271. package/src/rbac/types.ts +2 -2
  272. package/src/styles/core.css +0 -125
  273. package/src/types/file-reference.ts +77 -0
  274. package/src/types/rbac-functions.ts +290 -0
  275. package/src/types/supabase.ts +10 -28
  276. package/src/types/unified.ts +4 -1
  277. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +81 -55
  278. package/src/utils/__tests__/lazyLoad.unit.test.tsx +21 -12
  279. package/src/utils/__tests__/organisationContext.unit.test.ts +13 -7
  280. package/src/utils/__tests__/performanceBudgets.unit.test.ts +3 -3
  281. package/src/utils/__tests__/sessionTracking.unit.test.ts +32 -12
  282. package/src/utils/appConfig.ts +1 -1
  283. package/src/utils/appIdResolver.test.ts +503 -0
  284. package/src/utils/appIdResolver.ts +1 -1
  285. package/src/utils/appNameResolver.test.ts +494 -0
  286. package/src/utils/appNameResolver.ts +3 -2
  287. package/src/utils/bundleAnalysis.ts +3 -3
  288. package/src/utils/debugLogger.ts +1 -1
  289. package/src/utils/file-reference.ts +263 -0
  290. package/src/utils/formatDate.test.ts +2 -2
  291. package/src/utils/organisationContext.test.ts +340 -0
  292. package/src/utils/organisationContext.ts +19 -6
  293. package/src/utils/performanceBudgets.ts +2 -2
  294. package/src/utils/permissionUtils.test.ts +393 -0
  295. package/src/utils/permissionUtils.ts +5 -2
  296. package/src/utils/secureDataAccess.test.ts +715 -0
  297. package/src/utils/secureDataAccess.ts +21 -5
  298. package/src/utils/sessionTracking.ts +34 -4
  299. package/src/utils/storage/__tests__/helpers.unit.test.ts +328 -0
  300. package/src/utils/storage/__tests__/index.unit.test.ts +16 -0
  301. package/src/utils/storage/helpers.ts +20 -25
  302. package/src/utils/storage/index.ts +29 -1
  303. package/src/vite-env.d.ts +17 -0
  304. package/dist/chunk-22KLBHPS.js.map +0 -1
  305. package/dist/chunk-7BNPOCLL.js.map +0 -1
  306. package/dist/chunk-BC3S53OZ.js.map +0 -1
  307. package/dist/chunk-GWSBHC4J.js.map +0 -1
  308. package/dist/chunk-MYP2EGHX.js.map +0 -1
  309. package/dist/chunk-MZBUOP4P.js.map +0 -1
  310. package/dist/chunk-NYUJ4FJR.js.map +0 -1
  311. package/dist/chunk-NZ655MWE.js.map +0 -1
  312. package/dist/chunk-SS3E6QLB.js.map +0 -1
  313. package/dist/chunk-TRIZ7IB7.js.map +0 -1
  314. package/dist/chunk-WJARTBCT.js.map +0 -1
  315. package/dist/chunk-YDJW5XTN.js.map +0 -1
  316. package/docs/print-components/README.md +0 -258
  317. package/docs/print-components/api-reference.md +0 -636
  318. package/docs/print-components/examples/README.md +0 -204
  319. package/docs/print-components/examples/basic-report.tsx +0 -92
  320. package/docs/print-components/examples/card-catalog.tsx +0 -149
  321. package/docs/print-components/examples/cover-page-report.tsx +0 -163
  322. package/docs/print-components/quick-start.md +0 -363
  323. package/src/components/PrintButton/PrintButton.tsx +0 -321
  324. package/src/components/PrintButton/PrintButtonGroup.tsx +0 -84
  325. package/src/components/PrintButton/PrintToolbar.tsx +0 -94
  326. package/src/components/PrintButton/__tests__/PrintButton.test.tsx +0 -271
  327. package/src/components/PrintButton/examples/PrintButtonShowcase.tsx +0 -438
  328. package/src/components/PrintButton/index.ts +0 -33
  329. package/src/components/PrintButton/types.ts +0 -173
  330. package/src/components/PrintCard/PrintCard.tsx +0 -154
  331. package/src/components/PrintCard/PrintCardContent.tsx +0 -57
  332. package/src/components/PrintCard/PrintCardFooter.tsx +0 -60
  333. package/src/components/PrintCard/PrintCardGrid.tsx +0 -91
  334. package/src/components/PrintCard/PrintCardHeader.tsx +0 -78
  335. package/src/components/PrintCard/PrintCardImage.tsx +0 -81
  336. package/src/components/PrintCard/examples/PrintCardShowcase.tsx +0 -239
  337. package/src/components/PrintCard/index.ts +0 -34
  338. package/src/components/PrintCard/types.ts +0 -171
  339. package/src/components/PrintDataTable/PrintDataTable.tsx +0 -215
  340. package/src/components/PrintDataTable/PrintTableGroup.tsx +0 -90
  341. package/src/components/PrintDataTable/PrintTableRow.tsx +0 -76
  342. package/src/components/PrintDataTable/index.ts +0 -25
  343. package/src/components/PrintDataTable/types.ts +0 -67
  344. package/src/components/PrintFooter/PrintFooter.tsx +0 -183
  345. package/src/components/PrintFooter/PrintFooterContent.tsx +0 -71
  346. package/src/components/PrintFooter/PrintFooterInfo.tsx +0 -86
  347. package/src/components/PrintFooter/PrintPageNumber.tsx +0 -90
  348. package/src/components/PrintFooter/examples/PrintFooterShowcase.tsx +0 -390
  349. package/src/components/PrintFooter/index.ts +0 -30
  350. package/src/components/PrintFooter/types.ts +0 -149
  351. package/src/components/PrintGrid/PrintGrid.tsx +0 -180
  352. package/src/components/PrintGrid/PrintGridBreakpoint.tsx +0 -109
  353. package/src/components/PrintGrid/PrintGridContainer.tsx +0 -128
  354. package/src/components/PrintGrid/PrintGridItem.tsx +0 -220
  355. package/src/components/PrintGrid/examples/PrintGridShowcase.tsx +0 -359
  356. package/src/components/PrintGrid/index.ts +0 -31
  357. package/src/components/PrintGrid/types.ts +0 -159
  358. package/src/components/PrintHeader/PrintCoverHeader.tsx +0 -230
  359. package/src/components/PrintHeader/PrintHeader.tsx +0 -150
  360. package/src/components/PrintHeader/index.ts +0 -17
  361. package/src/components/PrintHeader/types.ts +0 -42
  362. package/src/components/PrintLayout/PrintLayout.tsx +0 -122
  363. package/src/components/PrintLayout/PrintLayoutContext.tsx +0 -66
  364. package/src/components/PrintLayout/PrintPageBreak.tsx +0 -52
  365. package/src/components/PrintLayout/examples/PrintShowcase.tsx +0 -230
  366. package/src/components/PrintLayout/index.ts +0 -19
  367. package/src/components/PrintLayout/types.ts +0 -37
  368. package/src/components/PrintPageBreak/PrintPageBreak.tsx +0 -120
  369. package/src/components/PrintPageBreak/PrintPageBreakGroup.tsx +0 -90
  370. package/src/components/PrintPageBreak/PrintPageBreakIndicator.tsx +0 -112
  371. package/src/components/PrintPageBreak/examples/PrintPageBreakShowcase.tsx +0 -279
  372. package/src/components/PrintPageBreak/index.ts +0 -23
  373. package/src/components/PrintPageBreak/types.ts +0 -94
  374. package/src/components/PrintSection/PrintColumn.tsx +0 -104
  375. package/src/components/PrintSection/PrintDivider.tsx +0 -101
  376. package/src/components/PrintSection/PrintSection.tsx +0 -129
  377. package/src/components/PrintSection/PrintSectionContent.tsx +0 -75
  378. package/src/components/PrintSection/PrintSectionHeader.tsx +0 -97
  379. package/src/components/PrintSection/examples/PrintSectionShowcase.tsx +0 -258
  380. package/src/components/PrintSection/index.ts +0 -33
  381. package/src/components/PrintSection/types.ts +0 -155
  382. package/src/components/PrintText/PrintText.tsx +0 -116
  383. package/src/components/PrintText/index.ts +0 -16
  384. package/src/components/PrintText/types.ts +0 -24
  385. package/src/rbac/__tests__/integration.test.tsx +0 -218
  386. package/src/utils/print/PrintDataProcessor.ts +0 -390
  387. package/src/utils/print/examples/PrintUtilitiesShowcase.tsx +0 -397
  388. package/src/utils/print/index.ts +0 -29
  389. package/src/utils/print/types.ts +0 -196
  390. package/src/utils/print/usePrintOptimization.ts +0 -272
  391. /package/dist/{DataTable-7FMFXA7A.js.map → DataTable-4T627QFJ.js.map} +0 -0
  392. /package/dist/{api-H5A3H4IR.js.map → api-LUNF5O6M.js.map} +0 -0
  393. /package/dist/{appNameResolver-7GHF5ED2.js.map → appNameResolver-UURKN7NF.js.map} +0 -0
  394. /package/dist/{audit-BUW3LMJB.js.map → audit-6TOCAMKO.js.map} +0 -0
  395. /package/dist/{chunk-NRK4AIHQ.js.map → chunk-KBRACSJI.js.map} +0 -0
  396. /package/dist/{chunk-6MTY77WU.js.map → chunk-TNMXZLDR.js.map} +0 -0
@@ -0,0 +1,382 @@
1
+ /**
2
+ * @file RBAC Types Tests
3
+ * @package @jmruthers/pace-core
4
+ * @module RBAC/Types
5
+ * @since 1.0.0
6
+ *
7
+ * Comprehensive tests for RBAC type definitions and error classes.
8
+ */
9
+
10
+ import { describe, it, expect } from 'vitest';
11
+ import {
12
+ RBACError,
13
+ PermissionDeniedError,
14
+ OrganisationContextRequiredError,
15
+ RBACNotInitializedError,
16
+ InvalidScopeError,
17
+ MissingUserContextError
18
+ } from './types';
19
+ import {
20
+ UUID,
21
+ Operation,
22
+ Permission,
23
+ AccessLevel,
24
+ Scope,
25
+ PermissionCheck,
26
+ GlobalRole,
27
+ OrganisationRole,
28
+ EventAppRole
29
+ } from './types';
30
+
31
+ describe('RBAC Error Classes', () => {
32
+ describe('RBACError', () => {
33
+ it('creates error with message and code', () => {
34
+ const error = new RBACError('Test error', 'TEST_ERROR');
35
+
36
+ expect(error.message).toBe('Test error');
37
+ expect(error.code).toBe('TEST_ERROR');
38
+ expect(error.name).toBe('RBACError');
39
+ expect(error.context).toBeUndefined();
40
+ });
41
+
42
+ it('creates error with context', () => {
43
+ const context = { userId: 'user-123', permission: 'read:users' };
44
+ const error = new RBACError('Test error', 'TEST_ERROR', context);
45
+
46
+ expect(error.message).toBe('Test error');
47
+ expect(error.code).toBe('TEST_ERROR');
48
+ expect(error.context).toEqual(context);
49
+ });
50
+
51
+ it('inherits from Error', () => {
52
+ const error = new RBACError('Test error', 'TEST_ERROR');
53
+ expect(error).toBeInstanceOf(Error);
54
+ });
55
+ });
56
+
57
+ describe('PermissionDeniedError', () => {
58
+ it('creates permission denied error', () => {
59
+ const error = new PermissionDeniedError('read:users');
60
+
61
+ expect(error.message).toBe('Permission denied: read:users');
62
+ expect(error.code).toBe('PERMISSION_DENIED');
63
+ expect(error.name).toBe('PermissionDeniedError');
64
+ expect(error.context).toEqual({ permission: 'read:users' });
65
+ });
66
+
67
+ it('creates permission denied error with context', () => {
68
+ const context = { userId: 'user-123', organisationId: 'org-456' };
69
+ const error = new PermissionDeniedError('read:users', context);
70
+
71
+ expect(error.message).toBe('Permission denied: read:users');
72
+ expect(error.code).toBe('PERMISSION_DENIED');
73
+ expect(error.context).toEqual({ permission: 'read:users', ...context });
74
+ });
75
+
76
+ it('inherits from RBACError', () => {
77
+ const error = new PermissionDeniedError('read:users');
78
+ expect(error).toBeInstanceOf(RBACError);
79
+ expect(error).toBeInstanceOf(Error);
80
+ });
81
+ });
82
+
83
+ describe('OrganisationContextRequiredError', () => {
84
+ it('creates organisation context required error', () => {
85
+ const error = new OrganisationContextRequiredError();
86
+
87
+ expect(error.message).toBe('Organisation context is required for this operation');
88
+ expect(error.code).toBe('ORGANISATION_CONTEXT_REQUIRED');
89
+ expect(error.name).toBe('OrganisationContextRequiredError');
90
+ });
91
+
92
+ it('inherits from RBACError', () => {
93
+ const error = new OrganisationContextRequiredError();
94
+ expect(error).toBeInstanceOf(RBACError);
95
+ expect(error).toBeInstanceOf(Error);
96
+ });
97
+ });
98
+
99
+ describe('RBACNotInitializedError', () => {
100
+ it('creates RBAC not initialized error', () => {
101
+ const error = new RBACNotInitializedError();
102
+
103
+ expect(error.message).toContain('RBAC system not initialized');
104
+ expect(error.code).toBe('RBAC_NOT_INITIALIZED');
105
+ expect(error.name).toBe('RBACNotInitializedError');
106
+ });
107
+
108
+ it('includes setup instructions in message', () => {
109
+ const error = new RBACNotInitializedError();
110
+ expect(error.message).toContain('setupRBAC');
111
+ expect(error.message).toContain('https://docs.pace-core.dev/rbac/setup');
112
+ });
113
+
114
+ it('inherits from RBACError', () => {
115
+ const error = new RBACNotInitializedError();
116
+ expect(error).toBeInstanceOf(RBACError);
117
+ expect(error).toBeInstanceOf(Error);
118
+ });
119
+ });
120
+
121
+ describe('InvalidScopeError', () => {
122
+ it('creates invalid scope error', () => {
123
+ const scope = { organisationId: 'invalid-uuid' };
124
+ const reason = 'Invalid UUID format';
125
+ const error = new InvalidScopeError(scope, reason);
126
+
127
+ expect(error.message).toContain('Invalid scope provided');
128
+ expect(error.message).toContain(JSON.stringify(scope));
129
+ expect(error.message).toContain(reason);
130
+ expect(error.code).toBe('INVALID_SCOPE');
131
+ expect(error.name).toBe('InvalidScopeError');
132
+ expect(error.context).toEqual({ scope, reason });
133
+ });
134
+
135
+ it('inherits from RBACError', () => {
136
+ const error = new InvalidScopeError({}, 'test');
137
+ expect(error).toBeInstanceOf(RBACError);
138
+ expect(error).toBeInstanceOf(Error);
139
+ });
140
+ });
141
+
142
+ describe('MissingUserContextError', () => {
143
+ it('creates missing user context error', () => {
144
+ const error = new MissingUserContextError();
145
+
146
+ expect(error.message).toContain('User context is required');
147
+ expect(error.message).toContain('auth provider');
148
+ expect(error.code).toBe('MISSING_USER_CONTEXT');
149
+ expect(error.name).toBe('MissingUserContextError');
150
+ });
151
+
152
+ it('inherits from RBACError', () => {
153
+ const error = new MissingUserContextError();
154
+ expect(error).toBeInstanceOf(RBACError);
155
+ expect(error).toBeInstanceOf(Error);
156
+ });
157
+ });
158
+ });
159
+
160
+ describe('Type Definitions', () => {
161
+ describe('UUID Type', () => {
162
+ it('accepts valid UUID strings', () => {
163
+ const validUUIDs: UUID[] = [
164
+ '123e4567-e89b-12d3-a456-426614174000',
165
+ '00000000-0000-0000-0000-000000000000',
166
+ 'ffffffff-ffff-ffff-ffff-ffffffffffff'
167
+ ];
168
+
169
+ validUUIDs.forEach(uuid => {
170
+ expect(typeof uuid).toBe('string');
171
+ expect(uuid).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i);
172
+ });
173
+ });
174
+ });
175
+
176
+ describe('Operation Type', () => {
177
+ it('includes all required operations', () => {
178
+ const operations: Operation[] = ['read', 'create', 'update', 'delete', 'manage'];
179
+
180
+ operations.forEach(operation => {
181
+ expect(['read', 'create', 'update', 'delete', 'manage']).toContain(operation);
182
+ });
183
+ });
184
+
185
+ it('has correct number of operations', () => {
186
+ const operations: Operation[] = ['read', 'create', 'update', 'delete', 'manage'];
187
+ expect(operations).toHaveLength(5);
188
+ });
189
+ });
190
+
191
+ describe('Permission Type', () => {
192
+ it('creates valid permission strings', () => {
193
+ const permissions: Permission[] = [
194
+ 'read:users',
195
+ 'create:user-profiles',
196
+ 'update:events',
197
+ 'delete:organisations',
198
+ 'manage:base.events'
199
+ ];
200
+
201
+ permissions.forEach(permission => {
202
+ expect(permission).toMatch(/^(read|create|update|delete|manage):/);
203
+ });
204
+ });
205
+
206
+ it('supports complex resource names', () => {
207
+ const permissions: Permission[] = [
208
+ 'read:user-profiles.details',
209
+ 'manage:base.events.schedule',
210
+ 'create:app-data.records'
211
+ ];
212
+
213
+ permissions.forEach(permission => {
214
+ expect(permission).toMatch(/^(read|create|update|delete|manage):[a-z0-9._-]+$/);
215
+ });
216
+ });
217
+ });
218
+
219
+ describe('AccessLevel Type', () => {
220
+ it('includes all required access levels', () => {
221
+ const accessLevels: AccessLevel[] = ['viewer', 'participant', 'planner', 'admin', 'super'];
222
+
223
+ accessLevels.forEach(level => {
224
+ expect(['viewer', 'participant', 'planner', 'admin', 'super']).toContain(level);
225
+ });
226
+ });
227
+
228
+ it('has correct hierarchy order', () => {
229
+ const levels: AccessLevel[] = ['viewer', 'participant', 'planner', 'admin', 'super'];
230
+ expect(levels).toHaveLength(5);
231
+
232
+ // Verify hierarchy makes sense
233
+ const hierarchy = ['viewer', 'participant', 'planner', 'admin', 'super'];
234
+ expect(levels).toEqual(hierarchy);
235
+ });
236
+ });
237
+
238
+ describe('Scope Type', () => {
239
+ it('creates valid scope objects', () => {
240
+ const scopes: Scope[] = [
241
+ { organisationId: '123e4567-e89b-12d3-a456-426614174000' as UUID },
242
+ {
243
+ organisationId: '123e4567-e89b-12d3-a456-426614174000' as UUID,
244
+ eventId: 'event-123'
245
+ },
246
+ {
247
+ organisationId: '123e4567-e89b-12d3-a456-426614174000' as UUID,
248
+ appId: '123e4567-e89b-12d3-a456-426614174001' as UUID
249
+ },
250
+ {
251
+ organisationId: '123e4567-e89b-12d3-a456-426614174000' as UUID,
252
+ eventId: 'event-123',
253
+ appId: '123e4567-e89b-12d3-a456-426614174001' as UUID
254
+ }
255
+ ];
256
+
257
+ scopes.forEach(scope => {
258
+ expect(scope).toBeDefined();
259
+ expect(typeof scope).toBe('object');
260
+ if (scope.organisationId) {
261
+ expect(typeof scope.organisationId).toBe('string');
262
+ }
263
+ if (scope.eventId) {
264
+ expect(typeof scope.eventId).toBe('string');
265
+ }
266
+ if (scope.appId) {
267
+ expect(typeof scope.appId).toBe('string');
268
+ }
269
+ });
270
+ });
271
+ });
272
+
273
+ describe('PermissionCheck Type', () => {
274
+ it('creates valid permission check objects', () => {
275
+ const permissionCheck: PermissionCheck = {
276
+ userId: '123e4567-e89b-12d3-a456-426614174000' as UUID,
277
+ scope: { organisationId: '123e4567-e89b-12d3-a456-426614174001' as UUID },
278
+ permission: 'read:users' as Permission,
279
+ pageId: 'page-123'
280
+ };
281
+
282
+ expect(permissionCheck.userId).toBeDefined();
283
+ expect(permissionCheck.scope).toBeDefined();
284
+ expect(permissionCheck.permission).toBeDefined();
285
+ expect(permissionCheck.pageId).toBeDefined();
286
+ });
287
+
288
+ it('handles optional pageId', () => {
289
+ const permissionCheck: PermissionCheck = {
290
+ userId: '123e4567-e89b-12d3-a456-426614174000' as UUID,
291
+ scope: { organisationId: '123e4567-e89b-12d3-a456-426614174001' as UUID },
292
+ permission: 'read:users' as Permission
293
+ };
294
+
295
+ expect(permissionCheck.pageId).toBeUndefined();
296
+ });
297
+ });
298
+
299
+ describe('Role Types', () => {
300
+ it('defines global roles correctly', () => {
301
+ const globalRoles: GlobalRole[] = ['super_admin'];
302
+ expect(globalRoles).toHaveLength(1);
303
+ expect(globalRoles[0]).toBe('super_admin');
304
+ });
305
+
306
+ it('defines organisation roles correctly', () => {
307
+ const orgRoles: OrganisationRole[] = ['supporter', 'member', 'leader', 'org_admin'];
308
+ expect(orgRoles).toHaveLength(4);
309
+ expect(orgRoles).toContain('supporter');
310
+ expect(orgRoles).toContain('member');
311
+ expect(orgRoles).toContain('leader');
312
+ expect(orgRoles).toContain('org_admin');
313
+ });
314
+
315
+ it('defines event app roles correctly', () => {
316
+ const eventAppRoles: EventAppRole[] = ['viewer', 'participant', 'planner', 'event_admin'];
317
+ expect(eventAppRoles).toHaveLength(4);
318
+ expect(eventAppRoles).toContain('viewer');
319
+ expect(eventAppRoles).toContain('participant');
320
+ expect(eventAppRoles).toContain('planner');
321
+ expect(eventAppRoles).toContain('event_admin');
322
+ });
323
+ });
324
+ });
325
+
326
+ describe('Type Guards and Validation', () => {
327
+ it('validates UUID format', () => {
328
+ const validUUID = '123e4567-e89b-12d3-a456-426614174000';
329
+ const invalidUUID = 'invalid-uuid';
330
+
331
+ expect(validUUID).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i);
332
+ expect(invalidUUID).not.toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i);
333
+ });
334
+
335
+ it('validates permission format', () => {
336
+ const validPermission = 'read:users';
337
+ const invalidPermission = 'invalid';
338
+
339
+ expect(validPermission).toMatch(/^(read|create|update|delete|manage):/);
340
+ expect(invalidPermission).not.toMatch(/^(read|create|update|delete|manage):/);
341
+ });
342
+
343
+ it('validates access level values', () => {
344
+ const validLevels = ['viewer', 'participant', 'planner', 'admin', 'super'];
345
+ const invalidLevel = 'invalid';
346
+
347
+ validLevels.forEach(level => {
348
+ expect(['viewer', 'participant', 'planner', 'admin', 'super']).toContain(level);
349
+ });
350
+
351
+ expect(['viewer', 'participant', 'planner', 'admin', 'super']).not.toContain(invalidLevel);
352
+ });
353
+ });
354
+
355
+ describe('Type Compatibility', () => {
356
+ it('ensures types are compatible with expected interfaces', () => {
357
+ // Test that types can be used in expected contexts
358
+ const permissionCheck: PermissionCheck = {
359
+ userId: '123e4567-e89b-12d3-a456-426614174000' as UUID,
360
+ scope: { organisationId: '123e4567-e89b-12d3-a456-426614174001' as UUID },
361
+ permission: 'read:users' as Permission
362
+ };
363
+
364
+ // This should compile without errors
365
+ const userId: UUID = permissionCheck.userId;
366
+ const scope: Scope = permissionCheck.scope;
367
+ const permission: Permission = permissionCheck.permission;
368
+
369
+ expect(userId).toBeDefined();
370
+ expect(scope).toBeDefined();
371
+ expect(permission).toBeDefined();
372
+ });
373
+
374
+ it('supports type narrowing', () => {
375
+ const accessLevel: AccessLevel = 'admin';
376
+
377
+ if (accessLevel === 'admin' || accessLevel === 'super') {
378
+ // This should be a valid admin level
379
+ expect(['admin', 'super']).toContain(accessLevel);
380
+ }
381
+ });
382
+ });
package/src/rbac/types.ts CHANGED
@@ -16,9 +16,9 @@ import type React from 'react';
16
16
 
17
17
  export type UUID = string;
18
18
 
19
- export type Operation = 'read' | 'create' | 'update' | 'delete' | 'manage';
19
+ export type Operation = 'read' | 'create' | 'update' | 'delete';
20
20
 
21
- export type Permission = `${Operation}:${string}`; // e.g. "manage:base.events"
21
+ export type Permission = `${Operation}:${string}`; // e.g. "read:base.events" or "create:team.members"
22
22
 
23
23
  export type AccessLevel =
24
24
  | 'viewer'
@@ -33,23 +33,6 @@
33
33
  --color-card: var(--color-main-50);
34
34
  --color-card-foreground: var(--color-main-950);
35
35
 
36
- /* Print-specific variables */
37
- --print-margin: 0.5in;
38
- --print-font-size: 12pt;
39
- --print-line-height: 1.4;
40
- --print-color: #000;
41
- --print-bg: #fff;
42
- --print-first-page-margin: 1in;
43
- --print-cover-logo-size: 120px;
44
- --print-cover-title-size: 2.5rem;
45
- --print-page-width: 8.27in;
46
- /* A4 width */
47
- --print-page-height: 11.69in;
48
- /* A4 height */
49
- --print-landscape-width: 11.69in;
50
- /* A4 landscape width */
51
- --print-landscape-height: 8.27in;
52
- /* A4 landscape height */
53
36
  }
54
37
 
55
38
  @layer base {
@@ -256,112 +239,4 @@
256
239
 
257
240
  @layer utilities {
258
241
 
259
- /* Print-specific utilities */
260
- .print-break-avoid {
261
- page-break-inside: avoid;
262
- }
263
-
264
- .print-break-before {
265
- page-break-before: always;
266
- }
267
-
268
- .print-break-after {
269
- page-break-after: always;
270
- }
271
-
272
- /* Print page size controls */
273
- .print-a4-portrait {
274
- @media print {
275
- @page {
276
- size: A4 portrait;
277
- margin: var(--print-margin);
278
- }
279
- }
280
- }
281
-
282
- .print-a4-landscape {
283
- @media print {
284
- @page {
285
- size: A4 landscape;
286
- margin: var(--print-margin);
287
- }
288
- }
289
- }
290
-
291
- /* First page header styles */
292
- .print-first-page-header {
293
- @media print {
294
- @page :first {
295
- margin-top: var(--print-first-page-margin);
296
- }
297
- }
298
- }
299
-
300
- .print-cover-header {
301
- @media print {
302
- @page :first {
303
- margin-top: var(--print-first-page-margin);
304
- }
305
- }
306
- }
307
-
308
- .print-subsequent-header {
309
- @media print {
310
- @page :not(:first) {
311
- margin-top: var(--print-margin);
312
- }
313
- }
314
- }
315
-
316
- /* Print-specific layouts */
317
- @media print {
318
- .print-hidden {
319
- display: none !important;
320
- }
321
-
322
- .print-visible {
323
- display: block !important;
324
- }
325
-
326
- .print-first-page-only {
327
- display: block;
328
- }
329
-
330
- .print-subsequent-pages-only {
331
- display: none;
332
- }
333
- }
334
-
335
- @media print {
336
- @page :not(:first) {
337
- .print-first-page-only {
338
- display: none !important;
339
- }
340
-
341
- .print-subsequent-pages-only {
342
- display: block !important;
343
- }
344
- }
345
- }
346
-
347
- /* Print typography */
348
- .print-text {
349
- @media print {
350
- font-size: var(--print-font-size);
351
- line-height: var(--print-line-height);
352
- color: var(--print-color);
353
- }
354
- }
355
-
356
- /* Print layout container */
357
- .print-layout {
358
- @media print {
359
- width: 100%;
360
- max-width: none;
361
- margin: 0;
362
- padding: 0;
363
- background: var(--print-bg);
364
- color: var(--print-color);
365
- }
366
- }
367
242
  }
@@ -0,0 +1,77 @@
1
+ // File Reference System Types
2
+ // These types define the structure for the centralized file reference system
3
+
4
+ export interface FileReference {
5
+ id: string;
6
+ table_name: string;
7
+ record_id: string;
8
+ file_path: string;
9
+ file_metadata: FileMetadata;
10
+ organisation_id: string;
11
+ app_id: string;
12
+ is_public: boolean;
13
+ created_at: string;
14
+ updated_at: string;
15
+ }
16
+
17
+ export interface FileMetadata {
18
+ fileName: string;
19
+ fileType: string;
20
+ fileSize?: number;
21
+ width?: number;
22
+ height?: number;
23
+ category: FileCategory;
24
+ hash?: string;
25
+ uploadedBy?: string;
26
+ uploadedAt?: string;
27
+ tags?: string[];
28
+ customMetadata?: Record<string, any>;
29
+ }
30
+
31
+ export enum FileCategory {
32
+ PROFILE_PHOTOS = 'profile_photos',
33
+ ID_DOCUMENTS = 'id_documents',
34
+ QUALIFICATIONS = 'qualifications',
35
+ MEDICAL_DOCUMENTS = 'medical_documents',
36
+ DISH_IMAGES = 'dish_images',
37
+ EVENT_LOGOS = 'event_logos',
38
+ GENERAL_DOCUMENTS = 'general_documents',
39
+ IMAGES = 'images',
40
+ AUDIO = 'audio',
41
+ VIDEO = 'video',
42
+ ARCHIVES = 'archives'
43
+ }
44
+
45
+ export interface FileUploadOptions {
46
+ table_name: string;
47
+ record_id: string;
48
+ organisation_id: string;
49
+ app_id: string;
50
+ category: FileCategory;
51
+ is_public?: boolean;
52
+ custom_metadata?: Record<string, any>;
53
+ }
54
+
55
+ export interface FileReferenceService {
56
+ createFileReference(options: FileUploadOptions, file: File): Promise<FileReference>;
57
+ getFileReference(table_name: string, record_id: string, organisation_id: string): Promise<FileReference | null>;
58
+ getFileUrl(table_name: string, record_id: string, organisation_id: string): Promise<string | null>;
59
+ getSignedUrl(table_name: string, record_id: string, organisation_id: string, expires_in?: number): Promise<string | null>;
60
+ updateFileReference(id: string, updates: Partial<FileReference>): Promise<FileReference>;
61
+ deleteFileReference(table_name: string, record_id: string, organisation_id: string, delete_file?: boolean): Promise<boolean>;
62
+ listFileReferences(table_name: string, record_id: string, organisation_id: string): Promise<FileReference[]>;
63
+ getFileCount(table_name: string, record_id: string, organisation_id: string): Promise<number>;
64
+ }
65
+
66
+ export interface StorageUploadOptions {
67
+ orgId: string;
68
+ category: FileCategory;
69
+ isPublic?: boolean;
70
+ customPath?: string;
71
+ }
72
+
73
+ export interface FileUploadResult {
74
+ file_reference: FileReference;
75
+ file_url: string;
76
+ signed_url?: string;
77
+ }