@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.
- package/{scripts/audit/audit-dependencies.cjs → audit-tool/00-dependencies.cjs} +12 -13
- package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
- package/audit-tool/audits/02-project-structure.cjs +255 -0
- package/audit-tool/audits/03-architecture.cjs +196 -0
- package/audit-tool/audits/04-code-quality.cjs +149 -0
- package/audit-tool/audits/05-styling.cjs +224 -0
- package/audit-tool/audits/06-security-rbac.cjs +544 -0
- package/audit-tool/audits/07-api-tech-stack.cjs +301 -0
- package/audit-tool/audits/08-testing-documentation.cjs +202 -0
- package/audit-tool/audits/09-operations.cjs +208 -0
- package/audit-tool/index.cjs +291 -0
- package/audit-tool/utils/code-utils.cjs +218 -0
- package/audit-tool/utils/file-utils.cjs +230 -0
- package/audit-tool/utils/report-utils.cjs +241 -0
- package/cursor-rules/00-standards-overview.mdc +156 -0
- package/cursor-rules/{00-pace-core-compliance.mdc → 01-pace-core-compliance.mdc} +187 -34
- package/cursor-rules/02-project-structure.mdc +37 -5
- package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +125 -11
- package/cursor-rules/04-code-quality.mdc +419 -0
- package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +55 -10
- package/cursor-rules/{09-rbac-compliance.mdc → 06-security-rbac.mdc} +62 -6
- package/cursor-rules/07-api-tech-stack.mdc +377 -0
- package/cursor-rules/08-testing-documentation.mdc +324 -0
- package/cursor-rules/09-operations.mdc +365 -0
- package/dist/DataTable-7PMH7XN7.js +15 -0
- package/dist/{DataTable-2N_tqbfq.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
- package/dist/{PublicPageProvider-BBH6Vqg7.d.ts → PublicPageProvider-DlsCaR5v.d.ts} +26 -16
- package/dist/{chunk-FENMYN2U.js → chunk-5X4QLXRG.js} +1 -3
- package/dist/{chunk-4T7OBVTU.js → chunk-6F3IILHI.js} +1 -1
- package/dist/{chunk-SD6WQY43.js → chunk-7ILTDCL2.js} +9 -1
- package/dist/{chunk-3QC3KRHK.js → chunk-A3W6LW53.js} +16 -1
- package/dist/{chunk-7TYHROIV.js → chunk-BM4CQ5P3.js} +50 -8
- package/dist/{chunk-2HGJFNAH.js → chunk-FEJLJNWA.js} +1 -15
- package/dist/{chunk-OHIK3MIO.js → chunk-GHYHJTYV.js} +2 -2
- package/dist/{chunk-UIYSCEV7.js → chunk-IUBRCBSY.js} +1 -1
- package/dist/{chunk-LAZMKTTF.js → chunk-JGWDVX64.js} +281 -347
- package/dist/{chunk-MAGBIDNS.js → chunk-L4XMVJKY.js} +2 -2
- package/dist/{chunk-A55DK444.js → chunk-OJ4SKRSV.js} +1 -7
- package/dist/{chunk-ZS5VO5JB.js → chunk-Q7Q7V5NV.js} +406 -451
- package/dist/{chunk-3O3WHILE.js → chunk-VBCS3DUA.js} +236 -60
- package/dist/{chunk-BVP2BCJF.js → chunk-ZKAWKYT4.js} +8 -8
- package/dist/components.d.ts +5 -4
- package/dist/components.js +27 -32
- package/dist/eslint-rules/index.cjs +22 -9
- package/{src/eslint-rules/rules/compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +184 -23
- package/dist/eslint-rules/rules/04-code-quality.cjs +290 -0
- package/dist/eslint-rules/rules/05-styling.cjs +61 -0
- package/dist/eslint-rules/rules/{rbac.cjs → 06-security-rbac.cjs} +26 -10
- package/dist/eslint-rules/rules/07-api-tech-stack.cjs +263 -0
- package/dist/eslint-rules/rules/08-testing.cjs +94 -0
- package/dist/hooks.d.ts +5 -5
- package/dist/hooks.js +6 -6
- package/dist/index.d.ts +6 -6
- package/dist/index.js +18 -17
- package/dist/rbac/index.js +6 -6
- package/dist/theming/runtime.d.ts +14 -1
- package/dist/theming/runtime.js +1 -1
- package/dist/{types-B-K_5VnO.d.ts → types-DXstZpNI.d.ts} +0 -17
- package/dist/{usePublicRouteParams-COZ28Mvq.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +19 -19
- package/dist/utils.d.ts +2 -2
- package/dist/utils.js +8 -8
- package/docs/README.md +1 -1
- package/docs/api/modules.md +47 -31
- package/docs/api-reference/components.md +18 -20
- package/docs/api-reference/hooks.md +80 -80
- package/docs/api-reference/types.md +1 -1
- package/docs/api-reference/utilities.md +1 -1
- package/docs/architecture/README.md +1 -1
- package/docs/core-concepts/events.md +3 -3
- package/docs/core-concepts/organisations.md +6 -6
- package/docs/core-concepts/permissions.md +6 -6
- package/docs/documentation-index.md +12 -18
- package/docs/getting-started/documentation-index.md +1 -1
- package/docs/getting-started/examples/README.md +4 -4
- package/docs/getting-started/examples/full-featured-app.md +1 -1
- package/docs/getting-started/faq.md +2 -2
- package/docs/getting-started/quick-reference.md +4 -4
- package/docs/implementation-guides/authentication.md +15 -15
- package/docs/implementation-guides/component-styling.md +1 -1
- package/docs/implementation-guides/data-tables.md +126 -33
- package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
- package/docs/implementation-guides/dynamic-colors.md +3 -3
- package/docs/implementation-guides/file-upload-storage.md +2 -2
- package/docs/implementation-guides/hierarchical-datatable.md +40 -60
- package/docs/implementation-guides/inactivity-tracking.md +3 -3
- package/docs/implementation-guides/large-datasets.md +3 -2
- package/docs/implementation-guides/organisation-security.md +2 -2
- package/docs/implementation-guides/performance.md +2 -2
- package/docs/implementation-guides/permission-enforcement.md +1 -1
- package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
- package/docs/migration/V0.4.0_rbac-migration.md +6 -6
- package/docs/rbac/README.md +5 -5
- package/docs/rbac/advanced-patterns.md +6 -6
- package/docs/rbac/api-reference.md +20 -20
- package/docs/rbac/event-based-apps.md +3 -3
- package/docs/rbac/examples.md +41 -41
- package/docs/rbac/getting-started.md +37 -37
- package/docs/rbac/performance.md +1 -1
- package/docs/rbac/quick-start.md +52 -52
- package/docs/rbac/secure-client-protection.md +1 -1
- package/docs/rbac/troubleshooting.md +1 -1
- package/docs/security/README.md +5 -5
- package/docs/standards/0-standards-overview.md +220 -0
- package/docs/standards/{00-pace-core-compliance.md → 1-pace-core-compliance-standards.md} +204 -185
- package/docs/standards/{02-project-structure.md → 2-project-structure-standards.md} +11 -47
- package/docs/standards/3-architecture-standards.md +606 -0
- package/docs/standards/4-code-quality-standards.md +728 -0
- package/docs/standards/{08-markup-quality.md → 5-styling-standards.md} +12 -9
- package/docs/standards/{09-rbac-compliance.md → 6-security-rbac-standards.md} +126 -18
- package/docs/standards/7-api-tech-stack-standards.md +662 -0
- package/docs/standards/8-testing-documentation-standards.md +401 -0
- package/docs/standards/9-operations-standards.md +1102 -0
- package/docs/standards/README.md +203 -104
- package/docs/troubleshooting/README.md +4 -4
- package/docs/troubleshooting/common-issues.md +2 -2
- package/docs/troubleshooting/debugging.md +9 -9
- package/docs/troubleshooting/migration.md +4 -4
- package/eslint-config-pace-core.cjs +21 -10
- package/package.json +6 -5
- package/scripts/install-cursor-rules.cjs +11 -243
- package/scripts/install-eslint-config.cjs +284 -0
- package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +2 -2
- package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
- package/src/__tests__/helpers/__tests__/test-utils.test.tsx +10 -10
- package/src/__tests__/integration/UserProfile.test.tsx +14 -14
- package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
- package/src/__tests__/templates/accessibility.test.template.tsx +9 -9
- package/src/__tests__/templates/component.test.template.tsx +18 -15
- package/src/components/Calendar/Calendar.tsx +201 -47
- package/src/components/ContextSelector/ContextSelector.tsx +137 -153
- package/src/components/DataTable/AUDIT_REPORT.md +293 -0
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +10 -2
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +10 -4
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
- package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
- package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
- package/src/components/DataTable/components/DataTableLayout.tsx +5 -16
- package/src/components/DataTable/components/EditableRow.tsx +5 -7
- package/src/components/DataTable/components/EmptyState.tsx +10 -9
- package/src/components/DataTable/components/FilterRow.tsx +2 -4
- package/src/components/DataTable/components/ImportModal.tsx +124 -126
- package/src/components/DataTable/components/LoadingState.tsx +5 -6
- package/src/components/DataTable/components/SortIndicator.tsx +50 -0
- package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
- package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
- package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
- package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
- package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
- package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +41 -27
- package/src/components/DataTable/components/index.ts +2 -1
- package/src/components/DataTable/types.ts +0 -18
- package/src/components/DataTable/utils/a11yUtils.ts +17 -0
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +2 -1
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
- package/src/components/DateTimeField/DateTimeField.tsx +7 -8
- package/src/components/Dialog/Dialog.test.tsx +1 -0
- package/src/components/Dialog/Dialog.tsx +25 -8
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
- package/src/components/FileUpload/FileUpload.test.tsx +52 -14
- package/src/components/FileUpload/FileUpload.tsx +112 -130
- package/src/components/Progress/Progress.tsx +2 -4
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
- package/src/components/Select/Select.tsx +86 -77
- package/src/components/Select/types.ts +3 -0
- package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
- package/src/hooks/__tests__/hooks.integration.test.tsx +49 -49
- package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +97 -97
- package/src/hooks/public/usePublicEvent.ts +5 -5
- package/src/hooks/public/usePublicEventLogo.ts +5 -5
- package/src/hooks/public/usePublicFileDisplay.ts +2 -2
- package/src/hooks/public/usePublicRouteParams.ts +5 -5
- package/src/hooks/useAppConfig.ts +2 -2
- package/src/hooks/useEventTheme.test.ts +7 -7
- package/src/hooks/useEventTheme.ts +1 -4
- package/src/hooks/useFileDisplay.ts +2 -2
- package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
- package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
- package/src/providers/__tests__/EventProvider.test.tsx +61 -61
- package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
- package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
- package/src/providers/__tests__/ProviderLifecycle.test.tsx +37 -37
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
- package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +10 -10
- package/src/styles/core.css +7 -0
- package/src/theming/__tests__/parseEventColours.test.ts +9 -3
- package/src/theming/parseEventColours.ts +22 -10
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
- package/src/utils/storage/README.md +1 -1
- package/cursor-rules/01-standards-compliance.mdc +0 -285
- package/cursor-rules/04-testing-standards.mdc +0 -270
- package/cursor-rules/05-bug-reports-and-features.mdc +0 -248
- package/cursor-rules/06-code-quality.mdc +0 -311
- package/cursor-rules/07-tech-stack-compliance.mdc +0 -216
- package/cursor-rules/10-error-handling-patterns.mdc +0 -179
- package/cursor-rules/11-performance-optimization.mdc +0 -169
- package/cursor-rules/12-ci-cd-integration.mdc +0 -150
- package/dist/DataTable-LRJL4IRV.js +0 -15
- package/dist/eslint-rules/rules/compliance.cjs +0 -348
- package/dist/eslint-rules/rules/components.cjs +0 -113
- package/dist/eslint-rules/rules/imports.cjs +0 -102
- package/docs/best-practices/README.md +0 -472
- package/docs/best-practices/accessibility.md +0 -604
- package/docs/best-practices/common-patterns.md +0 -516
- package/docs/best-practices/deployment.md +0 -1103
- package/docs/best-practices/performance.md +0 -1328
- package/docs/best-practices/security.md +0 -940
- package/docs/best-practices/testing.md +0 -1034
- package/docs/rbac/compliance/compliance-guide.md +0 -544
- package/docs/standards/01-standards-compliance.md +0 -188
- package/docs/standards/03-solid-principles.md +0 -39
- package/docs/standards/04-testing-standards.md +0 -36
- package/docs/standards/05-bug-reports-and-features.md +0 -27
- package/docs/standards/06-code-quality.md +0 -34
- package/docs/standards/07-tech-stack-compliance.md +0 -30
- package/docs/standards/10-error-handling-patterns.md +0 -401
- package/docs/standards/11-performance-optimization.md +0 -348
- package/docs/standards/12-ci-cd-integration.md +0 -370
- package/docs/standards/ALIGNMENT_REVIEW_SUMMARY.md +0 -192
- package/scripts/audit/audit-compliance.cjs +0 -1295
- package/scripts/audit/audit-components.cjs +0 -260
- package/scripts/audit/audit-rbac.cjs +0 -954
- package/scripts/audit/audit-standards.cjs +0 -1268
- package/scripts/audit/index.cjs +0 -1927
- package/src/components/DataTable/components/DataTableBody.tsx +0 -478
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
- package/src/components/DataTable/components/ExpandButton.tsx +0 -113
- package/src/components/DataTable/components/GroupHeader.tsx +0 -54
- package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
- package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
- package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
- package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
- package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
- package/src/components/DataTable/core/DataTableContext.tsx +0 -216
- package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
- package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
- package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
- package/src/components/DataTable/utils/debugTools.ts +0 -514
- package/src/eslint-rules/index.cjs +0 -22
- package/src/eslint-rules/rules/components.cjs +0 -113
- package/src/eslint-rules/rules/imports.cjs +0 -102
- package/src/eslint-rules/rules/rbac.cjs +0 -790
- package/src/eslint-rules/utils/helpers.cjs +0 -42
- 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
|
-
|
|
236
|
-
|
|
194
|
+
showOrganisations ? "Loading organisations..." :
|
|
195
|
+
"Loading events...";
|
|
237
196
|
return (
|
|
238
|
-
<
|
|
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
|
-
</
|
|
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
|
-
<
|
|
258
|
-
<
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
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
|
-
</
|
|
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
|
-
|
|
286
|
-
|
|
242
|
+
showOrganisations ? "No organisations available. Please contact your administrator." :
|
|
243
|
+
"No events available. Please contact your administrator.";
|
|
287
244
|
return (
|
|
288
|
-
|
|
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
|
-
|
|
262
|
+
</Alert>
|
|
308
263
|
);
|
|
309
264
|
}
|
|
310
265
|
return null;
|
|
311
266
|
}
|
|
312
|
-
|
|
313
|
-
//
|
|
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
|
-
<
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
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
|
-
<
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
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>
|
|
362
|
-
{
|
|
363
|
-
<SelectItem
|
|
364
|
-
key={
|
|
365
|
-
value={`
|
|
327
|
+
<SelectLabel>Organisations</SelectLabel>
|
|
328
|
+
{organisations.map((org) => (
|
|
329
|
+
<SelectItem
|
|
330
|
+
key={org.id}
|
|
331
|
+
value={`org:${org.id}`}
|
|
366
332
|
>
|
|
367
|
-
<
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
{
|
|
372
|
-
|
|
373
|
-
|
|
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
|
-
|
|
383
|
-
|
|
384
|
-
|
|
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
|
+
|