@jmruthers/pace-core 0.5.135 → 0.5.136

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 (522) hide show
  1. package/dist/{DataTable-C7GaRZye.d.ts → DataTable-CWAZZcXC.d.ts} +1 -1
  2. package/dist/{DataTable-A36PJG6N.js → DataTable-CYOHOX3O.js} +25 -13
  3. package/dist/{PublicLoadingSpinner-CUAnTvcg.d.ts → EventLogo-801uofbR.d.ts} +51 -135
  4. package/dist/UnifiedAuthProvider-5E5TUNMS.js +17 -0
  5. package/dist/{UnifiedAuthProvider-BVKmQd9u.d.ts → UnifiedAuthProvider-DJxGTftH.d.ts} +1 -1
  6. package/dist/{api-TNIBJWLM.js → api-45XYYO2A.js} +4 -3
  7. package/dist/{audit-T36HM7IM.js → audit-64X3VJXB.js} +3 -2
  8. package/dist/{chunk-CTJRBUX2.js → chunk-2TWNJ46Y.js} +2 -2
  9. package/dist/{chunk-UJI6WSMD.js → chunk-444EZN6N.js} +3 -3
  10. package/dist/chunk-444EZN6N.js.map +1 -0
  11. package/dist/{chunk-3CG5L6RN.js → chunk-4MT5BGGL.js} +90 -73
  12. package/dist/chunk-4MT5BGGL.js.map +1 -0
  13. package/dist/{chunk-PYUXFQJ3.js → chunk-56XJ3TU6.js} +2 -2
  14. package/dist/chunk-56XJ3TU6.js.map +1 -0
  15. package/dist/chunk-5DPZ5EAT.js +60 -0
  16. package/dist/chunk-5DPZ5EAT.js.map +1 -0
  17. package/dist/{chunk-66C4BSAY.js → chunk-ANBQRTPX.js} +9 -2
  18. package/dist/chunk-ANBQRTPX.js.map +1 -0
  19. package/dist/chunk-APIBCTL2.js +670 -0
  20. package/dist/chunk-APIBCTL2.js.map +1 -0
  21. package/dist/{chunk-GKHF54DI.js → chunk-BESYRHQM.js} +10 -4
  22. package/dist/chunk-BESYRHQM.js.map +1 -0
  23. package/dist/{chunk-WP5I5GLN.js → chunk-BVYWGZVV.js} +112 -97
  24. package/dist/chunk-BVYWGZVV.js.map +1 -0
  25. package/dist/{chunk-GEVIB2UB.js → chunk-ERISIBYU.js} +14 -5
  26. package/dist/chunk-ERISIBYU.js.map +1 -0
  27. package/dist/{chunk-CQZU6TFE.js → chunk-FHWWBIHA.js} +100 -62
  28. package/dist/chunk-FHWWBIHA.js.map +1 -0
  29. package/dist/{chunk-O3NWNXDY.js → chunk-FMUCXFII.js} +2 -2
  30. package/dist/chunk-FMUCXFII.js.map +1 -0
  31. package/dist/{chunk-GVDR7WNV.js → chunk-HJGGOMQ6.js} +194 -518
  32. package/dist/chunk-HJGGOMQ6.js.map +1 -0
  33. package/dist/{chunk-BDZUMRBD.js → chunk-K2WWTH7O.js} +13 -6
  34. package/dist/chunk-K2WWTH7O.js.map +1 -0
  35. package/dist/{chunk-BYXRHAIF.js → chunk-L6PGMCMD.js} +23 -14
  36. package/dist/chunk-L6PGMCMD.js.map +1 -0
  37. package/dist/chunk-LMC26NLJ.js +84 -0
  38. package/dist/chunk-LMC26NLJ.js.map +1 -0
  39. package/dist/{chunk-M6DDYFUD.js → chunk-LS353YLY.js} +19 -16
  40. package/dist/chunk-LS353YLY.js.map +1 -0
  41. package/dist/{chunk-ZYZCRSBD.js → chunk-LTV3XIJJ.js} +16 -11
  42. package/dist/chunk-LTV3XIJJ.js.map +1 -0
  43. package/dist/{chunk-HMNOSGVA.js → chunk-NOHEVYVX.js} +377 -666
  44. package/dist/chunk-NOHEVYVX.js.map +1 -0
  45. package/dist/{chunk-JCQZ6LA7.js → chunk-Q5QRDWKI.js} +9 -3
  46. package/dist/chunk-Q5QRDWKI.js.map +1 -0
  47. package/dist/chunk-S5OFRT4M.js +94 -0
  48. package/dist/chunk-S5OFRT4M.js.map +1 -0
  49. package/dist/{chunk-3DBFLLLU.js → chunk-SBVILCCA.js} +14 -9
  50. package/dist/chunk-SBVILCCA.js.map +1 -0
  51. package/dist/{chunk-TGIY2AR2.js → chunk-SL2YQDR6.js} +4 -3
  52. package/dist/{chunk-TGIY2AR2.js.map → chunk-SL2YQDR6.js.map} +1 -1
  53. package/dist/{chunk-VZ5OR6HD.js → chunk-TVYPTYOY.js} +55 -179
  54. package/dist/chunk-TVYPTYOY.js.map +1 -0
  55. package/dist/{chunk-ZV77RZMU.js → chunk-XARJS7CD.js} +2 -2
  56. package/dist/chunk-XDNLUEXI.js +138 -0
  57. package/dist/chunk-XDNLUEXI.js.map +1 -0
  58. package/dist/{chunk-F64FFPOZ.js → chunk-YLKIDTUK.js} +26 -20
  59. package/dist/chunk-YLKIDTUK.js.map +1 -0
  60. package/dist/{chunk-5F3NDPJV.js → chunk-ZZ2SS7NI.js} +10 -5
  61. package/dist/chunk-ZZ2SS7NI.js.map +1 -0
  62. package/dist/components.d.ts +7 -287
  63. package/dist/components.js +26 -157
  64. package/dist/components.js.map +1 -1
  65. package/dist/{file-reference-C9isKNPn.d.ts → file-reference-C6Gkn77H.d.ts} +1 -1
  66. package/dist/{formatting-DFcCxUEk.d.ts → formatting-CvUXy2mF.d.ts} +1 -1
  67. package/dist/hooks.d.ts +3 -3
  68. package/dist/hooks.js +22 -16
  69. package/dist/hooks.js.map +1 -1
  70. package/dist/index.d.ts +101 -9
  71. package/dist/index.js +43 -31
  72. package/dist/index.js.map +1 -1
  73. package/dist/providers.d.ts +1 -1
  74. package/dist/providers.js +5 -4
  75. package/dist/rbac/index.js +13 -12
  76. package/dist/styles/index.js +2 -1
  77. package/dist/theming/runtime.d.ts +2 -19
  78. package/dist/theming/runtime.js +2 -1
  79. package/dist/{types-D5rqZQXk.d.ts → types-Dfz9dmVH.d.ts} +12 -1
  80. package/dist/types.d.ts +2 -2
  81. package/dist/types.js +1 -1
  82. package/dist/{useInactivityTracker-MRUU55XI.js → useInactivityTracker-TO6ZOF35.js} +3 -2
  83. package/dist/{usePublicRouteParams-Dyt1tzI9.d.ts → usePublicRouteParams-B7PabvuH.d.ts} +1 -1
  84. package/dist/utils.d.ts +195 -232
  85. package/dist/utils.js +173 -331
  86. package/dist/utils.js.map +1 -1
  87. package/dist/{validation-DnhrNMju.d.ts → validation-8npbysjg.d.ts} +26 -8
  88. package/dist/validation.d.ts +261 -10
  89. package/dist/validation.js +82 -440
  90. package/dist/validation.js.map +1 -1
  91. package/docs/api/classes/ColumnFactory.md +1 -1
  92. package/docs/api/classes/ErrorBoundary.md +6 -6
  93. package/docs/api/classes/InvalidScopeError.md +1 -1
  94. package/docs/api/classes/MissingUserContextError.md +1 -1
  95. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  96. package/docs/api/classes/PermissionDeniedError.md +1 -1
  97. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  98. package/docs/api/classes/RBACAuditManager.md +6 -6
  99. package/docs/api/classes/RBACCache.md +1 -1
  100. package/docs/api/classes/RBACEngine.md +7 -7
  101. package/docs/api/classes/RBACError.md +1 -1
  102. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  103. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  104. package/docs/api/classes/StorageUtils.md +1 -1
  105. package/docs/api/enums/FileCategory.md +1 -1
  106. package/docs/api/interfaces/AggregateConfig.md +4 -4
  107. package/docs/api/interfaces/ButtonProps.md +1 -1
  108. package/docs/api/interfaces/CardProps.md +1 -1
  109. package/docs/api/interfaces/ColorPalette.md +1 -1
  110. package/docs/api/interfaces/ColorShade.md +29 -4
  111. package/docs/api/interfaces/DataAccessRecord.md +9 -9
  112. package/docs/api/interfaces/DataRecord.md +1 -1
  113. package/docs/api/interfaces/DataTableAction.md +18 -18
  114. package/docs/api/interfaces/DataTableColumn.md +61 -1
  115. package/docs/api/interfaces/DataTableProps.md +1 -1
  116. package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
  117. package/docs/api/interfaces/EmptyStateConfig.md +5 -5
  118. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +14 -14
  119. package/docs/api/interfaces/EventAppRoleData.md +1 -1
  120. package/docs/api/interfaces/EventLogoProps.md +152 -0
  121. package/docs/api/interfaces/ExportColumn.md +1 -1
  122. package/docs/api/interfaces/ExportOptions.md +8 -8
  123. package/docs/api/interfaces/FileDisplayProps.md +15 -15
  124. package/docs/api/interfaces/FileMetadata.md +1 -1
  125. package/docs/api/interfaces/FileReference.md +1 -1
  126. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  127. package/docs/api/interfaces/FileUploadOptions.md +1 -1
  128. package/docs/api/interfaces/FileUploadProps.md +1 -1
  129. package/docs/api/interfaces/FooterProps.md +1 -1
  130. package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
  131. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  132. package/docs/api/interfaces/InputProps.md +1 -1
  133. package/docs/api/interfaces/LabelProps.md +1 -1
  134. package/docs/api/interfaces/LoginFormProps.md +1 -1
  135. package/docs/api/interfaces/NavigationAccessRecord.md +10 -10
  136. package/docs/api/interfaces/NavigationContextType.md +9 -9
  137. package/docs/api/interfaces/NavigationGuardProps.md +10 -10
  138. package/docs/api/interfaces/NavigationItem.md +1 -1
  139. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  140. package/docs/api/interfaces/NavigationProviderProps.md +7 -7
  141. package/docs/api/interfaces/Organisation.md +1 -1
  142. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  143. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  144. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  145. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  146. package/docs/api/interfaces/PaceAppLayoutProps.md +27 -27
  147. package/docs/api/interfaces/PaceLoginPageProps.md +4 -4
  148. package/docs/api/interfaces/PageAccessRecord.md +8 -8
  149. package/docs/api/interfaces/PagePermissionContextType.md +8 -8
  150. package/docs/api/interfaces/PagePermissionGuardProps.md +11 -11
  151. package/docs/api/interfaces/PagePermissionProviderProps.md +7 -7
  152. package/docs/api/interfaces/PaletteData.md +4 -4
  153. package/docs/api/interfaces/PermissionEnforcerProps.md +11 -11
  154. package/docs/api/interfaces/ProtectedRouteProps.md +6 -6
  155. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  156. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  157. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  158. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  159. package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
  160. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  161. package/docs/api/interfaces/RBACConfig.md +1 -1
  162. package/docs/api/interfaces/RBACLogger.md +1 -1
  163. package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
  164. package/docs/api/interfaces/RoleBasedRouterContextType.md +8 -8
  165. package/docs/api/interfaces/RoleBasedRouterProps.md +10 -10
  166. package/docs/api/interfaces/RoleManagementResult.md +1 -1
  167. package/docs/api/interfaces/RouteAccessRecord.md +10 -10
  168. package/docs/api/interfaces/RouteConfig.md +10 -10
  169. package/docs/api/interfaces/SecureDataContextType.md +9 -9
  170. package/docs/api/interfaces/SecureDataProviderProps.md +8 -8
  171. package/docs/api/interfaces/SessionRestorationLoaderProps.md +21 -0
  172. package/docs/api/interfaces/StorageConfig.md +1 -1
  173. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  174. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  175. package/docs/api/interfaces/StorageListOptions.md +1 -1
  176. package/docs/api/interfaces/StorageListResult.md +1 -1
  177. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  178. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  179. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  180. package/docs/api/interfaces/StyleImport.md +1 -1
  181. package/docs/api/interfaces/SwitchProps.md +1 -1
  182. package/docs/api/interfaces/ToastActionElement.md +1 -1
  183. package/docs/api/interfaces/ToastProps.md +1 -1
  184. package/docs/api/interfaces/UnifiedAuthContextType.md +53 -53
  185. package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
  186. package/docs/api/interfaces/UseInactivityTrackerOptions.md +9 -9
  187. package/docs/api/interfaces/UseInactivityTrackerReturn.md +8 -8
  188. package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
  189. package/docs/api/interfaces/UsePublicEventReturn.md +5 -5
  190. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +4 -4
  191. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +9 -9
  192. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  193. package/docs/api/interfaces/UseResolvedScopeOptions.md +4 -4
  194. package/docs/api/interfaces/UseResolvedScopeReturn.md +4 -4
  195. package/docs/api/interfaces/UserEventAccess.md +11 -11
  196. package/docs/api/interfaces/UserMenuProps.md +1 -1
  197. package/docs/api/interfaces/UserProfile.md +1 -1
  198. package/docs/api/modules.md +514 -212
  199. package/docs/api-reference/components.md +106 -26
  200. package/docs/architecture/README.md +0 -2
  201. package/docs/implementation-guides/data-tables.md +277 -13
  202. package/docs/implementation-guides/forms.md +1 -16
  203. package/docs/implementation-guides/permission-enforcement.md +8 -2
  204. package/examples/README.md +30 -14
  205. package/examples/STRUCTURE.md +125 -0
  206. package/examples/components/DataTable/HierarchicalActionsExample.tsx +421 -0
  207. package/examples/components/DataTable/HierarchicalExample.tsx +475 -0
  208. package/examples/components/DataTable/InitialPageSizeExample.tsx +177 -0
  209. package/examples/components/DataTable/PerformanceExample.tsx +506 -0
  210. package/examples/components/DataTable/index.ts +13 -0
  211. package/examples/components/Dialog/BasicHtmlTest.tsx +55 -0
  212. package/examples/components/Dialog/DebugHtmlExample.tsx +68 -0
  213. package/examples/components/Dialog/HtmlDialogExample.tsx +202 -0
  214. package/examples/components/Dialog/ScrollableDialogExample.tsx +290 -0
  215. package/examples/components/Dialog/SimpleHtmlTest.tsx +61 -0
  216. package/examples/components/Dialog/SmartDialogExample.tsx +322 -0
  217. package/examples/components/Dialog/index.ts +15 -0
  218. package/examples/components/index.ts +11 -0
  219. package/examples/features/index.ts +12 -0
  220. package/examples/{public-pages → features/public-pages}/CorrectPublicPageImplementation.tsx +1 -1
  221. package/examples/{public-pages → features/public-pages}/PublicEventPage.tsx +1 -1
  222. package/examples/{public-pages → features/public-pages}/PublicPageApp.tsx +1 -1
  223. package/examples/{public-pages → features/public-pages}/PublicPageUsageExample.tsx +1 -1
  224. package/examples/index.ts +11 -3
  225. package/package.json +30 -10
  226. package/src/components/Alert/Alert.tsx +1 -1
  227. package/src/components/Avatar/Avatar.tsx +1 -1
  228. package/src/components/Button/Button.tsx +1 -1
  229. package/src/components/Card/Card.tsx +1 -1
  230. package/src/components/Checkbox/Checkbox.tsx +1 -1
  231. package/src/components/DataTable/DataTable.test.tsx +1 -1
  232. package/src/components/DataTable/DataTable.tsx +1 -30
  233. package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +562 -0
  234. package/src/components/DataTable/__tests__/styles.test.ts +2 -2
  235. package/src/components/DataTable/components/ActionButtons.tsx +0 -15
  236. package/src/components/DataTable/components/DataTableCore.tsx +4 -185
  237. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +1 -1
  238. package/src/components/DataTable/components/DataTableModals.tsx +1 -27
  239. package/src/components/DataTable/components/EditableRow.tsx +1 -1
  240. package/src/components/DataTable/components/ImportModal.tsx +2 -14
  241. package/src/components/DataTable/components/PaginationControls.tsx +1 -1
  242. package/src/components/DataTable/components/UnifiedTableBody.tsx +109 -82
  243. package/src/components/DataTable/components/__tests__/ActionButtons.test.tsx +1 -1
  244. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +1 -1
  245. package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +1 -1
  246. package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +1 -1
  247. package/src/components/DataTable/examples/GroupingAggregationExample.tsx +273 -0
  248. package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +1 -1
  249. package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +1 -1
  250. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +1 -1
  251. package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +1 -1
  252. package/src/components/DataTable/hooks/useDataTablePermissions.ts +2 -23
  253. package/src/components/DataTable/index.ts +4 -0
  254. package/src/components/DataTable/styles.ts +1 -1
  255. package/src/components/DataTable/types.ts +13 -0
  256. package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +1 -1
  257. package/src/components/DataTable/utils/aggregationUtils.ts +161 -0
  258. package/src/components/DataTable/utils/exportUtils.ts +1 -1
  259. package/src/components/DataTable/utils/flexibleImport.ts +1 -11
  260. package/src/components/DataTable/utils/index.ts +1 -0
  261. package/src/components/DataTable/utils/paginationUtils.ts +1 -1
  262. package/src/components/Dialog/Dialog.tsx +2 -2
  263. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +35 -7
  264. package/src/components/ErrorBoundary/ErrorBoundary.tsx +5 -4
  265. package/src/components/EventSelector/EventSelector.tsx +3 -2
  266. package/src/components/FileDisplay/FileDisplay.tsx +2 -36
  267. package/src/components/FileUpload/FileUpload.test.tsx +2 -2
  268. package/src/components/FileUpload/FileUpload.tsx +2 -2
  269. package/src/components/Footer/Footer.tsx +1 -1
  270. package/src/components/Form/Form.test.tsx +4 -509
  271. package/src/components/Form/Form.tsx +1 -1
  272. package/src/components/Form/FormField.tsx +1 -1
  273. package/src/components/Form/index.ts +0 -12
  274. package/src/components/Header/Header.tsx +1 -1
  275. package/src/components/Input/Input.tsx +1 -1
  276. package/src/components/Label/Label.tsx +1 -1
  277. package/src/components/LoginForm/LoginForm.tsx +1 -1
  278. package/src/components/NavigationMenu/NavigationMenu.test.tsx +19 -3
  279. package/src/components/NavigationMenu/NavigationMenu.tsx +9 -8
  280. package/src/components/OrganisationSelector/OrganisationSelector.tsx +4 -3
  281. package/src/components/PaceAppLayout/PaceAppLayout.tsx +14 -12
  282. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +0 -16
  283. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +0 -1
  284. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -9
  285. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +35 -3
  286. package/src/components/PaceLoginPage/PaceLoginPage.tsx +13 -12
  287. package/src/components/PasswordReset/PasswordChangeForm.tsx +1 -1
  288. package/src/components/PasswordReset/index.ts +0 -2
  289. package/src/components/Progress/Progress.tsx +1 -1
  290. package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +35 -8
  291. package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -2
  292. package/src/components/PublicLayout/PublicErrorBoundary.tsx +1 -1
  293. package/src/components/PublicLayout/PublicLoadingSpinner.tsx +1 -1
  294. package/src/components/PublicLayout/PublicPageContextChecker.tsx +44 -43
  295. package/src/components/PublicLayout/PublicPageFooter.tsx +1 -1
  296. package/src/components/PublicLayout/PublicPageHeader.tsx +1 -15
  297. package/src/components/PublicLayout/PublicPageProvider.tsx +3 -2
  298. package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +2 -0
  299. package/src/components/PublicLayout/index.ts +4 -2
  300. package/src/components/Select/Select.tsx +1 -1
  301. package/src/components/{SessionRestorationLoader.tsx → SessionRestorationLoader/SessionRestorationLoader.tsx} +3 -2
  302. package/src/components/SessionRestorationLoader/index.ts +3 -0
  303. package/src/components/Switch/Switch.tsx +1 -1
  304. package/src/components/Table/Table.tsx +1 -1
  305. package/src/components/Toast/Toast.tsx +1 -1
  306. package/src/components/Tooltip/Tooltip.tsx +1 -1
  307. package/src/components/index.ts +4 -10
  308. package/src/hooks/__tests__/hooks.integration.test.tsx +37 -22
  309. package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +33 -17
  310. package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +28 -3
  311. package/src/hooks/__tests__/useFileDisplay.unit.test.ts +36 -9
  312. package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +26 -2
  313. package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +19 -6
  314. package/src/hooks/__tests__/usePermissionCache.simple.test.ts +17 -4
  315. package/src/hooks/__tests__/usePermissionCache.unit.test.ts +17 -4
  316. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +26 -6
  317. package/src/hooks/__tests__/usePublicFileDisplay.test.ts +16 -6
  318. package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +3 -3
  319. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +17 -3
  320. package/src/hooks/public/usePublicEvent.ts +7 -6
  321. package/src/hooks/public/usePublicEventLogo.ts +7 -4
  322. package/src/hooks/public/usePublicFileDisplay.ts +6 -150
  323. package/src/hooks/useComponentPerformance.ts +4 -1
  324. package/src/hooks/useDataTablePerformance.ts +4 -3
  325. package/src/hooks/useEventTheme.test.ts +18 -5
  326. package/src/hooks/useEventTheme.ts +4 -1
  327. package/src/hooks/useEvents.ts +2 -0
  328. package/src/hooks/useFileDisplay.ts +9 -8
  329. package/src/hooks/useFileReference.ts +4 -1
  330. package/src/hooks/useFileUrl.ts +4 -1
  331. package/src/hooks/useInactivityTracker.ts +5 -4
  332. package/src/hooks/useOrganisationSecurity.test.ts +33 -12
  333. package/src/hooks/useOrganisationSecurity.ts +8 -7
  334. package/src/hooks/usePerformanceMonitor.ts +6 -3
  335. package/src/hooks/usePermissionCache.ts +13 -6
  336. package/src/hooks/useSecureDataAccess.test.ts +2 -2
  337. package/src/hooks/useSecureDataAccess.ts +9 -8
  338. package/src/hooks/useSessionRestoration.ts +4 -1
  339. package/src/hooks/useStorage.ts +4 -1
  340. package/src/index.ts +16 -7
  341. package/src/providers/services/AuthServiceProvider.tsx +3 -2
  342. package/src/providers/services/EventServiceProvider.tsx +2 -1
  343. package/src/providers/services/InactivityServiceProvider.tsx +2 -1
  344. package/src/providers/services/OrganisationServiceProvider.tsx +2 -1
  345. package/src/providers/services/UnifiedAuthProvider.tsx +4 -3
  346. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +22 -2
  347. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +24 -2
  348. package/src/rbac/__tests__/cache-invalidation.test.ts +20 -6
  349. package/src/rbac/api.ts +5 -2
  350. package/src/rbac/audit-enhanced.ts +6 -6
  351. package/src/rbac/audit.test.ts +60 -38
  352. package/src/rbac/audit.ts +8 -8
  353. package/src/rbac/cache-invalidation.ts +7 -4
  354. package/src/rbac/components/EnhancedNavigationMenu.tsx +11 -5
  355. package/src/rbac/components/NavigationGuard.tsx +7 -3
  356. package/src/rbac/components/NavigationProvider.tsx +6 -3
  357. package/src/rbac/components/PagePermissionGuard.tsx +28 -16
  358. package/src/rbac/components/PagePermissionProvider.tsx +4 -1
  359. package/src/rbac/components/PermissionEnforcer.tsx +9 -3
  360. package/src/rbac/components/RoleBasedRouter.tsx +3 -1
  361. package/src/rbac/components/SecureDataProvider.tsx +7 -3
  362. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +87 -61
  363. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +83 -33
  364. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +36 -13
  365. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +2 -2
  366. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +22 -8
  367. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +19 -6
  368. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +43 -17
  369. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +42 -17
  370. package/src/rbac/engine.ts +15 -7
  371. package/src/rbac/hooks/usePermissions.ts +7 -3
  372. package/src/rbac/hooks/useResolvedScope.test.ts +2 -2
  373. package/src/rbac/hooks/useResolvedScope.ts +10 -7
  374. package/src/rbac/permissions.ts +5 -2
  375. package/src/rbac/security.test.ts +27 -16
  376. package/src/rbac/security.ts +5 -4
  377. package/src/services/AuthService.ts +22 -21
  378. package/src/services/EventService.ts +12 -12
  379. package/src/services/InactivityService.ts +5 -4
  380. package/src/services/OrganisationService.ts +26 -25
  381. package/src/services/__tests__/AuthService.test.ts +51 -19
  382. package/src/services/__tests__/EventService.test.ts +37 -5
  383. package/src/services/__tests__/InactivityService.test.ts +38 -4
  384. package/src/services/__tests__/OrganisationService.test.ts +3 -8
  385. package/src/services/base/BaseService.ts +3 -1
  386. package/src/theming/__tests__/runtime.test.ts +21 -12
  387. package/src/theming/parseEventColours.ts +5 -19
  388. package/src/theming/runtime.ts +8 -4
  389. package/src/types/validation.ts +2 -29
  390. package/src/utils/__tests__/appConfig.unit.test.ts +1 -1
  391. package/src/utils/__tests__/audit.unit.test.ts +1 -1
  392. package/src/utils/__tests__/auth-utils.unit.test.ts +1 -1
  393. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +19 -19
  394. package/src/utils/__tests__/cn.unit.test.ts +1 -1
  395. package/src/utils/__tests__/debugLogger.test.ts +1 -1
  396. package/src/utils/__tests__/deviceFingerprint.unit.test.ts +1 -1
  397. package/src/utils/__tests__/dynamicUtils.unit.test.ts +1 -1
  398. package/src/utils/__tests__/formatting.unit.test.ts +1 -1
  399. package/src/utils/__tests__/lazyLoad.unit.test.tsx +1 -1
  400. package/src/utils/__tests__/logger.unit.test.ts +1 -1
  401. package/src/utils/__tests__/organisationContext.unit.test.ts +1 -1
  402. package/src/utils/__tests__/performanceBenchmark.test.ts +1 -1
  403. package/src/utils/__tests__/performanceBudgets.unit.test.ts +1 -1
  404. package/src/utils/__tests__/permissionTypes.unit.test.ts +1 -1
  405. package/src/utils/__tests__/permissionUtils.unit.test.ts +1 -1
  406. package/src/utils/__tests__/sanitization.unit.test.ts +1 -1
  407. package/src/utils/__tests__/schemaUtils.unit.test.ts +1 -1
  408. package/src/utils/__tests__/secureDataAccess.unit.test.ts +1 -1
  409. package/src/utils/__tests__/secureErrors.unit.test.ts +33 -15
  410. package/src/utils/__tests__/secureStorage.unit.test.ts +1 -1
  411. package/src/utils/__tests__/security.unit.test.ts +40 -18
  412. package/src/utils/__tests__/securityMonitor.unit.test.ts +1 -1
  413. package/src/utils/__tests__/sessionTracking.unit.test.ts +40 -29
  414. package/src/utils/__tests__/validationUtils.unit.test.ts +19 -6
  415. package/src/utils/{appIdResolver.test.ts → app/appIdResolver.test.ts} +28 -30
  416. package/src/utils/{appIdResolver.ts → app/appIdResolver.ts} +8 -5
  417. package/src/utils/{appNameResolver.test.ts → app/appNameResolver.test.ts} +1 -1
  418. package/src/utils/{appNameResolver.ts → app/appNameResolver.ts} +5 -1
  419. package/src/utils/{organisationContext.ts → context/organisationContext.ts} +6 -3
  420. package/src/utils/{sessionTracking.ts → context/sessionTracking.ts} +11 -12
  421. package/src/utils/{logger.ts → core/logger.ts} +4 -2
  422. package/src/utils/{deviceFingerprint.ts → device/deviceFingerprint.ts} +1 -1
  423. package/src/utils/{lazyLoad.tsx → dynamic/lazyLoad.tsx} +2 -2
  424. package/src/utils/{file-reference.test.ts → file-reference/__tests__/file-reference.test.ts} +5 -5
  425. package/src/utils/{file-reference.ts → file-reference/index.ts} +20 -38
  426. package/src/utils/index.ts +32 -54
  427. package/src/utils/{secureErrors.ts → security/secureErrors.ts} +6 -3
  428. package/src/utils/{security.ts → security/security.ts} +5 -2
  429. package/src/utils/storage/__tests__/helpers.unit.test.ts +1 -4
  430. package/src/utils/storage/helpers.ts +15 -8
  431. package/src/{components/Dialog/utils/__tests__/safeHtml.unit.test.ts → utils/validation/__tests__/htmlSanitization.unit.test.ts} +9 -15
  432. package/src/{validation → utils/validation}/csrf.ts +1 -1
  433. package/src/{components/Dialog/utils/safeHtml.ts → utils/validation/htmlSanitization.ts} +9 -10
  434. package/src/utils/validation/index.ts +79 -0
  435. package/src/utils/{sanitization.ts → validation/sanitization.ts} +71 -2
  436. package/src/{validation/schemaUtils.ts → utils/validation/schema.ts} +11 -6
  437. package/src/{validation → utils/validation}/sqlInjectionProtection.ts +2 -0
  438. package/src/utils/{validationUtils.ts → validation/validationUtils.ts} +4 -1
  439. package/src/validation/index.ts +3 -34
  440. package/dist/UnifiedAuthProvider-CQDZRJIS.js +0 -16
  441. package/dist/chunk-24MKLB7U.js +0 -81
  442. package/dist/chunk-24MKLB7U.js.map +0 -1
  443. package/dist/chunk-3CG5L6RN.js.map +0 -1
  444. package/dist/chunk-3DBFLLLU.js.map +0 -1
  445. package/dist/chunk-5F3NDPJV.js.map +0 -1
  446. package/dist/chunk-66C4BSAY.js.map +0 -1
  447. package/dist/chunk-BDZUMRBD.js.map +0 -1
  448. package/dist/chunk-BYXRHAIF.js.map +0 -1
  449. package/dist/chunk-CDQ3PX7L.js +0 -18
  450. package/dist/chunk-CDQ3PX7L.js.map +0 -1
  451. package/dist/chunk-CQZU6TFE.js.map +0 -1
  452. package/dist/chunk-F64FFPOZ.js.map +0 -1
  453. package/dist/chunk-GEVIB2UB.js.map +0 -1
  454. package/dist/chunk-GKHF54DI.js.map +0 -1
  455. package/dist/chunk-GVDR7WNV.js.map +0 -1
  456. package/dist/chunk-HMNOSGVA.js.map +0 -1
  457. package/dist/chunk-JCQZ6LA7.js.map +0 -1
  458. package/dist/chunk-M6DDYFUD.js.map +0 -1
  459. package/dist/chunk-O3NWNXDY.js.map +0 -1
  460. package/dist/chunk-PYUXFQJ3.js.map +0 -1
  461. package/dist/chunk-UJI6WSMD.js.map +0 -1
  462. package/dist/chunk-VZ5OR6HD.js.map +0 -1
  463. package/dist/chunk-WP5I5GLN.js.map +0 -1
  464. package/dist/chunk-ZYZCRSBD.js.map +0 -1
  465. package/src/components/Dialog/README.md +0 -804
  466. package/src/components/Form/FormErrorSummary.tsx +0 -113
  467. package/src/components/Form/FormFieldset.tsx +0 -127
  468. package/src/components/Form/FormLiveRegion.tsx +0 -198
  469. package/src/components/PasswordReset/PasswordResetForm.test.tsx +0 -597
  470. package/src/components/PasswordReset/PasswordResetForm.tsx +0 -201
  471. package/src/components/PublicLayout/PublicPageDebugger.tsx +0 -104
  472. package/src/components/PublicLayout/PublicPageDiagnostic.tsx +0 -162
  473. package/src/components/PublicLayout/__tests__/PublicPageDebugger.test.tsx +0 -185
  474. package/src/examples/CorrectPublicPageImplementation.tsx +0 -304
  475. package/src/examples/PublicEventPage.tsx +0 -287
  476. package/src/examples/PublicPageApp.tsx +0 -321
  477. package/src/examples/PublicPageUsageExample.tsx +0 -218
  478. package/src/utils/schemaUtils.ts +0 -37
  479. package/src/validation/__tests__/common.unit.test.ts +0 -101
  480. package/src/validation/__tests__/csrf.unit.test.ts +0 -365
  481. package/src/validation/__tests__/passwordSchema.unit.test.ts +0 -203
  482. package/src/validation/__tests__/sanitization.unit.test.ts +0 -250
  483. package/src/validation/__tests__/schemaUtils.unit.test.ts +0 -451
  484. package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +0 -462
  485. package/src/validation/__tests__/user.unit.test.ts +0 -440
  486. package/src/validation/sanitization.ts +0 -96
  487. /package/dist/{DataTable-A36PJG6N.js.map → DataTable-CYOHOX3O.js.map} +0 -0
  488. /package/dist/{UnifiedAuthProvider-CQDZRJIS.js.map → UnifiedAuthProvider-5E5TUNMS.js.map} +0 -0
  489. /package/dist/{api-TNIBJWLM.js.map → api-45XYYO2A.js.map} +0 -0
  490. /package/dist/{audit-T36HM7IM.js.map → audit-64X3VJXB.js.map} +0 -0
  491. /package/dist/{chunk-CTJRBUX2.js.map → chunk-2TWNJ46Y.js.map} +0 -0
  492. /package/dist/{chunk-ZV77RZMU.js.map → chunk-XARJS7CD.js.map} +0 -0
  493. /package/dist/{useInactivityTracker-MRUU55XI.js.map → useInactivityTracker-TO6ZOF35.js.map} +0 -0
  494. /package/examples/{public-pages → features/public-pages}/index.ts +0 -0
  495. /package/examples/{RBAC → features/rbac}/CompleteRBACExample.tsx +0 -0
  496. /package/examples/{RBAC → features/rbac}/EventBasedApp.tsx +0 -0
  497. /package/examples/{RBAC → features/rbac}/PermissionExample.tsx +0 -0
  498. /package/examples/{RBAC → features/rbac}/index.ts +0 -0
  499. /package/src/utils/{appConfig.ts → app/appConfig.ts} +0 -0
  500. /package/src/utils/{appNameResolver.simple.test.ts → app/appNameResolver.simple.test.ts} +0 -0
  501. /package/src/utils/{audit.ts → audit/audit.ts} +0 -0
  502. /package/src/utils/{organisationContext.test.ts → context/organisationContext.test.ts} +0 -0
  503. /package/src/utils/{cn.ts → core/cn.ts} +0 -0
  504. /package/src/utils/{debugLogger.ts → core/debugLogger.ts} +0 -0
  505. /package/src/utils/{dynamicUtils.ts → dynamic/dynamicUtils.ts} +0 -0
  506. /package/src/utils/{formatDate.test.ts → formatting/formatDate.test.ts} +0 -0
  507. /package/src/utils/{formatting.ts → formatting/formatting.ts} +0 -0
  508. /package/src/utils/{bundleAnalysis.ts → performance/bundleAnalysis.ts} +0 -0
  509. /package/src/utils/{performanceBenchmark.ts → performance/performanceBenchmark.ts} +0 -0
  510. /package/src/utils/{performanceBudgets.ts → performance/performanceBudgets.ts} +0 -0
  511. /package/src/utils/{permissionTypes.ts → permissions/permissionTypes.ts} +0 -0
  512. /package/src/utils/{permissionUtils.test.ts → permissions/permissionUtils.test.ts} +0 -0
  513. /package/src/utils/{permissionUtils.ts → permissions/permissionUtils.ts} +0 -0
  514. /package/src/utils/{auth-utils.ts → security/auth-utils.ts} +0 -0
  515. /package/src/utils/{secureDataAccess.test.ts → security/secureDataAccess.test.ts} +0 -0
  516. /package/src/utils/{secureDataAccess.ts → security/secureDataAccess.ts} +0 -0
  517. /package/src/utils/{secureStorage.ts → security/secureStorage.ts} +0 -0
  518. /package/src/utils/{securityMonitor.ts → security/securityMonitor.ts} +0 -0
  519. /package/src/{validation → utils/validation}/common.ts +0 -0
  520. /package/src/{validation → utils/validation}/passwordSchema.ts +0 -0
  521. /package/src/{validation → utils/validation}/user.ts +0 -0
  522. /package/src/utils/{validation.ts → validation/validation.ts} +0 -0
@@ -4,29 +4,45 @@ This directory contains runnable examples demonstrating how to use various featu
4
4
 
5
5
  ## Structure
6
6
 
7
- - **rbac/** - RBAC and permission system examples
8
- - **public-pages/** - Public page workflow examples
9
- - **authentication/** - Authentication examples (coming soon)
7
+ Examples are organized into two main categories:
8
+
9
+ ### Features (`features/`)
10
+ Cross-component workflow examples that demonstrate how to use multiple components together:
11
+ - **`features/rbac/`** - RBAC and permission system examples
12
+ - **`features/public-pages/`** - Public page workflow examples
13
+ - **`features/authentication/`** - Authentication examples (coming soon)
14
+
15
+ ### Components (`components/`)
16
+ Component-specific examples that demonstrate individual component features:
17
+ - **`components/DataTable/`** - DataTable component examples
18
+ - **`components/Dialog/`** - Dialog component examples
10
19
 
11
20
  ## Usage
12
21
 
13
- Import examples directly from the package:
22
+ ### Import Feature Examples
14
23
 
15
24
  ```tsx
16
- // Import from specific category
17
- import { PublicPageUsageExample } from '@jmruthers/pace-core/examples/public-pages';
18
- import { EventBasedApp } from '@jmruthers/pace-core/examples/rbac';
19
-
20
- // Or import from main examples export
25
+ // Import from main examples export (recommended)
21
26
  import { PublicPageUsageExample, EventBasedApp } from '@jmruthers/pace-core/examples';
27
+
28
+ // Or import from specific feature category
29
+ import { PublicPageUsageExample } from '@jmruthers/pace-core/examples/features/public-pages';
30
+ import { EventBasedApp } from '@jmruthers/pace-core/examples/features/rbac';
31
+
32
+ // Or import all features
33
+ import * as Features from '@jmruthers/pace-core/examples/features';
22
34
  ```
23
35
 
24
- ## Component-Specific Examples
36
+ ### Import Component Examples
37
+
38
+ ```tsx
39
+ // Import from specific component
40
+ import { HierarchicalExample } from '@jmruthers/pace-core/examples/components/DataTable';
41
+ import { HtmlDialogExample } from '@jmruthers/pace-core/examples/components/Dialog';
25
42
 
26
- For component-specific examples, see the component directories:
27
- - DataTable: `@jmruthers/pace-core/components/DataTable/examples`
28
- - Dialog: `@jmruthers/pace-core/components/Dialog/examples`
29
- - Print Components: `@jmruthers/pace-core/components/Print*/examples`
43
+ // Or import all component examples
44
+ import * as Components from '@jmruthers/pace-core/examples/components';
45
+ ```
30
46
 
31
47
  ## Documentation
32
48
 
@@ -0,0 +1,125 @@
1
+ # Examples Directory Structure
2
+
3
+ This document describes the organization of examples in the pace-core package.
4
+
5
+ ## Overview
6
+
7
+ All examples are consolidated in the `/packages/core/examples/` directory, organized into two main categories:
8
+
9
+ 1. **Features** (`features/`) - Cross-component workflow examples
10
+ 2. **Components** (`components/`) - Component-specific examples
11
+
12
+ ## Directory Structure
13
+
14
+ ```
15
+ examples/
16
+ ├── README.md # Main examples documentation
17
+ ├── index.ts # Central export point
18
+
19
+ ├── features/ # Feature-based examples (cross-component)
20
+ │ ├── index.ts
21
+ │ ├── rbac/ # RBAC examples
22
+ │ │ ├── index.ts
23
+ │ │ ├── EventBasedApp.tsx
24
+ │ │ ├── CompleteRBACExample.tsx
25
+ │ │ └── PermissionExample.tsx
26
+ │ │
27
+ │ └── public-pages/ # Public page workflow examples
28
+ │ ├── index.ts
29
+ │ ├── PublicPageUsageExample.tsx
30
+ │ ├── PublicEventPage.tsx
31
+ │ ├── PublicPageApp.tsx
32
+ │ └── CorrectPublicPageImplementation.tsx
33
+
34
+ └── components/ # Component-specific examples
35
+ ├── index.ts
36
+ ├── DataTable/
37
+ │ ├── index.ts
38
+ │ ├── HierarchicalExample.tsx
39
+ │ ├── HierarchicalActionsExample.tsx
40
+ │ ├── InitialPageSizeExample.tsx
41
+ │ └── PerformanceExample.tsx
42
+
43
+ └── Dialog/
44
+ ├── index.ts
45
+ ├── HtmlDialogExample.tsx
46
+ ├── ScrollableDialogExample.tsx
47
+ ├── SmartDialogExample.tsx
48
+ ├── SimpleHtmlTest.tsx
49
+ ├── BasicHtmlTest.tsx
50
+ └── DebugHtmlExample.tsx
51
+ ```
52
+
53
+ ## Import Paths
54
+
55
+ ### Feature Examples
56
+
57
+ ```tsx
58
+ // Main export (recommended)
59
+ import { PublicPageUsageExample, EventBasedApp } from '@jmruthers/pace-core/examples';
60
+
61
+ // Specific feature
62
+ import { PublicPageUsageExample } from '@jmruthers/pace-core/examples/features/public-pages';
63
+ import { EventBasedApp } from '@jmruthers/pace-core/examples/features/rbac';
64
+ ```
65
+
66
+ ### Component Examples
67
+
68
+ ```tsx
69
+ // Specific component
70
+ import { HierarchicalExample } from '@jmruthers/pace-core/examples/components/DataTable';
71
+ import { HtmlDialogExample } from '@jmruthers/pace-core/examples/components/Dialog';
72
+ ```
73
+
74
+ ## Migration Notes
75
+
76
+ ### Removed Locations
77
+
78
+ - ❌ `/packages/core/src/examples/` - Duplicates moved to `examples/features/public-pages/`
79
+ - ❌ `/packages/core/examples/RBAC/` - Moved to `examples/features/rbac/`
80
+ - ❌ `/packages/core/examples/public-pages/` - Moved to `examples/features/public-pages/`
81
+ - ❌ `/packages/core/examples/Components/`, `DataTable/`, `Dialog/`, `PublicPages/` - Empty folders removed
82
+
83
+ ### Component Examples
84
+
85
+ Component examples were previously located in:
86
+ - `/packages/core/src/components/DataTable/examples/`
87
+ - `/packages/core/src/components/Dialog/examples/`
88
+
89
+ These have been moved to:
90
+ - `/packages/core/examples/components/DataTable/`
91
+ - `/packages/core/examples/components/Dialog/`
92
+
93
+ **Note:** Test files remain in the original component directories (`src/components/*/examples/__tests__/`) as they are part of the component's test suite.
94
+
95
+ ## Adding New Examples
96
+
97
+ ### Feature Examples
98
+
99
+ 1. Create a new directory under `examples/features/`
100
+ 2. Add your example files
101
+ 3. Create an `index.ts` file exporting your examples
102
+ 4. Update `examples/features/index.ts` to export from your new directory
103
+ 5. Update `examples/index.ts` if needed
104
+ 6. Update `package.json` exports if you want a dedicated import path
105
+
106
+ ### Component Examples
107
+
108
+ 1. Create a new directory under `examples/components/[ComponentName]/`
109
+ 2. Add your example files
110
+ 3. Create an `index.ts` file exporting your examples
111
+ 4. Update `examples/components/index.ts` to export from your new directory
112
+ 5. Update `package.json` exports if you want a dedicated import path
113
+
114
+ ## Package Exports
115
+
116
+ The following export paths are available in `package.json`:
117
+
118
+ - `@jmruthers/pace-core/examples` - Main export (all examples)
119
+ - `@jmruthers/pace-core/examples/features` - All feature examples
120
+ - `@jmruthers/pace-core/examples/features/rbac` - RBAC examples
121
+ - `@jmruthers/pace-core/examples/features/public-pages` - Public pages examples
122
+ - `@jmruthers/pace-core/examples/components` - All component examples
123
+ - `@jmruthers/pace-core/examples/components/DataTable` - DataTable examples
124
+ - `@jmruthers/pace-core/examples/components/Dialog` - Dialog examples
125
+
@@ -0,0 +1,421 @@
1
+ /**
2
+ * @file Hierarchical Actions DataTable Example
3
+ * @package @jmruthers/pace-core
4
+ * @module Components/DataTable/Examples
5
+ * @since 0.4.36
6
+ *
7
+ * Example demonstrating hierarchical actions in DataTable components.
8
+ * Shows different action icons and labels for parent vs child rows.
9
+ */
10
+
11
+ import React from 'react';
12
+ import { DataTable } from '../DataTable';
13
+ import type { DataTableColumn, DataTableAction } from '../types';
14
+ import { Button } from '../../Button';
15
+ import { createLogger } from '../../../utils/logger';
16
+ import {
17
+ PlusIcon,
18
+ PencilIcon,
19
+ TrashIcon,
20
+ EyeIcon,
21
+ CopyIcon,
22
+ DownloadIcon,
23
+ UploadIcon,
24
+ SettingsIcon,
25
+ InfoIcon,
26
+ StarIcon
27
+ } from 'lucide-react';
28
+ import type { HierarchicalDataRow } from '../types';
29
+
30
+ // ============================================================================
31
+ // DATA TYPES
32
+ // ============================================================================
33
+
34
+ interface Dish extends HierarchicalDataRow {
35
+ id: string;
36
+ isParent: boolean;
37
+ parentId?: string;
38
+ // Parent row fields (dishes)
39
+ code?: string;
40
+ name?: string;
41
+ type?: string;
42
+ // Child row fields (ingredients)
43
+ diet?: string;
44
+ item?: string;
45
+ brand?: string;
46
+ quantity?: number;
47
+ unit?: string;
48
+ uptake?: number;
49
+ }
50
+
51
+ // ============================================================================
52
+ // SAMPLE DATA
53
+ // ============================================================================
54
+
55
+ const hierarchicalData: Dish[] = [
56
+ // Parent rows (dishes)
57
+ {
58
+ id: 'dish-1',
59
+ isParent: true,
60
+ code: 'D001',
61
+ name: 'Chicken Caesar Salad',
62
+ type: 'Salad',
63
+ },
64
+ {
65
+ id: 'dish-2',
66
+ isParent: true,
67
+ code: 'D002',
68
+ name: 'Beef Stir Fry',
69
+ type: 'Main Course',
70
+ },
71
+ {
72
+ id: 'dish-3',
73
+ isParent: true,
74
+ code: 'D003',
75
+ name: 'Chocolate Cake',
76
+ type: 'Dessert',
77
+ },
78
+
79
+ // Child rows (ingredients) for Chicken Caesar Salad
80
+ {
81
+ id: 'ing-1-1',
82
+ isParent: false,
83
+ parentId: 'dish-1',
84
+ diet: 'Standard',
85
+ item: 'Lettuce',
86
+ brand: 'Fresh Farms',
87
+ quantity: 200,
88
+ unit: 'g',
89
+ uptake: 1.0,
90
+ },
91
+ {
92
+ id: 'ing-1-2',
93
+ isParent: false,
94
+ parentId: 'dish-1',
95
+ diet: 'Standard',
96
+ item: 'Chicken Breast',
97
+ brand: 'Premium Poultry',
98
+ quantity: 150,
99
+ unit: 'g',
100
+ uptake: 0.9,
101
+ },
102
+ {
103
+ id: 'ing-1-3',
104
+ isParent: false,
105
+ parentId: 'dish-1',
106
+ diet: 'GF & Vegan',
107
+ item: 'Caesar Dressing',
108
+ brand: 'Vegan Delights',
109
+ quantity: 50,
110
+ unit: 'ml',
111
+ uptake: 0.8,
112
+ },
113
+
114
+ // Child rows (ingredients) for Beef Stir Fry
115
+ {
116
+ id: 'ing-2-1',
117
+ isParent: false,
118
+ parentId: 'dish-2',
119
+ diet: 'Halal',
120
+ item: 'Beef Strips',
121
+ brand: 'Halal Meats',
122
+ quantity: 250,
123
+ unit: 'g',
124
+ uptake: 1.0,
125
+ },
126
+ {
127
+ id: 'ing-2-2',
128
+ isParent: false,
129
+ parentId: 'dish-2',
130
+ diet: 'Standard',
131
+ item: 'Mixed Vegetables',
132
+ brand: 'Garden Fresh',
133
+ quantity: 200,
134
+ unit: 'g',
135
+ uptake: 0.95,
136
+ },
137
+
138
+ // Child rows (ingredients) for Chocolate Cake
139
+ {
140
+ id: 'ing-3-1',
141
+ isParent: false,
142
+ parentId: 'dish-3',
143
+ diet: 'Standard',
144
+ item: 'Flour',
145
+ brand: 'Baker\'s Choice',
146
+ quantity: 300,
147
+ unit: 'g',
148
+ uptake: 1.0,
149
+ },
150
+ {
151
+ id: 'ing-3-2',
152
+ isParent: false,
153
+ parentId: 'dish-3',
154
+ diet: 'Dairy Free',
155
+ item: 'Cocoa Powder',
156
+ brand: 'Pure Cocoa',
157
+ quantity: 50,
158
+ unit: 'g',
159
+ uptake: 1.0,
160
+ },
161
+ ];
162
+
163
+ // ============================================================================
164
+ // HIERARCHICAL ACTIONS
165
+ // ============================================================================
166
+
167
+ const hierarchicalActions: DataTableAction<Dish>[] = [
168
+ // View action - different icons for parent vs child
169
+ {
170
+ label: 'View Details',
171
+ icon: EyeIcon,
172
+ parentIcon: EyeIcon,
173
+ childIcon: InfoIcon,
174
+ parentLabel: 'View Dish',
175
+ childLabel: 'View Ingredient',
176
+ onClick: (row) => {
177
+ // View action
178
+ },
179
+ variant: 'default',
180
+ testId: 'view',
181
+ },
182
+
183
+ // Edit action - different icons and labels
184
+ {
185
+ label: 'Edit',
186
+ icon: PencilIcon,
187
+ parentIcon: SettingsIcon,
188
+ childIcon: PencilIcon,
189
+ parentLabel: 'Edit Recipe',
190
+ childLabel: 'Edit Ingredient',
191
+ onClick: (row) => {
192
+ // Edit action
193
+ },
194
+ variant: 'default',
195
+ testId: 'edit',
196
+ },
197
+
198
+ // Copy action - only for parent rows (dishes)
199
+ {
200
+ label: 'Copy Recipe',
201
+ icon: CopyIcon,
202
+ parentIcon: CopyIcon,
203
+ parentLabel: 'Duplicate Recipe',
204
+ onClick: (row) => {
205
+ // Copy recipe action
206
+ },
207
+ variant: 'outline',
208
+ testId: 'copy',
209
+ showForParent: true,
210
+ },
211
+
212
+ // Add ingredient action - only for parent rows
213
+ {
214
+ label: 'Add Ingredient',
215
+ icon: PlusIcon,
216
+ parentIcon: PlusIcon,
217
+ parentLabel: 'Add Ingredient',
218
+ onClick: (row) => {
219
+ // Add ingredient action
220
+ },
221
+ variant: 'secondary',
222
+ testId: 'add-ingredient',
223
+ showForParent: true,
224
+ },
225
+
226
+ // Export action - only for child rows (ingredients)
227
+ {
228
+ label: 'Export',
229
+ icon: DownloadIcon,
230
+ childIcon: DownloadIcon,
231
+ childLabel: 'Export Ingredient',
232
+ onClick: (row) => {
233
+ // Export ingredient action
234
+ },
235
+ variant: 'ghost',
236
+ testId: 'export',
237
+ showForChild: true,
238
+ },
239
+
240
+ // Star action - different behavior for parent vs child
241
+ {
242
+ label: 'Star',
243
+ icon: StarIcon,
244
+ parentIcon: StarIcon,
245
+ childIcon: StarIcon,
246
+ parentLabel: 'Favorite Recipe',
247
+ childLabel: 'Favorite Ingredient',
248
+ onClick: (row) => {
249
+ // Star action
250
+ },
251
+ variant: 'ghost',
252
+ testId: 'star',
253
+ },
254
+
255
+ // Delete action - different labels and icons
256
+ {
257
+ label: 'Delete',
258
+ icon: TrashIcon,
259
+ parentIcon: TrashIcon,
260
+ childIcon: TrashIcon,
261
+ parentLabel: 'Delete Recipe',
262
+ childLabel: 'Remove Ingredient',
263
+ onClick: (row) => {
264
+ // Delete action
265
+ },
266
+ variant: 'destructive',
267
+ testId: 'delete',
268
+ },
269
+ ];
270
+
271
+ // ============================================================================
272
+ // COLUMNS
273
+ // ============================================================================
274
+
275
+ const columns: DataTableColumn<Dish>[] = [
276
+ {
277
+ accessorKey: 'code',
278
+ header: 'Code',
279
+ renderForParent: (row) => <strong className="text-main-700">{row.code}</strong>,
280
+ renderForChild: () => '', // Blank for child rows
281
+ hideForChild: true,
282
+ },
283
+ {
284
+ accessorKey: 'name',
285
+ header: 'Name',
286
+ renderForParent: (row) => <strong className="text-main-700">{row.name}</strong>,
287
+ renderForChild: () => '', // Blank for child rows
288
+ hideForChild: true,
289
+ },
290
+ {
291
+ accessorKey: 'type',
292
+ header: 'Type',
293
+ renderForParent: (row) => (
294
+ <span className="inline-flex items-center px-2 py-1 rounded-full text-xs font-medium bg-main-100 text-main-800">
295
+ {row.type}
296
+ </span>
297
+ ),
298
+ renderForChild: () => '', // Blank for child rows
299
+ hideForChild: true,
300
+ },
301
+ {
302
+ accessorKey: 'diet',
303
+ header: 'Diet',
304
+ renderForParent: () => '', // Blank for parent rows
305
+ renderForChild: (row) => (
306
+ <span className="inline-flex items-center px-2 py-1 rounded-full text-xs font-medium bg-sec-100 text-sec-800">
307
+ {row.diet}
308
+ </span>
309
+ ),
310
+ hideForParent: true,
311
+ },
312
+ {
313
+ accessorKey: 'item',
314
+ header: 'Item',
315
+ renderForParent: () => '', // Blank for parent rows
316
+ renderForChild: (row) => <span className="text-sec-700">{row.item}</span>,
317
+ hideForParent: true,
318
+ },
319
+ {
320
+ accessorKey: 'brand',
321
+ header: 'Brand',
322
+ renderForParent: () => '', // Blank for parent rows
323
+ renderForChild: (row) => <span className="text-sec-600 text-sm">{row.brand}</span>,
324
+ hideForParent: true,
325
+ },
326
+ {
327
+ accessorKey: 'quantity',
328
+ header: 'Quantity',
329
+ renderForParent: () => '', // Blank for parent rows
330
+ renderForChild: (row) => (
331
+ <span className="font-mono text-sm">
332
+ {row.quantity} {row.unit}
333
+ </span>
334
+ ),
335
+ hideForParent: true,
336
+ },
337
+ {
338
+ accessorKey: 'uptake',
339
+ header: 'Uptake',
340
+ renderForParent: () => '', // Blank for parent rows
341
+ renderForChild: (row) => (
342
+ <span className="font-mono text-sm">
343
+ {row.uptake?.toFixed(2) || 'N/A'}
344
+ </span>
345
+ ),
346
+ hideForParent: true,
347
+ },
348
+ ];
349
+
350
+ // ============================================================================
351
+ // EXAMPLE COMPONENT
352
+ // ============================================================================
353
+
354
+ export function HierarchicalActionsExample() {
355
+ const logger = createLogger('HierarchicalActionsExample');
356
+ return (
357
+ <div className="space-y-6">
358
+ <div>
359
+ <h2 className="text-2xl font-bold text-main-900">Hierarchical Actions Example</h2>
360
+ <p className="text-main-600 mt-2">
361
+ This example demonstrates different action icons and labels for parent vs child rows in a hierarchical DataTable.
362
+ </p>
363
+ </div>
364
+
365
+ <div className="bg-sec-50 p-4 rounded-lg">
366
+ <h3 className="font-semibold text-sec-800 mb-2">Action Features:</h3>
367
+ <ul className="text-sm text-sec-700 space-y-1">
368
+ <li>• <strong>Expand/Collapse All:</strong> Button in header (▶️/🔽) to expand/collapse all parent rows</li>
369
+ <li>• <strong>View Details:</strong> Different icons (👁️ for dishes, ℹ️ for ingredients)</li>
370
+ <li>• <strong>Edit:</strong> Different icons (⚙️ for dishes, ✏️ for ingredients)</li>
371
+ <li>• <strong>Copy Recipe:</strong> Only shows for parent rows (dishes)</li>
372
+ <li>• <strong>Add Ingredient:</strong> Only shows for parent rows (dishes)</li>
373
+ <li>• <strong>Export:</strong> Only shows for child rows (ingredients)</li>
374
+ <li>• <strong>Star:</strong> Different labels ("Favorite Recipe" vs "Favorite Ingredient")</li>
375
+ <li>• <strong>Delete:</strong> Different labels ("Delete Recipe" vs "Remove Ingredient")</li>
376
+ </ul>
377
+ </div>
378
+
379
+ <DataTable
380
+ data={hierarchicalData}
381
+ columns={columns}
382
+ title="Dishes & Ingredients"
383
+ rbac={{ pageId: 'dishes' }}
384
+ features={{
385
+ search: true,
386
+ pagination: true,
387
+ sorting: true,
388
+ filtering: true,
389
+ hierarchical: true,
390
+ editing: true,
391
+ deletion: true,
392
+ import: false,
393
+ export: false,
394
+ selection: false,
395
+ creation: false,
396
+ deleteSelected: false,
397
+ grouping: false,
398
+ columnVisibility: false,
399
+ columnReordering: false,
400
+ }}
401
+ hierarchical={{
402
+ enabled: true,
403
+ defaultExpanded: false,
404
+ onExpandedChange: (expandedIds) => {
405
+ // Expanded rows changed
406
+ },
407
+ parentRowClassName: 'bg-main-50 hover:bg-main-100 font-medium',
408
+ childRowClassName: 'bg-sec-25 hover:bg-sec-50',
409
+ indentSize: 24,
410
+ }}
411
+ actions={hierarchicalActions}
412
+ onEditRow={(row, data) => {
413
+ // Edit row action
414
+ }}
415
+ onDeleteRow={(row) => {
416
+ // Delete row action
417
+ }}
418
+ />
419
+ </div>
420
+ );
421
+ }