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