@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
|
@@ -222,7 +222,7 @@ function MyComponent() {
|
|
|
222
222
|
}
|
|
223
223
|
}, [hasPermission, organisationId]);
|
|
224
224
|
|
|
225
|
-
if (isLoading) return <
|
|
225
|
+
if (isLoading) return <p>Loading...</p>;
|
|
226
226
|
|
|
227
227
|
return <DataTable data={data} />;
|
|
228
228
|
}
|
|
@@ -281,7 +281,7 @@ See [Public Pages Guide](./implementation-guides/public-pages.md).
|
|
|
281
281
|
3. Use React.memo for expensive components
|
|
282
282
|
4. Optimize data table rendering
|
|
283
283
|
|
|
284
|
-
See [Performance
|
|
284
|
+
See [Performance Optimization](../standards/9-operations-standards.md#performance-optimization).
|
|
285
285
|
|
|
286
286
|
## Still Have Questions?
|
|
287
287
|
|
|
@@ -36,10 +36,23 @@ npm install @jmruthers/pace-core
|
|
|
36
36
|
|
|
37
37
|
**Required Peer Dependencies:**
|
|
38
38
|
```bash
|
|
39
|
-
npm install react react-dom @tanstack/react-
|
|
39
|
+
npm install react react-dom @tanstack/react-query @tanstack/react-table clsx date-fns date-fns-tz react-day-picker react-hook-form react-router-dom tailwind-merge tailwindcss zod
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
> **📦 Complete Dependencies Reference**: See [Dependencies Guide](./dependencies.md) for a detailed breakdown of:
|
|
43
|
+
> - ✅ Which packages are **already included** (don't install)
|
|
44
|
+
> - ⚠️ Which packages are **required peer dependencies** (must install)
|
|
45
|
+
> - ❌ Common mistakes to avoid
|
|
46
|
+
> - 🔍 How to verify your installation
|
|
47
|
+
|
|
48
|
+
**Note**: The following packages are **included dependencies** - **DO NOT install them**, use pace-core exports instead:
|
|
49
|
+
- `@supabase/supabase-js` - Use `createBaseClient()` from `@jmruthers/pace-core` (security enforcement)
|
|
50
|
+
- `@radix-ui/*` packages - Use pace-core components (consistency enforcement)
|
|
51
|
+
- `lucide-react` - Use `@jmruthers/pace-core/icons` (consistency enforcement)
|
|
52
|
+
|
|
53
|
+
The following packages are **peer dependencies** and **MUST be installed**:
|
|
54
|
+
- `@tanstack/react-query` - Required for `QueryClient`, `QueryClientProvider`, and React Query hooks
|
|
55
|
+
- `date-fns` and `date-fns-tz` - Required for date formatting (apps may use date-fns functions directly)
|
|
43
56
|
|
|
44
57
|
### Step 2: Install Tailwind CSS v4
|
|
45
58
|
|
|
@@ -286,19 +299,19 @@ export default App;
|
|
|
286
299
|
|
|
287
300
|
If you're using PACE Core's authentication features:
|
|
288
301
|
|
|
289
|
-
|
|
290
|
-
npm install @supabase/supabase-js
|
|
291
|
-
```
|
|
302
|
+
**⚠️ Important**: `@supabase/supabase-js` is **included** in pace-core - you do NOT need to install it separately. Use `createBaseClient()` from pace-core instead.
|
|
292
303
|
|
|
293
304
|
Create `src/lib/supabase.ts`:
|
|
294
305
|
|
|
295
306
|
```typescript
|
|
296
|
-
import {
|
|
307
|
+
import { createBaseClient } from '@jmruthers/pace-core'
|
|
297
308
|
|
|
309
|
+
// Base Supabase client for UnifiedAuthProvider only
|
|
310
|
+
// DO NOT use this client directly - use useSecureSupabase() instead
|
|
298
311
|
const supabaseUrl = process.env.VITE_SUPABASE_URL!
|
|
299
312
|
const supabasePublishableKey = process.env.VITE_SUPABASE_PUBLISHABLE_KEY!
|
|
300
313
|
|
|
301
|
-
export const supabase =
|
|
314
|
+
export const supabase = createBaseClient(supabaseUrl, supabasePublishableKey)
|
|
302
315
|
```
|
|
303
316
|
|
|
304
317
|
Set environment variables in `.env.local`:
|
|
@@ -92,7 +92,7 @@ import { useUnifiedAuth } from '@jmruthers/pace-core';
|
|
|
92
92
|
function MyComponent() {
|
|
93
93
|
const { user, loading, signIn, signOut } = useUnifiedAuth();
|
|
94
94
|
|
|
95
|
-
if (loading) return <
|
|
95
|
+
if (loading) return <p>Loading...</p>;
|
|
96
96
|
if (!user) return <button onClick={signIn}>Sign In</button>;
|
|
97
97
|
|
|
98
98
|
return (
|
|
@@ -184,7 +184,7 @@ function SuperAdminPanel() {
|
|
|
184
184
|
|
|
185
185
|
if (!isSuperAdmin) return null;
|
|
186
186
|
|
|
187
|
-
return <
|
|
187
|
+
return <section>Super admin panel</section>;
|
|
188
188
|
}
|
|
189
189
|
```
|
|
190
190
|
|
|
@@ -510,7 +510,7 @@ function MyComponent() {
|
|
|
510
510
|
const { user, loading, error } = useUnifiedAuth();
|
|
511
511
|
|
|
512
512
|
if (error) {
|
|
513
|
-
return <
|
|
513
|
+
return <p>Error: {error.message}</p>;
|
|
514
514
|
}
|
|
515
515
|
|
|
516
516
|
// ... rest of component
|
|
@@ -611,4 +611,4 @@ function AdminPanel() {
|
|
|
611
611
|
- **Common Issues**: [Troubleshooting Guide](./troubleshooting/common-issues.md)
|
|
612
612
|
- **Debugging**: [Debugging Guide](./troubleshooting/debugging.md)
|
|
613
613
|
- **Migration**: [Migration Guide](./migration/)
|
|
614
|
-
- **Security**: [Security
|
|
614
|
+
- **Security**: [Security & RBAC Standards](../standards/6-security-rbac-standards.md)
|
|
@@ -29,20 +29,29 @@ npm install
|
|
|
29
29
|
|
|
30
30
|
## Step 2: Install PACE Core
|
|
31
31
|
|
|
32
|
+
> **📦 Dependencies Guide**: See [Dependencies Guide](./dependencies.md) for complete details on which packages to install and which are already included.
|
|
33
|
+
|
|
32
34
|
```bash
|
|
33
|
-
# Install PACE Core
|
|
34
|
-
npm install @jmruthers/pace-core
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
# Install Tailwind v4
|
|
43
|
-
npm install -D tailwindcss@^4.0.0 @tailwindcss/vite
|
|
35
|
+
# Install PACE Core
|
|
36
|
+
npm install @jmruthers/pace-core
|
|
37
|
+
|
|
38
|
+
# Install required peer dependencies
|
|
39
|
+
npm install react react-dom @tanstack/react-query @tanstack/react-table \
|
|
40
|
+
clsx date-fns date-fns-tz react-day-picker react-hook-form react-router-dom tailwind-merge tailwindcss zod
|
|
41
|
+
|
|
42
|
+
# Install Tailwind v4 (dev dependency)
|
|
43
|
+
npm install -D @tailwindcss/vite tailwindcss@^4.0.0
|
|
44
44
|
```
|
|
45
45
|
|
|
46
|
+
**⚠️ Important**:
|
|
47
|
+
- ❌ **DO NOT install** `@supabase/supabase-js`, `@radix-ui/*`, or `lucide-react` - they're included in pace-core. Use pace-core exports instead:
|
|
48
|
+
- `createBaseClient()` from `@jmruthers/pace-core` (instead of `createClient` from `@supabase/supabase-js`)
|
|
49
|
+
- pace-core components (instead of `@radix-ui/*` primitives)
|
|
50
|
+
- `@jmruthers/pace-core/icons` (instead of `lucide-react`)
|
|
51
|
+
- ⚠️ `@tanstack/react-query` is a **peer dependency** - you MUST install it (required for QueryClient configuration)
|
|
52
|
+
- ⚠️ All listed packages above are **required peer dependencies** - you must install them
|
|
53
|
+
- See [Dependencies Guide](./dependencies.md) for the complete breakdown
|
|
54
|
+
|
|
46
55
|
## Step 3: Configure Vite
|
|
47
56
|
|
|
48
57
|
**⚠️ CRITICAL**: This configuration prevents React context and Router context errors.
|
|
@@ -120,9 +129,11 @@ import { createClient } from '@supabase/supabase-js';
|
|
|
120
129
|
const supabaseUrl = import.meta.env.VITE_SUPABASE_URL!;
|
|
121
130
|
const supabasePublishableKey = import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY!;
|
|
122
131
|
|
|
123
|
-
export const supabase = createClient(supabaseUrl,
|
|
132
|
+
export const supabase = createClient(supabaseUrl, supabasePublishableKey);
|
|
124
133
|
```
|
|
125
134
|
|
|
135
|
+
**Note**: `@supabase/supabase-js` is already included in pace-core, so you don't need to install it separately. Just import it directly.
|
|
136
|
+
|
|
126
137
|
## Step 6: Set Up Your Database
|
|
127
138
|
|
|
128
139
|
In your Supabase dashboard, run this SQL to create a simple `tasks` table:
|
|
@@ -326,9 +326,9 @@ function UserDashboard() {
|
|
|
326
326
|
hasEventAccess, // Check event access
|
|
327
327
|
} = useUnifiedAuth();
|
|
328
328
|
|
|
329
|
-
if (loading) return <
|
|
330
|
-
if (error) return <
|
|
331
|
-
if (!user) return <
|
|
329
|
+
if (loading) return <p>Loading...</p>;
|
|
330
|
+
if (error) return <p>Error: {error.message}</p>;
|
|
331
|
+
if (!user) return <p>Please log in</p>;
|
|
332
332
|
|
|
333
333
|
return (
|
|
334
334
|
<div>
|
|
@@ -441,14 +441,14 @@ function EventContent() {
|
|
|
441
441
|
const { selectedEvent, hasEventAccess } = useUnifiedAuth();
|
|
442
442
|
|
|
443
443
|
if (!selectedEvent) {
|
|
444
|
-
return <
|
|
444
|
+
return <p>Please select an event</p>;
|
|
445
445
|
}
|
|
446
446
|
|
|
447
447
|
if (!hasEventAccess(selectedEvent.id)) {
|
|
448
|
-
return <
|
|
448
|
+
return <p>You don't have access to this event</p>;
|
|
449
449
|
}
|
|
450
450
|
|
|
451
|
-
return <
|
|
451
|
+
return <section>Event content for {selectedEvent.name}</section>;
|
|
452
452
|
}
|
|
453
453
|
```
|
|
454
454
|
|
|
@@ -703,14 +703,14 @@ function ConditionalContent() {
|
|
|
703
703
|
const { user, loading } = useUnifiedAuth();
|
|
704
704
|
|
|
705
705
|
if (loading) {
|
|
706
|
-
return <
|
|
706
|
+
return <p>Loading...</p>;
|
|
707
707
|
}
|
|
708
708
|
|
|
709
709
|
if (!user) {
|
|
710
|
-
return <
|
|
710
|
+
return <p>Please log in to continue</p>;
|
|
711
711
|
}
|
|
712
712
|
|
|
713
|
-
return <
|
|
713
|
+
return <p>Welcome, {user.email}!</p>;
|
|
714
714
|
}
|
|
715
715
|
```
|
|
716
716
|
|
|
@@ -850,11 +850,11 @@ function App() {
|
|
|
850
850
|
function AuthTest() {
|
|
851
851
|
const { user, loading, error } = useUnifiedAuth();
|
|
852
852
|
|
|
853
|
-
if (loading) return <
|
|
854
|
-
if (error) return <
|
|
855
|
-
if (!user) return <
|
|
856
|
-
|
|
857
|
-
return <
|
|
853
|
+
if (loading) return <p>Loading...</p>;
|
|
854
|
+
if (error) return <p>Error: {error.message}</p>;
|
|
855
|
+
if (!user) return <p>Not logged in</p>;
|
|
856
|
+
|
|
857
|
+
return <p>Welcome {user.email}</p>;
|
|
858
858
|
}
|
|
859
859
|
```
|
|
860
860
|
|
|
@@ -1105,7 +1105,7 @@ See the [Authentication Implementation Guide](./authentication.md) for a complet
|
|
|
1105
1105
|
|
|
1106
1106
|
### Advanced Patterns
|
|
1107
1107
|
|
|
1108
|
-
See the [
|
|
1108
|
+
See the [Authentication Implementation Guide](./authentication.md) for advanced authentication patterns and the [Standards Overview](../standards/0-standards-overview.md) for compliance requirements.
|
|
1109
1109
|
|
|
1110
1110
|
## Related Documentation
|
|
1111
1111
|
|
|
@@ -408,7 +408,7 @@ function DashboardCard({ title, children }) {
|
|
|
408
408
|
## Related Documentation
|
|
409
409
|
|
|
410
410
|
- [Styling Overview](../styles/README.md) - Complete styling system
|
|
411
|
-
- [Performance
|
|
411
|
+
- [Performance Optimization](../standards/9-operations-standards.md#performance-optimization) - Performance optimization
|
|
412
412
|
- [Component API Reference](../api-reference/components.md) - Component props
|
|
413
413
|
|
|
414
414
|
---
|
|
@@ -408,11 +408,11 @@ const columns: DataTableColumn<Dish>[] = [
|
|
|
408
408
|
const indentLevel = isParent ? 0 : 1;
|
|
409
409
|
|
|
410
410
|
return (
|
|
411
|
-
<
|
|
412
|
-
<
|
|
411
|
+
<section className={`flex items-center ${isParent ? 'font-semibold' : ''}`}>
|
|
412
|
+
<section style={{ marginLeft: `${indentLevel * 20}px` }}>
|
|
413
413
|
{isParent ? '🍽️' : '🥬'} {row.original.name}
|
|
414
|
-
</
|
|
415
|
-
</
|
|
414
|
+
</section>
|
|
415
|
+
</section>
|
|
416
416
|
);
|
|
417
417
|
}
|
|
418
418
|
},
|
|
@@ -478,26 +478,26 @@ const columns: DataTableColumn<Dish>[] = [
|
|
|
478
478
|
if (isParent) {
|
|
479
479
|
// Parent row actions
|
|
480
480
|
return (
|
|
481
|
-
<
|
|
481
|
+
<section className="flex gap-2">
|
|
482
482
|
<Button size="sm" variant="outline">
|
|
483
483
|
Edit Dish
|
|
484
484
|
</Button>
|
|
485
485
|
<Button size="sm" variant="outline">
|
|
486
486
|
Add Ingredient
|
|
487
487
|
</Button>
|
|
488
|
-
</
|
|
488
|
+
</section>
|
|
489
489
|
);
|
|
490
490
|
} else {
|
|
491
491
|
// Child row actions
|
|
492
492
|
return (
|
|
493
|
-
<
|
|
493
|
+
<section className="flex gap-2">
|
|
494
494
|
<Button size="sm" variant="ghost">
|
|
495
495
|
Edit Ingredient
|
|
496
496
|
</Button>
|
|
497
497
|
<Button size="sm" variant="ghost">
|
|
498
498
|
Remove
|
|
499
499
|
</Button>
|
|
500
|
-
</
|
|
500
|
+
</section>
|
|
501
501
|
);
|
|
502
502
|
}
|
|
503
503
|
}
|
|
@@ -1197,7 +1197,7 @@ import { DataTable } from '@jmruthers/pace-core';
|
|
|
1197
1197
|
|
|
1198
1198
|
**✅ Column Alignment in Virtualized Tables**
|
|
1199
1199
|
- **Problem**: Header and body columns were misaligned in virtualized mode due to separate table layouts.
|
|
1200
|
-
- **Solution**:
|
|
1200
|
+
- **Solution**: `UnifiedTableBody` component handles virtualization automatically with synchronized column sizing between header and body tables, `table-fixed` layout for consistent column widths, dynamic column width calculation and synchronization, proper virtualization handling for large datasets.
|
|
1201
1201
|
|
|
1202
1202
|
**✅ Pagination State Synchronization**
|
|
1203
1203
|
- **Problem**: Page size dropdown showed 50 but displayed 20 rows due to hardcoded values and virtualization conflicts.
|
|
@@ -2167,7 +2167,7 @@ function UserForm({ user, onSubmit, onCancel }) {
|
|
|
2167
2167
|
|
|
2168
2168
|
return (
|
|
2169
2169
|
<form onSubmit={handleSubmit(onSubmit)} className="space-y-4">
|
|
2170
|
-
<
|
|
2170
|
+
<section>
|
|
2171
2171
|
<label htmlFor="name">Name</label>
|
|
2172
2172
|
<input
|
|
2173
2173
|
id="name"
|
|
@@ -2177,9 +2177,9 @@ function UserForm({ user, onSubmit, onCancel }) {
|
|
|
2177
2177
|
{errors.name && (
|
|
2178
2178
|
<p className="text-acc-600 text-sm">{errors.name.message}</p>
|
|
2179
2179
|
)}
|
|
2180
|
-
</
|
|
2180
|
+
</section>
|
|
2181
2181
|
|
|
2182
|
-
<
|
|
2182
|
+
<section>
|
|
2183
2183
|
<label htmlFor="email">Email</label>
|
|
2184
2184
|
<input
|
|
2185
2185
|
id="email"
|
|
@@ -2190,9 +2190,9 @@ function UserForm({ user, onSubmit, onCancel }) {
|
|
|
2190
2190
|
{errors.email && (
|
|
2191
2191
|
<p className="text-acc-600 text-sm">{errors.email.message}</p>
|
|
2192
2192
|
)}
|
|
2193
|
-
</
|
|
2193
|
+
</section>
|
|
2194
2194
|
|
|
2195
|
-
<
|
|
2195
|
+
<section>
|
|
2196
2196
|
<label htmlFor="role">Role</label>
|
|
2197
2197
|
<select
|
|
2198
2198
|
id="role"
|
|
@@ -2206,9 +2206,9 @@ function UserForm({ user, onSubmit, onCancel }) {
|
|
|
2206
2206
|
{errors.role && (
|
|
2207
2207
|
<p className="text-acc-600 text-sm">{errors.role.message}</p>
|
|
2208
2208
|
)}
|
|
2209
|
-
</
|
|
2209
|
+
</section>
|
|
2210
2210
|
|
|
2211
|
-
<
|
|
2211
|
+
<section className="flex gap-2">
|
|
2212
2212
|
<button
|
|
2213
2213
|
type="submit"
|
|
2214
2214
|
disabled={isSubmitting}
|
|
@@ -2223,7 +2223,7 @@ function UserForm({ user, onSubmit, onCancel }) {
|
|
|
2223
2223
|
>
|
|
2224
2224
|
Cancel
|
|
2225
2225
|
</button>
|
|
2226
|
-
</
|
|
2226
|
+
</section>
|
|
2227
2227
|
</form>
|
|
2228
2228
|
);
|
|
2229
2229
|
}
|
|
@@ -2496,25 +2496,118 @@ If you're upgrading from a previous version:
|
|
|
2496
2496
|
|
|
2497
2497
|
### Component Structure
|
|
2498
2498
|
|
|
2499
|
+
The DataTable component is built with a modular architecture that separates concerns and provides clear component boundaries. The structure is organized into main components, sub-components, hooks, utilities, and core architecture classes.
|
|
2500
|
+
|
|
2499
2501
|
```
|
|
2500
|
-
DataTable
|
|
2501
|
-
|
|
2502
|
-
|
|
2503
|
-
│ ├──
|
|
2504
|
-
│ ├──
|
|
2505
|
-
│
|
|
2506
|
-
|
|
2507
|
-
│
|
|
2508
|
-
│
|
|
2509
|
-
├──
|
|
2510
|
-
│ ├──
|
|
2511
|
-
│ └──
|
|
2512
|
-
|
|
2513
|
-
|
|
2514
|
-
|
|
2515
|
-
|
|
2502
|
+
DataTable (Main Entry Point)
|
|
2503
|
+
│
|
|
2504
|
+
├── DataTableCore (Internal Orchestrator)
|
|
2505
|
+
│ ├── DataTableErrorBoundary
|
|
2506
|
+
│ ├── LoadingState
|
|
2507
|
+
│ ├── AccessDeniedPage
|
|
2508
|
+
│ └── DataTableLayout
|
|
2509
|
+
│ │
|
|
2510
|
+
│ ├── DataTableToolbar
|
|
2511
|
+
│ │ ├── GroupingDropdown
|
|
2512
|
+
│ │ ├── ColumnVisibilityDropdown
|
|
2513
|
+
│ │ └── BulkOperationsDropdown
|
|
2514
|
+
│ │
|
|
2515
|
+
│ ├── UnifiedTableBody
|
|
2516
|
+
│ │ ├── FilterRow
|
|
2517
|
+
│ │ │ └── ColumnFilter
|
|
2518
|
+
│ │ ├── MemoizedRow (RowComponent)
|
|
2519
|
+
│ │ │ ├── EditableRow
|
|
2520
|
+
│ │ │ │ └── EditFields
|
|
2521
|
+
│ │ │ ├── ActionButtons
|
|
2522
|
+
│ │ │ └── RowComponent (handles grouped rows inline and hierarchical expand/collapse)
|
|
2523
|
+
│ │ └── EmptyState
|
|
2524
|
+
│ │
|
|
2525
|
+
│ ├── PaginationControls
|
|
2526
|
+
│ │ └── EnhancedPaginationControls (when enabled)
|
|
2527
|
+
│ │
|
|
2528
|
+
│ └── DataTableModals
|
|
2529
|
+
│ └── ImportModal
|
|
2530
|
+
│
|
|
2531
|
+
├── Hooks (State & Logic Management)
|
|
2532
|
+
│ ├── useDataTableState
|
|
2533
|
+
│ ├── useDataTableDataPipeline
|
|
2534
|
+
│ ├── useDataTableConfiguration
|
|
2535
|
+
│ ├── useDataTablePermissions
|
|
2536
|
+
│ ├── useTableColumns
|
|
2537
|
+
│ ├── useTableHandlers
|
|
2538
|
+
│ ├── useColumnOrderPersistence
|
|
2539
|
+
│ ├── useColumnVisibilityPersistence
|
|
2540
|
+
│ ├── useEffectiveColumnOrder
|
|
2541
|
+
│ ├── useHierarchicalState
|
|
2542
|
+
│ ├── useServerSideDataEffect
|
|
2543
|
+
│ ├── useKeyboardNavigation
|
|
2544
|
+
│ └── useDataTablePerformance (from core hooks)
|
|
2545
|
+
│ ├── DataChunkManager
|
|
2546
|
+
│ ├── SearchIndex
|
|
2547
|
+
│ ├── PerformanceMonitor
|
|
2548
|
+
│ └── VisibilityTracker
|
|
2549
|
+
│
|
|
2550
|
+
├── Core Architecture Classes
|
|
2551
|
+
│ ├── ColumnFactory
|
|
2552
|
+
│ ├── ColumnManager
|
|
2553
|
+
│ ├── DataManager
|
|
2554
|
+
│ ├── StateManager
|
|
2555
|
+
│ ├── ActionManager
|
|
2556
|
+
│ ├── LocalDataAdapter
|
|
2557
|
+
│ └── PluginRegistry
|
|
2558
|
+
│
|
|
2559
|
+
└── Utilities
|
|
2560
|
+
├── aggregationUtils (sum, average, count, min, max)
|
|
2561
|
+
├── columnUtils
|
|
2562
|
+
├── exportUtils
|
|
2563
|
+
├── hierarchicalUtils
|
|
2564
|
+
├── hierarchicalSorting
|
|
2565
|
+
├── paginationUtils
|
|
2566
|
+
├── performanceUtils
|
|
2567
|
+
├── rowUtils
|
|
2568
|
+
├── a11yUtils
|
|
2569
|
+
├── errorHandling
|
|
2570
|
+
└── flexibleImport
|
|
2516
2571
|
```
|
|
2517
2572
|
|
|
2573
|
+
#### Component Descriptions
|
|
2574
|
+
|
|
2575
|
+
**Main Components:**
|
|
2576
|
+
- **`DataTable`**: Public API component that wraps `DataTableCore` with feature normalization
|
|
2577
|
+
- **`DataTableCore`**: Internal orchestrator that manages all hooks, state, and sub-components
|
|
2578
|
+
- **`DataTableLayout`**: Main layout component that arranges toolbar, body, pagination, and modals
|
|
2579
|
+
|
|
2580
|
+
**Toolbar Components:**
|
|
2581
|
+
- **`DataTableToolbar`**: Top toolbar with search, grouping, column visibility, and action buttons
|
|
2582
|
+
- **`GroupingDropdown`**: Dropdown for selecting columns to group by
|
|
2583
|
+
- **`ColumnVisibilityDropdown`**: Dropdown for showing/hiding columns
|
|
2584
|
+
- **`BulkOperationsDropdown`**: Menu for bulk operations (delete selected, etc.)
|
|
2585
|
+
|
|
2586
|
+
**Table Body Components:**
|
|
2587
|
+
- **`UnifiedTableBody`**: Unified component that handles both standard and virtualized rendering
|
|
2588
|
+
- **`FilterRow`**: Row of filter inputs below column headers
|
|
2589
|
+
- **`ColumnFilter`**: Individual column filter component
|
|
2590
|
+
- **`MemoizedRow`** (RowComponent): Individual table row with memoization
|
|
2591
|
+
- **`EditableRow`**: Inline editable row with form fields
|
|
2592
|
+
- **`EditFields`**: Field renderers for editable columns (text, select, date, number, boolean)
|
|
2593
|
+
- **`ActionButtons`**: Row action buttons (edit, delete, custom actions)
|
|
2594
|
+
- **Hierarchical expand/collapse**: Handled inline by `RowComponent` for hierarchical rows
|
|
2595
|
+
- **Grouped rows**: Handled inline by `RowComponent` when `row.getIsGrouped()` returns true
|
|
2596
|
+
- **`EmptyState`**: Component displayed when table has no data
|
|
2597
|
+
|
|
2598
|
+
**Pagination Components:**
|
|
2599
|
+
- **`PaginationControls`**: Standard pagination controls
|
|
2600
|
+
- **`EnhancedPaginationControls`**: Enhanced version with performance metrics and jump-to-page
|
|
2601
|
+
|
|
2602
|
+
**Modal Components:**
|
|
2603
|
+
- **`DataTableModals`**: Container for all modal dialogs
|
|
2604
|
+
- **`ImportModal`**: CSV import modal with column mapping
|
|
2605
|
+
|
|
2606
|
+
**Supporting Components:**
|
|
2607
|
+
- **`DataTableErrorBoundary`**: Error boundary for graceful error handling
|
|
2608
|
+
- **`LoadingState`**: Loading indicator component
|
|
2609
|
+
- **`AccessDeniedPage`**: Component shown when user lacks permissions
|
|
2610
|
+
|
|
2518
2611
|
### Performance Utilities
|
|
2519
2612
|
|
|
2520
2613
|
- **`determinePaginationMode`**: Automatically selects optimal pagination strategy
|
|
@@ -93,7 +93,7 @@ function MyApp() {
|
|
|
93
93
|
// Automatically applies event colors when an event is selected
|
|
94
94
|
useEventTheme();
|
|
95
95
|
|
|
96
|
-
return <
|
|
96
|
+
return <main>Your app content</main>;
|
|
97
97
|
}
|
|
98
98
|
```
|
|
99
99
|
|
|
@@ -268,7 +268,7 @@ import { useEventTheme } from '@jmruthers/pace-core';
|
|
|
268
268
|
function MyApp() {
|
|
269
269
|
useEventTheme(); // Automatically applies event colors
|
|
270
270
|
|
|
271
|
-
return <
|
|
271
|
+
return <main>Your app content</main>;
|
|
272
272
|
}
|
|
273
273
|
```
|
|
274
274
|
|
|
@@ -319,7 +319,7 @@ function App() {
|
|
|
319
319
|
function App() {
|
|
320
320
|
useEventTheme(); // Replaces the above useEffect
|
|
321
321
|
|
|
322
|
-
return <
|
|
322
|
+
return <main>Your app</main>;
|
|
323
323
|
}
|
|
324
324
|
```
|
|
325
325
|
|
|
@@ -388,7 +388,7 @@ function FileManager() {
|
|
|
388
388
|
<div>
|
|
389
389
|
{/* Upload UI */}
|
|
390
390
|
{isLoading && <div>Uploading...</div>}
|
|
391
|
-
{error && <
|
|
391
|
+
{error && <p>Error: {error.message}</p>}
|
|
392
392
|
</div>
|
|
393
393
|
);
|
|
394
394
|
}
|
|
@@ -941,6 +941,6 @@ When network is interrupted during upload:
|
|
|
941
941
|
## Next Steps
|
|
942
942
|
|
|
943
943
|
- **[Storage Utilities](../api-reference/utilities.md#storage)** - Additional storage utilities
|
|
944
|
-
- **[Security
|
|
944
|
+
- **[Security & RBAC Standards](../standards/6-security-rbac-standards.md)** - Security guidelines
|
|
945
945
|
- **[RBAC Integration](./permission-enforcement.md)** - Permission-based file access
|
|
946
946
|
- **[Performance Optimization](./performance.md)** - Large file handling
|