@jmruthers/pace-core 0.5.135 → 0.5.137

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 (544) hide show
  1. package/dist/{DataTable-A36PJG6N.js → DataTable-6M4L6BI2.js} +26 -13
  2. package/dist/{DataTable-C7GaRZye.d.ts → DataTable-CWAZZcXC.d.ts} +1 -1
  3. package/dist/{PublicLoadingSpinner-CUAnTvcg.d.ts → EventLogo-rFL_kRjk.d.ts} +123 -135
  4. package/dist/{UnifiedAuthProvider-BVKmQd9u.d.ts → UnifiedAuthProvider-DJxGTftH.d.ts} +1 -1
  5. package/dist/{UnifiedAuthProvider-CQDZRJIS.js → UnifiedAuthProvider-XIQQ7LVU.js} +5 -5
  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-F64FFPOZ.js → chunk-22WKWKRX.js} +26 -20
  9. package/dist/chunk-22WKWKRX.js.map +1 -0
  10. package/dist/{chunk-VZ5OR6HD.js → chunk-4C7EXCAR.js} +62 -150
  11. package/dist/chunk-4C7EXCAR.js.map +1 -0
  12. package/dist/{chunk-PYUXFQJ3.js → chunk-56XJ3TU6.js} +2 -2
  13. package/dist/chunk-56XJ3TU6.js.map +1 -0
  14. package/dist/{chunk-CTJRBUX2.js → chunk-6LAAY47Q.js} +2 -2
  15. package/dist/{chunk-UJI6WSMD.js → chunk-7QCC6MCP.js} +90 -3
  16. package/dist/chunk-7QCC6MCP.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-CQZU6TFE.js → chunk-BCIBECNB.js} +100 -62
  20. package/dist/chunk-BCIBECNB.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-BJPBT3CU.js +21 -0
  24. package/dist/chunk-BJPBT3CU.js.map +1 -0
  25. package/dist/{chunk-BYXRHAIF.js → chunk-BLCXZEYF.js} +23 -14
  26. package/dist/chunk-BLCXZEYF.js.map +1 -0
  27. package/dist/{chunk-WP5I5GLN.js → chunk-BVYWGZVV.js} +112 -97
  28. package/dist/chunk-BVYWGZVV.js.map +1 -0
  29. package/dist/{chunk-GEVIB2UB.js → chunk-ERISIBYU.js} +14 -5
  30. package/dist/chunk-ERISIBYU.js.map +1 -0
  31. package/dist/{chunk-O3NWNXDY.js → chunk-FMUCXFII.js} +2 -2
  32. package/dist/chunk-FMUCXFII.js.map +1 -0
  33. package/dist/{chunk-GVDR7WNV.js → chunk-HAWZXGR2.js} +334 -614
  34. package/dist/chunk-HAWZXGR2.js.map +1 -0
  35. package/dist/{chunk-ZV77RZMU.js → chunk-INQLMHPF.js} +2 -2
  36. package/dist/chunk-JISYG63F.js +70 -0
  37. package/dist/chunk-JISYG63F.js.map +1 -0
  38. package/dist/{chunk-HMNOSGVA.js → chunk-KYRHUBIU.js} +576 -767
  39. package/dist/chunk-KYRHUBIU.js.map +1 -0
  40. package/dist/{chunk-M6DDYFUD.js → chunk-LS353YLY.js} +19 -16
  41. package/dist/chunk-LS353YLY.js.map +1 -0
  42. package/dist/{chunk-TGIY2AR2.js → chunk-MA6EPSGZ.js} +4 -3
  43. package/dist/{chunk-TGIY2AR2.js.map → chunk-MA6EPSGZ.js.map} +1 -1
  44. package/dist/chunk-OWAG3GSU.js +58 -0
  45. package/dist/chunk-OWAG3GSU.js.map +1 -0
  46. package/dist/{chunk-JCQZ6LA7.js → chunk-Q5QRDWKI.js} +9 -3
  47. package/dist/chunk-Q5QRDWKI.js.map +1 -0
  48. package/dist/chunk-S5OFRT4M.js +94 -0
  49. package/dist/chunk-S5OFRT4M.js.map +1 -0
  50. package/dist/{chunk-3DBFLLLU.js → chunk-SBVILCCA.js} +14 -9
  51. package/dist/chunk-SBVILCCA.js.map +1 -0
  52. package/dist/{chunk-ZYZCRSBD.js → chunk-T6JN6LH6.js} +16 -11
  53. package/dist/chunk-T6JN6LH6.js.map +1 -0
  54. package/dist/chunk-XDNLUEXI.js +138 -0
  55. package/dist/chunk-XDNLUEXI.js.map +1 -0
  56. package/dist/{chunk-3CG5L6RN.js → chunk-YCWDTTUK.js} +90 -75
  57. package/dist/chunk-YCWDTTUK.js.map +1 -0
  58. package/dist/{chunk-5F3NDPJV.js → chunk-ZZ2SS7NI.js} +10 -5
  59. package/dist/chunk-ZZ2SS7NI.js.map +1 -0
  60. package/dist/components.d.ts +7 -287
  61. package/dist/components.js +27 -157
  62. package/dist/components.js.map +1 -1
  63. package/dist/{file-reference-C9isKNPn.d.ts → file-reference-C6Gkn77H.d.ts} +1 -1
  64. package/dist/{formatting-DFcCxUEk.d.ts → formatting-CvUXy2mF.d.ts} +1 -1
  65. package/dist/hooks.d.ts +3 -3
  66. package/dist/hooks.js +21 -16
  67. package/dist/hooks.js.map +1 -1
  68. package/dist/index.d.ts +101 -9
  69. package/dist/index.js +44 -31
  70. package/dist/index.js.map +1 -1
  71. package/dist/providers.d.ts +1 -1
  72. package/dist/providers.js +4 -4
  73. package/dist/rbac/index.js +12 -12
  74. package/dist/schema-DTDZQe2u.d.ts +28 -0
  75. package/dist/styles/index.js +2 -1
  76. package/dist/theming/runtime.d.ts +2 -19
  77. package/dist/theming/runtime.js +2 -1
  78. package/dist/{types-D5rqZQXk.d.ts → types-Dfz9dmVH.d.ts} +12 -1
  79. package/dist/types.d.ts +153 -4
  80. package/dist/types.js +51 -16
  81. package/dist/types.js.map +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 +221 -173
  85. package/dist/utils.js +185 -225
  86. package/dist/utils.js.map +1 -1
  87. package/dist/validation.d.ts +24 -115
  88. package/dist/validation.js +19 -474
  89. package/dist/validation.js.map +1 -1
  90. package/docs/api/classes/ColumnFactory.md +1 -1
  91. package/docs/api/classes/ErrorBoundary.md +6 -6
  92. package/docs/api/classes/InvalidScopeError.md +1 -1
  93. package/docs/api/classes/MissingUserContextError.md +1 -1
  94. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  95. package/docs/api/classes/PermissionDeniedError.md +1 -1
  96. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  97. package/docs/api/classes/RBACAuditManager.md +6 -6
  98. package/docs/api/classes/RBACCache.md +1 -1
  99. package/docs/api/classes/RBACEngine.md +7 -7
  100. package/docs/api/classes/RBACError.md +1 -1
  101. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  102. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  103. package/docs/api/classes/StorageUtils.md +1 -1
  104. package/docs/api/enums/FileCategory.md +1 -1
  105. package/docs/api/interfaces/AggregateConfig.md +4 -4
  106. package/docs/api/interfaces/BadgeProps.md +27 -0
  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 +591 -220
  199. package/docs/api-reference/components.md +106 -26
  200. package/docs/architecture/README.md +0 -3
  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/docs/styles/README.md +0 -2
  205. package/examples/README.md +30 -14
  206. package/examples/STRUCTURE.md +125 -0
  207. package/examples/components 2/DataTable/HierarchicalActionsExample.tsx +421 -0
  208. package/examples/components 2/DataTable/HierarchicalExample.tsx +475 -0
  209. package/examples/components 2/DataTable/InitialPageSizeExample.tsx +177 -0
  210. package/examples/components 2/DataTable/PerformanceExample.tsx +506 -0
  211. package/examples/components 2/DataTable/index.ts +13 -0
  212. package/examples/components 2/Dialog/BasicHtmlTest.tsx +55 -0
  213. package/examples/components 2/Dialog/DebugHtmlExample.tsx +68 -0
  214. package/examples/components 2/Dialog/HtmlDialogExample.tsx +202 -0
  215. package/examples/components 2/Dialog/ScrollableDialogExample.tsx +290 -0
  216. package/examples/components 2/Dialog/SimpleHtmlTest.tsx +61 -0
  217. package/examples/components 2/Dialog/SmartDialogExample.tsx +322 -0
  218. package/examples/components 2/Dialog/index.ts +15 -0
  219. package/examples/components 2/index.ts +11 -0
  220. package/examples/features/index.ts +12 -0
  221. package/{src/examples → examples/features/public-pages}/CorrectPublicPageImplementation.tsx +14 -17
  222. package/{src/examples → examples/features/public-pages}/PublicEventPage.tsx +14 -27
  223. package/{src/examples → examples/features/public-pages}/PublicPageApp.tsx +15 -28
  224. package/{src/examples → examples/features/public-pages}/PublicPageUsageExample.tsx +8 -10
  225. package/examples/features/public-pages/index.ts +14 -0
  226. package/examples/features/rbac/CompleteRBACExample.tsx +324 -0
  227. package/examples/features/rbac/EventBasedApp.tsx +239 -0
  228. package/examples/features/rbac/PermissionExample.tsx +151 -0
  229. package/examples/features/rbac/index.ts +13 -0
  230. package/examples/index.ts +11 -3
  231. package/package.json +30 -19
  232. package/src/__tests__/TEST_STANDARD.md +92 -0
  233. package/src/components/Alert/Alert.tsx +1 -1
  234. package/src/components/Avatar/Avatar.tsx +1 -1
  235. package/src/components/Badge/Badge.test.tsx +314 -0
  236. package/src/components/Badge/Badge.tsx +304 -0
  237. package/src/components/Badge/index.ts +3 -0
  238. package/src/components/Button/Button.tsx +1 -1
  239. package/src/components/Card/Card.tsx +1 -1
  240. package/src/components/Checkbox/Checkbox.tsx +1 -1
  241. package/src/components/DataTable/DataTable.test.tsx +1 -1
  242. package/src/components/DataTable/DataTable.tsx +1 -30
  243. package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +562 -0
  244. package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +217 -0
  245. package/src/components/DataTable/__tests__/styles.test.ts +3 -3
  246. package/src/components/DataTable/components/ActionButtons.tsx +0 -15
  247. package/src/components/DataTable/components/ColumnFilter.tsx +8 -4
  248. package/src/components/DataTable/components/DataTableBody.tsx +461 -0
  249. package/src/components/DataTable/components/DataTableCore.tsx +4 -185
  250. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +1 -1
  251. package/src/components/DataTable/components/DataTableModals.tsx +1 -27
  252. package/src/components/DataTable/components/DraggableColumnHeader.tsx +144 -0
  253. package/src/components/DataTable/components/EditableRow.tsx +1 -1
  254. package/src/components/DataTable/components/FilterRow.tsx +9 -3
  255. package/src/components/DataTable/components/ImportModal.tsx +2 -14
  256. package/src/components/DataTable/components/PaginationControls.tsx +2 -1
  257. package/src/components/DataTable/components/UnifiedTableBody.tsx +109 -82
  258. package/src/components/DataTable/components/VirtualizedDataTable.tsx +513 -0
  259. package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +14 -68
  260. package/src/components/DataTable/components/__tests__/ActionButtons.test.tsx +1 -1
  261. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +62 -0
  262. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +1 -1
  263. package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +1 -1
  264. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +43 -0
  265. package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +1 -1
  266. package/src/components/DataTable/core/ActionManager.ts +235 -0
  267. package/src/components/DataTable/core/ColumnManager.ts +205 -0
  268. package/src/components/DataTable/core/DataManager.ts +188 -0
  269. package/src/components/DataTable/core/DataTableContext.tsx +181 -0
  270. package/src/components/DataTable/core/LocalDataAdapter.ts +273 -0
  271. package/src/components/DataTable/core/PluginRegistry.ts +229 -0
  272. package/src/components/DataTable/core/StateManager.ts +311 -0
  273. package/src/components/DataTable/core/interfaces.ts +338 -0
  274. package/src/components/DataTable/examples/GroupingAggregationExample.tsx +273 -0
  275. package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +1 -1
  276. package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +1 -1
  277. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +1 -1
  278. package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +1 -1
  279. package/src/components/DataTable/hooks/useDataTablePermissions.ts +2 -23
  280. package/src/components/DataTable/index.ts +4 -0
  281. package/src/components/DataTable/styles.ts +28 -7
  282. package/src/components/DataTable/types.ts +13 -0
  283. package/src/components/DataTable/utils/__tests__/columnUtils.test.ts +94 -0
  284. package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +1 -1
  285. package/src/components/DataTable/utils/aggregationUtils.ts +161 -0
  286. package/src/components/DataTable/utils/columnUtils.ts +40 -0
  287. package/src/components/DataTable/utils/debugTools.ts +609 -0
  288. package/src/components/DataTable/utils/exportUtils.ts +1 -1
  289. package/src/components/DataTable/utils/flexibleImport.ts +1 -11
  290. package/src/components/DataTable/utils/index.ts +2 -0
  291. package/src/components/DataTable/utils/paginationUtils.ts +1 -1
  292. package/src/components/Dialog/Dialog.tsx +2 -2
  293. package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +8 -1
  294. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +35 -7
  295. package/src/components/ErrorBoundary/ErrorBoundary.tsx +5 -4
  296. package/src/components/EventSelector/EventSelector.tsx +3 -2
  297. package/src/components/FileDisplay/FileDisplay.tsx +2 -36
  298. package/src/components/FileUpload/FileUpload.test.tsx +2 -2
  299. package/src/components/FileUpload/FileUpload.tsx +2 -2
  300. package/src/components/Footer/Footer.test.tsx +1 -1
  301. package/src/components/Footer/Footer.tsx +1 -1
  302. package/src/components/Form/Form.test.tsx +5 -510
  303. package/src/components/Form/Form.tsx +1 -1
  304. package/src/components/Form/FormField.tsx +1 -1
  305. package/src/components/Form/index.ts +0 -12
  306. package/src/components/Header/Header.tsx +1 -1
  307. package/src/components/Input/Input.tsx +1 -1
  308. package/src/components/Label/Label.tsx +1 -1
  309. package/src/components/LoginForm/LoginForm.test.tsx +1 -1
  310. package/src/components/LoginForm/LoginForm.tsx +1 -1
  311. package/src/components/NavigationMenu/NavigationMenu.test.tsx +19 -3
  312. package/src/components/NavigationMenu/NavigationMenu.tsx +9 -8
  313. package/src/components/OrganisationSelector/OrganisationSelector.tsx +4 -3
  314. package/src/components/PaceAppLayout/PaceAppLayout.tsx +14 -12
  315. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +0 -16
  316. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +76 -10
  317. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +0 -1
  318. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -9
  319. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +35 -3
  320. package/src/components/PaceLoginPage/PaceLoginPage.tsx +14 -13
  321. package/src/components/PasswordReset/PasswordChangeForm.tsx +1 -1
  322. package/src/components/PasswordReset/index.ts +0 -2
  323. package/src/components/Progress/Progress.tsx +1 -1
  324. package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +35 -8
  325. package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -2
  326. package/src/components/PublicLayout/PublicErrorBoundary.tsx +1 -1
  327. package/src/components/PublicLayout/PublicLoadingSpinner.tsx +1 -1
  328. package/src/components/PublicLayout/PublicPageContextChecker.tsx +44 -43
  329. package/src/components/PublicLayout/PublicPageFooter.tsx +1 -1
  330. package/src/components/PublicLayout/PublicPageHeader.tsx +1 -15
  331. package/src/components/PublicLayout/PublicPageProvider.tsx +3 -2
  332. package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +2 -0
  333. package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +1 -1
  334. package/src/components/PublicLayout/index.ts +4 -2
  335. package/src/components/Select/Select.test.tsx +1 -1
  336. package/src/components/Select/Select.tsx +21 -9
  337. package/src/components/{SessionRestorationLoader.tsx → SessionRestorationLoader/SessionRestorationLoader.tsx} +3 -2
  338. package/src/components/SessionRestorationLoader/index.ts +3 -0
  339. package/src/components/Switch/Switch.tsx +1 -1
  340. package/src/components/Table/Table.tsx +1 -1
  341. package/src/components/Table/__tests__/Table.test.tsx +1 -1
  342. package/src/components/Toast/Toast.tsx +1 -1
  343. package/src/components/Tooltip/Tooltip.tsx +1 -1
  344. package/src/components/index.ts +7 -10
  345. package/src/hooks/__tests__/hooks.integration.test.tsx +37 -22
  346. package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +33 -17
  347. package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +28 -3
  348. package/src/hooks/__tests__/useFileDisplay.unit.test.ts +36 -9
  349. package/src/hooks/__tests__/useFileUrl.unit.test.ts +83 -85
  350. package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +26 -2
  351. package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +19 -6
  352. package/src/hooks/__tests__/usePermissionCache.simple.test.ts +17 -4
  353. package/src/hooks/__tests__/usePermissionCache.unit.test.ts +17 -4
  354. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +26 -6
  355. package/src/hooks/__tests__/usePublicFileDisplay.test.ts +16 -6
  356. package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +3 -3
  357. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +17 -3
  358. package/src/hooks/public/usePublicEvent.ts +7 -6
  359. package/src/hooks/public/usePublicEventLogo.ts +7 -4
  360. package/src/hooks/public/usePublicFileDisplay.ts +6 -150
  361. package/src/hooks/useComponentPerformance.ts +4 -1
  362. package/src/hooks/useDataTablePerformance.ts +4 -3
  363. package/src/hooks/useEventTheme.test.ts +18 -5
  364. package/src/hooks/useEventTheme.ts +4 -1
  365. package/src/hooks/useEvents.ts +2 -0
  366. package/src/hooks/useFileDisplay.ts +9 -8
  367. package/src/hooks/useFileReference.ts +4 -1
  368. package/src/hooks/useFileUrl.ts +4 -1
  369. package/src/hooks/useInactivityTracker.ts +5 -4
  370. package/src/hooks/useOrganisationSecurity.test.ts +33 -12
  371. package/src/hooks/useOrganisationSecurity.ts +8 -7
  372. package/src/hooks/usePerformanceMonitor.ts +6 -3
  373. package/src/hooks/usePermissionCache.ts +13 -6
  374. package/src/hooks/useSecureDataAccess.test.ts +2 -2
  375. package/src/hooks/useSecureDataAccess.ts +9 -8
  376. package/src/hooks/useSessionRestoration.ts +4 -1
  377. package/src/hooks/useStorage.ts +4 -1
  378. package/src/index.ts +20 -7
  379. package/src/providers/services/AuthServiceProvider.tsx +3 -2
  380. package/src/providers/services/EventServiceProvider.tsx +2 -1
  381. package/src/providers/services/InactivityServiceProvider.tsx +2 -1
  382. package/src/providers/services/OrganisationServiceProvider.tsx +2 -1
  383. package/src/providers/services/UnifiedAuthProvider.tsx +4 -3
  384. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +22 -2
  385. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +24 -2
  386. package/src/rbac/__tests__/cache-invalidation.test.ts +20 -6
  387. package/src/rbac/api.ts +5 -2
  388. package/src/rbac/audit-enhanced.ts +6 -6
  389. package/src/rbac/audit.test.ts +60 -38
  390. package/src/rbac/audit.ts +8 -8
  391. package/src/rbac/cache-invalidation.ts +7 -4
  392. package/src/rbac/components/EnhancedNavigationMenu.tsx +11 -5
  393. package/src/rbac/components/NavigationGuard.tsx +7 -3
  394. package/src/rbac/components/NavigationProvider.tsx +6 -3
  395. package/src/rbac/components/PagePermissionGuard.tsx +28 -16
  396. package/src/rbac/components/PagePermissionProvider.tsx +4 -1
  397. package/src/rbac/components/PermissionEnforcer.tsx +9 -3
  398. package/src/rbac/components/RoleBasedRouter.tsx +3 -1
  399. package/src/rbac/components/SecureDataProvider.tsx +7 -3
  400. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +87 -61
  401. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +83 -33
  402. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +36 -13
  403. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +2 -2
  404. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +22 -8
  405. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +19 -6
  406. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +43 -17
  407. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +42 -17
  408. package/src/rbac/engine.ts +15 -7
  409. package/src/rbac/hooks/usePermissions.ts +7 -3
  410. package/src/rbac/hooks/useResolvedScope.test.ts +2 -2
  411. package/src/rbac/hooks/useResolvedScope.ts +10 -7
  412. package/src/rbac/permissions.ts +5 -2
  413. package/src/rbac/security.test.ts +27 -16
  414. package/src/rbac/security.ts +5 -4
  415. package/src/services/AuthService.ts +22 -21
  416. package/src/services/EventService.ts +12 -12
  417. package/src/services/InactivityService.ts +5 -4
  418. package/src/services/OrganisationService.ts +26 -25
  419. package/src/services/__tests__/AuthService.test.ts +51 -19
  420. package/src/services/__tests__/EventService.test.ts +37 -5
  421. package/src/services/__tests__/InactivityService.test.ts +38 -4
  422. package/src/services/__tests__/OrganisationService.test.ts +3 -8
  423. package/src/services/base/BaseService.ts +3 -1
  424. package/src/styles/core.css +3 -0
  425. package/src/theming/__tests__/runtime.test.ts +21 -12
  426. package/src/theming/parseEventColours.ts +5 -19
  427. package/src/theming/runtime.ts +8 -4
  428. package/src/types/validation.ts +2 -29
  429. package/src/utils/__tests__/appConfig.unit.test.ts +1 -1
  430. package/src/utils/__tests__/audit.unit.test.ts +1 -1
  431. package/src/utils/__tests__/auth-utils.unit.test.ts +1 -1
  432. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +19 -19
  433. package/src/utils/__tests__/cn.unit.test.ts +1 -1
  434. package/src/utils/__tests__/debugLogger.test.ts +1 -1
  435. package/src/utils/__tests__/deviceFingerprint.unit.test.ts +1 -1
  436. package/src/utils/__tests__/dynamicUtils.unit.test.ts +1 -1
  437. package/src/utils/__tests__/formatting.unit.test.ts +1 -1
  438. package/src/utils/__tests__/lazyLoad.unit.test.tsx +1 -1
  439. package/src/utils/__tests__/logger.unit.test.ts +1 -1
  440. package/src/utils/__tests__/organisationContext.unit.test.ts +1 -1
  441. package/src/utils/__tests__/performanceBenchmark.test.ts +1 -1
  442. package/src/utils/__tests__/performanceBudgets.unit.test.ts +1 -1
  443. package/src/utils/__tests__/permissionTypes.unit.test.ts +1 -1
  444. package/src/utils/__tests__/permissionUtils.unit.test.ts +1 -1
  445. package/src/utils/__tests__/sanitization.unit.test.ts +1 -1
  446. package/src/utils/__tests__/schemaUtils.unit.test.ts +1 -1
  447. package/src/utils/__tests__/secureDataAccess.unit.test.ts +1 -1
  448. package/src/utils/__tests__/secureErrors.unit.test.ts +33 -15
  449. package/src/utils/__tests__/secureStorage.unit.test.ts +1 -1
  450. package/src/utils/__tests__/security.unit.test.ts +40 -18
  451. package/src/utils/__tests__/securityMonitor.unit.test.ts +1 -1
  452. package/src/utils/__tests__/sessionTracking.unit.test.ts +40 -29
  453. package/src/utils/__tests__/validationUtils.unit.test.ts +19 -6
  454. package/src/utils/app/appConfig.ts +47 -0
  455. package/src/utils/app/appIdResolver.test.ts +497 -0
  456. package/src/utils/app/appIdResolver.ts +133 -0
  457. package/src/utils/app/appNameResolver.simple.test.ts +212 -0
  458. package/src/utils/app/appNameResolver.test.ts +121 -0
  459. package/src/utils/app/appNameResolver.ts +195 -0
  460. package/src/utils/audit/audit.ts +127 -0
  461. package/src/utils/context/organisationContext.test.ts +322 -0
  462. package/src/utils/context/organisationContext.ts +156 -0
  463. package/src/utils/context/sessionTracking.ts +125 -0
  464. package/src/utils/core/cn.ts +7 -0
  465. package/src/utils/core/debugLogger.ts +67 -0
  466. package/src/utils/core/logger.ts +181 -0
  467. package/src/utils/device/deviceFingerprint.ts +215 -0
  468. package/src/utils/dynamic/dynamicUtils.ts +105 -0
  469. package/src/utils/dynamic/lazyLoad.tsx +44 -0
  470. package/src/utils/file-reference/__tests__/file-reference.test.ts +788 -0
  471. package/src/utils/file-reference/index.ts +501 -0
  472. package/src/utils/formatting/formatDate.test.ts +237 -0
  473. package/src/utils/formatting/formatting.ts +133 -0
  474. package/src/utils/index.ts +39 -54
  475. package/src/utils/performance/bundleAnalysis.ts +129 -0
  476. package/src/utils/performance/performanceBenchmark.ts +64 -0
  477. package/src/utils/performance/performanceBudgets.ts +110 -0
  478. package/src/utils/permissions/permissionTypes.ts +37 -0
  479. package/src/utils/permissions/permissionUtils.test.ts +393 -0
  480. package/src/utils/permissions/permissionUtils.ts +34 -0
  481. package/src/utils/security/auth-utils.ts +96 -0
  482. package/src/utils/security/secureDataAccess.test.ts +711 -0
  483. package/src/utils/security/secureDataAccess.ts +377 -0
  484. package/src/utils/security/secureErrors.ts +82 -0
  485. package/src/utils/security/secureStorage.ts +244 -0
  486. package/src/utils/security/security.ts +159 -0
  487. package/src/utils/security/securityMonitor.ts +45 -0
  488. package/src/utils/storage/__tests__/helpers.unit.test.ts +1 -4
  489. package/src/utils/storage/helpers.ts +15 -8
  490. package/src/utils/validation/__tests__/htmlSanitization.unit.test.ts +598 -0
  491. package/src/{validation → utils/validation}/csrf.ts +1 -1
  492. package/src/utils/validation/htmlSanitization.ts +184 -0
  493. package/src/utils/validation/index.ts +79 -0
  494. package/src/utils/validation/sanitization.ts +333 -0
  495. package/src/{validation/schemaUtils.ts → utils/validation/schema.ts} +11 -6
  496. package/src/{validation → utils/validation}/sqlInjectionProtection.ts +2 -0
  497. package/src/utils/validation/validation.ts +111 -0
  498. package/src/utils/validation/validationUtils.ts +123 -0
  499. package/src/validation/index.ts +3 -34
  500. package/dist/chunk-24MKLB7U.js +0 -81
  501. package/dist/chunk-24MKLB7U.js.map +0 -1
  502. package/dist/chunk-3CG5L6RN.js.map +0 -1
  503. package/dist/chunk-3DBFLLLU.js.map +0 -1
  504. package/dist/chunk-5F3NDPJV.js.map +0 -1
  505. package/dist/chunk-66C4BSAY.js.map +0 -1
  506. package/dist/chunk-BDZUMRBD.js +0 -87
  507. package/dist/chunk-BDZUMRBD.js.map +0 -1
  508. package/dist/chunk-BYXRHAIF.js.map +0 -1
  509. package/dist/chunk-CDQ3PX7L.js +0 -18
  510. package/dist/chunk-CDQ3PX7L.js.map +0 -1
  511. package/dist/chunk-CQZU6TFE.js.map +0 -1
  512. package/dist/chunk-F64FFPOZ.js.map +0 -1
  513. package/dist/chunk-GEVIB2UB.js.map +0 -1
  514. package/dist/chunk-GKHF54DI.js.map +0 -1
  515. package/dist/chunk-GVDR7WNV.js.map +0 -1
  516. package/dist/chunk-HMNOSGVA.js.map +0 -1
  517. package/dist/chunk-JCQZ6LA7.js.map +0 -1
  518. package/dist/chunk-M6DDYFUD.js.map +0 -1
  519. package/dist/chunk-O3NWNXDY.js.map +0 -1
  520. package/dist/chunk-PYUXFQJ3.js.map +0 -1
  521. package/dist/chunk-UJI6WSMD.js.map +0 -1
  522. package/dist/chunk-VZ5OR6HD.js.map +0 -1
  523. package/dist/chunk-WP5I5GLN.js.map +0 -1
  524. package/dist/chunk-ZYZCRSBD.js.map +0 -1
  525. package/dist/validation-DnhrNMju.d.ts +0 -159
  526. package/src/components/PublicLayout/__tests__/PublicPageDebugger.test.tsx +0 -185
  527. package/src/validation/__tests__/common.unit.test.ts +0 -101
  528. package/src/validation/__tests__/csrf.unit.test.ts +0 -365
  529. package/src/validation/__tests__/passwordSchema.unit.test.ts +0 -203
  530. package/src/validation/__tests__/sanitization.unit.test.ts +0 -250
  531. package/src/validation/__tests__/schemaUtils.unit.test.ts +0 -451
  532. package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +0 -462
  533. package/src/validation/__tests__/user.unit.test.ts +0 -440
  534. package/src/validation/sanitization.ts +0 -96
  535. /package/dist/{DataTable-A36PJG6N.js.map → DataTable-6M4L6BI2.js.map} +0 -0
  536. /package/dist/{UnifiedAuthProvider-CQDZRJIS.js.map → UnifiedAuthProvider-XIQQ7LVU.js.map} +0 -0
  537. /package/dist/{api-TNIBJWLM.js.map → api-45XYYO2A.js.map} +0 -0
  538. /package/dist/{audit-T36HM7IM.js.map → audit-64X3VJXB.js.map} +0 -0
  539. /package/dist/{chunk-CTJRBUX2.js.map → chunk-6LAAY47Q.js.map} +0 -0
  540. /package/dist/{chunk-ZV77RZMU.js.map → chunk-INQLMHPF.js.map} +0 -0
  541. /package/dist/{useInactivityTracker-MRUU55XI.js.map → useInactivityTracker-TO6ZOF35.js.map} +0 -0
  542. /package/src/{validation → utils/validation}/common.ts +0 -0
  543. /package/src/{validation → utils/validation}/passwordSchema.ts +0 -0
  544. /package/src/{validation → utils/validation}/user.ts +0 -0
@@ -0,0 +1,506 @@
1
+ /**
2
+ * @file Enhanced DataTable Performance Example
3
+ * @package @jmruthers/pace-core
4
+ * @module Components/DataTable/Examples/Performance
5
+ * @since 0.3.0
6
+ */
7
+
8
+ import React, { useState, useMemo } from 'react';
9
+ import {
10
+ type DataTableColumn,
11
+ type ServerSideConfig,
12
+ type PerformanceConfig,
13
+ type ServerSideParams,
14
+ type ServerSideResponse,
15
+ type DataTableFeatureConfig
16
+ } from '../types';
17
+ import { DataTable } from '../DataTable';
18
+
19
+ // Sample data interface
20
+ interface User {
21
+ id: string;
22
+ name: string;
23
+ email: string;
24
+ role: string;
25
+ department: string;
26
+ status: 'active' | 'inactive';
27
+ lastLogin: string;
28
+ createdAt: string;
29
+ [key: string]: unknown;
30
+ }
31
+
32
+ // Generate large dataset for testing
33
+ const generateLargeDataset = (size: number): User[] => {
34
+ const roles = ['Admin', 'User', 'Manager', 'Developer', 'Designer'];
35
+ const departments = ['Engineering', 'Marketing', 'Sales', 'HR', 'Finance'];
36
+ const statuses: ('active' | 'inactive')[] = ['active', 'inactive'];
37
+
38
+ return Array.from({ length: size }, (_, index) => ({
39
+ id: `user-${index + 1}`,
40
+ name: `User ${index + 1}`,
41
+ email: `user${index + 1}@example.com`,
42
+ role: roles[index % roles.length],
43
+ department: departments[index % departments.length],
44
+ status: statuses[index % statuses.length],
45
+ lastLogin: new Date(Date.now() - Math.random() * 30 * 24 * 60 * 60 * 1000).toISOString(),
46
+ createdAt: new Date(Date.now() - Math.random() * 365 * 24 * 60 * 60 * 1000).toISOString(),
47
+ }));
48
+ };
49
+
50
+ /**
51
+ * Example 1: Client-side performance optimization for medium datasets (1,000-10,000 records)
52
+ */
53
+ export function ClientSidePerformanceExample() {
54
+ const data = useMemo(() => generateLargeDataset(5000), []);
55
+
56
+ const columns: DataTableColumn<User>[] = [
57
+ {
58
+ accessorKey: 'name',
59
+ header: 'Name',
60
+ sortable: true,
61
+ searchable: true,
62
+ },
63
+ {
64
+ accessorKey: 'email',
65
+ header: 'Email',
66
+ sortable: true,
67
+ searchable: true,
68
+ },
69
+ {
70
+ accessorKey: 'role',
71
+ header: 'Role',
72
+ sortable: true,
73
+ enableGrouping: true,
74
+ },
75
+ {
76
+ accessorKey: 'department',
77
+ header: 'Department',
78
+ sortable: true,
79
+ enableGrouping: true,
80
+ },
81
+ {
82
+ accessorKey: 'status',
83
+ header: 'Status',
84
+ sortable: true,
85
+ cell: ({ row }) => (
86
+ <span
87
+ className={`px-2 py-1 rounded text-xs ${
88
+ row.original.status === 'active'
89
+ ? 'bg-main-100 text-main-800'
90
+ : 'bg-acc-100 text-acc-800'
91
+ }`}
92
+ >
93
+ {row.original.status}
94
+ </span>
95
+ ),
96
+ },
97
+ {
98
+ accessorKey: 'lastLogin',
99
+ header: 'Last Login',
100
+ sortable: true,
101
+ cell: ({ row }) => new Date(row.original.lastLogin).toLocaleDateString(),
102
+ },
103
+ ];
104
+
105
+ const performanceConfig: PerformanceConfig = {
106
+ virtualScrolling: true,
107
+ overscan: 5,
108
+ memoizeCells: true,
109
+ debounceSearch: 300,
110
+ enableChunking: true,
111
+ chunkSize: 1000,
112
+ };
113
+
114
+ const features: DataTableFeatureConfig = {
115
+ // Core Features
116
+ search: true,
117
+ pagination: true,
118
+ sorting: true,
119
+ filtering: true,
120
+
121
+ // Data Management
122
+ import: false,
123
+ export: true,
124
+
125
+ // Row Operations
126
+ selection: false,
127
+ creation: false,
128
+ editing: false,
129
+ deletion: false,
130
+ deleteSelected: false,
131
+
132
+ // Table Customization
133
+ grouping: true,
134
+ columnVisibility: true,
135
+ columnReordering: false,
136
+ hierarchical: false,
137
+
138
+ // Performance
139
+ // Virtualization is automatically enabled for large datasets
140
+
141
+ // Advanced Features
142
+ // bulkOperations removed - no longer supported
143
+ };
144
+
145
+ return (
146
+ <div className="space-y-4">
147
+ <div>
148
+ <h2>Client-Side Performance Example</h2>
149
+ <p className="text-sec-600">
150
+ 5,000 records with virtual scrolling and performance optimizations
151
+ </p>
152
+ </div>
153
+
154
+ <DataTable
155
+ data={data}
156
+ columns={columns}
157
+ title="Users Management"
158
+ description="High-performance client-side data table"
159
+ rbac={{ pageId: 'users' }}
160
+ features={features}
161
+
162
+ // All features configured via features prop above
163
+
164
+ />
165
+ </div>
166
+ );
167
+ }
168
+
169
+ /**
170
+ * Example 2: Server-side performance for large datasets (100,000+ records)
171
+ */
172
+ export function ServerSidePerformanceExample() {
173
+ const [isLoading, setIsLoading] = useState(false);
174
+
175
+ // Mock server-side data fetching
176
+ const serverSideConfig: ServerSideConfig<User> = {
177
+ fetchData: async (params: ServerSideParams) => {
178
+ setIsLoading(true);
179
+
180
+ // Simulate API delay
181
+ await new Promise(resolve => setTimeout(resolve, 500));
182
+
183
+ // Mock server response
184
+ const totalCount = 100000;
185
+ const pageCount = Math.ceil(totalCount / params.pageSize);
186
+
187
+ // Generate data for current page
188
+ const startIndex = params.pageIndex * params.pageSize;
189
+ const data = generateLargeDataset(params.pageSize).map((user, index) => ({
190
+ ...user,
191
+ id: `user-${startIndex + index + 1}`,
192
+ name: `User ${startIndex + index + 1}`,
193
+ email: `user${startIndex + index + 1}@example.com`,
194
+ }));
195
+
196
+ setIsLoading(false);
197
+
198
+ const response: ServerSideResponse<User> = {
199
+ data,
200
+ totalCount,
201
+ pageIndex: params.pageIndex,
202
+ pageSize: params.pageSize,
203
+ pageCount,
204
+ hasNextPage: params.pageIndex < pageCount - 1,
205
+ hasPreviousPage: params.pageIndex > 0,
206
+ };
207
+
208
+ return response;
209
+ },
210
+ enableServerSorting: true,
211
+ enableServerFiltering: true,
212
+ enableServerSearch: true,
213
+ enableServerPagination: true,
214
+ debounceMs: 300,
215
+ cacheMs: 60000,
216
+ };
217
+
218
+ const serverFeatures: DataTableFeatureConfig = {
219
+ // Core Features
220
+ search: true,
221
+ pagination: true,
222
+ sorting: true,
223
+ filtering: true,
224
+
225
+ // Data Management
226
+ import: false,
227
+ export: true,
228
+
229
+ // Row Operations
230
+ selection: false,
231
+ creation: false,
232
+ editing: false,
233
+ deletion: false,
234
+ deleteSelected: false,
235
+
236
+ // Table Customization
237
+ grouping: false,
238
+ columnVisibility: false,
239
+ columnReordering: false,
240
+ hierarchical: false,
241
+
242
+ // Performance
243
+ // Virtualization is automatically enabled for large datasets
244
+
245
+ // Advanced Features
246
+ // bulkOperations removed - no longer supported
247
+ };
248
+
249
+ const columns: DataTableColumn<User>[] = [
250
+ {
251
+ accessorKey: 'name',
252
+ header: 'Name',
253
+ sortable: true,
254
+ searchable: true,
255
+ },
256
+ {
257
+ accessorKey: 'email',
258
+ header: 'Email',
259
+ sortable: true,
260
+ searchable: true,
261
+ },
262
+ {
263
+ accessorKey: 'role',
264
+ header: 'Role',
265
+ sortable: true,
266
+ },
267
+ {
268
+ accessorKey: 'department',
269
+ header: 'Department',
270
+ sortable: true,
271
+ },
272
+ {
273
+ accessorKey: 'status',
274
+ header: 'Status',
275
+ sortable: true,
276
+ cell: ({ row }) => (
277
+ <span
278
+ className={`px-2 py-1 rounded text-xs ${
279
+ row.original.status === 'active'
280
+ ? 'bg-main-100 text-main-800'
281
+ : 'bg-acc-100 text-acc-800'
282
+ }`}
283
+ >
284
+ {row.original.status}
285
+ </span>
286
+ ),
287
+ },
288
+ ];
289
+
290
+ return (
291
+ <div className="space-y-4">
292
+ <div>
293
+ <h2>Server-Side Performance Example</h2>
294
+ <p className="text-sec-600">
295
+ 100,000+ records with server-side pagination, sorting, and filtering
296
+ </p>
297
+ </div>
298
+
299
+ <DataTable
300
+ data={[]} // Empty array - data comes from server
301
+ columns={columns}
302
+ title="Large Dataset Management"
303
+ description="Server-side data processing for maximum performance"
304
+ rbac={{ pageId: 'users' }}
305
+ features={serverFeatures}
306
+
307
+ // Server-side configuration
308
+ serverSide={serverSideConfig}
309
+
310
+ // All features configured via features prop above
311
+ isLoading={isLoading}
312
+
313
+ />
314
+ </div>
315
+ );
316
+ }
317
+
318
+ /**
319
+ * Example 3: Hybrid mode for balanced performance (10,000-50,000 records)
320
+ */
321
+ export function HybridPerformanceExample() {
322
+ const data = useMemo(() => generateLargeDataset(25000), []);
323
+
324
+ const hybridFeatures: DataTableFeatureConfig = {
325
+ // Core Features
326
+ search: true,
327
+ pagination: true,
328
+ sorting: true,
329
+ filtering: true,
330
+
331
+ // Data Management
332
+ import: false,
333
+ export: true,
334
+
335
+ // Row Operations
336
+ selection: false,
337
+ creation: false,
338
+ editing: false,
339
+ deletion: false,
340
+ deleteSelected: false,
341
+
342
+ // Table Customization
343
+ grouping: true,
344
+ columnVisibility: true,
345
+ columnReordering: false,
346
+ hierarchical: false,
347
+
348
+ // Performance
349
+ // Virtualization is automatically enabled for large datasets
350
+
351
+ // Advanced Features
352
+ // bulkOperations removed - no longer supported
353
+ };
354
+
355
+ const columns: DataTableColumn<User>[] = [
356
+ {
357
+ accessorKey: 'name',
358
+ header: 'Name',
359
+ sortable: true,
360
+ searchable: true,
361
+ },
362
+ {
363
+ accessorKey: 'email',
364
+ header: 'Email',
365
+ sortable: true,
366
+ searchable: true,
367
+ },
368
+ {
369
+ accessorKey: 'role',
370
+ header: 'Role',
371
+ sortable: true,
372
+ enableGrouping: true,
373
+ },
374
+ {
375
+ accessorKey: 'department',
376
+ header: 'Department',
377
+ sortable: true,
378
+ enableGrouping: true,
379
+ },
380
+ {
381
+ accessorKey: 'status',
382
+ header: 'Status',
383
+ sortable: true,
384
+ },
385
+ ];
386
+
387
+ return (
388
+ <div className="space-y-4">
389
+ <div>
390
+ <h2>Hybrid Performance Example</h2>
391
+ <p className="text-sec-600">
392
+ 25,000 records with intelligent chunking and hybrid processing
393
+ </p>
394
+ </div>
395
+
396
+ <DataTable
397
+ data={data}
398
+ columns={columns}
399
+ title="Hybrid Data Processing"
400
+ description="Balanced approach for medium-large datasets"
401
+ rbac={{ pageId: 'users' }}
402
+ features={hybridFeatures}
403
+
404
+ // All features configured via features prop above
405
+
406
+ />
407
+ </div>
408
+ );
409
+ }
410
+
411
+ /**
412
+ * Example 4: Performance comparison dashboard
413
+ */
414
+ export function PerformanceComparisonExample() {
415
+ const [selectedExample, setSelectedExample] = useState<'client' | 'server' | 'hybrid'>('client');
416
+
417
+ return (
418
+ <div className="space-y-6">
419
+ <div>
420
+ <h1>DataTable Performance Examples</h1>
421
+ <p className="text-sec-600">
422
+ Compare different performance optimization strategies for various dataset sizes
423
+ </p>
424
+ </div>
425
+
426
+ {/* Mode Selector */}
427
+ <div className="flex space-x-4">
428
+ <button
429
+ onClick={() => setSelectedExample('client')}
430
+ className={`px-4 py-2 rounded ${
431
+ selectedExample === 'client'
432
+ ? 'bg-main-500 text-main-50'
433
+ : 'bg-sec-200 text-sec-700 hover:bg-sec-300'
434
+ }`}
435
+ >
436
+ Client-Side (5K records)
437
+ </button>
438
+ <button
439
+ onClick={() => setSelectedExample('hybrid')}
440
+ className={`px-4 py-2 rounded ${
441
+ selectedExample === 'hybrid'
442
+ ? 'bg-main-500 text-main-50'
443
+ : 'bg-sec-200 text-sec-700 hover:bg-sec-300'
444
+ }`}
445
+ >
446
+ Hybrid (25K records)
447
+ </button>
448
+ <button
449
+ onClick={() => setSelectedExample('server')}
450
+ className={`px-4 py-2 rounded ${
451
+ selectedExample === 'server'
452
+ ? 'bg-main-500 text-main-50'
453
+ : 'bg-sec-200 text-sec-700 hover:bg-sec-300'
454
+ }`}
455
+ >
456
+ Server-Side (100K+ records)
457
+ </button>
458
+ </div>
459
+
460
+ {/* Performance Strategy Info */}
461
+ <div className="bg-main-50 border border-main-200 rounded-lg p-4">
462
+ <h3 className="text-main-900">
463
+ {selectedExample === 'client' && 'Client-Side Strategy'}
464
+ {selectedExample === 'hybrid' && 'Hybrid Strategy'}
465
+ {selectedExample === 'server' && 'Server-Side Strategy'}
466
+ </h3>
467
+ <div className="text-sm text-main-800">
468
+ {selectedExample === 'client' && (
469
+ <ul className="list-disc list-inside space-y-1">
470
+ <li>Virtual scrolling for smooth rendering</li>
471
+ <li>Memoized cell components to prevent re-renders</li>
472
+ <li>Search indexing for instant search results</li>
473
+ <li>Data chunking for memory management</li>
474
+ <li>Debounced search to reduce processing</li>
475
+ </ul>
476
+ )}
477
+ {selectedExample === 'hybrid' && (
478
+ <ul className="list-disc list-inside space-y-1">
479
+ <li>Intelligent data chunking with LRU cache</li>
480
+ <li>Progressive loading for better UX</li>
481
+ <li>Enhanced virtual scrolling with larger overscan</li>
482
+ <li>Optimized page sizes for balanced performance</li>
483
+ <li>Advanced search indexing with fuzzy matching</li>
484
+ </ul>
485
+ )}
486
+ {selectedExample === 'server' && (
487
+ <ul className="list-disc list-inside space-y-1">
488
+ <li>Server-side pagination, sorting, and filtering</li>
489
+ <li>Debounced API requests to prevent excessive calls</li>
490
+ <li>Response caching for improved performance</li>
491
+ <li>Loading states and error handling</li>
492
+ <li>Optimized page sizes for server processing</li>
493
+ </ul>
494
+ )}
495
+ </div>
496
+ </div>
497
+
498
+ {/* Render Selected Example */}
499
+ {selectedExample === 'client' && <ClientSidePerformanceExample />}
500
+ {selectedExample === 'hybrid' && <HybridPerformanceExample />}
501
+ {selectedExample === 'server' && <ServerSidePerformanceExample />}
502
+ </div>
503
+ );
504
+ }
505
+
506
+ export default PerformanceComparisonExample;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @file DataTable Examples
3
+ * @package @jmruthers/pace-core
4
+ * @module Examples/Components/DataTable
5
+ * @since 1.0.0
6
+ *
7
+ * DataTable component examples demonstrating various features and use cases.
8
+ */
9
+
10
+ export { HierarchicalExample } from './HierarchicalExample';
11
+ export { HierarchicalActionsExample } from './HierarchicalActionsExample';
12
+ export { InitialPageSizeExample } from './InitialPageSizeExample';
13
+ export { PerformanceExample } from './PerformanceExample';
@@ -0,0 +1,55 @@
1
+ /**
2
+ * @file Basic HTML Test
3
+ * @package @jmruthers/pace-core
4
+ * @module Components/Dialog/Examples
5
+ * @since 0.4.37
6
+ */
7
+
8
+ import React, { useState } from 'react';
9
+ import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogBody, DialogFooter } from '../Dialog';
10
+ import { Button } from '../../Button';
11
+
12
+ export function BasicHtmlTest() {
13
+ const [isOpen, setIsOpen] = useState(false);
14
+
15
+ return (
16
+ <div className="p-4">
17
+ <h2 className="text-xl font-bold mb-4">Basic HTML Test</h2>
18
+
19
+ <div className="mb-4">
20
+ <h3 className="font-semibold mb-2">Test 1: Direct dangerouslySetInnerHTML</h3>
21
+ <div
22
+ dangerouslySetInnerHTML={{ __html: '<p>Hello <strong>world</strong>!</p>' }}
23
+ className="bg-main-50 p-2 rounded"
24
+ />
25
+ </div>
26
+
27
+ <div className="mb-4">
28
+ <h3 className="font-semibold mb-2">Test 2: Dialog with HTML content</h3>
29
+ <Button onClick={() => setIsOpen(true)}>
30
+ Open Dialog
31
+ </Button>
32
+ </div>
33
+
34
+ <Dialog open={isOpen} onOpenChange={setIsOpen}>
35
+ <DialogContent size="md">
36
+ <DialogHeader>
37
+ <DialogTitle>HTML Test</DialogTitle>
38
+ </DialogHeader>
39
+
40
+ <DialogBody htmlContent="<p>Hello <strong>world</strong>!</p>" allowHtml={true}>
41
+ <div className="text-acc-500">
42
+ HTML content failed to render. This is fallback content.
43
+ </div>
44
+ </DialogBody>
45
+
46
+ <DialogFooter>
47
+ <Button variant="outline" onClick={() => setIsOpen(false)}>
48
+ Close
49
+ </Button>
50
+ </DialogFooter>
51
+ </DialogContent>
52
+ </Dialog>
53
+ </div>
54
+ );
55
+ }
@@ -0,0 +1,68 @@
1
+ /**
2
+ * @file Debug HTML Content Example
3
+ * @package @jmruthers/pace-core
4
+ * @module Components/Dialog/Examples
5
+ * @since 0.4.37
6
+ */
7
+
8
+ import React, { useState } from 'react';
9
+ import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogBody, DialogFooter } from '../Dialog';
10
+ import { Button } from '../../Button';
11
+
12
+ export function DebugHtmlExample() {
13
+ const [isOpen, setIsOpen] = useState(false);
14
+
15
+ const testHtml = `
16
+ <p class="text-sm text-sec-600 mb-4">Upload a CSV file with dish or recipe data. The system will automatically detect the format based on your column headers.</p>
17
+
18
+ <div class="bg-main-50 p-4 rounded-lg">
19
+ <h3 class="font-semibold text-main-900 mb-2">Dish Format (3 columns)</h3>
20
+ <p class="text-sm text-main-800 mb-2">Perfect for importing basic dish information:</p>
21
+ <div class="space-y-1">
22
+ <p class="text-sm"><strong>Required:</strong> <code>dish_code</code>, <code>dish_name</code>, <code>mealtype_name</code></p>
23
+ <p class="text-sm"><strong>Optional:</strong> <code>dish_description</code></p>
24
+ </div>
25
+ </div>
26
+ `;
27
+
28
+ return (
29
+ <div className="p-4">
30
+ <h2 className="text-xl font-bold mb-4">Debug HTML Content</h2>
31
+
32
+ <div className="mb-4">
33
+ <h3 className="font-semibold mb-2">Raw HTML String:</h3>
34
+ <pre className="bg-sec-100 p-2 rounded text-xs overflow-auto">
35
+ {testHtml}
36
+ </pre>
37
+ </div>
38
+
39
+ <Button onClick={() => setIsOpen(true)}>
40
+ Open Dialog with HTML Content
41
+ </Button>
42
+
43
+ <Dialog open={isOpen} onOpenChange={setIsOpen}>
44
+ <DialogContent size="lg">
45
+ <DialogHeader>
46
+ <DialogTitle>Import Dishes or Recipes</DialogTitle>
47
+ </DialogHeader>
48
+
49
+ <DialogBody htmlContent={testHtml} allowHtml={true}>
50
+ {/* Fallback content if HTML rendering fails */}
51
+ <div className="text-acc-500">
52
+ HTML content failed to render. This is fallback content.
53
+ </div>
54
+ </DialogBody>
55
+
56
+ <DialogFooter>
57
+ <Button variant="outline" onClick={() => setIsOpen(false)}>
58
+ Cancel
59
+ </Button>
60
+ <Button onClick={() => setIsOpen(false)}>
61
+ Import Data
62
+ </Button>
63
+ </DialogFooter>
64
+ </DialogContent>
65
+ </Dialog>
66
+ </div>
67
+ );
68
+ }