@jmruthers/pace-core 0.6.5 → 0.6.7

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 (473) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +5 -403
  3. package/audit-tool/00-dependencies.cjs +394 -0
  4. package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
  5. package/audit-tool/audits/02-project-structure.cjs +255 -0
  6. package/audit-tool/audits/03-architecture.cjs +196 -0
  7. package/audit-tool/audits/04-code-quality.cjs +149 -0
  8. package/audit-tool/audits/05-styling.cjs +224 -0
  9. package/audit-tool/audits/06-security-rbac.cjs +544 -0
  10. package/audit-tool/audits/07-api-tech-stack.cjs +301 -0
  11. package/audit-tool/audits/08-testing-documentation.cjs +202 -0
  12. package/audit-tool/audits/09-operations.cjs +208 -0
  13. package/audit-tool/index.cjs +291 -0
  14. package/audit-tool/utils/code-utils.cjs +218 -0
  15. package/audit-tool/utils/file-utils.cjs +230 -0
  16. package/audit-tool/utils/report-utils.cjs +241 -0
  17. package/core-usage-manifest.json +93 -0
  18. package/cursor-rules/00-standards-overview.mdc +156 -0
  19. package/cursor-rules/01-pace-core-compliance.mdc +586 -0
  20. package/cursor-rules/02-project-structure.mdc +42 -4
  21. package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +126 -10
  22. package/cursor-rules/04-code-quality.mdc +419 -0
  23. package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +104 -34
  24. package/cursor-rules/06-security-rbac.mdc +518 -0
  25. package/cursor-rules/07-api-tech-stack.mdc +377 -0
  26. package/cursor-rules/08-testing-documentation.mdc +324 -0
  27. package/cursor-rules/09-operations.mdc +365 -0
  28. package/dist/{AuthService-Cb34EQs3.d.ts → AuthService-DmfO5rGS.d.ts} +10 -0
  29. package/dist/DataTable-7PMH7XN7.js +15 -0
  30. package/dist/{DataTable-BMRU8a1j.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
  31. package/dist/{PublicPageProvider-QTFVrL-Z.d.ts → PublicPageProvider-DlsCaR5v.d.ts} +33 -72
  32. package/dist/UnifiedAuthProvider-ZT6TIGM7.js +7 -0
  33. package/dist/api-Y4MQWOFW.js +4 -0
  34. package/dist/audit-MYQXYZFU.js +3 -0
  35. package/dist/{chunk-DGUM43GV.js → chunk-3RG5ZIWI.js} +1 -4
  36. package/dist/{chunk-QXHPKYJV.js → chunk-4SXLQIZO.js} +1 -26
  37. package/dist/{chunk-UPPMRMYG.js → chunk-5X4QLXRG.js} +73 -151
  38. package/dist/chunk-6F3IILHI.js +62 -0
  39. package/dist/{chunk-E66EQZE6.js → chunk-6GLLNA6U.js} +3 -9
  40. package/dist/{chunk-ZSAAAMVR.js → chunk-6QYDGKQY.js} +1 -4
  41. package/dist/{chunk-FMUCXFII.js → chunk-7ILTDCL2.js} +9 -5
  42. package/dist/{chunk-M43Y4SSO.js → chunk-A3W6LW53.js} +15 -13
  43. package/dist/{chunk-63FOKYGO.js → chunk-AHU7G2R5.js} +2 -11
  44. package/dist/{chunk-HU2C6SSC.js → chunk-BM4CQ5P3.js} +606 -559
  45. package/dist/chunk-C7NSAPTL.js +1 -0
  46. package/dist/{chunk-J36DSWQK.js → chunk-FEJLJNWA.js} +7 -41
  47. package/dist/{chunk-IHB5DR3H.js → chunk-FTCRZOG2.js} +188 -387
  48. package/dist/{chunk-G37KK66H.js → chunk-FYHN4DD5.js} +60 -19
  49. package/dist/chunk-GHYHJTYV.js +994 -0
  50. package/dist/{chunk-VBXEHIUJ.js → chunk-HF6O3O37.js} +6 -88
  51. package/dist/{chunk-FFQEQTNW.js → chunk-IUBRCBSY.js} +134 -45
  52. package/dist/{chunk-6COVEUS7.js → chunk-JGWDVX64.js} +983 -1034
  53. package/dist/{chunk-RGAWHO7N.js → chunk-L4XMVJKY.js} +77 -222
  54. package/dist/chunk-MBADTM7L.js +64 -0
  55. package/dist/{chunk-M7MPQISP.js → chunk-OJ4SKRSV.js} +3 -16
  56. package/dist/{chunk-IVOFDYWT.js → chunk-Q7Q7V5NV.js} +2109 -1604
  57. package/dist/{chunk-JGRYX5UX.js → chunk-S7DKJPLT.js} +29 -58
  58. package/dist/{chunk-PWLANIRT.js → chunk-TTRFSOKR.js} +1 -7
  59. package/dist/{chunk-5DRSZLL2.js → chunk-UH3NTO3F.js} +1 -6
  60. package/dist/{chunk-NTM7ZSB6.js → chunk-VBCS3DUA.js} +261 -168
  61. package/dist/{chunk-EFN2EIMK.js → chunk-ZFYPMX46.js} +271 -87
  62. package/dist/{chunk-L4OXEN46.js → chunk-ZKAWKYT4.js} +10 -24
  63. package/dist/components.d.ts +7 -5
  64. package/dist/components.js +46 -257
  65. package/dist/{database.generated-CzIvgcPu.d.ts → database.generated-CcnC_DRc.d.ts} +4795 -3691
  66. package/dist/eslint-rules/index.cjs +35 -0
  67. package/{src/eslint-rules/pace-core-compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +234 -235
  68. package/dist/eslint-rules/rules/04-code-quality.cjs +290 -0
  69. package/dist/eslint-rules/rules/05-styling.cjs +61 -0
  70. package/dist/eslint-rules/rules/06-security-rbac.cjs +806 -0
  71. package/dist/eslint-rules/rules/07-api-tech-stack.cjs +263 -0
  72. package/dist/eslint-rules/rules/08-testing.cjs +94 -0
  73. package/dist/eslint-rules/utils/helpers.cjs +42 -0
  74. package/dist/eslint-rules/utils/manifest-loader.cjs +75 -0
  75. package/dist/hooks.d.ts +6 -6
  76. package/dist/hooks.js +62 -172
  77. package/dist/icons/index.d.ts +1 -0
  78. package/dist/icons/index.js +1 -0
  79. package/dist/index.d.ts +12 -11
  80. package/dist/index.js +67 -660
  81. package/dist/providers.d.ts +2 -2
  82. package/dist/providers.js +8 -35
  83. package/dist/rbac/eslint-rules.d.ts +46 -44
  84. package/dist/rbac/eslint-rules.js +7 -4
  85. package/dist/rbac/index.d.ts +109 -586
  86. package/dist/rbac/index.js +14 -207
  87. package/dist/styles/index.js +2 -12
  88. package/dist/theming/runtime.d.ts +14 -1
  89. package/dist/theming/runtime.js +3 -19
  90. package/dist/{timezone-CHhWg6b4.d.ts → timezone-BZe_eUxx.d.ts} +175 -1
  91. package/dist/{types-CkbwOr4Y.d.ts → types-DXstZpNI.d.ts} +4 -17
  92. package/dist/types-t9H8qKRw.d.ts +55 -0
  93. package/dist/types.d.ts +1 -1
  94. package/dist/types.js +7 -94
  95. package/dist/{usePublicRouteParams-ClnV4tnv.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +20 -20
  96. package/dist/utils.d.ts +24 -117
  97. package/dist/utils.js +54 -392
  98. package/docs/README.md +17 -7
  99. package/docs/api/README.md +4 -402
  100. package/docs/api/modules.md +301 -871
  101. package/docs/api-reference/components.md +21 -21
  102. package/docs/api-reference/deprecated.md +31 -6
  103. package/docs/api-reference/hooks.md +80 -80
  104. package/docs/api-reference/rpc-functions.md +78 -3
  105. package/docs/api-reference/types.md +1 -1
  106. package/docs/api-reference/utilities.md +1 -1
  107. package/docs/architecture/README.md +1 -1
  108. package/docs/core-concepts/events.md +3 -3
  109. package/docs/core-concepts/organisations.md +6 -6
  110. package/docs/core-concepts/permissions.md +6 -6
  111. package/docs/documentation-index.md +12 -18
  112. package/docs/getting-started/cursor-rules.md +3 -23
  113. package/docs/getting-started/dependencies.md +650 -0
  114. package/docs/getting-started/documentation-index.md +1 -1
  115. package/docs/getting-started/examples/README.md +4 -4
  116. package/docs/getting-started/examples/full-featured-app.md +1 -1
  117. package/docs/getting-started/faq.md +2 -2
  118. package/docs/getting-started/installation-guide.md +20 -7
  119. package/docs/getting-started/quick-reference.md +4 -4
  120. package/docs/getting-started/quick-start.md +23 -12
  121. package/docs/implementation-guides/authentication.md +15 -15
  122. package/docs/implementation-guides/component-styling.md +1 -1
  123. package/docs/implementation-guides/data-tables.md +126 -33
  124. package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
  125. package/docs/implementation-guides/dynamic-colors.md +3 -3
  126. package/docs/implementation-guides/file-upload-storage.md +2 -2
  127. package/docs/implementation-guides/hierarchical-datatable.md +40 -60
  128. package/docs/implementation-guides/inactivity-tracking.md +3 -3
  129. package/docs/implementation-guides/large-datasets.md +3 -2
  130. package/docs/implementation-guides/organisation-security.md +2 -2
  131. package/docs/implementation-guides/performance.md +2 -2
  132. package/docs/implementation-guides/permission-enforcement.md +5 -1
  133. package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
  134. package/docs/migration/V0.4.0_rbac-migration.md +6 -6
  135. package/docs/rbac/MIGRATION_GUIDE.md +819 -0
  136. package/docs/rbac/RBAC_CONTRACT.md +724 -0
  137. package/docs/rbac/README.md +17 -8
  138. package/docs/rbac/advanced-patterns.md +6 -6
  139. package/docs/rbac/api-reference.md +20 -20
  140. package/docs/rbac/edge-functions-guide.md +376 -0
  141. package/docs/rbac/event-based-apps.md +3 -3
  142. package/docs/rbac/examples.md +41 -41
  143. package/docs/rbac/getting-started.md +37 -37
  144. package/docs/rbac/performance.md +1 -1
  145. package/docs/rbac/quick-start.md +52 -52
  146. package/docs/rbac/secure-client-protection.md +1 -35
  147. package/docs/rbac/troubleshooting.md +1 -1
  148. package/docs/security/README.md +5 -5
  149. package/docs/standards/0-standards-overview.md +220 -0
  150. package/docs/standards/1-pace-core-compliance-standards.md +986 -0
  151. package/docs/standards/2-project-structure-standards.md +949 -0
  152. package/docs/standards/3-architecture-standards.md +606 -0
  153. package/docs/standards/4-code-quality-standards.md +728 -0
  154. package/docs/standards/5-styling-standards.md +348 -0
  155. package/docs/standards/{07-rbac-and-rls-standard.md → 6-security-rbac-standards.md} +269 -66
  156. package/docs/standards/7-api-tech-stack-standards.md +662 -0
  157. package/docs/standards/8-testing-documentation-standards.md +401 -0
  158. package/docs/standards/9-operations-standards.md +1102 -0
  159. package/docs/standards/README.md +185 -57
  160. package/docs/troubleshooting/README.md +4 -4
  161. package/docs/troubleshooting/common-issues.md +2 -2
  162. package/docs/troubleshooting/debugging.md +9 -9
  163. package/docs/troubleshooting/migration.md +4 -4
  164. package/docs/troubleshooting/organisation-context-setup.md +42 -19
  165. package/eslint-config-pace-core.cjs +33 -6
  166. package/package.json +35 -23
  167. package/scripts/install-cursor-rules.cjs +25 -6
  168. package/scripts/install-eslint-config.cjs +284 -0
  169. package/src/__tests__/fixtures/supabase.ts +1 -1
  170. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +3 -3
  171. package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +1 -1
  172. package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +1 -1
  173. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
  174. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +13 -13
  175. package/src/__tests__/helpers/component-test-utils.tsx +1 -1
  176. package/src/__tests__/helpers/supabaseMock.ts +2 -2
  177. package/src/__tests__/integration/UserProfile.test.tsx +14 -14
  178. package/src/__tests__/public-recipe-view.test.ts +38 -9
  179. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
  180. package/src/__tests__/templates/accessibility.test.template.tsx +9 -9
  181. package/src/__tests__/templates/component.test.template.tsx +18 -15
  182. package/src/components/Button/Button.tsx +5 -1
  183. package/src/components/Calendar/Calendar.tsx +201 -47
  184. package/src/components/ContextSelector/ContextSelector.tsx +106 -119
  185. package/src/components/DataTable/AUDIT_REPORT.md +293 -0
  186. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +10 -2
  187. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +10 -4
  188. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
  189. package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
  190. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
  191. package/src/components/DataTable/components/DataTableCore.tsx +186 -13
  192. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
  193. package/src/components/DataTable/components/DataTableLayout.tsx +35 -21
  194. package/src/components/DataTable/components/EditFields.tsx +23 -3
  195. package/src/components/DataTable/components/EditableRow.tsx +12 -9
  196. package/src/components/DataTable/components/EmptyState.tsx +10 -9
  197. package/src/components/DataTable/components/FilterRow.tsx +2 -4
  198. package/src/components/DataTable/components/ImportModal.tsx +124 -126
  199. package/src/components/DataTable/components/LoadingState.tsx +5 -6
  200. package/src/components/DataTable/components/RowComponent.tsx +12 -0
  201. package/src/components/DataTable/components/SortIndicator.tsx +50 -0
  202. package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
  203. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
  204. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
  205. package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
  206. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
  207. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +41 -27
  208. package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -4
  209. package/src/components/DataTable/components/index.ts +2 -1
  210. package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +51 -47
  211. package/src/components/DataTable/hooks/useDataTablePermissions.ts +24 -21
  212. package/src/components/DataTable/hooks/useDataTableState.ts +125 -9
  213. package/src/components/DataTable/hooks/useTableColumns.ts +40 -2
  214. package/src/components/DataTable/hooks/useTableHandlers.ts +11 -0
  215. package/src/components/DataTable/types.ts +5 -18
  216. package/src/components/DataTable/utils/a11yUtils.ts +17 -0
  217. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +2 -1
  218. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
  219. package/src/components/DateTimeField/DateTimeField.tsx +10 -9
  220. package/src/components/Dialog/Dialog.test.tsx +128 -104
  221. package/src/components/Dialog/Dialog.tsx +742 -24
  222. package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
  223. package/src/components/FileDisplay/FileDisplay.test.tsx +4 -2
  224. package/src/components/FileDisplay/FileDisplay.tsx +23 -17
  225. package/src/components/FileUpload/FileUpload.test.tsx +52 -14
  226. package/src/components/FileUpload/FileUpload.tsx +112 -130
  227. package/src/components/Form/Form.test.tsx +6 -8
  228. package/src/components/Form/Form.tsx +365 -4
  229. package/src/components/NavigationMenu/NavigationMenu.test.tsx +14 -13
  230. package/src/components/NavigationMenu/useNavigationFiltering.ts +11 -21
  231. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +6 -4
  232. package/src/components/PaceAppLayout/PaceAppLayout.tsx +11 -15
  233. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +108 -61
  234. package/src/components/PaceLoginPage/PaceLoginPage.tsx +27 -3
  235. package/src/components/Progress/Progress.tsx +2 -4
  236. package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
  237. package/src/components/Select/Select.tsx +109 -98
  238. package/src/components/Select/types.ts +4 -1
  239. package/src/components/UserMenu/UserMenu.tsx +9 -6
  240. package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
  241. package/src/hooks/__tests__/hooks.integration.test.tsx +55 -57
  242. package/src/hooks/__tests__/useAppConfig.unit.test.ts +129 -67
  243. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +97 -97
  244. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +149 -67
  245. package/src/hooks/__tests__/usePublicEvent.test.ts +149 -79
  246. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +158 -109
  247. package/src/hooks/__tests__/useSessionDraft.test.ts +163 -0
  248. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +10 -5
  249. package/src/hooks/public/usePublicEvent.ts +67 -195
  250. package/src/hooks/public/usePublicEventLogo.test.ts +70 -17
  251. package/src/hooks/public/usePublicEventLogo.ts +24 -14
  252. package/src/hooks/public/usePublicFileDisplay.ts +2 -2
  253. package/src/hooks/public/usePublicRouteParams.ts +5 -5
  254. package/src/hooks/useAppConfig.ts +28 -26
  255. package/src/hooks/useEventTheme.test.ts +217 -239
  256. package/src/hooks/useEventTheme.ts +16 -28
  257. package/src/hooks/useFileDisplay.ts +2 -2
  258. package/src/hooks/useOrganisationPermissions.ts +5 -7
  259. package/src/hooks/useQueryCache.ts +0 -1
  260. package/src/hooks/useSessionDraft.ts +380 -0
  261. package/src/hooks/useSessionRestoration.ts +3 -1
  262. package/src/icons/index.ts +27 -0
  263. package/src/index.ts +5 -0
  264. package/src/providers/OrganisationProvider.tsx +23 -14
  265. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
  266. package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
  267. package/src/providers/__tests__/EventProvider.test.tsx +61 -61
  268. package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
  269. package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
  270. package/src/providers/__tests__/ProviderLifecycle.test.tsx +37 -37
  271. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
  272. package/src/providers/services/EventServiceProvider.tsx +1 -24
  273. package/src/providers/services/UnifiedAuthProvider.tsx +5 -48
  274. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
  275. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +13 -10
  276. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +7 -457
  277. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +33 -7
  278. package/src/rbac/adapters.tsx +7 -295
  279. package/src/rbac/api.test.ts +44 -56
  280. package/src/rbac/api.ts +10 -17
  281. package/src/rbac/cache-invalidation.ts +0 -1
  282. package/src/rbac/compliance/index.ts +10 -0
  283. package/src/rbac/compliance/pattern-detector.ts +553 -0
  284. package/src/rbac/compliance/runtime-compliance.ts +22 -0
  285. package/src/rbac/components/AccessDenied.tsx +150 -0
  286. package/src/rbac/components/NavigationGuard.tsx +12 -20
  287. package/src/rbac/components/PagePermissionGuard.tsx +4 -24
  288. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +21 -8
  289. package/src/rbac/components/index.ts +3 -41
  290. package/src/rbac/eslint-rules.js +1 -1
  291. package/src/rbac/hooks/index.ts +0 -3
  292. package/src/rbac/hooks/permissions/index.ts +0 -3
  293. package/src/rbac/hooks/permissions/useAccessLevel.ts +4 -8
  294. package/src/rbac/hooks/usePermissions.ts +0 -3
  295. package/src/rbac/hooks/useResolvedScope.test.ts +57 -47
  296. package/src/rbac/hooks/useResolvedScope.ts +58 -140
  297. package/src/rbac/hooks/useResourcePermissions.test.ts +124 -38
  298. package/src/rbac/hooks/useResourcePermissions.ts +139 -48
  299. package/src/rbac/hooks/useRoleManagement.test.ts +65 -22
  300. package/src/rbac/hooks/useRoleManagement.ts +147 -19
  301. package/src/rbac/hooks/useSecureSupabase.ts +4 -8
  302. package/src/rbac/index.ts +7 -9
  303. package/src/rbac/utils/contextValidator.ts +9 -7
  304. package/src/services/AuthService.ts +130 -18
  305. package/src/services/EventService.ts +4 -97
  306. package/src/services/InactivityService.ts +16 -0
  307. package/src/services/OrganisationService.ts +7 -44
  308. package/src/services/__tests__/OrganisationService.test.ts +26 -8
  309. package/src/services/base/BaseService.ts +0 -3
  310. package/src/styles/core.css +7 -0
  311. package/src/theming/__tests__/parseEventColours.test.ts +9 -3
  312. package/src/theming/parseEventColours.ts +22 -10
  313. package/src/types/database.generated.ts +4733 -3809
  314. package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
  315. package/src/utils/__tests__/organisationContext.unit.test.ts +9 -10
  316. package/src/utils/context/organisationContext.test.ts +13 -28
  317. package/src/utils/context/organisationContext.ts +21 -52
  318. package/src/utils/dynamic/dynamicUtils.ts +1 -1
  319. package/src/utils/file-reference/index.ts +39 -15
  320. package/src/utils/formatting/formatDateTime.test.ts +3 -2
  321. package/src/utils/google-places/loadGoogleMapsScript.ts +29 -4
  322. package/src/utils/index.ts +4 -1
  323. package/src/utils/persistence/__tests__/keyDerivation.test.ts +135 -0
  324. package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +123 -0
  325. package/src/utils/persistence/keyDerivation.ts +304 -0
  326. package/src/utils/persistence/sensitiveFieldDetection.ts +212 -0
  327. package/src/utils/security/secureStorage.ts +5 -5
  328. package/src/utils/storage/README.md +1 -1
  329. package/src/utils/storage/helpers.ts +3 -3
  330. package/src/utils/supabase/createBaseClient.ts +147 -0
  331. package/src/utils/timezone/timezone.test.ts +1 -2
  332. package/src/utils/timezone/timezone.ts +1 -1
  333. package/src/utils/validation/csrf.ts +4 -4
  334. package/cursor-rules/00-pace-core-compliance.mdc +0 -331
  335. package/cursor-rules/01-standards-compliance.mdc +0 -244
  336. package/cursor-rules/04-testing-standards.mdc +0 -268
  337. package/cursor-rules/05-bug-reports-and-features.mdc +0 -246
  338. package/cursor-rules/06-code-quality.mdc +0 -309
  339. package/cursor-rules/07-tech-stack-compliance.mdc +0 -214
  340. package/cursor-rules/CHANGELOG.md +0 -119
  341. package/cursor-rules/README.md +0 -192
  342. package/dist/DataTable-AOVNCPTX.js +0 -175
  343. package/dist/DataTable-AOVNCPTX.js.map +0 -1
  344. package/dist/UnifiedAuthProvider-4SBX4LU5.js +0 -18
  345. package/dist/UnifiedAuthProvider-4SBX4LU5.js.map +0 -1
  346. package/dist/api-O6HTBX5Y.js +0 -52
  347. package/dist/api-O6HTBX5Y.js.map +0 -1
  348. package/dist/audit-V53FV5AG.js +0 -17
  349. package/dist/audit-V53FV5AG.js.map +0 -1
  350. package/dist/chunk-5DRSZLL2.js.map +0 -1
  351. package/dist/chunk-63FOKYGO.js.map +0 -1
  352. package/dist/chunk-6COVEUS7.js.map +0 -1
  353. package/dist/chunk-AFVQODI2.js +0 -263
  354. package/dist/chunk-AFVQODI2.js.map +0 -1
  355. package/dist/chunk-DGUM43GV.js.map +0 -1
  356. package/dist/chunk-E66EQZE6.js.map +0 -1
  357. package/dist/chunk-EFN2EIMK.js.map +0 -1
  358. package/dist/chunk-FFQEQTNW.js.map +0 -1
  359. package/dist/chunk-FMUCXFII.js.map +0 -1
  360. package/dist/chunk-G37KK66H.js.map +0 -1
  361. package/dist/chunk-G7QEZTYQ.js +0 -2053
  362. package/dist/chunk-G7QEZTYQ.js.map +0 -1
  363. package/dist/chunk-HU2C6SSC.js.map +0 -1
  364. package/dist/chunk-IHB5DR3H.js.map +0 -1
  365. package/dist/chunk-IVOFDYWT.js.map +0 -1
  366. package/dist/chunk-J36DSWQK.js.map +0 -1
  367. package/dist/chunk-JGRYX5UX.js.map +0 -1
  368. package/dist/chunk-KQCRWDSA.js +0 -1
  369. package/dist/chunk-KQCRWDSA.js.map +0 -1
  370. package/dist/chunk-L4OXEN46.js.map +0 -1
  371. package/dist/chunk-LMC26NLJ.js +0 -84
  372. package/dist/chunk-LMC26NLJ.js.map +0 -1
  373. package/dist/chunk-M43Y4SSO.js.map +0 -1
  374. package/dist/chunk-M7MPQISP.js.map +0 -1
  375. package/dist/chunk-NTM7ZSB6.js.map +0 -1
  376. package/dist/chunk-PWLANIRT.js.map +0 -1
  377. package/dist/chunk-QXHPKYJV.js.map +0 -1
  378. package/dist/chunk-RGAWHO7N.js.map +0 -1
  379. package/dist/chunk-UPPMRMYG.js.map +0 -1
  380. package/dist/chunk-VBXEHIUJ.js.map +0 -1
  381. package/dist/chunk-ZSAAAMVR.js.map +0 -1
  382. package/dist/components.js.map +0 -1
  383. package/dist/contextValidator-5OGXSPKS.js +0 -9
  384. package/dist/contextValidator-5OGXSPKS.js.map +0 -1
  385. package/dist/eslint-rules/pace-core-compliance.cjs +0 -510
  386. package/dist/hooks.js.map +0 -1
  387. package/dist/index.js.map +0 -1
  388. package/dist/providers.js.map +0 -1
  389. package/dist/rbac/eslint-rules.js.map +0 -1
  390. package/dist/rbac/index.js.map +0 -1
  391. package/dist/styles/index.js.map +0 -1
  392. package/dist/theming/runtime.js.map +0 -1
  393. package/dist/types.js.map +0 -1
  394. package/dist/utils.js.map +0 -1
  395. package/docs/best-practices/README.md +0 -472
  396. package/docs/best-practices/accessibility.md +0 -601
  397. package/docs/best-practices/common-patterns.md +0 -516
  398. package/docs/best-practices/deployment.md +0 -1103
  399. package/docs/best-practices/performance.md +0 -1328
  400. package/docs/best-practices/security.md +0 -940
  401. package/docs/best-practices/testing.md +0 -1034
  402. package/docs/rbac/compliance/compliance-guide.md +0 -544
  403. package/docs/standards/01-architecture-standard.md +0 -44
  404. package/docs/standards/02-api-and-rpc-standard.md +0 -39
  405. package/docs/standards/03-component-standard.md +0 -32
  406. package/docs/standards/04-code-style-standard.md +0 -32
  407. package/docs/standards/05-security-standard.md +0 -44
  408. package/docs/standards/06-testing-and-docs-standard.md +0 -29
  409. package/docs/standards/pace-core-compliance.md +0 -432
  410. package/scripts/audit/core/checks/accessibility.cjs +0 -197
  411. package/scripts/audit/core/checks/api-usage.cjs +0 -191
  412. package/scripts/audit/core/checks/bundle.cjs +0 -142
  413. package/scripts/audit/core/checks/compliance.cjs +0 -2706
  414. package/scripts/audit/core/checks/config.cjs +0 -54
  415. package/scripts/audit/core/checks/coverage.cjs +0 -84
  416. package/scripts/audit/core/checks/dependencies.cjs +0 -994
  417. package/scripts/audit/core/checks/documentation.cjs +0 -268
  418. package/scripts/audit/core/checks/environment.cjs +0 -116
  419. package/scripts/audit/core/checks/error-handling.cjs +0 -340
  420. package/scripts/audit/core/checks/forms.cjs +0 -172
  421. package/scripts/audit/core/checks/heuristics.cjs +0 -68
  422. package/scripts/audit/core/checks/hooks.cjs +0 -334
  423. package/scripts/audit/core/checks/imports.cjs +0 -244
  424. package/scripts/audit/core/checks/performance.cjs +0 -325
  425. package/scripts/audit/core/checks/routes.cjs +0 -117
  426. package/scripts/audit/core/checks/state.cjs +0 -130
  427. package/scripts/audit/core/checks/structure.cjs +0 -65
  428. package/scripts/audit/core/checks/style.cjs +0 -584
  429. package/scripts/audit/core/checks/testing.cjs +0 -122
  430. package/scripts/audit/core/checks/typescript.cjs +0 -61
  431. package/scripts/audit/core/scanner.cjs +0 -199
  432. package/scripts/audit/core/utils.cjs +0 -137
  433. package/scripts/audit/index.cjs +0 -223
  434. package/scripts/audit/reporters/console.cjs +0 -151
  435. package/scripts/audit/reporters/json.cjs +0 -54
  436. package/scripts/audit/reporters/markdown.cjs +0 -124
  437. package/scripts/audit-consuming-app.cjs +0 -86
  438. package/src/components/DataTable/components/DataTableBody.tsx +0 -454
  439. package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
  440. package/src/components/DataTable/components/ExpandButton.tsx +0 -113
  441. package/src/components/DataTable/components/GroupHeader.tsx +0 -54
  442. package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
  443. package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
  444. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
  445. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
  446. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
  447. package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
  448. package/src/components/DataTable/core/DataTableContext.tsx +0 -216
  449. package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
  450. package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
  451. package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
  452. package/src/components/DataTable/utils/debugTools.ts +0 -514
  453. package/src/eslint-rules/pace-core-compliance.js +0 -638
  454. package/src/rbac/components/EnhancedNavigationMenu.test.tsx +0 -555
  455. package/src/rbac/components/EnhancedNavigationMenu.tsx +0 -293
  456. package/src/rbac/components/NavigationProvider.test.tsx +0 -481
  457. package/src/rbac/components/NavigationProvider.tsx +0 -345
  458. package/src/rbac/components/PagePermissionProvider.test.tsx +0 -476
  459. package/src/rbac/components/PagePermissionProvider.tsx +0 -279
  460. package/src/rbac/components/PermissionEnforcer.tsx +0 -312
  461. package/src/rbac/components/RoleBasedRouter.tsx +0 -440
  462. package/src/rbac/components/SecureDataProvider.test.tsx +0 -543
  463. package/src/rbac/components/SecureDataProvider.tsx +0 -339
  464. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +0 -620
  465. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +0 -726
  466. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +0 -661
  467. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +0 -881
  468. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +0 -783
  469. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +0 -645
  470. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +0 -659
  471. package/src/rbac/hooks/permissions/useCachedPermissions.ts +0 -79
  472. package/src/rbac/hooks/permissions/useHasAllPermissions.ts +0 -90
  473. package/src/rbac/hooks/permissions/useHasAnyPermission.ts +0 -90
@@ -117,30 +117,30 @@ export function ContextSelector({
117
117
  showOrganisations = true,
118
118
  showEvents = true
119
119
  }: ContextSelectorProps) {
120
- const {
121
- organisations,
120
+ const {
121
+ organisations,
122
122
  selectedOrganisation,
123
123
  isLoading: orgLoading,
124
124
  error: orgError,
125
125
  refreshOrganisations
126
126
  } = useOrganisations();
127
-
128
- const {
129
- events,
130
- selectedEvent,
131
- isLoading: eventLoading,
132
- error: eventError,
127
+
128
+ const {
129
+ events,
130
+ selectedEvent,
131
+ isLoading: eventLoading,
132
+ error: eventError,
133
133
  refreshEvents
134
134
  } = useEvents();
135
-
135
+
136
136
  const { isSuperAdmin } = useRBAC();
137
-
137
+
138
138
  const isLoading = (showOrganisations && orgLoading) || (showEvents && eventLoading);
139
139
  const hasError = (showOrganisations && orgError) || (showEvents && eventError);
140
- const hasItems =
141
- (showOrganisations && (organisations?.length || 0) > 0) ||
140
+ const hasItems =
141
+ (showOrganisations && (organisations?.length || 0) > 0) ||
142
142
  (showEvents && (events?.length || 0) > 0);
143
-
143
+
144
144
  // Determine current selection value
145
145
  // Priority: Event selection takes precedence over organisation selection
146
146
  // When an event is selected, show the event (even if an org is also selected)
@@ -154,10 +154,10 @@ export function ContextSelector({
154
154
  }
155
155
  return '';
156
156
  }, [showOrganisations, showEvents, selectedOrganisation?.id, selectedEvent]);
157
-
157
+
158
158
  const handleValueChange = (value: string) => {
159
159
  if (disabled || isLoading) return;
160
-
160
+
161
161
  if (value.startsWith('org:') && showOrganisations) {
162
162
  const orgId = value.replace('org:', '');
163
163
  const org = organisations?.find(o => o.id === orgId);
@@ -172,7 +172,7 @@ export function ContextSelector({
172
172
  }
173
173
  }
174
174
  };
175
-
175
+
176
176
  const handleRetry = async () => {
177
177
  try {
178
178
  if (showOrganisations && orgError) {
@@ -185,24 +185,24 @@ export function ContextSelector({
185
185
  logger.error('ContextSelector', 'Failed to refresh:', error);
186
186
  }
187
187
  };
188
-
188
+
189
189
  // Loading state - only show loading if we don't have any items yet
190
190
  // This prevents the selector from being stuck in loading when data exists
191
191
  if (isLoading && !hasItems) {
192
- const loadingText = compact ? "Loading..." :
192
+ const loadingText = compact ? "Loading..." :
193
193
  showOrganisations && showEvents ? "Loading organisations and events..." :
194
- showOrganisations ? "Loading organisations..." :
195
- "Loading events...";
194
+ showOrganisations ? "Loading organisations..." :
195
+ "Loading events...";
196
196
  return (
197
- <div className={`flex items-center gap-2 ${className}`}>
198
- <LoadingSpinner size="sm" />
197
+ <p className={className}>
198
+ <LoadingSpinner size="sm" /><br/>
199
199
  <span className="text-sm text-muted-foreground">
200
200
  {loadingText}
201
201
  </span>
202
- </div>
202
+ </p>
203
203
  );
204
204
  }
205
-
205
+
206
206
  // Error state
207
207
  if (hasError) {
208
208
  const errorMessages = [];
@@ -213,17 +213,15 @@ export function ContextSelector({
213
213
  errorMessages.push(`Failed to load events: ${eventError.message}`);
214
214
  }
215
215
  return (
216
- <div className={`space-y-2 ${className}`}>
217
- <Alert variant="destructive">
218
- <AlertCircle className="size-4" />
219
- <AlertDescription>
220
- {errorMessages.join(' ')}
221
- </AlertDescription>
222
- </Alert>
216
+ <Alert variant="destructive" className={`space-y-2 ${className}`}>
217
+ <AlertCircle className="size-4" />
218
+ <AlertDescription>
219
+ {errorMessages.join(' ')}
220
+ </AlertDescription>
223
221
  {showRetryButton && (
224
- <Button
225
- variant="outline"
226
- size="sm"
222
+ <Button
223
+ variant="outline"
224
+ size="sm"
227
225
  onClick={handleRetry}
228
226
  disabled={isLoading}
229
227
  className="w-full"
@@ -232,29 +230,27 @@ export function ContextSelector({
232
230
  Retry
233
231
  </Button>
234
232
  )}
235
- </div>
233
+ </Alert>
236
234
  );
237
235
  }
238
-
236
+
239
237
  // No items available
240
238
  if (!hasItems) {
241
239
  if (showNoItemsMessage) {
242
- const noItemsText =
240
+ const noItemsText =
243
241
  showOrganisations && showEvents ? "No organisations or events available. Please contact your administrator." :
244
- showOrganisations ? "No organisations available. Please contact your administrator." :
245
- "No events available. Please contact your administrator.";
242
+ showOrganisations ? "No organisations available. Please contact your administrator." :
243
+ "No events available. Please contact your administrator.";
246
244
  return (
247
- <div className={`space-y-2 ${className}`}>
248
- <Alert>
245
+ <Alert className={`space-y-2 ${className}`}>
249
246
  <AlertCircle className="size-4" />
250
247
  <AlertDescription>
251
248
  {noItemsText}
252
249
  </AlertDescription>
253
- </Alert>
254
250
  {showRetryButton && (
255
- <Button
256
- variant="outline"
257
- size="sm"
251
+ <Button
252
+ variant="outline"
253
+ size="sm"
258
254
  onClick={handleRetry}
259
255
  disabled={isLoading}
260
256
  className="w-full"
@@ -263,34 +259,34 @@ export function ContextSelector({
263
259
  Check Again
264
260
  </Button>
265
261
  )}
266
- </div>
262
+ </Alert>
267
263
  );
268
264
  }
269
265
  return null;
270
266
  }
271
-
267
+
272
268
  // Format display value
273
269
  // Priority: Event selection takes precedence over organisation selection (matches currentValue)
274
270
  const displayValue = useMemo(() => {
275
271
  if (showEvents && selectedEvent) {
276
272
  return (
277
- <div className="flex items-center gap-2">
278
- <Calendar className="size-4 flex-shrink-0" />
273
+ <>
274
+ <Calendar className="inline-block size-4 mr-2" />
279
275
  <span className="truncate">{selectedEvent.event_name}</span>
280
- </div>
276
+ </>
281
277
  );
282
278
  }
283
279
  if (showOrganisations && selectedOrganisation) {
284
280
  return (
285
- <div className="flex items-center gap-2">
286
- <Building2 className="size-4 flex-shrink-0" />
281
+ <>
282
+ <Building2 className="inline-block size-4 mr-2" />
287
283
  <span className="truncate">{selectedOrganisation.display_name}</span>
288
- </div>
284
+ </>
289
285
  );
290
286
  }
291
287
  return null;
292
288
  }, [showOrganisations, showEvents, selectedOrganisation, selectedEvent]);
293
-
289
+
294
290
  // Determine placeholder text based on what's shown
295
291
  const effectivePlaceholder = useMemo(() => {
296
292
  if (placeholder !== "Select organisation or event") {
@@ -307,78 +303,69 @@ export function ContextSelector({
307
303
  }
308
304
  return placeholder;
309
305
  }, [placeholder, showOrganisations, showEvents]);
310
-
306
+
311
307
  return (
312
- <div className={className} data-testid="context-selector">
313
- <Select
314
- value={currentValue}
315
- onValueChange={handleValueChange}
316
- disabled={disabled || isLoading}
308
+ <Select
309
+ value={currentValue}
310
+ onValueChange={handleValueChange}
311
+ disabled={disabled || isLoading}
312
+ className={className} data-testid="context-selector"
313
+ >
314
+ <SelectTrigger
315
+ className="text-left"
316
+ variant="outline"
317
317
  >
318
- <SelectTrigger
319
- className="text-left"
320
- variant="outline"
321
- >
322
- <SelectValue placeholder={effectivePlaceholder}>
323
- {displayValue}
324
- </SelectValue>
325
- </SelectTrigger>
326
- <SelectContent>
327
- {/* Organisations Section */}
328
- {showOrganisations && organisations && organisations.length > 0 && (
329
- <>
330
- <SelectGroup>
331
- <SelectLabel>Organisations</SelectLabel>
332
- {organisations.map((org) => (
333
- <SelectItem
334
- key={org.id}
335
- value={`org:${org.id}`}
336
- >
337
- <div className="flex items-center gap-2">
338
- <Building2 className="size-4" />
339
- <div className="flex flex-col">
340
- <span className="font-medium">{org.display_name}</span>
341
- {!compact && org.description && (
342
- <span className="text-xs text-muted-foreground truncate max-w-40">
343
- {org.description}
344
- </span>
345
- )}
346
- </div>
347
- </div>
348
- </SelectItem>
349
- ))}
350
- </SelectGroup>
351
- {showEvents && events && events.length > 0 && <SelectSeparator />}
352
- </>
353
- )}
354
-
355
- {/* Events Section */}
356
- {showEvents && events && events.length > 0 && (
318
+ <SelectValue placeholder={effectivePlaceholder}>
319
+ {displayValue}
320
+ </SelectValue>
321
+ </SelectTrigger>
322
+ <SelectContent>
323
+ {/* Organisations Section */}
324
+ {showOrganisations && organisations && organisations.length > 0 && (
325
+ <>
357
326
  <SelectGroup>
358
- <SelectLabel>Events</SelectLabel>
359
- {events.map((event) => (
360
- <SelectItem
361
- key={event.event_id || event.id}
362
- value={`event:${event.event_id || event.id}`}
327
+ <SelectLabel>Organisations</SelectLabel>
328
+ {organisations.map((org) => (
329
+ <SelectItem
330
+ key={org.id}
331
+ value={`org:${org.id}`}
363
332
  >
364
- <div className="flex items-center gap-2">
365
- <Calendar className="size-4" />
366
- <div className="flex flex-col">
367
- <span className="font-medium">{event.event_name}</span>
368
- {!compact && event.event_date && (
369
- <span className="text-xs text-muted-foreground">
370
- {new Date(event.event_date).toLocaleDateString()}
371
- </span>
372
- )}
373
- </div>
374
- </div>
333
+ <Building2 className="inline-block size-4 mr-2" />
334
+ <span className="font-medium">{org.display_name}</span><br />
335
+ {!compact && org.description && (
336
+ <span className="text-xs text-muted-foreground">
337
+ {org.description}
338
+ </span>
339
+ )}
375
340
  </SelectItem>
376
341
  ))}
377
342
  </SelectGroup>
378
- )}
379
- </SelectContent>
380
- </Select>
381
- </div>
343
+ {showEvents && events && events.length > 0 && <SelectSeparator />}
344
+ </>
345
+ )}
346
+
347
+ {/* Events Section */}
348
+ {showEvents && events && events.length > 0 && (
349
+ <SelectGroup>
350
+ <SelectLabel>Events</SelectLabel>
351
+ {events.map((event) => (
352
+ <SelectItem
353
+ key={event.event_id || event.id}
354
+ value={`event:${event.event_id || event.id}`}
355
+ >
356
+ <Calendar className=" inline-block size-4 mr-2" />
357
+ <span className="font-medium">{event.event_name}</span><br />
358
+ {!compact && event.event_date && (
359
+ <span className="text-xs text-muted-foreground">
360
+ {new Date(event.event_date).toLocaleDateString()}
361
+ </span>
362
+ )}
363
+ </SelectItem>
364
+ ))}
365
+ </SelectGroup>
366
+ )}
367
+ </SelectContent>
368
+ </Select>
382
369
  );
383
370
  }
384
371
 
@@ -0,0 +1,293 @@
1
+ # DataTable Component Audit Report
2
+
3
+ **Date**: 2024-12-17
4
+ **Last Updated**: 2024-12-17 (All deprecated components deleted)
5
+ **Scope**: Complete audit of DataTable component structure, imports/exports, and component status
6
+
7
+ ## Executive Summary
8
+
9
+ This audit examined all subcomponents, hooks, and utilities within the DataTable component to identify:
10
+ - Deprecated/unused components
11
+ - Export/import structure
12
+ - Component usage patterns
13
+ - Potential cleanup opportunities
14
+
15
+ ## Component Status Summary
16
+
17
+ ### ✅ ACTIVE COMPONENTS (Used in Production)
18
+
19
+ | Component | Status | Location | Used By | Notes |
20
+ |-----------|--------|----------|---------|-------|
21
+ | **ActionButtons** | ✅ Active | `components/ActionButtons.tsx` | `RowComponent` | Used for row actions |
22
+ | **BulkOperationsDropdown** | ✅ Active | `components/BulkOperationsDropdown.tsx` | `DataTableToolbar` | Bulk operations menu |
23
+ | **ColumnFilter** | ✅ Active | `components/ColumnFilter.tsx` | `FilterRow` | Individual column filtering |
24
+ | **ColumnVisibilityDropdown** | ✅ Active | `components/ColumnVisibilityDropdown.tsx` | `DataTableToolbar` | Show/hide columns |
25
+ | **DataTableCore** | ✅ Active | `components/DataTableCore.tsx` | `DataTable.tsx` | Main orchestrator |
26
+ | **DataTableErrorBoundary** | ✅ Active | `components/DataTableErrorBoundary.tsx` | `DataTable.tsx` | Error handling |
27
+ | **DataTableLayout** | ✅ Active | `components/DataTableLayout.tsx` | `DataTableCore` | Main layout component |
28
+ | **DataTableModals** | ✅ Active | `components/DataTableModals.tsx` | `DataTableLayout` | Modal container |
29
+ | **DataTableToolbar** | ✅ Active | `components/DataTableToolbar.tsx` | `DataTableLayout` | Toolbar with controls |
30
+ | **EditableRow** | ✅ Active | `components/EditableRow.tsx` | `RowComponent` | Inline row editing |
31
+ | **EmptyState** | ✅ Active | `components/EmptyState.tsx` | `UnifiedTableBody` | Empty state display |
32
+ | **FilterRow** | ✅ Active | `components/FilterRow.tsx` | `UnifiedTableBody` | Filter row for columns |
33
+ | **GroupingDropdown** | ✅ Active | `components/GroupingDropdown.tsx` | `DataTableToolbar` | Group by dropdown |
34
+ | **ImportModal** | ✅ Active | `components/ImportModal.tsx` | `DataTableModals` | CSV import modal |
35
+ | **LoadingState** | ✅ Active | `components/LoadingState.tsx` | `DataTableCore`, `UnifiedTableBody` | Loading spinner |
36
+ | **PaginationControls** | ✅ Active | `components/PaginationControls.tsx` | `DataTableLayout` | Pagination UI |
37
+ | **RowComponent** | ✅ Active | `components/RowComponent.tsx` | `UnifiedTableBody` | Row rendering (as MemoizedRow) |
38
+ | **SortIndicator** | ✅ Active | `components/SortIndicator.tsx` | `DataTableLayout` | Sorting chevrons |
39
+ | **UnifiedTableBody** | ✅ Active | `components/UnifiedTableBody.tsx` | `DataTableLayout` | Table body with virtualization |
40
+
41
+ ### ❌ DELETED COMPONENTS (Removed 2024-12-17)
42
+
43
+ | Component | Status | Location | Reason | Action Taken |
44
+ |-----------|--------|----------|--------|--------------|
45
+ | **GroupHeader** | ❌ **DELETED** | `components/GroupHeader.tsx` | Not imported/used anywhere | ✅ **DELETED** - Functionality implemented inline in `RowComponent` |
46
+ | **ViewRowModal** | ❌ **DELETED** | `components/ViewRowModal.tsx` | Only used in tests, not integrated | ✅ **DELETED** |
47
+ | **ExpandButton** | ❌ **DELETED** | `components/ExpandButton.tsx` | Not used in production; functionality inline | ✅ **DELETED** - Removed from types.ts |
48
+ | **DraggableColumnHeader** | ❌ **DELETED** | `components/DraggableColumnHeader.tsx` | Not imported anywhere | ✅ **DELETED** |
49
+ | **VirtualizedDataTable** | ❌ **DELETED** | `components/VirtualizedDataTable.tsx` | Replaced by UnifiedTableBody | ✅ **DELETED** (previous cleanup) |
50
+
51
+ ### 🔧 UTILITY FILES
52
+
53
+ | Utility | Status | Location | Used By | Notes |
54
+ |---------|--------|----------|---------|-------|
55
+ | **cellValueUtils** | ✅ Active | `components/cellValueUtils.ts` | `DataTableCore` | Converts data to cell values |
56
+ | **EditFields** | ✅ Active | `components/EditFields.tsx` | `UnifiedTableBody`, `EditableRow` | Field rendering for editing |
57
+
58
+ ### 📁 INTERNAL COMPONENTS (Not Exported)
59
+
60
+ | Component | Status | Location | Used By | Notes |
61
+ |-----------|--------|----------|---------|-------|
62
+ | **AccessDeniedPage** | ✅ Active | `components/AccessDeniedPage.tsx` | `DataTableCore` | RBAC access denied page |
63
+ | **EditFields** | ✅ Active | `components/EditFields.tsx` | `UnifiedTableBody`, `EditableRow` | Internal field rendering |
64
+
65
+ ## Hooks Status
66
+
67
+ ### ✅ ACTIVE HOOKS
68
+
69
+ | Hook | Status | Location | Used By | Notes |
70
+ |------|--------|----------|---------|-------|
71
+ | **useColumnOrderPersistence** | ✅ Active | `hooks/useColumnOrderPersistence.ts` | `DataTableCore` | Persists column order |
72
+ | **useColumnVisibilityPersistence** | ✅ Active | `hooks/useColumnVisibilityPersistence.ts` | `DataTableCore` | Persists column visibility |
73
+ | **useDataTableConfiguration** | ✅ Active | `hooks/useDataTableConfiguration.ts` | `DataTableCore` | Configuration management |
74
+ | **useDataTableDataPipeline** | ✅ Active | `hooks/useDataTableDataPipeline.ts` | `DataTableCore` | Data processing pipeline |
75
+ | **useDataTablePermissions** | ✅ Active | `hooks/useDataTablePermissions.ts` | `DataTableCore` | RBAC permissions |
76
+ | **useDataTableState** | ✅ Active | `hooks/useDataTableState.ts` | `DataTableCore` | State management |
77
+ | **useEffectiveColumnOrder** | ✅ Active | `hooks/useEffectiveColumnOrder.ts` | `DataTableCore` | Column ordering logic |
78
+ | **useHierarchicalState** | ✅ Active | `hooks/useHierarchicalState.ts` | `DataTableCore` | Hierarchical data state |
79
+ | **useKeyboardNavigation** | ✅ Active | `hooks/useKeyboardNavigation.ts` | `DataTableCore` | Keyboard navigation |
80
+ | **useServerSideDataEffect** | ✅ Active | `hooks/useServerSideDataEffect.ts` | `DataTableCore` | Server-side data fetching |
81
+ | **useTableColumns** | ✅ Active | `hooks/useTableColumns.ts` | `DataTableCore` | Column management |
82
+ | **useTableHandlers** | ✅ Active | `hooks/useTableHandlers.ts` | `DataTableCore` | Event handlers |
83
+
84
+ ### 🔧 COMPONENT-LEVEL HOOKS
85
+
86
+ | Hook | Status | Location | Used By | Notes |
87
+ |------|--------|----------|---------|-------|
88
+ | **useImportModalFocus** | ✅ Active | `components/hooks/useImportModalFocus.ts` | `DataTableCore` | Focus management for import modal |
89
+ | **usePermissionTracking** | ✅ Active | `components/hooks/usePermissionTracking.ts` | `DataTableCore` | Permission change tracking |
90
+
91
+ ## Utilities Status
92
+
93
+ ### ✅ ACTIVE UTILITIES
94
+
95
+ | Utility | Status | Location | Used By | Notes |
96
+ |---------|--------|----------|---------|-------|
97
+ | **a11yUtils** | ✅ Active | `utils/a11yUtils.ts` | Multiple components | Accessibility utilities |
98
+ | **aggregationUtils** | ✅ Active | `utils/aggregationUtils.ts` | Exported, used externally | Aggregation functions |
99
+ | **columnUtils** | ✅ Active | `utils/columnUtils.ts` | Multiple components | Column helper functions |
100
+ | **errorHandling** | ✅ Active | `utils/errorHandling.ts` | `useDataTablePerformance` | Error handling stubs (used by performance hook) |
101
+ | **exportUtils** | ✅ Active | `utils/exportUtils.ts` | `DataTableLayout` | CSV export functionality |
102
+ | **flexibleImport** | ✅ Active | `utils/flexibleImport.ts` | Exported, used externally | Flexible CSV import |
103
+ | **hierarchicalSorting** | ✅ Active | `utils/hierarchicalSorting.ts` | Used internally | Hierarchical data sorting |
104
+ | **hierarchicalUtils** | ✅ Active | `utils/hierarchicalUtils.ts` | `RowComponent` | Hierarchical data utilities |
105
+ | **paginationUtils** | ✅ Active | `utils/paginationUtils.ts` | Used internally | Pagination calculations |
106
+ | **performanceUtils** | ✅ Active | `utils/performanceUtils.ts` | Exported, used externally | Performance utilities |
107
+ | **rowUtils** | ✅ Active | `utils/rowUtils.ts` | Multiple components | Row helper functions |
108
+
109
+ ### ❌ DEPRECATED UTILITIES
110
+
111
+ | Utility | Status | Location | Notes |
112
+ |---------|--------|----------|-------|
113
+ | **debugTools** | ❌ **DELETED** | `utils/debugTools.ts` | Unused debugging infrastructure | ✅ **DELETED** |
114
+
115
+ ## Context Status
116
+
117
+ ### ✅ ACTIVE CONTEXT
118
+
119
+ | Context | Status | Location | Used By | Notes |
120
+ |---------|--------|----------|---------|-------|
121
+ | **DataTableContext** | ✅ Active | `context/DataTableContext.tsx` | Used internally | Newer context implementation |
122
+
123
+ ### ❌ DEPRECATED CONTEXT
124
+
125
+ | Context | Status | Location | Notes |
126
+ |---------|--------|----------|-------|
127
+ | **core/DataTableContext** | ❌ **DELETED** | `core/DataTableContext.tsx` | Already deleted - replaced by hook-based architecture |
128
+
129
+ ## Core Architecture Status
130
+
131
+ ### ✅ ACTIVE CORE COMPONENTS
132
+
133
+ | Component | Status | Location | Used By | Notes |
134
+ |-----------|--------|----------|---------|-------|
135
+ | **ActionManager** | ✅ Active | `core/ActionManager.ts` | Used by core architecture | Action management |
136
+ | **ColumnFactory** | ✅ Active | `core/ColumnFactory.ts` | `DataTableCore`, exported | Column creation |
137
+ | **ColumnManager** | ✅ Active | `core/ColumnManager.ts` | Used by core architecture | Column management |
138
+ | **DataManager** | ✅ Active | `core/DataManager.ts` | Used by core architecture | Data management |
139
+ | **LocalDataAdapter** | ✅ Active | `core/LocalDataAdapter.ts` | Used by core architecture | Local data adapter |
140
+ | **PluginRegistry** | ✅ Active | `core/PluginRegistry.ts` | Used by core architecture | Plugin system |
141
+ | **StateManager** | ✅ Active | `core/StateManager.ts` | Used by core architecture | State management |
142
+ | **interfaces** | ✅ Active | `core/interfaces.ts` | Core architecture | Type definitions |
143
+
144
+ ## Export Structure Analysis
145
+
146
+ ### Main Exports (`index.ts`)
147
+
148
+ **Exported Components:**
149
+ - ✅ `DataTable` - Main component
150
+ - ✅ `DataTableCore` - Core orchestrator
151
+ - ✅ `DataTableErrorBoundary` - Error boundary
152
+ - ✅ `PaginationControls`, `EnhancedPaginationControls` - Pagination
153
+ - ✅ All components from `components/index.ts` (via `export * from './components'`)
154
+ - ✅ All utilities from `utils/index.ts` (via `export * from './utils'`)
155
+
156
+ ### Component Exports (`components/index.ts`)
157
+
158
+ **Exported:**
159
+ - ✅ ActionButtons
160
+ - ✅ BulkOperationsDropdown
161
+ - ✅ ColumnVisibilityDropdown
162
+ - ✅ UnifiedTableBody
163
+ - ✅ EditableRow
164
+ - ✅ DataTableToolbar
165
+ - ✅ DataTableModals
166
+ - ✅ ImportModal (+ ImportModalConfig type)
167
+ - ❌ **GroupHeader** - Exported but UNUSED
168
+ - ✅ GroupingDropdown
169
+ - ✅ DataTableErrorBoundary
170
+ - ✅ PaginationControls
171
+ - ✅ LoadingState
172
+ - ✅ EmptyState
173
+ - ✅ SortIndicator (+ SortIndicatorProps type)
174
+
175
+ **NOT Exported (Internal Only):**
176
+ - AccessDeniedPage
177
+ - ColumnFilter
178
+ - DataTableCore
179
+ - DataTableLayout
180
+ - EditFields
181
+ - FilterRow
182
+ - RowComponent (exported as MemoizedRow)
183
+ - cellValueUtils
184
+
185
+ ## Detailed Findings
186
+
187
+ ### ✅ All Deprecated Components Deleted (2024-12-17)
188
+
189
+ The following components, hooks, and utilities have been successfully removed:
190
+
191
+ 1. **GroupHeader** - ✅ DELETED
192
+ - Component and test file removed
193
+ - Removed from exports
194
+ - Functionality handled inline by `RowComponent`
195
+
196
+ 2. **ViewRowModal** - ✅ DELETED
197
+ - Component and test file removed
198
+ - Never integrated into DataTableModals
199
+
200
+ 3. **ExpandButton** - ✅ DELETED
201
+ - Component and test file removed
202
+ - `ExpandButtonProps` interface removed from `types.ts`
203
+ - `expandButton` prop removed from `HierarchicalConfig`
204
+ - Functionality handled inline by `RowComponent`
205
+
206
+ 4. **DraggableColumnHeader** - ✅ DELETED
207
+ - Component removed
208
+ - Drag-and-drop UI not implemented (column reordering persistence exists via `useColumnOrderPersistence`)
209
+
210
+ 5. **useColumnReordering** - ✅ DELETED
211
+ - Hook and test file removed
212
+ - Related to DraggableColumnHeader
213
+
214
+ 6. **debugTools** - ✅ DELETED
215
+ - Utility removed (unused debugging infrastructure)
216
+
217
+ 7. **VirtualizedDataTable** - ✅ DELETED (previous cleanup)
218
+ - Replaced by UnifiedTableBody
219
+
220
+ 8. **core/DataTableContext** - ✅ DELETED (previous cleanup)
221
+ - Replaced by hook-based architecture
222
+
223
+ All related documentation has been updated to reflect these deletions.
224
+
225
+ ## Import/Export Structure
226
+
227
+ ### External Usage Check
228
+
229
+ **Components imported from `@jmruthers/pace-core`:**
230
+ - Only `DataTable` main component is imported externally
231
+ - No external usage of subcomponents found
232
+ - All subcomponents are internal to the DataTable system
233
+
234
+ ### Internal Dependencies
235
+
236
+ **Clean Structure:**
237
+ - ✅ No circular dependencies detected
238
+ - ✅ Clear separation between components, hooks, and utils
239
+ - ✅ Proper export hierarchy
240
+
241
+ ## Recommendations
242
+
243
+ ### ✅ Completed Actions (2024-12-17)
244
+
245
+ All deprecated components have been successfully deleted:
246
+ 1. ✅ **GroupHeader** - Deleted component, test, and removed from exports
247
+ 2. ✅ **ViewRowModal** - Deleted component and test
248
+ 3. ✅ **ExpandButton** - Deleted component, test, and removed from types.ts
249
+ 4. ✅ **DraggableColumnHeader** - Deleted component
250
+ 5. ✅ **useColumnReordering** - Deleted hook and test
251
+ 6. ✅ **debugTools** - Deleted utility
252
+ 7. ✅ **VirtualizedDataTable** - Already deleted (previous cleanup)
253
+ 8. ✅ **core/DataTableContext** - Already deleted (previous cleanup)
254
+
255
+ ### Code Quality Improvements
256
+
257
+ 1. ✅ **Removed unused exports** from `components/index.ts`
258
+
259
+ 2. **Document internal components** that are not exported but used internally
260
+
261
+ 3. **Consider consolidating** inline group header logic in RowComponent into a shared utility if it grows
262
+
263
+ ## Summary Statistics
264
+
265
+ - **Total Components**: 20 (after cleanup)
266
+ - ✅ Active: 20
267
+ - ❌ Deleted: 5 (GroupHeader, ViewRowModal, ExpandButton, DraggableColumnHeader, VirtualizedDataTable)
268
+
269
+ - **Total Hooks**: 12 (after cleanup)
270
+ - ✅ Active: 12
271
+ - ❌ Deleted: 1 (useColumnReordering)
272
+
273
+ - **Total Utilities**: 10 (after cleanup)
274
+ - ✅ Active: 10
275
+ - ❌ Deleted: 1 (debugTools)
276
+
277
+ - **Total Core Components**: 8
278
+ - ✅ Active: 8
279
+
280
+ ## Conclusion
281
+
282
+ The DataTable component structure is well-organized with clear separation of concerns. All deprecated and unused components have been successfully removed:
283
+
284
+ ✅ **Cleanup Complete (2024-12-17)**
285
+ - All deprecated components deleted
286
+ - All unused hooks removed
287
+ - All unused utilities removed
288
+ - Type references cleaned up
289
+ - Documentation updated
290
+ - Export structure cleaned
291
+
292
+ All remaining active components, hooks, and utilities are properly used and integrated into the DataTable system. The codebase is now cleaner and more maintainable.
293
+
@@ -354,7 +354,11 @@ describe('DataTableCore Component', () => {
354
354
  />
355
355
  );
356
356
 
357
- expect(screen.getByText('Loading...')).toBeInTheDocument();
357
+ // There are two "Loading..." texts (sr-only and visible), use getAllByText
358
+ const loadingTexts = screen.getAllByText('Loading...');
359
+ expect(loadingTexts.length).toBeGreaterThan(0);
360
+ // Check that the visible text is present
361
+ expect(screen.getByText('Loading...', { selector: 'strong' })).toBeInTheDocument();
358
362
  });
359
363
  });
360
364
 
@@ -1267,7 +1271,11 @@ describe('DataTableCore Component', () => {
1267
1271
  />
1268
1272
  );
1269
1273
 
1270
- expect(screen.getByText('Loading...')).toBeInTheDocument();
1274
+ // There are two "Loading..." texts (sr-only and visible), use getAllByText
1275
+ const loadingTexts = screen.getAllByText('Loading...');
1276
+ expect(loadingTexts.length).toBeGreaterThan(0);
1277
+ // Check that the visible text is present
1278
+ expect(screen.getByText('Loading...', { selector: 'strong' })).toBeInTheDocument();
1271
1279
  });
1272
1280
 
1273
1281
  it('handles permission loading state', () => {