@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.
- package/{scripts/audit/audit-dependencies.cjs → audit-tool/00-dependencies.cjs} +227 -22
- package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
- package/audit-tool/audits/02-project-structure.cjs +240 -0
- package/audit-tool/audits/03-architecture.cjs +224 -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 +554 -0
- package/audit-tool/audits/07-api-tech-stack.cjs +355 -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 +295 -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 +380 -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-6RMSCQJ6.js +15 -0
- package/dist/{DataTable-2N_tqbfq.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
- package/dist/{PublicPageProvider-BBH6Vqg7.d.ts → PublicPageProvider-CIGSujI2.d.ts} +40 -24
- package/dist/{UnifiedAuthProvider-ZT6TIGM7.js → UnifiedAuthProvider-7SNDOWYD.js} +2 -2
- package/dist/{api-Y4MQWOFW.js → api-7P7DI652.js} +1 -1
- package/dist/{chunk-MAGBIDNS.js → chunk-4DDCYDQ3.js} +8 -7
- package/dist/{chunk-BVP2BCJF.js → chunk-5W2A3DRC.js} +10 -9
- package/dist/{chunk-SD6WQY43.js → chunk-7ILTDCL2.js} +9 -1
- package/dist/{chunk-3QC3KRHK.js → chunk-A3W6LW53.js} +16 -1
- package/dist/{chunk-3O3WHILE.js → chunk-EF2UGZWY.js} +239 -63
- package/dist/{chunk-LAZMKTTF.js → chunk-EURB7QFZ.js} +341 -337
- package/dist/{chunk-2HGJFNAH.js → chunk-FEJLJNWA.js} +1 -15
- package/dist/{chunk-7TYHROIV.js → chunk-GS5672WG.js} +55 -13
- package/dist/{chunk-UIYSCEV7.js → chunk-IUBRCBSY.js} +1 -1
- package/dist/{chunk-ZFYPMX46.js → chunk-LX6U42O3.js} +1 -1
- package/dist/{chunk-FENMYN2U.js → chunk-MPBLMWVR.js} +3 -3
- package/dist/{chunk-ZS5VO5JB.js → chunk-NKHKXPI4.js} +408 -453
- package/dist/{chunk-A55DK444.js → chunk-OJ4SKRSV.js} +1 -7
- package/dist/{chunk-4T7OBVTU.js → chunk-S6ZQKDY6.js} +1 -1
- package/dist/{chunk-FTCRZOG2.js → chunk-T5CVK4R3.js} +5 -5
- package/dist/{chunk-OHIK3MIO.js → chunk-Z2FNRKF3.js} +13 -13
- package/dist/components.d.ts +5 -4
- package/dist/components.js +29 -34
- 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 +346 -0
- package/dist/eslint-rules/rules/05-styling.cjs +61 -0
- package/dist/eslint-rules/rules/{rbac.cjs → 06-security-rbac.cjs} +34 -13
- package/dist/eslint-rules/rules/07-api-tech-stack.cjs +385 -0
- package/dist/eslint-rules/rules/08-testing.cjs +94 -0
- package/dist/{functions-DHebl8-F.d.ts → functions-lBy5L2ry.d.ts} +1 -1
- package/dist/hooks.d.ts +5 -5
- package/dist/hooks.js +8 -8
- package/dist/index.d.ts +7 -7
- package/dist/index.js +21 -20
- package/dist/providers.js +2 -2
- package/dist/rbac/index.d.ts +1 -1
- package/dist/rbac/index.js +8 -8
- package/dist/theming/runtime.d.ts +61 -1
- package/dist/theming/runtime.js +1 -1
- package/dist/{types-B-K_5VnO.d.ts → types-DXstZpNI.d.ts} +0 -17
- package/dist/types.d.ts +2 -2
- 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 +106 -41
- 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/dependencies.md +23 -0
- 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/app-layout.md +1 -1
- package/docs/implementation-guides/authentication.md +15 -15
- package/docs/implementation-guides/component-styling.md +1 -1
- package/docs/implementation-guides/data-tables.md +127 -34
- 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} +241 -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 +50 -20
- package/package.json +50 -19
- package/scripts/eslint-audit.cjs +123 -0
- package/scripts/install-cursor-rules.cjs +11 -243
- package/scripts/install-eslint-config.cjs +349 -0
- package/scripts/validate-dependencies.cjs +248 -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 +30 -18
- 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 +10 -9
- package/src/__tests__/templates/component.test.template.tsx +18 -15
- package/src/components/AddressField/AddressField.tsx +26 -1
- package/src/components/Alert/Alert.test.tsx +86 -22
- package/src/components/Alert/Alert.tsx +19 -11
- package/src/components/Badge/Badge.tsx +1 -1
- package/src/components/Calendar/Calendar.tsx +201 -47
- package/src/components/Checkbox/Checkbox.test.tsx +2 -1
- package/src/components/ContextSelector/ContextSelector.tsx +108 -126
- package/src/components/DataTable/AUDIT_REPORT.md +293 -0
- package/src/components/DataTable/DataTable.tsx +1 -19
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +6 -2
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +21 -6
- package/src/components/DataTable/__tests__/pagination.modes.test.tsx +3 -2
- 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 +11 -10
- 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 +45 -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 +1 -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 +45 -16
- package/src/components/FileUpload/FileUpload.tsx +141 -130
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +48 -12
- package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +9 -9
- package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +30 -30
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +4 -4
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +7 -1
- 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__/useDataTablePerformance.unit.test.ts +8 -5
- package/src/hooks/__tests__/useFileUrl.unit.test.ts +4 -0
- package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +99 -99
- package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +45 -8
- package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +22 -2
- 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 +13 -9
- package/src/hooks/useAddressAutocomplete.test.ts +18 -18
- package/src/hooks/useAppConfig.ts +2 -2
- package/src/hooks/useEventTheme.test.ts +7 -7
- package/src/hooks/useEventTheme.ts +2 -1
- package/src/hooks/useFileDisplay.ts +2 -2
- package/src/hooks/useFileUrl.ts +52 -8
- package/src/hooks/useOrganisationSecurity.test.ts +2 -1
- 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 +38 -38
- 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/rbac/__tests__/auth-rbac.e2e.test.tsx +15 -6
- package/src/rbac/__tests__/rbac-functions.test.ts +3 -3
- package/src/rbac/api.test.ts +104 -0
- package/src/rbac/engine.ts +1 -1
- package/src/rbac/hooks/useCan.test.ts +2 -2
- package/src/rbac/secureClient.ts +1 -1
- package/src/rbac/types/functions.ts +1 -1
- package/src/styles/core.css +7 -0
- package/src/theming/__tests__/parseEventColours.test.ts +118 -3
- package/src/theming/parseEventColours.ts +77 -11
- package/src/types/supabase.ts +2 -3
- package/src/utils/__tests__/bundleAnalysis.unit.test.ts +9 -9
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
- package/src/utils/file-reference/__tests__/file-reference.test.ts +4 -0
- package/src/utils/formatting/formatDate.test.ts +3 -2
- package/src/utils/formatting/formatDateTime.test.ts +2 -2
- package/src/utils/google-places/googlePlacesUtils.test.ts +36 -24
- package/src/utils/storage/README.md +1 -1
- package/src/utils/storage/__tests__/helpers.unit.test.ts +19 -12
- package/src/utils/storage/helpers.test.ts +69 -3
- 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
|
@@ -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
|
-
|
|
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
|
|
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
|
-
|
|
166
|
-
<Calendar className="size-4
|
|
161
|
+
<>
|
|
162
|
+
<Calendar className="inline-block size-4 mr-2" />
|
|
167
163
|
<span className="truncate">{selectedEvent.event_name}</span>
|
|
168
|
-
|
|
164
|
+
</>
|
|
169
165
|
);
|
|
170
166
|
}
|
|
171
167
|
if (showOrganisations && selectedOrganisation) {
|
|
172
168
|
return (
|
|
173
|
-
|
|
174
|
-
<Building2 className="size-4
|
|
169
|
+
<>
|
|
170
|
+
<Building2 className="inline-block size-4 mr-2" />
|
|
175
171
|
<span className="truncate">{selectedOrganisation.display_name}</span>
|
|
176
|
-
|
|
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
|
|
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
|
-
|
|
236
|
-
|
|
231
|
+
showOrganisations ? "Loading organisations..." :
|
|
232
|
+
"Loading events...";
|
|
237
233
|
return (
|
|
238
|
-
<
|
|
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
|
-
</
|
|
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
|
-
<
|
|
258
|
-
<
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
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
|
-
</
|
|
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
|
-
|
|
286
|
-
|
|
279
|
+
showOrganisations ? "No organisations available. Please contact your administrator." :
|
|
280
|
+
"No events available. Please contact your administrator.";
|
|
287
281
|
return (
|
|
288
|
-
|
|
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
|
-
|
|
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
|
-
<
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
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
|
-
<
|
|
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 && (
|
|
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>
|
|
362
|
-
{
|
|
363
|
-
<SelectItem
|
|
364
|
-
key={
|
|
365
|
-
value={`
|
|
325
|
+
<SelectLabel>Organisations</SelectLabel>
|
|
326
|
+
{organisations.map((org) => (
|
|
327
|
+
<SelectItem
|
|
328
|
+
key={org.id}
|
|
329
|
+
value={`org:${org.id}`}
|
|
366
330
|
>
|
|
367
|
-
<
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
{
|
|
372
|
-
|
|
373
|
-
|
|
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
|
-
|
|
383
|
-
|
|
384
|
-
|
|
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
|
// ============================================================================
|