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