@jmruthers/pace-core 0.4.1 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (660) hide show
  1. package/CHANGELOG.md +26 -1
  2. package/README.md +231 -229
  3. package/dist/{DataTable-2LB6HI6V.js → DataTable-ZQDRE46Q.js} +15 -17
  4. package/dist/{DataTable-BDBqkU-i.d.ts → DataTable-ltTFXHS3.d.ts} +25 -51
  5. package/dist/{Table-CIm9IWqk.d.ts → PublicLoadingSpinner-Bq_-BeK-.d.ts} +635 -122
  6. package/dist/{UnifiedAuthProvider-V7y63NjT.d.ts → RBACProvider-BO4ilsQB.d.ts} +11 -36
  7. package/dist/UnifiedAuthProvider-DGQsy-vY.d.ts +103 -0
  8. package/dist/{api-AIJ3IJX3.js → api-H5A3H4IR.js} +6 -4
  9. package/dist/{appConfig-fB1pP_v3.d.ts → appConfig-BVGyuvI7.d.ts} +1 -1
  10. package/dist/appNameResolver-7GHF5ED2.js +22 -0
  11. package/dist/{audit-PD5L5ZSC.js → audit-BUW3LMJB.js} +3 -3
  12. package/dist/chunk-5H3C2SWM.js +3293 -0
  13. package/dist/chunk-5H3C2SWM.js.map +1 -0
  14. package/dist/chunk-5SIXIV7R.js +1925 -0
  15. package/dist/chunk-5SIXIV7R.js.map +1 -0
  16. package/dist/{chunk-YNU5QJ4S.js → chunk-7BNPOCLL.js} +22 -5
  17. package/dist/chunk-7BNPOCLL.js.map +1 -0
  18. package/dist/{chunk-4ZTIEYU2.js → chunk-CDQ3PX7L.js} +1 -1
  19. package/dist/chunk-CDQ3PX7L.js.map +1 -0
  20. package/dist/chunk-GNTALZV3.js +17 -0
  21. package/dist/chunk-GNTALZV3.js.map +1 -0
  22. package/dist/chunk-GWSBHC4J.js +1349 -0
  23. package/dist/chunk-GWSBHC4J.js.map +1 -0
  24. package/dist/{chunk-JUUNUW3O.js → chunk-HD7PYDUV.js} +14 -5
  25. package/dist/chunk-HD7PYDUV.js.map +1 -0
  26. package/dist/{chunk-H4PZ4B3Y.js → chunk-HXX35Q2M.js} +113 -27
  27. package/dist/chunk-HXX35Q2M.js.map +1 -0
  28. package/dist/chunk-K6B7BLSE.js +388 -0
  29. package/dist/chunk-K6B7BLSE.js.map +1 -0
  30. package/dist/chunk-M4RW7PIP.js +5441 -0
  31. package/dist/chunk-M4RW7PIP.js.map +1 -0
  32. package/dist/chunk-MZBUOP4P.js +119 -0
  33. package/dist/chunk-MZBUOP4P.js.map +1 -0
  34. package/dist/chunk-N2EUGZRW.js +98 -0
  35. package/dist/chunk-N2EUGZRW.js.map +1 -0
  36. package/dist/chunk-NQ4TOOO6.js +20 -0
  37. package/dist/chunk-NQ4TOOO6.js.map +1 -0
  38. package/dist/{chunk-DC5AMYBS.js → chunk-PLDDJCW6.js} +15 -5
  39. package/dist/chunk-PLDDJCW6.js.map +1 -0
  40. package/dist/{chunk-IOX76PSM.js → chunk-PVMYVQSM.js} +270 -28
  41. package/dist/chunk-PVMYVQSM.js.map +1 -0
  42. package/dist/{chunk-4MCJAK7J.js → chunk-QKHFMQ5R.js} +2155 -4853
  43. package/dist/chunk-QKHFMQ5R.js.map +1 -0
  44. package/dist/chunk-QVYBYGT2.js +428 -0
  45. package/dist/chunk-QVYBYGT2.js.map +1 -0
  46. package/dist/{chunk-WHLSWC6W.js → chunk-SS3E6QLB.js} +16 -61
  47. package/dist/chunk-SS3E6QLB.js.map +1 -0
  48. package/dist/chunk-WJARTBCT.js +128 -0
  49. package/dist/chunk-WJARTBCT.js.map +1 -0
  50. package/dist/chunk-YDJW5XTN.js +84 -0
  51. package/dist/chunk-YDJW5XTN.js.map +1 -0
  52. package/dist/components.d.ts +907 -10
  53. package/dist/components.js +3237 -204
  54. package/dist/components.js.map +1 -1
  55. package/dist/{database-CAMsquLm.d.ts → database-C3Szpi5J.d.ts} +28 -11
  56. package/dist/hooks.d.ts +7 -6
  57. package/dist/hooks.js +33 -11
  58. package/dist/hooks.js.map +1 -1
  59. package/dist/index.d.ts +247 -111
  60. package/dist/index.js +330 -185
  61. package/dist/index.js.map +1 -1
  62. package/dist/{organisation-DLNNQhPB.d.ts → organisation-CO3Sh3_D.d.ts} +1 -1
  63. package/dist/providers.d.ts +5 -4
  64. package/dist/providers.js +14 -5
  65. package/dist/rbac/index.d.ts +964 -839
  66. package/dist/rbac/index.js +58 -1970
  67. package/dist/rbac/index.js.map +1 -1
  68. package/dist/styles/core.css +364 -0
  69. package/dist/styles/fonts/georama-italic.woff2 +0 -0
  70. package/dist/styles/fonts/georama.woff2 +0 -0
  71. package/dist/styles/fonts/open-sans-italic.woff2 +0 -0
  72. package/dist/styles/fonts/open-sans.woff2 +0 -0
  73. package/dist/styles/fonts/reddit-mono.woff2 +0 -0
  74. package/dist/styles/index.d.ts +36 -0
  75. package/dist/styles/index.js +24 -0
  76. package/dist/styles/index.js.map +1 -0
  77. package/dist/theming/runtime.d.ts +73 -0
  78. package/dist/theming/runtime.js +16 -0
  79. package/dist/theming/runtime.js.map +1 -0
  80. package/dist/{types-Bavn44NW.d.ts → types-BRDU7N6w.d.ts} +79 -33
  81. package/dist/types.d.ts +5 -5
  82. package/dist/types.js +7 -2
  83. package/dist/types.js.map +1 -1
  84. package/dist/{unified-BtRpPbmp.d.ts → unified-CMPjE_fv.d.ts} +0 -1
  85. package/dist/usePublicRouteParams-B2OcAsur.d.ts +477 -0
  86. package/dist/utils.d.ts +83 -60
  87. package/dist/utils.js +293 -55651
  88. package/dist/utils.js.map +1 -1
  89. package/dist/validation.d.ts +1 -1
  90. package/dist/validation.js +1 -1
  91. package/docs/INDEX.md +192 -0
  92. package/docs/README.md +46 -32
  93. package/docs/api/README.md +231 -229
  94. package/docs/api/classes/ErrorBoundary.md +1 -1
  95. package/docs/api/classes/InvalidScopeError.md +73 -0
  96. package/docs/api/classes/MissingUserContextError.md +66 -0
  97. package/docs/api/classes/OrganisationContextRequiredError.md +66 -0
  98. package/docs/api/classes/PermissionDeniedError.md +73 -0
  99. package/docs/api/classes/PublicErrorBoundary.md +132 -0
  100. package/docs/api/classes/RBACAuditManager.md +270 -0
  101. package/docs/api/classes/RBACCache.md +284 -0
  102. package/docs/api/classes/RBACEngine.md +141 -0
  103. package/docs/api/classes/RBACError.md +76 -0
  104. package/docs/api/classes/RBACNotInitializedError.md +66 -0
  105. package/docs/api/classes/SecureSupabaseClient.md +135 -0
  106. package/docs/api/interfaces/AggregateConfig.md +4 -4
  107. package/docs/api/interfaces/ButtonProps.md +2 -2
  108. package/docs/api/interfaces/CardProps.md +2 -2
  109. package/docs/api/interfaces/ColorPalette.md +1 -1
  110. package/docs/api/interfaces/ColorShade.md +1 -1
  111. package/docs/api/interfaces/DataAccessRecord.md +96 -0
  112. package/docs/api/interfaces/DataTableAction.md +98 -7
  113. package/docs/api/interfaces/DataTableColumn.md +131 -12
  114. package/docs/api/interfaces/DataTableProps.md +77 -274
  115. package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
  116. package/docs/api/interfaces/EmptyStateConfig.md +5 -5
  117. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +235 -0
  118. package/docs/api/interfaces/EventContextType.md +7 -7
  119. package/docs/api/interfaces/EventLogoProps.md +152 -0
  120. package/docs/api/interfaces/EventProviderProps.md +2 -2
  121. package/docs/api/interfaces/FileSizeLimits.md +7 -0
  122. package/docs/api/interfaces/FileUploadProps.md +154 -0
  123. package/docs/api/interfaces/FooterProps.md +1 -1
  124. package/docs/api/interfaces/InactivityWarningModalProps.md +115 -0
  125. package/docs/api/interfaces/InputProps.md +2 -2
  126. package/docs/api/interfaces/LabelProps.md +1 -1
  127. package/docs/api/interfaces/LoginFormProps.md +1 -1
  128. package/docs/api/interfaces/NavigationAccessRecord.md +107 -0
  129. package/docs/api/interfaces/NavigationContextType.md +164 -0
  130. package/docs/api/interfaces/NavigationGuardProps.md +139 -0
  131. package/docs/api/interfaces/NavigationItem.md +1 -1
  132. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  133. package/docs/api/interfaces/NavigationProviderProps.md +117 -0
  134. package/docs/api/interfaces/Organisation.md +1 -1
  135. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  136. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  137. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  138. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  139. package/docs/api/interfaces/PaceAppLayoutProps.md +26 -26
  140. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  141. package/docs/api/interfaces/PageAccessRecord.md +85 -0
  142. package/docs/api/interfaces/PagePermissionContextType.md +140 -0
  143. package/docs/api/interfaces/PagePermissionGuardProps.md +153 -0
  144. package/docs/api/interfaces/PagePermissionProviderProps.md +119 -0
  145. package/docs/api/interfaces/PaletteData.md +1 -1
  146. package/docs/api/interfaces/PermissionEnforcerProps.md +153 -0
  147. package/docs/api/interfaces/PublicErrorBoundaryProps.md +94 -0
  148. package/docs/api/interfaces/PublicErrorBoundaryState.md +68 -0
  149. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +86 -0
  150. package/docs/api/interfaces/PublicPageFooterProps.md +112 -0
  151. package/docs/api/interfaces/PublicPageHeaderProps.md +138 -0
  152. package/docs/api/interfaces/PublicPageLayoutProps.md +138 -0
  153. package/docs/api/interfaces/RBACConfig.md +99 -0
  154. package/docs/api/interfaces/RBACContextType.md +474 -0
  155. package/docs/api/interfaces/RBACLogger.md +112 -0
  156. package/docs/api/interfaces/RBACProviderProps.md +107 -0
  157. package/docs/api/interfaces/RoleBasedRouterContextType.md +151 -0
  158. package/docs/api/interfaces/RoleBasedRouterProps.md +156 -0
  159. package/docs/api/interfaces/RouteAccessRecord.md +107 -0
  160. package/docs/api/interfaces/RouteConfig.md +121 -0
  161. package/docs/api/interfaces/SecureDataContextType.md +168 -0
  162. package/docs/api/interfaces/SecureDataProviderProps.md +132 -0
  163. package/docs/api/interfaces/StorageConfig.md +41 -0
  164. package/docs/api/interfaces/StorageFileInfo.md +74 -0
  165. package/docs/api/interfaces/StorageFileMetadata.md +140 -0
  166. package/docs/api/interfaces/StorageListOptions.md +86 -0
  167. package/docs/api/interfaces/StorageListResult.md +41 -0
  168. package/docs/api/interfaces/StorageUploadOptions.md +88 -0
  169. package/docs/api/interfaces/StorageUploadResult.md +63 -0
  170. package/docs/api/interfaces/StorageUrlOptions.md +47 -0
  171. package/docs/api/interfaces/StyleImport.md +2 -2
  172. package/docs/api/interfaces/ToastActionElement.md +1 -1
  173. package/docs/api/interfaces/ToastProps.md +1 -1
  174. package/docs/api/interfaces/UnifiedAuthContextType.md +465 -64
  175. package/docs/api/interfaces/UnifiedAuthProviderProps.md +95 -9
  176. package/docs/api/interfaces/UseInactivityTrackerOptions.md +136 -0
  177. package/docs/api/interfaces/UseInactivityTrackerReturn.md +123 -0
  178. package/docs/api/interfaces/UsePublicEventLogoOptions.md +87 -0
  179. package/docs/api/interfaces/UsePublicEventLogoReturn.md +81 -0
  180. package/docs/api/interfaces/UsePublicEventOptions.md +34 -0
  181. package/docs/api/interfaces/UsePublicEventReturn.md +68 -0
  182. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +94 -0
  183. package/docs/api/interfaces/UserEventAccess.md +14 -14
  184. package/docs/api/interfaces/UserMenuProps.md +6 -6
  185. package/docs/api/interfaces/UserProfile.md +1 -1
  186. package/docs/api/modules.md +4233 -1134
  187. package/docs/api-reference/components.md +761 -43
  188. package/docs/api-reference/hooks.md +126 -0
  189. package/docs/api-reference/providers.md +141 -65
  190. package/docs/api-reference/types.md +66 -36
  191. package/docs/api-reference/utilities.md +1 -1
  192. package/docs/architecture/README.md +1 -2
  193. package/docs/best-practices/README.md +400 -0
  194. package/docs/consuming-app-example.md +42 -96
  195. package/docs/consuming-app-vite-config.md +233 -0
  196. package/docs/core-concepts/events.md +3 -3
  197. package/docs/core-concepts/organisations.md +0 -1
  198. package/docs/core-concepts/rbac-system.md +23 -10
  199. package/docs/documentation-style-checklist.md +8 -2
  200. package/docs/examples/navigation-menu-auth-fix.md +344 -0
  201. package/docs/getting-started/examples/README.md +15 -1
  202. package/docs/getting-started/examples/basic-auth-app.md +444 -119
  203. package/docs/getting-started/examples/full-featured-app.md +6 -6
  204. package/docs/getting-started/installation.md +231 -52
  205. package/docs/getting-started/quick-start.md +121 -24
  206. package/docs/implementation-guides/app-layout.md +133 -108
  207. package/docs/implementation-guides/data-tables.md +1011 -29
  208. package/docs/implementation-guides/forms.md +3 -3
  209. package/docs/implementation-guides/hierarchical-datatable.md +850 -0
  210. package/docs/implementation-guides/large-datasets.md +2 -2
  211. package/docs/implementation-guides/navigation.md +1 -1
  212. package/docs/implementation-guides/permission-enforcement.md +4 -4
  213. package/docs/implementation-guides/public-pages.md +752 -0
  214. package/docs/migration/README.md +18 -8
  215. package/docs/migration/quick-migration-guide.md +320 -0
  216. package/docs/migration/rbac-migration.md +50 -0
  217. package/docs/migration/v0.4.15-tailwind-scanning.md +272 -0
  218. package/docs/migration/v0.4.16-css-first-approach.md +306 -0
  219. package/docs/migration/v0.4.17-source-path-fix.md +229 -0
  220. package/docs/migration-guide.md +77 -105
  221. package/docs/performance/README.md +1 -4
  222. package/docs/print-components/README.md +258 -0
  223. package/docs/print-components/api-reference.md +636 -0
  224. package/docs/print-components/examples/README.md +204 -0
  225. package/docs/print-components/examples/basic-report.tsx +92 -0
  226. package/docs/print-components/examples/card-catalog.tsx +149 -0
  227. package/docs/print-components/examples/cover-page-report.tsx +163 -0
  228. package/docs/print-components/quick-start.md +363 -0
  229. package/docs/quick-reference.md +53 -36
  230. package/docs/rbac/README.md +136 -69
  231. package/docs/rbac/api-reference.md +39 -8
  232. package/docs/rbac/examples.md +237 -66
  233. package/docs/rbac/getting-started.md +131 -16
  234. package/docs/rbac/quick-start.md +499 -323
  235. package/docs/rbac/troubleshooting.md +240 -262
  236. package/docs/security/README.md +50 -1
  237. package/docs/styles/README.md +226 -111
  238. package/docs/testing/README.md +6 -10
  239. package/docs/troubleshooting/README.md +497 -0
  240. package/docs/troubleshooting/common-issues.md +604 -14
  241. package/docs/troubleshooting/styling-issues.md +219 -0
  242. package/docs/troubleshooting/tailwind-content-scanning.md +213 -0
  243. package/docs/usage.md +54 -91
  244. package/docs/visual-testing.md +0 -7
  245. package/package.json +47 -25
  246. package/src/__mocks__/lucide-react.ts +181 -0
  247. package/src/__tests__/REBUILD_PLAN.md +223 -0
  248. package/src/__tests__/TESTING_GUIDELINES.md +341 -0
  249. package/src/__tests__/fixtures/mocks.ts +93 -0
  250. package/src/__tests__/helpers/component-test-utils.tsx +145 -0
  251. package/src/__tests__/helpers/test-utils.tsx +117 -0
  252. package/src/__tests__/integration/UserProfile.test.tsx +128 -0
  253. package/src/__tests__/setup.ts +71 -0
  254. package/src/__tests__/templates/accessibility.test.template.tsx +279 -0
  255. package/src/__tests__/templates/component.test.template.tsx +144 -0
  256. package/src/__tests__/templates/hook.test.template.ts +173 -0
  257. package/src/__tests__/templates/integration.test.template.tsx +199 -0
  258. package/src/__tests__/types/test.types.ts +106 -0
  259. package/src/components/Alert/Alert.test.tsx +496 -0
  260. package/src/components/Alert/Alert.tsx +134 -0
  261. package/src/components/Alert/index.ts +2 -0
  262. package/src/components/Avatar/Avatar.test.tsx +484 -0
  263. package/src/components/Avatar/Avatar.tsx +84 -0
  264. package/src/components/Avatar/index.ts +2 -0
  265. package/src/components/Button/Button.test.tsx +662 -0
  266. package/src/components/Button/Button.tsx +270 -0
  267. package/src/components/Button/index.ts +2 -0
  268. package/src/components/Card/Card.test.tsx +593 -0
  269. package/src/components/Card/Card.tsx +271 -0
  270. package/src/components/Card/index.ts +1 -0
  271. package/src/components/Checkbox/Checkbox.test.tsx +461 -0
  272. package/src/components/Checkbox/Checkbox.tsx +75 -0
  273. package/src/components/Checkbox/__mocks__/Checkbox.tsx +2 -0
  274. package/src/components/Checkbox/index.ts +2 -0
  275. package/src/components/DataTable/DataTable.tsx +446 -0
  276. package/src/components/DataTable/__tests__/README.md +145 -0
  277. package/src/components/DataTable/__tests__/mocks/MockRBACProvider.tsx +66 -0
  278. package/src/components/DataTable/__tests__/test-utils/dataFactories.ts +103 -0
  279. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +381 -0
  280. package/src/components/DataTable/__tests__/test-utils.ts +94 -0
  281. package/src/components/DataTable/components/AccessDeniedPage.tsx +168 -0
  282. package/src/components/DataTable/components/ActionButtons.tsx +194 -0
  283. package/src/components/DataTable/components/BulkOperationsDropdown.tsx +160 -0
  284. package/src/components/DataTable/components/ColumnFilter.tsx +114 -0
  285. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +100 -0
  286. package/src/components/DataTable/components/DataTableBody.tsx +461 -0
  287. package/src/components/DataTable/components/DataTableCore.tsx +1027 -0
  288. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +214 -0
  289. package/src/components/DataTable/components/DataTableModals.tsx +87 -0
  290. package/src/components/DataTable/components/DataTableToolbar.tsx +262 -0
  291. package/src/components/DataTable/components/DraggableColumnHeader.tsx +144 -0
  292. package/src/components/DataTable/components/EditableRow.tsx +159 -0
  293. package/src/components/DataTable/components/EmptyState.tsx +64 -0
  294. package/src/components/DataTable/components/ExpandButton.tsx +113 -0
  295. package/src/components/DataTable/components/FilterRow.tsx +100 -0
  296. package/src/components/DataTable/components/GroupHeader.tsx +42 -0
  297. package/src/components/DataTable/components/GroupingDropdown.tsx +96 -0
  298. package/src/components/DataTable/components/ImportModal.tsx +345 -0
  299. package/src/components/DataTable/components/LoadingState.tsx +12 -0
  300. package/src/components/DataTable/components/PaginationControls.tsx +332 -0
  301. package/src/components/DataTable/components/UnifiedTableBody.tsx +742 -0
  302. package/src/components/DataTable/components/ViewRowModal.tsx +68 -0
  303. package/src/components/DataTable/components/VirtualizedDataTable.tsx +513 -0
  304. package/src/components/DataTable/components/index.ts +16 -0
  305. package/src/components/DataTable/context/DataTableContext.tsx +97 -0
  306. package/src/components/DataTable/core/ActionManager.ts +235 -0
  307. package/src/components/DataTable/core/ColumnFactory.ts +268 -0
  308. package/src/components/DataTable/core/ColumnManager.ts +205 -0
  309. package/src/components/DataTable/core/DataManager.ts +188 -0
  310. package/src/components/DataTable/core/DataTableContext.tsx +181 -0
  311. package/src/components/DataTable/core/LocalDataAdapter.ts +264 -0
  312. package/src/components/DataTable/core/PluginRegistry.ts +229 -0
  313. package/src/components/DataTable/core/StateManager.ts +311 -0
  314. package/src/components/DataTable/core/index.ts +8 -0
  315. package/src/components/DataTable/core/interfaces.ts +338 -0
  316. package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +419 -0
  317. package/src/components/DataTable/examples/HierarchicalExample.tsx +475 -0
  318. package/src/components/DataTable/examples/InitialPageSizeExample.tsx +176 -0
  319. package/src/components/DataTable/examples/PerformanceExample.tsx +505 -0
  320. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +95 -0
  321. package/src/components/DataTable/hooks/useColumnReordering.ts +110 -0
  322. package/src/components/DataTable/hooks/useDataTableState.ts +325 -0
  323. package/src/components/DataTable/hooks/useHierarchicalState.ts +174 -0
  324. package/src/components/DataTable/index.ts +68 -0
  325. package/src/components/DataTable/styles.ts +171 -0
  326. package/src/components/DataTable/types.ts +511 -0
  327. package/src/components/DataTable/utils/debugTools.ts +583 -0
  328. package/src/components/DataTable/utils/errorHandling.ts +494 -0
  329. package/src/components/DataTable/utils/exportUtils.ts +126 -0
  330. package/src/components/DataTable/utils/flexibleImport.ts +510 -0
  331. package/src/components/DataTable/utils/hierarchicalSorting.ts +151 -0
  332. package/src/components/DataTable/utils/hierarchicalUtils.ts +218 -0
  333. package/src/components/DataTable/utils/index.ts +1 -0
  334. package/src/components/DataTable/utils/performanceUtils.ts +351 -0
  335. package/src/components/Dialog/Dialog.test.tsx +1139 -0
  336. package/src/components/Dialog/Dialog.tsx +782 -0
  337. package/src/components/Dialog/README.md +804 -0
  338. package/src/components/Dialog/examples/BasicHtmlTest.tsx +55 -0
  339. package/src/components/Dialog/examples/DebugHtmlExample.tsx +68 -0
  340. package/src/components/Dialog/examples/HtmlDialogExample.tsx +202 -0
  341. package/src/components/Dialog/examples/SimpleHtmlTest.tsx +61 -0
  342. package/src/components/Dialog/examples/SmartDialogExample.tsx +322 -0
  343. package/src/components/Dialog/index.ts +12 -0
  344. package/src/components/Dialog/utils/safeHtml.ts +185 -0
  345. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +752 -0
  346. package/src/components/ErrorBoundary/ErrorBoundary.tsx +312 -0
  347. package/src/components/ErrorBoundary/index.ts +8 -0
  348. package/src/components/EventSelector/EventSelector.tsx +360 -0
  349. package/src/components/EventSelector/index.ts +3 -0
  350. package/src/components/EventSelector/types.ts +79 -0
  351. package/src/components/FileUpload/FileUpload.example.tsx +218 -0
  352. package/src/components/FileUpload/FileUpload.test.tsx +665 -0
  353. package/src/components/FileUpload/FileUpload.tsx +237 -0
  354. package/src/components/FileUpload/index.ts +6 -0
  355. package/src/components/Footer/Footer.test.tsx +482 -0
  356. package/src/components/Footer/Footer.tsx +197 -0
  357. package/src/components/Footer/index.ts +17 -0
  358. package/src/components/Form/Form.test.tsx +1158 -0
  359. package/src/components/Form/Form.tsx +166 -0
  360. package/src/components/Form/FormErrorSummary.tsx +113 -0
  361. package/src/components/Form/FormField.tsx +249 -0
  362. package/src/components/Form/FormFieldset.tsx +127 -0
  363. package/src/components/Form/FormLiveRegion.tsx +198 -0
  364. package/src/components/Form/index.ts +26 -0
  365. package/src/components/Header/Header.test.tsx +582 -0
  366. package/src/components/Header/Header.tsx +301 -0
  367. package/src/components/Header/index.ts +4 -0
  368. package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +489 -0
  369. package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +164 -0
  370. package/src/components/InactivityWarningModal/index.ts +9 -0
  371. package/src/components/Input/Input.test.tsx +466 -0
  372. package/src/components/Input/Input.tsx +201 -0
  373. package/src/components/Input/__mocks__/Input.tsx +2 -0
  374. package/src/components/Input/index.ts +9 -0
  375. package/src/components/Label/Label.tsx +186 -0
  376. package/src/components/Label/index.ts +2 -0
  377. package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +450 -0
  378. package/src/components/LoadingSpinner/LoadingSpinner.tsx +98 -0
  379. package/src/components/LoadingSpinner/index.ts +3 -0
  380. package/src/components/LoginForm/LoginForm.test.tsx +816 -0
  381. package/src/components/LoginForm/LoginForm.tsx +273 -0
  382. package/src/components/LoginForm/index.ts +3 -0
  383. package/src/components/NavigationMenu/NavigationMenu.test.tsx +883 -0
  384. package/src/components/NavigationMenu/NavigationMenu.tsx +698 -0
  385. package/src/components/NavigationMenu/index.ts +10 -0
  386. package/src/components/NavigationMenu/types.ts +85 -0
  387. package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +748 -0
  388. package/src/components/OrganisationSelector/OrganisationSelector.tsx +304 -0
  389. package/src/components/OrganisationSelector/index.ts +9 -0
  390. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +891 -0
  391. package/src/components/PaceAppLayout/PaceAppLayout.tsx +699 -0
  392. package/src/components/PaceAppLayout/README.md +278 -0
  393. package/src/components/PaceAppLayout/index.ts +1 -0
  394. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +475 -0
  395. package/src/components/PaceLoginPage/PaceLoginPage.tsx +221 -0
  396. package/src/components/PaceLoginPage/index.ts +1 -0
  397. package/src/components/PasswordReset/PasswordChangeForm.test.tsx +621 -0
  398. package/src/components/PasswordReset/PasswordChangeForm.tsx +186 -0
  399. package/src/components/PasswordReset/PasswordResetForm.test.tsx +605 -0
  400. package/src/components/PasswordReset/PasswordResetForm.tsx +201 -0
  401. package/src/components/PasswordReset/index.ts +4 -0
  402. package/src/components/PrintButton/PrintButton.tsx +321 -0
  403. package/src/components/PrintButton/PrintButtonGroup.tsx +84 -0
  404. package/src/components/PrintButton/PrintToolbar.tsx +94 -0
  405. package/src/components/PrintButton/examples/PrintButtonShowcase.tsx +438 -0
  406. package/src/components/PrintButton/index.ts +33 -0
  407. package/src/components/PrintButton/types.ts +173 -0
  408. package/src/components/PrintCard/PrintCard.tsx +154 -0
  409. package/src/components/PrintCard/PrintCardContent.tsx +57 -0
  410. package/src/components/PrintCard/PrintCardFooter.tsx +60 -0
  411. package/src/components/PrintCard/PrintCardGrid.tsx +91 -0
  412. package/src/components/PrintCard/PrintCardHeader.tsx +78 -0
  413. package/src/components/PrintCard/PrintCardImage.tsx +81 -0
  414. package/src/components/PrintCard/examples/PrintCardShowcase.tsx +239 -0
  415. package/src/components/PrintCard/index.ts +34 -0
  416. package/src/components/PrintCard/types.ts +171 -0
  417. package/src/components/PrintDataTable/PrintDataTable.tsx +215 -0
  418. package/src/components/PrintDataTable/PrintTableGroup.tsx +90 -0
  419. package/src/components/PrintDataTable/PrintTableRow.tsx +76 -0
  420. package/src/components/PrintDataTable/index.ts +25 -0
  421. package/src/components/PrintDataTable/types.ts +67 -0
  422. package/src/components/PrintFooter/PrintFooter.tsx +183 -0
  423. package/src/components/PrintFooter/PrintFooterContent.tsx +71 -0
  424. package/src/components/PrintFooter/PrintFooterInfo.tsx +86 -0
  425. package/src/components/PrintFooter/PrintPageNumber.tsx +90 -0
  426. package/src/components/PrintFooter/examples/PrintFooterShowcase.tsx +390 -0
  427. package/src/components/PrintFooter/index.ts +30 -0
  428. package/src/components/PrintFooter/types.ts +149 -0
  429. package/src/components/PrintGrid/PrintGrid.tsx +180 -0
  430. package/src/components/PrintGrid/PrintGridBreakpoint.tsx +109 -0
  431. package/src/components/PrintGrid/PrintGridContainer.tsx +128 -0
  432. package/src/components/PrintGrid/PrintGridItem.tsx +220 -0
  433. package/src/components/PrintGrid/examples/PrintGridShowcase.tsx +359 -0
  434. package/src/components/PrintGrid/index.ts +31 -0
  435. package/src/components/PrintGrid/types.ts +159 -0
  436. package/src/components/PrintHeader/PrintCoverHeader.tsx +230 -0
  437. package/src/components/PrintHeader/PrintHeader.tsx +150 -0
  438. package/src/components/PrintHeader/index.ts +17 -0
  439. package/src/components/PrintHeader/types.ts +42 -0
  440. package/src/components/PrintLayout/PrintLayout.tsx +122 -0
  441. package/src/components/PrintLayout/PrintLayoutContext.tsx +66 -0
  442. package/src/components/PrintLayout/PrintPageBreak.tsx +52 -0
  443. package/src/components/PrintLayout/examples/PrintShowcase.tsx +230 -0
  444. package/src/components/PrintLayout/index.ts +19 -0
  445. package/src/components/PrintLayout/types.ts +37 -0
  446. package/src/components/PrintPageBreak/PrintPageBreak.tsx +120 -0
  447. package/src/components/PrintPageBreak/PrintPageBreakGroup.tsx +90 -0
  448. package/src/components/PrintPageBreak/PrintPageBreakIndicator.tsx +112 -0
  449. package/src/components/PrintPageBreak/examples/PrintPageBreakShowcase.tsx +279 -0
  450. package/src/components/PrintPageBreak/index.ts +23 -0
  451. package/src/components/PrintPageBreak/types.ts +94 -0
  452. package/src/components/PrintSection/PrintColumn.tsx +104 -0
  453. package/src/components/PrintSection/PrintDivider.tsx +101 -0
  454. package/src/components/PrintSection/PrintSection.tsx +129 -0
  455. package/src/components/PrintSection/PrintSectionContent.tsx +75 -0
  456. package/src/components/PrintSection/PrintSectionHeader.tsx +97 -0
  457. package/src/components/PrintSection/examples/PrintSectionShowcase.tsx +258 -0
  458. package/src/components/PrintSection/index.ts +33 -0
  459. package/src/components/PrintSection/types.ts +155 -0
  460. package/src/components/PrintText/PrintText.tsx +116 -0
  461. package/src/components/PrintText/index.ts +16 -0
  462. package/src/components/PrintText/types.ts +24 -0
  463. package/src/components/Progress/Progress.tsx +116 -0
  464. package/src/components/Progress/index.ts +3 -0
  465. package/src/components/PublicLayout/EventLogo.tsx +287 -0
  466. package/src/components/PublicLayout/PublicErrorBoundary.tsx +279 -0
  467. package/src/components/PublicLayout/PublicLoadingSpinner.tsx +208 -0
  468. package/src/components/PublicLayout/PublicPageContextChecker.tsx +130 -0
  469. package/src/components/PublicLayout/PublicPageDebugger.tsx +104 -0
  470. package/src/components/PublicLayout/PublicPageDiagnostic.tsx +162 -0
  471. package/src/components/PublicLayout/PublicPageFooter.tsx +124 -0
  472. package/src/components/PublicLayout/PublicPageHeader.tsx +178 -0
  473. package/src/components/PublicLayout/PublicPageLayout.tsx +232 -0
  474. package/src/components/PublicLayout/PublicPageProvider.tsx +137 -0
  475. package/src/components/PublicLayout/index.ts +51 -0
  476. package/src/components/Select/Select.test.tsx +948 -0
  477. package/src/components/Select/Select.tsx +660 -0
  478. package/src/components/Select/index.ts +1 -0
  479. package/src/components/SuperAdminGuard.tsx +116 -0
  480. package/src/components/Table/Table.tsx +222 -0
  481. package/src/components/Table/index.ts +11 -0
  482. package/src/components/Toast/Toast.test.tsx +586 -0
  483. package/src/components/Toast/Toast.tsx +339 -0
  484. package/src/components/Toast/index.ts +14 -0
  485. package/src/components/Tooltip/Tooltip.test.tsx +852 -0
  486. package/src/components/Tooltip/Tooltip.tsx +167 -0
  487. package/src/components/Tooltip/index.ts +7 -0
  488. package/src/components/UserMenu/UserMenu.test.tsx +702 -0
  489. package/src/components/UserMenu/UserMenu.tsx +243 -0
  490. package/src/components/UserMenu/index.ts +3 -0
  491. package/src/components/examples/PermissionExample.tsx +150 -0
  492. package/src/components/index.ts +434 -0
  493. package/src/components.ts +19 -0
  494. package/src/constants/performance.ts +14 -0
  495. package/src/examples/CorrectPublicPageImplementation.tsx +301 -0
  496. package/src/examples/PublicEventPage.tsx +274 -0
  497. package/src/examples/PublicPageApp.tsx +308 -0
  498. package/src/examples/PublicPageUsageExample.tsx +216 -0
  499. package/src/hooks/index.ts +56 -0
  500. package/src/hooks/public/index.ts +34 -0
  501. package/src/hooks/public/usePublicEvent.ts +261 -0
  502. package/src/hooks/public/usePublicEventLogo.ts +285 -0
  503. package/src/hooks/public/usePublicRouteParams.ts +259 -0
  504. package/src/hooks/useAppConfig.ts +94 -0
  505. package/src/hooks/useComponentPerformance.ts +39 -0
  506. package/src/hooks/useCounter.test.ts +135 -0
  507. package/src/hooks/useDataTablePerformance.ts +387 -0
  508. package/src/hooks/useDataTableState.ts +110 -0
  509. package/src/hooks/useDebounce.test.ts +375 -0
  510. package/src/hooks/useDebounce.ts +18 -0
  511. package/src/hooks/useFocusManagement.ts +161 -0
  512. package/src/hooks/useFocusTrap.ts +155 -0
  513. package/src/hooks/useInactivityTracker.ts +372 -0
  514. package/src/hooks/useIsMobile.ts +42 -0
  515. package/src/hooks/useKeyboardShortcuts.ts +237 -0
  516. package/src/hooks/useOrganisationPermissions.test.ts +528 -0
  517. package/src/hooks/useOrganisationPermissions.ts +208 -0
  518. package/src/hooks/useOrganisationSecurity.test.ts +734 -0
  519. package/src/hooks/useOrganisationSecurity.ts +262 -0
  520. package/src/hooks/usePerformanceMonitor.ts +128 -0
  521. package/src/hooks/usePermissionCache.test.ts +542 -0
  522. package/src/hooks/usePermissionCache.ts +455 -0
  523. package/src/hooks/useSecureDataAccess.ts +586 -0
  524. package/src/hooks/useStorage.ts +274 -0
  525. package/src/hooks/useToast.ts +242 -0
  526. package/src/hooks/useZodForm.ts +28 -0
  527. package/src/index.ts +199 -0
  528. package/src/providers/AuthProvider.tsx +369 -0
  529. package/src/providers/EventProvider.tsx +324 -0
  530. package/src/providers/InactivityProvider.tsx +238 -0
  531. package/src/providers/OrganisationProvider.tsx +588 -0
  532. package/src/providers/UnifiedAuthProvider.tsx +327 -0
  533. package/src/providers/index.ts +17 -0
  534. package/src/rbac/README.md +885 -0
  535. package/src/rbac/__tests__/integration.test.tsx +218 -0
  536. package/src/rbac/adapters.tsx +726 -0
  537. package/src/rbac/api.test.ts +441 -0
  538. package/src/rbac/api.ts +339 -0
  539. package/src/rbac/audit-enhanced.ts +339 -0
  540. package/src/rbac/audit.ts +338 -0
  541. package/src/rbac/cache.ts +215 -0
  542. package/src/rbac/components/EnhancedNavigationMenu.tsx +294 -0
  543. package/src/rbac/components/NavigationGuard.tsx +294 -0
  544. package/src/rbac/components/NavigationProvider.tsx +314 -0
  545. package/src/rbac/components/PagePermissionGuard.tsx +430 -0
  546. package/src/rbac/components/PagePermissionProvider.tsx +274 -0
  547. package/src/rbac/components/PermissionEnforcer.tsx +307 -0
  548. package/src/rbac/components/RoleBasedRouter.tsx +425 -0
  549. package/src/rbac/components/SecureDataProvider.tsx +319 -0
  550. package/src/rbac/components/index.ts +64 -0
  551. package/src/rbac/config.ts +133 -0
  552. package/src/rbac/docs/event-based-apps.md +285 -0
  553. package/src/rbac/engine.ts +1026 -0
  554. package/src/rbac/eslint-rules.js +285 -0
  555. package/src/rbac/examples/CompleteRBACExample.tsx +323 -0
  556. package/src/rbac/examples/EventBasedApp.tsx +238 -0
  557. package/src/rbac/hooks/index.ts +21 -0
  558. package/src/rbac/hooks/useCan.test.ts +461 -0
  559. package/src/rbac/hooks/usePermissions.test.ts +359 -0
  560. package/src/rbac/hooks/usePermissions.ts +567 -0
  561. package/src/rbac/hooks/useRBAC.simple.test.ts +90 -0
  562. package/src/rbac/hooks/useRBAC.test.ts +503 -0
  563. package/src/rbac/hooks/useRBAC.ts +262 -0
  564. package/src/rbac/index.ts +109 -0
  565. package/src/rbac/permissions.ts +293 -0
  566. package/src/rbac/providers/RBACProvider.tsx +634 -0
  567. package/src/rbac/providers/__tests__/RBACProvider.test.tsx +687 -0
  568. package/src/rbac/providers/index.ts +11 -0
  569. package/src/rbac/secureClient.ts +244 -0
  570. package/src/rbac/security.ts +346 -0
  571. package/src/rbac/testing/index.tsx +340 -0
  572. package/src/rbac/types.ts +343 -0
  573. package/src/rbac/utils/eventContext.ts +83 -0
  574. package/src/styles/core.css +364 -0
  575. package/src/styles/index.ts +51 -0
  576. package/src/theming/runtime.ts +187 -0
  577. package/src/types/database.ts +472 -0
  578. package/src/types/guards.ts +30 -0
  579. package/src/types/index.ts +25 -0
  580. package/src/types/organisation.ts +184 -0
  581. package/src/types/security.ts +70 -0
  582. package/src/types/supabase.ts +166 -0
  583. package/src/types/theme.ts +6 -0
  584. package/src/types/unified.ts +262 -0
  585. package/src/types/validation.ts +164 -0
  586. package/src/types/vitest-globals.d.ts +43 -0
  587. package/src/utils/__mocks__/supabaseMock.ts +75 -0
  588. package/src/utils/__mocks__/supabaseMock.tsx +198 -0
  589. package/src/utils/appConfig.ts +47 -0
  590. package/src/utils/appIdResolver.ts +130 -0
  591. package/src/utils/appNameResolver.ts +190 -0
  592. package/src/utils/audit.ts +127 -0
  593. package/src/utils/auth-utils.ts +96 -0
  594. package/src/utils/bundleAnalysis.ts +129 -0
  595. package/src/utils/cn.ts +7 -0
  596. package/src/utils/debugLogger.ts +46 -0
  597. package/src/utils/deviceFingerprint.ts +215 -0
  598. package/src/utils/dynamicUtils.ts +105 -0
  599. package/src/utils/formatDate.test.ts +241 -0
  600. package/src/utils/formatting.ts +77 -0
  601. package/src/utils/index.ts +145 -0
  602. package/src/utils/lazyLoad.tsx +44 -0
  603. package/src/utils/organisationContext.ts +135 -0
  604. package/src/utils/performanceBenchmark.ts +64 -0
  605. package/src/utils/performanceBudgets.ts +111 -0
  606. package/src/utils/permissionTypes.ts +37 -0
  607. package/src/utils/permissionUtils.ts +31 -0
  608. package/src/utils/print/PrintDataProcessor.ts +390 -0
  609. package/src/utils/print/examples/PrintUtilitiesShowcase.tsx +397 -0
  610. package/src/utils/print/index.ts +29 -0
  611. package/src/utils/print/types.ts +196 -0
  612. package/src/utils/print/usePrintOptimization.ts +272 -0
  613. package/src/utils/sanitization.ts +264 -0
  614. package/src/utils/schemaUtils.ts +37 -0
  615. package/src/utils/secureDataAccess.ts +361 -0
  616. package/src/utils/secureErrors.ts +79 -0
  617. package/src/utils/secureStorage.ts +244 -0
  618. package/src/utils/security.ts +156 -0
  619. package/src/utils/securityMonitor.ts +45 -0
  620. package/src/utils/sessionTracking.ts +170 -0
  621. package/src/utils/storage/README.md +348 -0
  622. package/src/utils/storage/config.ts +100 -0
  623. package/src/utils/storage/helpers.ts +359 -0
  624. package/src/utils/storage/index.ts +36 -0
  625. package/src/utils/storage/types.ts +90 -0
  626. package/src/utils/validation.ts +111 -0
  627. package/src/utils/validationUtils.ts +120 -0
  628. package/src/validation/common.ts +53 -0
  629. package/src/validation/csrf.ts +214 -0
  630. package/src/validation/index.ts +43 -0
  631. package/src/validation/passwordSchema.ts +125 -0
  632. package/src/validation/sanitization.ts +96 -0
  633. package/src/validation/schemaUtils.ts +42 -0
  634. package/src/validation/sqlInjectionProtection.ts +242 -0
  635. package/src/validation/user.ts +34 -0
  636. package/dist/chunk-4MCJAK7J.js.map +0 -1
  637. package/dist/chunk-4ZTIEYU2.js.map +0 -1
  638. package/dist/chunk-H4PZ4B3Y.js.map +0 -1
  639. package/dist/chunk-IOX76PSM.js.map +0 -1
  640. package/dist/chunk-JUUNUW3O.js.map +0 -1
  641. package/dist/chunk-KK6WIDK6.js +0 -63
  642. package/dist/chunk-KK6WIDK6.js.map +0 -1
  643. package/dist/chunk-U7DY5T33.js +0 -11
  644. package/dist/chunk-U7DY5T33.js.map +0 -1
  645. package/dist/chunk-WHLSWC6W.js.map +0 -1
  646. package/dist/chunk-XI7QFSSC.js +0 -790
  647. package/dist/chunk-XI7QFSSC.js.map +0 -1
  648. package/dist/chunk-XIJMMBDD.js +0 -73
  649. package/dist/chunk-XIJMMBDD.js.map +0 -1
  650. package/dist/chunk-YNU5QJ4S.js.map +0 -1
  651. package/dist/chunk-YWYCNGWH.js +0 -2070
  652. package/dist/chunk-YWYCNGWH.js.map +0 -1
  653. package/dist/chunk-ZJ3UKPIW.js +0 -952
  654. package/dist/chunk-ZJ3UKPIW.js.map +0 -1
  655. package/dist/useAppConfig-CZNJJsT_.d.ts +0 -148
  656. package/dist/{DataTable-2LB6HI6V.js.map → DataTable-ZQDRE46Q.js.map} +0 -0
  657. package/dist/{api-AIJ3IJX3.js.map → api-H5A3H4IR.js.map} +0 -0
  658. package/dist/{audit-PD5L5ZSC.js.map → appNameResolver-7GHF5ED2.js.map} +0 -0
  659. package/dist/{chunk-DC5AMYBS.js.map → audit-BUW3LMJB.js.map} +0 -0
  660. package/dist/{validation-D2-NNCCE.d.ts → validation-PM_iOaTI.d.ts} +6 -6
@@ -0,0 +1,446 @@
1
+ /**
2
+ * @file Enhanced DataTable Component with Performance Optimizations
3
+ * @package @jmruthers/pace-core
4
+ * @module Components/DataTable
5
+ * @since 0.3.0
6
+ *
7
+ * A comprehensive, feature-rich data table component built on top of TanStack Table.
8
+ * Provides advanced data management capabilities with a clean, accessible interface.
9
+ *
10
+ * The DataTable is an enterprise-grade data table component that provides all the features
11
+ * you need for complex data management: sorting, filtering, pagination, search, export/import,
12
+ * inline editing, grouping with aggregation, virtual scrolling, and full accessibility support.
13
+ *
14
+ * ## Performance Features
15
+ * - 🚀 **Intelligent Virtual Scrolling** - Automatically handles 100,000+ records with smooth scrolling
16
+ * - ⚡ **Smart Pagination** - Automatic mode detection (client/server/hybrid)
17
+ * - 🔍 **Advanced Search** - Fast indexing with fuzzy search capabilities
18
+ * - 💾 **Memory Management** - Intelligent data chunking and cleanup
19
+ * - 🎯 **Intersection Observer** - Efficient visibility tracking
20
+ * - 🔄 **Data Chunking** - LRU cache for optimal memory usage
21
+ * - 🧠 **Adaptive Rendering** - Automatically switches between standard and virtualized rendering
22
+ *
23
+ * ## Features
24
+ * - ✅ **Search** - Global search with column-specific filters
25
+ * - ✅ **Pagination** - Configurable pagination with custom initial page size and page size options
26
+ * - ✅ **Sorting** - Multi-column sorting with visual indicators (↕️ unsorted, ↑ ascending, ↓ descending)
27
+ * - ✅ **Filtering** - Column-specific filtering with multiple input types
28
+ * - ✅ **Export/Import** - CSV and JSON data export/import
29
+ * - ✅ **Row Selection** - Single and multi-row selection for bulk operations
30
+ * - ✅ **Row Creation** - Add new rows with validation
31
+ * - ✅ **Row Editing** - Inline row editing with input field conversion
32
+ * - ✅ **Row Deletion** - Individual and bulk row deletion
33
+ * - ✅ **Actions** - Custom row actions and toolbar buttons
34
+ * - ✅ **Grouping** - Data grouping with aggregation functions
35
+ * - ✅ **Column Visibility** - Show/hide columns dynamically
36
+ * - ✅ **Column Reordering** - Drag and drop column reordering
37
+ * - ✅ **Intelligent Virtual Scrolling** - Automatic performance optimization for large datasets
38
+ * - ✅ **Responsive Design** - Mobile-friendly responsive layout
39
+ * - ✅ **Accessibility** - WCAG 2.1 AA compliant with keyboard navigation
40
+ * - ✅ **TypeScript** - Full TypeScript support with strict typing
41
+ *
42
+ * @example
43
+ * ```tsx
44
+ * // Basic usage - simple data table (automatically optimized)
45
+ * import { DataTable, type DataTableColumn } from '@jmruthers/pace-core';
46
+ *
47
+ * interface User {
48
+ * id: string;
49
+ * name: string;
50
+ * email: string;
51
+ * role: string;
52
+ * status: 'active' | 'inactive';
53
+ * }
54
+ *
55
+ * const columns: DataTableColumn<User>[] = [
56
+ * {
57
+ * accessorKey: 'name',
58
+ * header: 'Name',
59
+ * sortable: true,
60
+ * searchable: true,
61
+ * },
62
+ * {
63
+ * accessorKey: 'email',
64
+ * header: 'Email',
65
+ * sortable: true,
66
+ * searchable: true,
67
+ * },
68
+ * {
69
+ * accessorKey: 'role',
70
+ * header: 'Role',
71
+ * sortable: true,
72
+ * enableGrouping: true,
73
+ * },
74
+ * {
75
+ * accessorKey: 'status',
76
+ * header: 'Status',
77
+ * sortable: true,
78
+ * cell: ({ row }) => (
79
+ * <span className={`px-2 py-1 rounded text-xs ${
80
+ * row.original.status === 'active'
81
+ * ? 'bg-main-100 text-main-800'
82
+ * : 'bg-acc-100 text-acc-800'
83
+ * }`}>
84
+ * {row.original.status}
85
+ * </span>
86
+ * ),
87
+ * },
88
+ * ];
89
+ *
90
+ * const data: User[] = [
91
+ * { id: '1', name: 'John Doe', email: 'john@example.com', role: 'Admin', status: 'active' },
92
+ * { id: '2', name: 'Jane Smith', email: 'jane@example.com', role: 'User', status: 'active' },
93
+ * ];
94
+ *
95
+ * <DataTable
96
+ * data={data}
97
+ * columns={columns}
98
+ * title="Users"
99
+ * description="Manage your users"
100
+ * features={{
101
+ * search: true,
102
+ * pagination: true,
103
+ * sorting: true,
104
+ * filtering: true,
105
+ * export: true,
106
+ * import: true,
107
+ * selection: true,
108
+ * creation: true,
109
+ * editing: true,
110
+ * deletion: true,
111
+ * deleteSelected: true,
112
+ * grouping: true,
113
+ * columnVisibility: true,
114
+ * columnReordering: true,
115
+ * }}
116
+ * initialPageSize={25} // Set custom initial page size
117
+ * columnOrder={['select', 'name', 'email', 'role', 'status']} // Control column order
118
+ * onEditRow={(row, data) => console.log('Edit:', row, data)}
119
+ * onDeleteRow={(row) => console.log('Delete:', row)}
120
+ * />
121
+ * ```
122
+ *
123
+ * @example
124
+ * ```tsx
125
+ * // DataTable with custom column ordering and selection
126
+ * <DataTable
127
+ * data={data}
128
+ * columns={columns}
129
+ * title="Custom Ordered Table"
130
+ * features={{
131
+ * selection: true,
132
+ * sorting: true,
133
+ * filtering: true,
134
+ * // ... other features
135
+ * }}
136
+ * // Control the exact order of columns, including selection column
137
+ * columnOrder={['select', 'name', 'email', 'role', 'status']}
138
+ * // When selection is enabled but not in columnOrder, it defaults to first position
139
+ * // columnOrder={['name', 'email', 'role']} // selection column will be first
140
+ * />
141
+ * ```
142
+ *
143
+ * @example
144
+ * ```tsx
145
+ * // Large dataset with performance optimizations
146
+ * <DataTable
147
+ * data={largeDataset} // 50,000+ records
148
+ * columns={columns}
149
+ * title="Large Dataset"
150
+ *
151
+ * // Features configuration
152
+ * features={{
153
+ * search: true,
154
+ * pagination: true,
155
+ * sorting: true,
156
+ * filtering: true,
157
+ * export: true,
158
+ * import: true,
159
+ * selection: true,
160
+ * creation: true,
161
+ * editing: true,
162
+ * deletion: true,
163
+ * deleteSelected: true,
164
+ * grouping: true,
165
+ * columnVisibility: true,
166
+ * columnReordering: true,
167
+ * // Virtualization is automatically enabled for large datasets
168
+ * }}
169
+ *
170
+ * // Performance configuration (optional)
171
+ * performance={{
172
+ * virtualScrolling: true,
173
+ * enableChunking: true,
174
+ * chunkSize: 1000,
175
+ * enableWebWorkers: true,
176
+ * }}
177
+ * />
178
+ * ```
179
+ *
180
+ * @example
181
+ * ```tsx
182
+ * // Server-side data with large datasets
183
+ * <DataTable
184
+ * data={[]} // Empty - data comes from server
185
+ * columns={columns}
186
+ * title="Server-side Data"
187
+ *
188
+ * // Features configuration
189
+ * features={{
190
+ * search: true,
191
+ * pagination: true,
192
+ * sorting: true,
193
+ * filtering: true,
194
+ * export: true,
195
+ * import: true,
196
+ * selection: true,
197
+ * creation: true,
198
+ * editing: true,
199
+ * deletion: true,
200
+ * deleteSelected: true,
201
+ * grouping: true,
202
+ * columnVisibility: true,
203
+ * columnReordering: true,
204
+ * // Virtualization is automatically enabled for large datasets
205
+ * }}
206
+ *
207
+ * // Server-side configuration
208
+ * serverSide={{
209
+ * fetchData: async (params) => {
210
+ * const response = await fetchServerData(params);
211
+ * return response;
212
+ * },
213
+ * enableServerSorting: true,
214
+ * enableServerFiltering: true,
215
+ * enableServerSearch: true,
216
+ * enableServerPagination: true,
217
+ * }}
218
+ * />
219
+ * ```
220
+ *
221
+ * @example
222
+ * ```tsx
223
+ * // DataTable with customized import modal text
224
+ * const importConfig = {
225
+ * title: "Import Customer Data",
226
+ * description: "Upload a CSV file with customer information to import multiple records.",
227
+ * uploadText: "Choose a customer CSV file to upload",
228
+ * selectFileButtonText: "Browse Files",
229
+ * importButtonText: "Import Customers",
230
+ * importButtonProcessingText: "Processing customers...",
231
+ * previewHeaderText: "Customer Preview (first 5 records)",
232
+ * totalRowsText: "Found {count} customer records to import"
233
+ * };
234
+ *
235
+ * <DataTable
236
+ * data={customerData}
237
+ * columns={customerColumns}
238
+ * title="Customer Management"
239
+ * features={{
240
+ * search: true,
241
+ * pagination: true,
242
+ * sorting: true,
243
+ * filtering: true,
244
+ * export: true,
245
+ * import: true,
246
+ * selection: true,
247
+ * creation: true,
248
+ * editing: true,
249
+ * deletion: true,
250
+ * deleteSelected: true,
251
+ * grouping: true,
252
+ * columnVisibility: true,
253
+ * columnReordering: true,
254
+ * }}
255
+ * importModalConfig={importConfig}
256
+ * onImport={(importedData) => {
257
+ * console.log('Imported customers:', importedData);
258
+ * // Handle imported customer data
259
+ * }}
260
+ * />
261
+ * ```
262
+ */
263
+
264
+ import React from 'react';
265
+ import { DataTableCore } from './components/DataTableCore';
266
+ import type {
267
+ DataRecord,
268
+ GetRowId,
269
+ ServerSideParams,
270
+ PerformanceConfig,
271
+ ServerSideConfig,
272
+ ChunkingConfig,
273
+ SearchIndexConfig,
274
+ PaginationMode,
275
+ EmptyStateConfig,
276
+ DataTableFeatureConfig,
277
+ DataTableColumn,
278
+ SimpleColumn,
279
+ AggregateConfig,
280
+ DataTableAction,
281
+ HierarchicalConfig,
282
+ DataTableRBACConfig
283
+ } from './types';
284
+ import type { ImportModalConfig } from './components/ImportModal';
285
+
286
+ // ============================================================================
287
+ // ENHANCED DATATABLE PROPS
288
+ // ============================================================================
289
+
290
+ /**
291
+ * Enhanced DataTable props with performance features
292
+ * @template TData - The type of data records in the table
293
+ */
294
+ export interface DataTableProps<TData extends DataRecord> {
295
+ // ========================================
296
+ // CORE DATA
297
+ // ========================================
298
+
299
+ /** Array of data records to display in the table */
300
+ data: TData[];
301
+ /** Column definitions for the table */
302
+ columns: DataTableColumn<TData>[];
303
+
304
+ // ========================================
305
+ // MANDATORY RBAC
306
+ // ========================================
307
+
308
+ /** RBAC configuration - REQUIRED for all DataTables */
309
+ rbac: DataTableRBACConfig;
310
+
311
+ // ========================================
312
+ // DISPLAY
313
+ // ========================================
314
+
315
+ /** Optional title displayed above the table */
316
+ title?: string;
317
+ /** Optional description displayed below the title */
318
+ description?: string;
319
+ /** Visual variant of the table */
320
+ variant?: 'default' | 'compact' | 'spacious';
321
+ /** Additional CSS classes for the table container */
322
+ className?: string;
323
+
324
+ // ========================================
325
+ // NEW: UNIFIED FEATURE CONFIGURATION
326
+ // ========================================
327
+
328
+ /** Feature configuration - all features are disabled by default */
329
+ features: DataTableFeatureConfig;
330
+
331
+ // ========================================
332
+ // HIERARCHICAL CONFIGURATION
333
+ // ========================================
334
+
335
+ /** Hierarchical parent/child row configuration */
336
+ hierarchical?: HierarchicalConfig;
337
+
338
+ // ========================================
339
+ // PERFORMANCE FEATURES
340
+ // ========================================
341
+
342
+ /** Performance optimization configuration */
343
+ performance?: PerformanceConfig;
344
+ /** Server-side data fetching configuration */
345
+ serverSide?: ServerSideConfig<TData>;
346
+ /** Override automatic pagination mode detection */
347
+ paginationMode?: PaginationMode;
348
+ /** Data chunking configuration for memory optimization */
349
+ chunking?: ChunkingConfig;
350
+ /** Search indexing configuration for fast search */
351
+ searchIndex?: SearchIndexConfig;
352
+ /** Virtual scrolling height */
353
+ virtualHeight?: number;
354
+ /** Initial page size for pagination */
355
+ initialPageSize?: number;
356
+ /** Enable enhanced pagination controls */
357
+ enhancedPagination?: boolean;
358
+ /** Custom loading component */
359
+ loadingComponent?: React.ComponentType;
360
+ /** Custom error component */
361
+ errorComponent?: React.ComponentType<{ error: Error; retry: () => void }>;
362
+
363
+ // ========================================
364
+ // EVENT HANDLERS
365
+ // ========================================
366
+
367
+ /** Callback when a row is edited */
368
+ onEditRow?: (row: TData, data: Partial<TData>) => void;
369
+ /** Callback when a row is deleted */
370
+ onDeleteRow?: (row: TData) => void;
371
+ /** Callback when a new row is created */
372
+ onCreateRow?: (data: Partial<TData>) => void;
373
+ /** Callback when data is imported */
374
+ onImport?: (data: TData[]) => void | Promise<void>;
375
+ /** Callback when row selection changes */
376
+ onRowSelectionChange?: (selection: Record<string, boolean>) => void;
377
+ /** Controlled selection state */
378
+ selection?: Record<string, boolean>;
379
+ /** Callback when bulk delete selected rows is triggered */
380
+ onDeleteSelected?: (selectedRows: Record<string, boolean>) => void;
381
+
382
+ // ========================================
383
+ // UTILITIES
384
+ // ========================================
385
+
386
+ /** Function to generate unique row IDs */
387
+ getRowId?: GetRowId<TData>;
388
+ /** Whether the table is in a loading state */
389
+ isLoading?: boolean;
390
+ /** Custom component to display when table is empty */
391
+ emptyState?: EmptyStateConfig | React.ReactElement;
392
+ /** Array of aggregation functions for grouped data */
393
+ aggregates?: AggregateConfig[];
394
+
395
+ /** Import modal configuration */
396
+ importModalConfig?: ImportModalConfig;
397
+
398
+ /** Custom row actions - use this for custom action buttons */
399
+ actions?: DataTableAction<TData>[];
400
+
401
+ /** Column order configuration - array of column IDs in desired order */
402
+ columnOrder?: string[];
403
+ }
404
+
405
+ // ============================================================================
406
+ // MAIN ENHANCED DATATABLE COMPONENT
407
+ // ============================================================================
408
+
409
+ /**
410
+ * Enhanced DataTable with comprehensive performance optimizations
411
+ *
412
+ * This component automatically detects dataset size and applies appropriate performance optimizations:
413
+ * - < 1,000 records: Standard rendering with full feature support
414
+ * - 1,000+ records: Automatic virtual scrolling with intelligent memory management
415
+ * - 10,000+ records: Enhanced chunking and memory optimization
416
+ * - 100,000+ records: Advanced server-side processing with virtualization
417
+ *
418
+ * Features are configured through the unified `features` prop for maximum flexibility.
419
+ */
420
+ export function DataTable<TData extends DataRecord>(props: DataTableProps<TData>) {
421
+ // Validate required features
422
+ if (!props.features) {
423
+ throw new Error('DataTable: features configuration is required');
424
+ }
425
+
426
+ // Validate feature dependencies
427
+ if (props.features.deleteSelected && !props.features.deletion) {
428
+ console.warn('DataTable: deleteSelected requires deletion to be enabled');
429
+ }
430
+
431
+ return <DataTableCore {...props} />;
432
+ }
433
+
434
+ // ============================================================================
435
+ // EXPORT WITH PERFORMANCE OPTIMIZATIONS
436
+ // ============================================================================
437
+
438
+ /**
439
+ * DataTable component with React.memo for performance optimization
440
+ */
441
+ const DataTableComponent = React.memo(DataTable) as typeof DataTable;
442
+
443
+ export { DataTableComponent as default };
444
+
445
+ // Re-export for convenience
446
+ export { DataTable as EnhancedDataTable };
@@ -0,0 +1,145 @@
1
+ # DataTable Test Suite
2
+
3
+ This directory contains comprehensive tests for the DataTable component, designed to prevent regressions and ensure all critical functionality works correctly.
4
+
5
+ ## Test Files Overview
6
+
7
+ ### Regression Prevention Tests
8
+
9
+ - **`DataTable.workflowValidation.test.tsx`** - Comprehensive workflow validation covering all core functionality
10
+ - **`DataTable.regressionFixes.test.tsx`** - Documents specific fixes and prevents known regressions
11
+ - **`DataTable.sorting.test.tsx`** - Comprehensive sorting functionality tests including visual indicators and accessibility
12
+
13
+ ### Existing Tests
14
+
15
+ - **`DataTable.simple.test.tsx`** - Basic rendering tests
16
+ - **`DataTable.integration.test.tsx`** - Cross-component integration tests
17
+ - **`DataTable.performance.test.tsx`** - Performance benchmarks
18
+ - **`DataTable.errorHandling.test.tsx`** - Error condition handling
19
+ - **`DataTable.permissions.test.tsx`** - RBAC and permissions testing
20
+ - **`DataTable.userWorkflows.test.tsx`** - User interaction flows
21
+
22
+ ## Test Strategy
23
+
24
+ ### 1. Workflow Validation (23 tests)
25
+ The `DataTable.workflowValidation.test.tsx` file provides comprehensive coverage of:
26
+
27
+ - **Basic Rendering Workflows (3 tests)**
28
+ - Data display validation
29
+ - Header rendering
30
+ - Actions column conditionals
31
+
32
+ - **Editing Workflow Validation (5 tests)**
33
+ - Actions column presence
34
+ - Edit button rendering and icons
35
+ - Handler requirements
36
+ - Click behavior validation
37
+
38
+ - **Deletion Workflow Validation (4 tests)**
39
+ - Delete button rendering and icons
40
+ - Immediate handler execution
41
+ - Handler requirements
42
+
43
+ - **Combined Features Validation (2 tests)**
44
+ - Both edit and delete enabled
45
+ - Mixed interactions
46
+
47
+ - **Search Workflow Validation (3 tests)**
48
+ - Search functionality
49
+ - Filtering behavior
50
+ - Actions preservation during search
51
+
52
+ - **Sorting Workflow Validation (4 tests)**
53
+ - Sortable column indicators (↕️ unsorted, ↑ ascending, ↓ descending)
54
+ - Click behavior for sorting
55
+ - Non-sortable column behavior
56
+ - Visual feedback and accessibility
57
+
58
+ - **Data Integrity Validation (3 tests)**
59
+ - Exact prop data display
60
+ - Empty data handling
61
+ - Null/undefined value handling
62
+
63
+ - **Accessibility Validation (3 tests)**
64
+ - Semantic table structure
65
+ - ARIA labels
66
+ - Keyboard navigation support
67
+
68
+ ### 2. Regression Fixes (13 tests)
69
+ The `DataTable.regressionFixes.test.tsx` file documents specific fixes:
70
+
71
+ - **Save and Cancel Actions in allActions Array (3 tests)**
72
+ - Validates the fix for the actions filtering logic
73
+ - Ensures Save/Cancel buttons are included in action processing
74
+
75
+ - **Action Button Icons and Behavior (4 tests)**
76
+ - Pencil icons for Edit buttons
77
+ - Trash icons for Delete buttons
78
+ - Correct edit mode entry behavior
79
+ - Immediate delete handler execution
80
+
81
+ - **Action Button Validation (3 tests)**
82
+ - ARIA label maintenance
83
+ - Conditional actions column rendering
84
+ - Handler requirement enforcement
85
+
86
+ - **Data Integrity Prevention (3 tests)**
87
+ - Exact data display
88
+ - Empty data graceful handling
89
+ - Semantic structure maintenance
90
+
91
+ ## Critical Regression Fix
92
+
93
+ ### The Save/Cancel Actions Bug
94
+ **Issue**: Edit buttons appeared but Save/Cancel buttons didn't appear in edit mode.
95
+ **Root Cause**: The action filtering logic in DataTable component only included `edit` and `delete` actions in the `allActions` array, excluding `save` and `cancel` actions.
96
+ **Fix**: Updated the filtering logic to include all built-in actions:
97
+
98
+ ```typescript
99
+ // BEFORE (broken):
100
+ const editActions = builtInActions.filter(action => action.testId === 'edit');
101
+ const deleteActions = builtInActions.filter(action => action.testId === 'delete');
102
+ const allActions = [...(actions || []), ...editActions, ...deleteActions];
103
+
104
+ // AFTER (fixed):
105
+ const editActions = builtInActions.filter(action => action.testId === 'edit');
106
+ const saveActions = builtInActions.filter(action => action.testId === 'save');
107
+ const cancelActions = builtInActions.filter(action => action.testId === 'cancel');
108
+ const deleteActions = builtInActions.filter(action => action.testId === 'delete');
109
+ const allActions = [...(actions || []), ...editActions, ...saveActions, ...cancelActions, ...deleteActions];
110
+ ```
111
+
112
+ ## Running Tests
113
+
114
+ Run all DataTable tests:
115
+ ```bash
116
+ npm test -- src/components/DataTable/__tests__/
117
+ ```
118
+
119
+ Run specific test suites:
120
+ ```bash
121
+ # Workflow validation tests
122
+ npm test -- src/components/DataTable/__tests__/DataTable.workflowValidation.test.tsx
123
+
124
+ # Regression fix tests
125
+ npm test -- src/components/DataTable/__tests__/DataTable.regressionFixes.test.tsx
126
+
127
+ # Sorting functionality tests
128
+ npm test -- src/components/DataTable/__tests__/DataTable.sorting.test.tsx
129
+
130
+ # Simple integration tests
131
+ npm test -- src/components/DataTable/__tests__/DataTable.simple.test.tsx
132
+ ```
133
+
134
+ ## Test Coverage Summary
135
+
136
+ - **91 total tests** in new regression prevention suites
137
+ - **100% pass rate** for workflow validation
138
+ - **100% pass rate** for regression fixes
139
+ - **100% pass rate** for auto-sizing functionality
140
+ - **Critical action rendering validated**
141
+ - **Search and data integrity confirmed**
142
+ - **Auto-sizing behavior verified**
143
+ - **Accessibility standards maintained**
144
+
145
+ This test suite ensures DataTable reliability and prevents future regressions in critical editing workflows.
@@ -0,0 +1,66 @@
1
+ /**
2
+ * @file Mock RBAC Provider for DataTable Tests
3
+ * @package @jmruthers/pace-core
4
+ * @module Components/DataTable/__tests__/mocks
5
+ * @since 0.3.0
6
+ *
7
+ * Mock provider for the new RBAC system used in DataTable tests.
8
+ */
9
+
10
+ import React, { createContext, useContext, ReactNode } from 'react';
11
+
12
+ // Mock types for testing - simplified version of new RBAC types
13
+ type AccessLevel = 'viewer' | 'participant' | 'planner' | 'admin' | 'super';
14
+
15
+ interface MockRBACContextType {
16
+ permissions: Record<string, boolean>;
17
+ accessLevel: AccessLevel;
18
+ hasPermission: (permission: string) => boolean;
19
+ hasAccessLevel: (level: AccessLevel) => boolean;
20
+ }
21
+
22
+ const MockRBACContext = createContext<MockRBACContextType | null>(null);
23
+
24
+ interface MockRBACProviderProps {
25
+ children: ReactNode;
26
+ permissions?: Record<string, boolean>;
27
+ accessLevel?: AccessLevel;
28
+ }
29
+
30
+ export const MockRBACProvider: React.FC<MockRBACProviderProps> = ({
31
+ children,
32
+ permissions = {},
33
+ accessLevel = 'viewer'
34
+ }) => {
35
+ const hasPermission = (permission: string): boolean => {
36
+ return permissions[permission] || false;
37
+ };
38
+
39
+ const hasAccessLevel = (level: AccessLevel): boolean => {
40
+ const levels: AccessLevel[] = ['viewer', 'participant', 'planner', 'admin', 'super'];
41
+ const userLevelIndex = levels.indexOf(accessLevel);
42
+ const requiredLevelIndex = levels.indexOf(level);
43
+ return userLevelIndex >= requiredLevelIndex;
44
+ };
45
+
46
+ const contextValue: MockRBACContextType = {
47
+ permissions,
48
+ accessLevel,
49
+ hasPermission,
50
+ hasAccessLevel
51
+ };
52
+
53
+ return (
54
+ <MockRBACContext.Provider value={contextValue}>
55
+ {children}
56
+ </MockRBACContext.Provider>
57
+ );
58
+ };
59
+
60
+ export const useMockRBAC = (): MockRBACContextType => {
61
+ const context = useContext(MockRBACContext);
62
+ if (!context) {
63
+ throw new Error('useMockRBAC must be used within a MockRBACProvider');
64
+ }
65
+ return context;
66
+ };