@jmruthers/pace-core 0.6.6 → 0.6.8

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 (292) hide show
  1. package/{scripts/audit/audit-dependencies.cjs → audit-tool/00-dependencies.cjs} +227 -22
  2. package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
  3. package/audit-tool/audits/02-project-structure.cjs +240 -0
  4. package/audit-tool/audits/03-architecture.cjs +224 -0
  5. package/audit-tool/audits/04-code-quality.cjs +149 -0
  6. package/audit-tool/audits/05-styling.cjs +224 -0
  7. package/audit-tool/audits/06-security-rbac.cjs +554 -0
  8. package/audit-tool/audits/07-api-tech-stack.cjs +355 -0
  9. package/audit-tool/audits/08-testing-documentation.cjs +202 -0
  10. package/audit-tool/audits/09-operations.cjs +208 -0
  11. package/audit-tool/index.cjs +295 -0
  12. package/audit-tool/utils/code-utils.cjs +218 -0
  13. package/audit-tool/utils/file-utils.cjs +230 -0
  14. package/audit-tool/utils/report-utils.cjs +380 -0
  15. package/cursor-rules/00-standards-overview.mdc +156 -0
  16. package/cursor-rules/{00-pace-core-compliance.mdc → 01-pace-core-compliance.mdc} +187 -34
  17. package/cursor-rules/02-project-structure.mdc +37 -5
  18. package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +125 -11
  19. package/cursor-rules/04-code-quality.mdc +419 -0
  20. package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +55 -10
  21. package/cursor-rules/{09-rbac-compliance.mdc → 06-security-rbac.mdc} +62 -6
  22. package/cursor-rules/07-api-tech-stack.mdc +377 -0
  23. package/cursor-rules/08-testing-documentation.mdc +324 -0
  24. package/cursor-rules/09-operations.mdc +365 -0
  25. package/dist/DataTable-6RMSCQJ6.js +15 -0
  26. package/dist/{DataTable-2N_tqbfq.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
  27. package/dist/{PublicPageProvider-BBH6Vqg7.d.ts → PublicPageProvider-CIGSujI2.d.ts} +40 -24
  28. package/dist/{UnifiedAuthProvider-ZT6TIGM7.js → UnifiedAuthProvider-7SNDOWYD.js} +2 -2
  29. package/dist/{api-Y4MQWOFW.js → api-7P7DI652.js} +1 -1
  30. package/dist/{chunk-MAGBIDNS.js → chunk-4DDCYDQ3.js} +8 -7
  31. package/dist/{chunk-BVP2BCJF.js → chunk-5W2A3DRC.js} +10 -9
  32. package/dist/{chunk-SD6WQY43.js → chunk-7ILTDCL2.js} +9 -1
  33. package/dist/{chunk-3QC3KRHK.js → chunk-A3W6LW53.js} +16 -1
  34. package/dist/{chunk-3O3WHILE.js → chunk-EF2UGZWY.js} +239 -63
  35. package/dist/{chunk-LAZMKTTF.js → chunk-EURB7QFZ.js} +341 -337
  36. package/dist/{chunk-2HGJFNAH.js → chunk-FEJLJNWA.js} +1 -15
  37. package/dist/{chunk-7TYHROIV.js → chunk-GS5672WG.js} +55 -13
  38. package/dist/{chunk-UIYSCEV7.js → chunk-IUBRCBSY.js} +1 -1
  39. package/dist/{chunk-ZFYPMX46.js → chunk-LX6U42O3.js} +1 -1
  40. package/dist/{chunk-FENMYN2U.js → chunk-MPBLMWVR.js} +3 -3
  41. package/dist/{chunk-ZS5VO5JB.js → chunk-NKHKXPI4.js} +408 -453
  42. package/dist/{chunk-A55DK444.js → chunk-OJ4SKRSV.js} +1 -7
  43. package/dist/{chunk-4T7OBVTU.js → chunk-S6ZQKDY6.js} +1 -1
  44. package/dist/{chunk-FTCRZOG2.js → chunk-T5CVK4R3.js} +5 -5
  45. package/dist/{chunk-OHIK3MIO.js → chunk-Z2FNRKF3.js} +13 -13
  46. package/dist/components.d.ts +5 -4
  47. package/dist/components.js +29 -34
  48. package/dist/eslint-rules/index.cjs +22 -9
  49. package/{src/eslint-rules/rules/compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +184 -23
  50. package/dist/eslint-rules/rules/04-code-quality.cjs +346 -0
  51. package/dist/eslint-rules/rules/05-styling.cjs +61 -0
  52. package/dist/eslint-rules/rules/{rbac.cjs → 06-security-rbac.cjs} +34 -13
  53. package/dist/eslint-rules/rules/07-api-tech-stack.cjs +385 -0
  54. package/dist/eslint-rules/rules/08-testing.cjs +94 -0
  55. package/dist/{functions-DHebl8-F.d.ts → functions-lBy5L2ry.d.ts} +1 -1
  56. package/dist/hooks.d.ts +5 -5
  57. package/dist/hooks.js +8 -8
  58. package/dist/index.d.ts +7 -7
  59. package/dist/index.js +21 -20
  60. package/dist/providers.js +2 -2
  61. package/dist/rbac/index.d.ts +1 -1
  62. package/dist/rbac/index.js +8 -8
  63. package/dist/theming/runtime.d.ts +61 -1
  64. package/dist/theming/runtime.js +1 -1
  65. package/dist/{types-B-K_5VnO.d.ts → types-DXstZpNI.d.ts} +0 -17
  66. package/dist/types.d.ts +2 -2
  67. package/dist/{usePublicRouteParams-COZ28Mvq.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +19 -19
  68. package/dist/utils.d.ts +2 -2
  69. package/dist/utils.js +8 -8
  70. package/docs/README.md +1 -1
  71. package/docs/api/modules.md +106 -41
  72. package/docs/api-reference/components.md +18 -20
  73. package/docs/api-reference/hooks.md +80 -80
  74. package/docs/api-reference/types.md +1 -1
  75. package/docs/api-reference/utilities.md +1 -1
  76. package/docs/architecture/README.md +1 -1
  77. package/docs/core-concepts/events.md +3 -3
  78. package/docs/core-concepts/organisations.md +6 -6
  79. package/docs/core-concepts/permissions.md +6 -6
  80. package/docs/documentation-index.md +12 -18
  81. package/docs/getting-started/dependencies.md +23 -0
  82. package/docs/getting-started/documentation-index.md +1 -1
  83. package/docs/getting-started/examples/README.md +4 -4
  84. package/docs/getting-started/examples/full-featured-app.md +1 -1
  85. package/docs/getting-started/faq.md +2 -2
  86. package/docs/getting-started/quick-reference.md +4 -4
  87. package/docs/implementation-guides/app-layout.md +1 -1
  88. package/docs/implementation-guides/authentication.md +15 -15
  89. package/docs/implementation-guides/component-styling.md +1 -1
  90. package/docs/implementation-guides/data-tables.md +127 -34
  91. package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
  92. package/docs/implementation-guides/dynamic-colors.md +3 -3
  93. package/docs/implementation-guides/file-upload-storage.md +2 -2
  94. package/docs/implementation-guides/hierarchical-datatable.md +40 -60
  95. package/docs/implementation-guides/inactivity-tracking.md +3 -3
  96. package/docs/implementation-guides/large-datasets.md +3 -2
  97. package/docs/implementation-guides/organisation-security.md +2 -2
  98. package/docs/implementation-guides/performance.md +2 -2
  99. package/docs/implementation-guides/permission-enforcement.md +1 -1
  100. package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
  101. package/docs/migration/V0.4.0_rbac-migration.md +6 -6
  102. package/docs/rbac/README.md +5 -5
  103. package/docs/rbac/advanced-patterns.md +6 -6
  104. package/docs/rbac/api-reference.md +20 -20
  105. package/docs/rbac/event-based-apps.md +3 -3
  106. package/docs/rbac/examples.md +41 -41
  107. package/docs/rbac/getting-started.md +37 -37
  108. package/docs/rbac/performance.md +1 -1
  109. package/docs/rbac/quick-start.md +52 -52
  110. package/docs/rbac/secure-client-protection.md +1 -1
  111. package/docs/rbac/troubleshooting.md +1 -1
  112. package/docs/security/README.md +5 -5
  113. package/docs/standards/0-standards-overview.md +220 -0
  114. package/docs/standards/{00-pace-core-compliance.md → 1-pace-core-compliance-standards.md} +241 -185
  115. package/docs/standards/{02-project-structure.md → 2-project-structure-standards.md} +11 -47
  116. package/docs/standards/3-architecture-standards.md +606 -0
  117. package/docs/standards/4-code-quality-standards.md +728 -0
  118. package/docs/standards/{08-markup-quality.md → 5-styling-standards.md} +12 -9
  119. package/docs/standards/{09-rbac-compliance.md → 6-security-rbac-standards.md} +126 -18
  120. package/docs/standards/7-api-tech-stack-standards.md +662 -0
  121. package/docs/standards/8-testing-documentation-standards.md +401 -0
  122. package/docs/standards/9-operations-standards.md +1102 -0
  123. package/docs/standards/README.md +203 -104
  124. package/docs/troubleshooting/README.md +4 -4
  125. package/docs/troubleshooting/common-issues.md +2 -2
  126. package/docs/troubleshooting/debugging.md +9 -9
  127. package/docs/troubleshooting/migration.md +4 -4
  128. package/eslint-config-pace-core.cjs +50 -20
  129. package/package.json +50 -19
  130. package/scripts/eslint-audit.cjs +123 -0
  131. package/scripts/install-cursor-rules.cjs +11 -243
  132. package/scripts/install-eslint-config.cjs +349 -0
  133. package/scripts/validate-dependencies.cjs +248 -0
  134. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +2 -2
  135. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
  136. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +30 -18
  137. package/src/__tests__/integration/UserProfile.test.tsx +14 -14
  138. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
  139. package/src/__tests__/templates/accessibility.test.template.tsx +10 -9
  140. package/src/__tests__/templates/component.test.template.tsx +18 -15
  141. package/src/components/AddressField/AddressField.tsx +26 -1
  142. package/src/components/Alert/Alert.test.tsx +86 -22
  143. package/src/components/Alert/Alert.tsx +19 -11
  144. package/src/components/Badge/Badge.tsx +1 -1
  145. package/src/components/Calendar/Calendar.tsx +201 -47
  146. package/src/components/Checkbox/Checkbox.test.tsx +2 -1
  147. package/src/components/ContextSelector/ContextSelector.tsx +108 -126
  148. package/src/components/DataTable/AUDIT_REPORT.md +293 -0
  149. package/src/components/DataTable/DataTable.tsx +1 -19
  150. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +6 -2
  151. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +21 -6
  152. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +3 -2
  153. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
  154. package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
  155. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
  156. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
  157. package/src/components/DataTable/components/DataTableLayout.tsx +5 -16
  158. package/src/components/DataTable/components/EditableRow.tsx +5 -7
  159. package/src/components/DataTable/components/EmptyState.tsx +11 -10
  160. package/src/components/DataTable/components/FilterRow.tsx +2 -4
  161. package/src/components/DataTable/components/ImportModal.tsx +124 -126
  162. package/src/components/DataTable/components/LoadingState.tsx +5 -6
  163. package/src/components/DataTable/components/SortIndicator.tsx +50 -0
  164. package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
  165. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
  166. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
  167. package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
  168. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
  169. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +45 -27
  170. package/src/components/DataTable/components/index.ts +2 -1
  171. package/src/components/DataTable/types.ts +0 -18
  172. package/src/components/DataTable/utils/a11yUtils.ts +17 -0
  173. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +1 -1
  174. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
  175. package/src/components/DateTimeField/DateTimeField.tsx +7 -8
  176. package/src/components/Dialog/Dialog.test.tsx +1 -0
  177. package/src/components/Dialog/Dialog.tsx +25 -8
  178. package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
  179. package/src/components/FileUpload/FileUpload.test.tsx +45 -16
  180. package/src/components/FileUpload/FileUpload.tsx +141 -130
  181. package/src/components/NavigationMenu/NavigationMenu.test.tsx +48 -12
  182. package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +9 -9
  183. package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +30 -30
  184. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +4 -4
  185. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +7 -1
  186. package/src/components/Progress/Progress.tsx +2 -4
  187. package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
  188. package/src/components/Select/Select.tsx +86 -77
  189. package/src/components/Select/types.ts +3 -0
  190. package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
  191. package/src/hooks/__tests__/hooks.integration.test.tsx +49 -49
  192. package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +8 -5
  193. package/src/hooks/__tests__/useFileUrl.unit.test.ts +4 -0
  194. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +99 -99
  195. package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +45 -8
  196. package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +22 -2
  197. package/src/hooks/public/usePublicEvent.ts +5 -5
  198. package/src/hooks/public/usePublicEventLogo.ts +5 -5
  199. package/src/hooks/public/usePublicFileDisplay.ts +2 -2
  200. package/src/hooks/public/usePublicRouteParams.ts +13 -9
  201. package/src/hooks/useAddressAutocomplete.test.ts +18 -18
  202. package/src/hooks/useAppConfig.ts +2 -2
  203. package/src/hooks/useEventTheme.test.ts +7 -7
  204. package/src/hooks/useEventTheme.ts +2 -1
  205. package/src/hooks/useFileDisplay.ts +2 -2
  206. package/src/hooks/useFileUrl.ts +52 -8
  207. package/src/hooks/useOrganisationSecurity.test.ts +2 -1
  208. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
  209. package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
  210. package/src/providers/__tests__/EventProvider.test.tsx +61 -61
  211. package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
  212. package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
  213. package/src/providers/__tests__/ProviderLifecycle.test.tsx +38 -38
  214. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
  215. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
  216. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +10 -10
  217. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +15 -6
  218. package/src/rbac/__tests__/rbac-functions.test.ts +3 -3
  219. package/src/rbac/api.test.ts +104 -0
  220. package/src/rbac/engine.ts +1 -1
  221. package/src/rbac/hooks/useCan.test.ts +2 -2
  222. package/src/rbac/secureClient.ts +1 -1
  223. package/src/rbac/types/functions.ts +1 -1
  224. package/src/styles/core.css +7 -0
  225. package/src/theming/__tests__/parseEventColours.test.ts +118 -3
  226. package/src/theming/parseEventColours.ts +77 -11
  227. package/src/types/supabase.ts +2 -3
  228. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +9 -9
  229. package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
  230. package/src/utils/file-reference/__tests__/file-reference.test.ts +4 -0
  231. package/src/utils/formatting/formatDate.test.ts +3 -2
  232. package/src/utils/formatting/formatDateTime.test.ts +2 -2
  233. package/src/utils/google-places/googlePlacesUtils.test.ts +36 -24
  234. package/src/utils/storage/README.md +1 -1
  235. package/src/utils/storage/__tests__/helpers.unit.test.ts +19 -12
  236. package/src/utils/storage/helpers.test.ts +69 -3
  237. package/cursor-rules/01-standards-compliance.mdc +0 -285
  238. package/cursor-rules/04-testing-standards.mdc +0 -270
  239. package/cursor-rules/05-bug-reports-and-features.mdc +0 -248
  240. package/cursor-rules/06-code-quality.mdc +0 -311
  241. package/cursor-rules/07-tech-stack-compliance.mdc +0 -216
  242. package/cursor-rules/10-error-handling-patterns.mdc +0 -179
  243. package/cursor-rules/11-performance-optimization.mdc +0 -169
  244. package/cursor-rules/12-ci-cd-integration.mdc +0 -150
  245. package/dist/DataTable-LRJL4IRV.js +0 -15
  246. package/dist/eslint-rules/rules/compliance.cjs +0 -348
  247. package/dist/eslint-rules/rules/components.cjs +0 -113
  248. package/dist/eslint-rules/rules/imports.cjs +0 -102
  249. package/docs/best-practices/README.md +0 -472
  250. package/docs/best-practices/accessibility.md +0 -604
  251. package/docs/best-practices/common-patterns.md +0 -516
  252. package/docs/best-practices/deployment.md +0 -1103
  253. package/docs/best-practices/performance.md +0 -1328
  254. package/docs/best-practices/security.md +0 -940
  255. package/docs/best-practices/testing.md +0 -1034
  256. package/docs/rbac/compliance/compliance-guide.md +0 -544
  257. package/docs/standards/01-standards-compliance.md +0 -188
  258. package/docs/standards/03-solid-principles.md +0 -39
  259. package/docs/standards/04-testing-standards.md +0 -36
  260. package/docs/standards/05-bug-reports-and-features.md +0 -27
  261. package/docs/standards/06-code-quality.md +0 -34
  262. package/docs/standards/07-tech-stack-compliance.md +0 -30
  263. package/docs/standards/10-error-handling-patterns.md +0 -401
  264. package/docs/standards/11-performance-optimization.md +0 -348
  265. package/docs/standards/12-ci-cd-integration.md +0 -370
  266. package/docs/standards/ALIGNMENT_REVIEW_SUMMARY.md +0 -192
  267. package/scripts/audit/audit-compliance.cjs +0 -1295
  268. package/scripts/audit/audit-components.cjs +0 -260
  269. package/scripts/audit/audit-rbac.cjs +0 -954
  270. package/scripts/audit/audit-standards.cjs +0 -1268
  271. package/scripts/audit/index.cjs +0 -1927
  272. package/src/components/DataTable/components/DataTableBody.tsx +0 -478
  273. package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
  274. package/src/components/DataTable/components/ExpandButton.tsx +0 -113
  275. package/src/components/DataTable/components/GroupHeader.tsx +0 -54
  276. package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
  277. package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
  278. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
  279. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
  280. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
  281. package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
  282. package/src/components/DataTable/core/DataTableContext.tsx +0 -216
  283. package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
  284. package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
  285. package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
  286. package/src/components/DataTable/utils/debugTools.ts +0 -514
  287. package/src/eslint-rules/index.cjs +0 -22
  288. package/src/eslint-rules/rules/components.cjs +0 -113
  289. package/src/eslint-rules/rules/imports.cjs +0 -102
  290. package/src/eslint-rules/rules/rbac.cjs +0 -790
  291. package/src/eslint-rules/utils/helpers.cjs +0 -42
  292. package/src/eslint-rules/utils/manifest-loader.cjs +0 -75
@@ -55,7 +55,6 @@ import { LoadingSpinner } from '../LoadingSpinner/LoadingSpinner';
55
55
  import { RefreshCw, AlertCircle, Building2, Calendar } from 'lucide-react';
56
56
  import { useOrganisations } from '../../hooks/useOrganisations';
57
57
  import { useEvents } from '../../hooks/useEvents';
58
- import { useRBAC } from '../../rbac/hooks/useRBAC';
59
58
  import type { Organisation } from '../../types/organisation';
60
59
  import type { Event } from '../../types/event';
61
60
  import { logger } from '../../utils/core/logger';
@@ -117,32 +116,29 @@ export function ContextSelector({
117
116
  showOrganisations = true,
118
117
  showEvents = true
119
118
  }: ContextSelectorProps) {
120
- const {
121
- organisations,
119
+ const {
120
+ organisations,
122
121
  selectedOrganisation,
123
122
  isLoading: orgLoading,
124
123
  error: orgError,
125
124
  refreshOrganisations
126
125
  } = useOrganisations();
127
-
128
- const {
129
- events,
130
- selectedEvent,
131
- isLoading: eventLoading,
132
- error: eventError,
126
+
127
+ const {
128
+ events,
129
+ selectedEvent,
130
+ isLoading: eventLoading,
131
+ error: eventError,
133
132
  refreshEvents
134
133
  } = useEvents();
135
-
136
- const { isSuperAdmin } = useRBAC();
137
-
134
+
135
+
138
136
  const isLoading = (showOrganisations && orgLoading) || (showEvents && eventLoading);
139
137
  const hasError = (showOrganisations && orgError) || (showEvents && eventError);
140
- const hasItems =
141
- (showOrganisations && (organisations?.length || 0) > 0) ||
138
+ const hasItems =
139
+ (showOrganisations && (organisations?.length || 0) > 0) ||
142
140
  (showEvents && (events?.length || 0) > 0);
143
-
144
- // Call all hooks unconditionally at the top level
145
- // Hooks must be called in the same order on every render
141
+
146
142
  // Determine current selection value
147
143
  // Priority: Event selection takes precedence over organisation selection
148
144
  // When an event is selected, show the event (even if an org is also selected)
@@ -156,30 +152,30 @@ export function ContextSelector({
156
152
  }
157
153
  return '';
158
154
  }, [showOrganisations, showEvents, selectedOrganisation?.id, selectedEvent]);
159
-
160
- // Format display value - must be called before any early returns
155
+
156
+ // Format display value
161
157
  // Priority: Event selection takes precedence over organisation selection (matches currentValue)
162
158
  const displayValue = useMemo(() => {
163
159
  if (showEvents && selectedEvent) {
164
160
  return (
165
- <div className="flex items-center gap-2">
166
- <Calendar className="size-4 flex-shrink-0" />
161
+ <>
162
+ <Calendar className="inline-block size-4 mr-2" />
167
163
  <span className="truncate">{selectedEvent.event_name}</span>
168
- </div>
164
+ </>
169
165
  );
170
166
  }
171
167
  if (showOrganisations && selectedOrganisation) {
172
168
  return (
173
- <div className="flex items-center gap-2">
174
- <Building2 className="size-4 flex-shrink-0" />
169
+ <>
170
+ <Building2 className="inline-block size-4 mr-2" />
175
171
  <span className="truncate">{selectedOrganisation.display_name}</span>
176
- </div>
172
+ </>
177
173
  );
178
174
  }
179
175
  return null;
180
176
  }, [showOrganisations, showEvents, selectedOrganisation, selectedEvent]);
181
-
182
- // Determine placeholder text based on what's shown - must be called before any early returns
177
+
178
+ // Determine placeholder text based on what's shown
183
179
  const effectivePlaceholder = useMemo(() => {
184
180
  if (placeholder !== "Select organisation or event") {
185
181
  return placeholder;
@@ -195,10 +191,10 @@ export function ContextSelector({
195
191
  }
196
192
  return placeholder;
197
193
  }, [placeholder, showOrganisations, showEvents]);
198
-
194
+
199
195
  const handleValueChange = (value: string) => {
200
196
  if (disabled || isLoading) return;
201
-
197
+
202
198
  if (value.startsWith('org:') && showOrganisations) {
203
199
  const orgId = value.replace('org:', '');
204
200
  const org = organisations?.find(o => o.id === orgId);
@@ -213,7 +209,7 @@ export function ContextSelector({
213
209
  }
214
210
  }
215
211
  };
216
-
212
+
217
213
  const handleRetry = async () => {
218
214
  try {
219
215
  if (showOrganisations && orgError) {
@@ -226,24 +222,24 @@ export function ContextSelector({
226
222
  logger.error('ContextSelector', 'Failed to refresh:', error);
227
223
  }
228
224
  };
229
-
225
+
230
226
  // Loading state - only show loading if we don't have any items yet
231
227
  // This prevents the selector from being stuck in loading when data exists
232
228
  if (isLoading && !hasItems) {
233
- const loadingText = compact ? "Loading..." :
229
+ const loadingText = compact ? "Loading..." :
234
230
  showOrganisations && showEvents ? "Loading organisations and events..." :
235
- showOrganisations ? "Loading organisations..." :
236
- "Loading events...";
231
+ showOrganisations ? "Loading organisations..." :
232
+ "Loading events...";
237
233
  return (
238
- <div className={`flex items-center gap-2 ${className}`}>
239
- <LoadingSpinner size="sm" />
234
+ <p className={className}>
235
+ <LoadingSpinner size="sm" /><br/>
240
236
  <span className="text-sm text-muted-foreground">
241
237
  {loadingText}
242
238
  </span>
243
- </div>
239
+ </p>
244
240
  );
245
241
  }
246
-
242
+
247
243
  // Error state
248
244
  if (hasError) {
249
245
  const errorMessages = [];
@@ -254,17 +250,15 @@ export function ContextSelector({
254
250
  errorMessages.push(`Failed to load events: ${eventError.message}`);
255
251
  }
256
252
  return (
257
- <div className={`space-y-2 ${className}`}>
258
- <Alert variant="destructive">
259
- <AlertCircle className="size-4" />
260
- <AlertDescription>
261
- {errorMessages.join(' ')}
262
- </AlertDescription>
263
- </Alert>
253
+ <Alert variant="destructive" className={`space-y-2 ${className}`}>
254
+ <AlertCircle className="size-4" />
255
+ <AlertDescription>
256
+ {errorMessages.join(' ')}
257
+ </AlertDescription>
264
258
  {showRetryButton && (
265
- <Button
266
- variant="outline"
267
- size="sm"
259
+ <Button
260
+ variant="outline"
261
+ size="sm"
268
262
  onClick={handleRetry}
269
263
  disabled={isLoading}
270
264
  className="w-full"
@@ -273,29 +267,27 @@ export function ContextSelector({
273
267
  Retry
274
268
  </Button>
275
269
  )}
276
- </div>
270
+ </Alert>
277
271
  );
278
272
  }
279
-
273
+
280
274
  // No items available
281
275
  if (!hasItems) {
282
276
  if (showNoItemsMessage) {
283
- const noItemsText =
277
+ const noItemsText =
284
278
  showOrganisations && showEvents ? "No organisations or events available. Please contact your administrator." :
285
- showOrganisations ? "No organisations available. Please contact your administrator." :
286
- "No events available. Please contact your administrator.";
279
+ showOrganisations ? "No organisations available. Please contact your administrator." :
280
+ "No events available. Please contact your administrator.";
287
281
  return (
288
- <div className={`space-y-2 ${className}`}>
289
- <Alert>
282
+ <Alert className={`space-y-2 ${className}`}>
290
283
  <AlertCircle className="size-4" />
291
284
  <AlertDescription>
292
285
  {noItemsText}
293
286
  </AlertDescription>
294
- </Alert>
295
287
  {showRetryButton && (
296
- <Button
297
- variant="outline"
298
- size="sm"
288
+ <Button
289
+ variant="outline"
290
+ size="sm"
299
291
  onClick={handleRetry}
300
292
  disabled={isLoading}
301
293
  className="w-full"
@@ -304,84 +296,74 @@ export function ContextSelector({
304
296
  Check Again
305
297
  </Button>
306
298
  )}
307
- </div>
299
+ </Alert>
308
300
  );
309
301
  }
310
302
  return null;
311
303
  }
312
-
313
- // Early returns have been handled above, now render the main component
304
+
314
305
  return (
315
- <div className={className} data-testid="context-selector">
316
- <Select
317
- value={currentValue}
318
- onValueChange={handleValueChange}
319
- disabled={disabled || isLoading}
306
+ <Select
307
+ value={currentValue}
308
+ onValueChange={handleValueChange}
309
+ disabled={disabled || isLoading}
310
+ className={className} data-testid="context-selector"
311
+ >
312
+ <SelectTrigger
313
+ className="text-left"
314
+ variant="outline"
320
315
  >
321
- <SelectTrigger
322
- className="text-left"
323
- variant="outline"
324
- >
325
- <SelectValue placeholder={effectivePlaceholder}>
326
- {displayValue}
327
- </SelectValue>
328
- </SelectTrigger>
329
- <SelectContent>
330
- {/* Organisations Section */}
331
- {showOrganisations && organisations && organisations.length > 0 && (
332
- <>
333
- <SelectGroup>
334
- <SelectLabel>Organisations</SelectLabel>
335
- {organisations.map((org) => (
336
- <SelectItem
337
- key={org.id}
338
- value={`org:${org.id}`}
339
- >
340
- <div className="flex items-center gap-2">
341
- <Building2 className="size-4" />
342
- <div className="flex flex-col">
343
- <span className="font-medium">{org.display_name}</span>
344
- {!compact && org.description && (
345
- <span className="text-xs text-muted-foreground truncate max-w-40">
346
- {org.description}
347
- </span>
348
- )}
349
- </div>
350
- </div>
351
- </SelectItem>
352
- ))}
353
- </SelectGroup>
354
- {showEvents && events && events.length > 0 && <SelectSeparator />}
355
- </>
356
- )}
357
-
358
- {/* Events Section */}
359
- {showEvents && events && events.length > 0 && (
316
+ <SelectValue placeholder={effectivePlaceholder}>
317
+ {displayValue}
318
+ </SelectValue>
319
+ </SelectTrigger>
320
+ <SelectContent>
321
+ {/* Organisations Section */}
322
+ {showOrganisations && organisations && organisations.length > 0 && (
323
+ <>
360
324
  <SelectGroup>
361
- <SelectLabel>Events</SelectLabel>
362
- {events.map((event) => (
363
- <SelectItem
364
- key={event.event_id || event.id}
365
- value={`event:${event.event_id || event.id}`}
325
+ <SelectLabel>Organisations</SelectLabel>
326
+ {organisations.map((org) => (
327
+ <SelectItem
328
+ key={org.id}
329
+ value={`org:${org.id}`}
366
330
  >
367
- <div className="flex items-center gap-2">
368
- <Calendar className="size-4" />
369
- <div className="flex flex-col">
370
- <span className="font-medium">{event.event_name}</span>
371
- {!compact && event.event_date && (
372
- <span className="text-xs text-muted-foreground">
373
- {new Date(event.event_date).toLocaleDateString()}
374
- </span>
375
- )}
376
- </div>
377
- </div>
331
+ <Building2 className="inline-block size-4 mr-2" />
332
+ <span className="font-medium">{org.display_name}</span><br />
333
+ {!compact && org.description && (
334
+ <span className="text-xs text-muted-foreground">
335
+ {org.description}
336
+ </span>
337
+ )}
378
338
  </SelectItem>
379
339
  ))}
380
340
  </SelectGroup>
381
- )}
382
- </SelectContent>
383
- </Select>
384
- </div>
341
+ {showEvents && events && events.length > 0 && <SelectSeparator />}
342
+ </>
343
+ )}
344
+
345
+ {/* Events Section */}
346
+ {showEvents && events && events.length > 0 && (
347
+ <SelectGroup>
348
+ <SelectLabel>Events</SelectLabel>
349
+ {events.map((event) => (
350
+ <SelectItem
351
+ key={event.event_id || event.id}
352
+ value={`event:${event.event_id || event.id}`}
353
+ >
354
+ <Calendar className=" inline-block size-4 mr-2" />
355
+ <span className="font-medium">{event.event_name}</span><br />
356
+ {!compact && event.event_date && (
357
+ <span className="text-xs text-muted-foreground">
358
+ {new Date(event.event_date).toLocaleDateString()}
359
+ </span>
360
+ )}
361
+ </SelectItem>
362
+ ))}
363
+ </SelectGroup>
364
+ )}
365
+ </SelectContent>
366
+ </Select>
385
367
  );
386
368
  }
387
369
 
@@ -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
+
@@ -283,25 +283,7 @@
283
283
  import React from 'react';
284
284
  import { DataTableCore } from './components/DataTableCore';
285
285
  import { createLogger } from '../../utils/core/logger';
286
- import { normalizeDataTableFeatures } from './types';
287
- import type {
288
- DataRecord,
289
- GetRowId,
290
- ServerSideParams,
291
- PerformanceConfig,
292
- ServerSideConfig,
293
- ChunkingConfig,
294
- SearchIndexConfig,
295
- PaginationMode,
296
- EmptyStateConfig,
297
- DataTableFeatureConfig,
298
- DataTableColumn,
299
- SimpleColumn,
300
- AggregateConfig,
301
- DataTableAction,
302
- HierarchicalConfig,
303
- DataTableRBACConfig
304
- } from './types';
286
+ import { normalizeDataTableFeatures, type DataRecord, type GetRowId, type ServerSideParams, type PerformanceConfig, type ServerSideConfig, type ChunkingConfig, type SearchIndexConfig, type PaginationMode, type EmptyStateConfig, type DataTableFeatureConfig, type DataTableColumn, type SimpleColumn, type AggregateConfig, type DataTableAction, type HierarchicalConfig, type DataTableRBACConfig } from './types';
305
287
  import type { ImportModalConfig } from './components/ImportModal';
306
288
 
307
289
  // ============================================================================