@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
|
@@ -112,20 +112,20 @@ const columns: DataTableColumn<Dish>[] = [
|
|
|
112
112
|
header: 'Name',
|
|
113
113
|
// Different rendering for parent vs child rows
|
|
114
114
|
renderForParent: (row) => (
|
|
115
|
-
<
|
|
115
|
+
<section className="flex items-center gap-2">
|
|
116
116
|
<span className="font-semibold text-main-800">{row.name}</span>
|
|
117
117
|
<span className="text-xs bg-main-100 text-main-700 px-2 py-1 rounded">
|
|
118
118
|
{row.type}
|
|
119
119
|
</span>
|
|
120
|
-
</
|
|
120
|
+
</section>
|
|
121
121
|
),
|
|
122
122
|
renderForChild: (row) => (
|
|
123
|
-
<
|
|
123
|
+
<section className="flex items-center gap-2 ml-4">
|
|
124
124
|
<span className="text-sec-700">{row.name}</span>
|
|
125
125
|
<span className="text-xs bg-sec-100 text-sec-600 px-2 py-1 rounded">
|
|
126
126
|
{row.type}
|
|
127
127
|
</span>
|
|
128
|
-
</
|
|
128
|
+
</section>
|
|
129
129
|
),
|
|
130
130
|
},
|
|
131
131
|
{
|
|
@@ -133,14 +133,14 @@ const columns: DataTableColumn<Dish>[] = [
|
|
|
133
133
|
accessorKey: 'cost',
|
|
134
134
|
header: 'Cost',
|
|
135
135
|
renderForParent: (row) => (
|
|
136
|
-
<
|
|
136
|
+
<p className="text-right font-semibold text-main-800">
|
|
137
137
|
${row.cost?.toFixed(2)}
|
|
138
|
-
</
|
|
138
|
+
</p>
|
|
139
139
|
),
|
|
140
140
|
renderForChild: (row) => (
|
|
141
|
-
<
|
|
141
|
+
<p className="text-right text-sec-600 ml-4">
|
|
142
142
|
${row.cost?.toFixed(2)}
|
|
143
|
-
</
|
|
143
|
+
</p>
|
|
144
144
|
),
|
|
145
145
|
},
|
|
146
146
|
{
|
|
@@ -150,10 +150,10 @@ const columns: DataTableColumn<Dish>[] = [
|
|
|
150
150
|
// Only show for child rows
|
|
151
151
|
renderForParent: () => null,
|
|
152
152
|
renderForChild: (row) => (
|
|
153
|
-
<
|
|
153
|
+
<p className="text-sm ml-4">
|
|
154
154
|
<span className="font-medium">{row.quantity}</span>
|
|
155
155
|
{row.unit && <span className="text-sec-500 ml-1">{row.unit}</span>}
|
|
156
|
-
</
|
|
156
|
+
</p>
|
|
157
157
|
),
|
|
158
158
|
hideForParent: true, // Hide this column for parent rows
|
|
159
159
|
}
|
|
@@ -193,7 +193,7 @@ hierarchical={{
|
|
|
193
193
|
onExpandedChange: (expandedIds) => {
|
|
194
194
|
console.log('Expanded rows:', expandedIds);
|
|
195
195
|
},
|
|
196
|
-
|
|
196
|
+
// Note: Custom expand button functionality has been removed. Expand/collapse is handled inline by RowComponent.
|
|
197
197
|
indentSize: 24, // Indentation for child rows in pixels
|
|
198
198
|
parentRowClassName: 'bg-main-50 font-medium', // CSS classes for parent rows
|
|
199
199
|
childRowClassName: 'bg-sec-25', // CSS classes for child rows
|
|
@@ -207,7 +207,7 @@ hierarchical={{
|
|
|
207
207
|
| `enabled` | `boolean` | `false` | Enable/disable hierarchical functionality |
|
|
208
208
|
| `defaultExpanded` | `boolean \| string[]` | `false` | Initial expansion state |
|
|
209
209
|
| `onExpandedChange` | `(expandedIds: string[]) => void` | `undefined` | Callback when expansion changes |
|
|
210
|
-
| `expandButton` |
|
|
210
|
+
| `expandButton` | ~~`React.ComponentType`~~ | ~~`ExpandButton`~~ | ~~Custom expand/collapse button~~ **DEPRECATED - Removed** |
|
|
211
211
|
| `indentSize` | `number` | `24` | Indentation for child rows in pixels |
|
|
212
212
|
| `parentRowClassName` | `string` | `''` | CSS classes for parent rows |
|
|
213
213
|
| `childRowClassName` | `string` | `''` | CSS classes for child rows |
|
|
@@ -240,16 +240,16 @@ const column: DataTableColumn<YourType> = {
|
|
|
240
240
|
id: 'actions',
|
|
241
241
|
header: 'Actions',
|
|
242
242
|
renderForParent: (row) => (
|
|
243
|
-
<
|
|
243
|
+
<section className="flex gap-2">
|
|
244
244
|
<Button size="sm">Edit Recipe</Button>
|
|
245
245
|
<Button size="sm" variant="outline">Add Ingredient</Button>
|
|
246
|
-
</
|
|
246
|
+
</section>
|
|
247
247
|
),
|
|
248
248
|
renderForChild: (row) => (
|
|
249
|
-
<
|
|
249
|
+
<section className="flex gap-2">
|
|
250
250
|
<Button size="sm" variant="ghost">Edit</Button>
|
|
251
251
|
<Button size="sm" variant="destructive">Remove</Button>
|
|
252
|
-
</
|
|
252
|
+
</section>
|
|
253
253
|
),
|
|
254
254
|
}
|
|
255
255
|
```
|
|
@@ -277,29 +277,9 @@ The DataTable automatically adds an expand/collapse all button in the header whe
|
|
|
277
277
|
You can provide a custom expand button component:
|
|
278
278
|
|
|
279
279
|
```tsx
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
<button
|
|
284
|
-
onClick={onClick}
|
|
285
|
-
className="p-1 hover:bg-sec-100 rounded"
|
|
286
|
-
{...props}
|
|
287
|
-
>
|
|
288
|
-
{isExpanded ? (
|
|
289
|
-
<ChevronDown className="h-4 w-4" />
|
|
290
|
-
) : (
|
|
291
|
-
<ChevronRight className="h-4 w-4" />
|
|
292
|
-
)}
|
|
293
|
-
</button>
|
|
294
|
-
);
|
|
295
|
-
|
|
296
|
-
// Use in DataTable
|
|
297
|
-
<DataTable
|
|
298
|
-
hierarchical={{
|
|
299
|
-
enabled: true,
|
|
300
|
-
expandButton: CustomExpandButton,
|
|
301
|
-
}}
|
|
302
|
-
/>
|
|
280
|
+
// Note: Custom expand button functionality has been removed.
|
|
281
|
+
// Expand/collapse buttons are now handled inline by RowComponent.
|
|
282
|
+
// The expandButton prop is no longer available in HierarchicalConfig.
|
|
303
283
|
```
|
|
304
284
|
|
|
305
285
|
## Hierarchical Actions
|
|
@@ -510,20 +490,20 @@ function HierarchicalDishTable() {
|
|
|
510
490
|
enableSorting: true,
|
|
511
491
|
size: 200,
|
|
512
492
|
renderForParent: (row) => (
|
|
513
|
-
<
|
|
493
|
+
<section className="flex items-center gap-2">
|
|
514
494
|
<span className="font-semibold text-main-800">{row.name}</span>
|
|
515
495
|
<span className="text-xs bg-main-100 text-main-700 px-2 py-1 rounded">
|
|
516
496
|
{row.type}
|
|
517
497
|
</span>
|
|
518
|
-
</
|
|
498
|
+
</section>
|
|
519
499
|
),
|
|
520
500
|
renderForChild: (row) => (
|
|
521
|
-
<
|
|
501
|
+
<section className="flex items-center gap-2 ml-4">
|
|
522
502
|
<span className="text-sec-700">{row.name}</span>
|
|
523
503
|
<span className="text-xs bg-sec-100 text-sec-600 px-2 py-1 rounded">
|
|
524
504
|
{row.type}
|
|
525
505
|
</span>
|
|
526
|
-
</
|
|
506
|
+
</section>
|
|
527
507
|
),
|
|
528
508
|
},
|
|
529
509
|
{
|
|
@@ -533,14 +513,14 @@ function HierarchicalDishTable() {
|
|
|
533
513
|
enableSorting: true,
|
|
534
514
|
size: 250,
|
|
535
515
|
renderForParent: (row) => (
|
|
536
|
-
<
|
|
516
|
+
<p className="text-sm text-sec-600">
|
|
537
517
|
{row.description}
|
|
538
|
-
</
|
|
518
|
+
</p>
|
|
539
519
|
),
|
|
540
520
|
renderForChild: (row) => (
|
|
541
|
-
<
|
|
521
|
+
<p className="text-sm text-sec-500 ml-4">
|
|
542
522
|
{row.description}
|
|
543
|
-
</
|
|
523
|
+
</p>
|
|
544
524
|
),
|
|
545
525
|
},
|
|
546
526
|
{
|
|
@@ -551,10 +531,10 @@ function HierarchicalDishTable() {
|
|
|
551
531
|
size: 120,
|
|
552
532
|
renderForParent: () => null,
|
|
553
533
|
renderForChild: (row) => (
|
|
554
|
-
<
|
|
534
|
+
<p className="text-sm ml-4">
|
|
555
535
|
<span className="font-medium">{row.quantity}</span>
|
|
556
536
|
{row.unit && <span className="text-sec-500 ml-1">{row.unit}</span>}
|
|
557
|
-
</
|
|
537
|
+
</p>
|
|
558
538
|
),
|
|
559
539
|
hideForParent: true,
|
|
560
540
|
},
|
|
@@ -565,14 +545,14 @@ function HierarchicalDishTable() {
|
|
|
565
545
|
enableSorting: true,
|
|
566
546
|
size: 100,
|
|
567
547
|
renderForParent: (row) => (
|
|
568
|
-
<
|
|
548
|
+
<p className="text-right font-semibold text-main-800">
|
|
569
549
|
${row.cost?.toFixed(2)}
|
|
570
|
-
</
|
|
550
|
+
</p>
|
|
571
551
|
),
|
|
572
552
|
renderForChild: (row) => (
|
|
573
|
-
<
|
|
553
|
+
<p className="text-right text-sec-600 ml-4">
|
|
574
554
|
${row.cost?.toFixed(2)}
|
|
575
|
-
</
|
|
555
|
+
</p>
|
|
576
556
|
),
|
|
577
557
|
},
|
|
578
558
|
{
|
|
@@ -583,9 +563,9 @@ function HierarchicalDishTable() {
|
|
|
583
563
|
size: 150,
|
|
584
564
|
renderForParent: () => null,
|
|
585
565
|
renderForChild: (row) => (
|
|
586
|
-
<
|
|
566
|
+
<p className="text-sm text-sec-600 ml-4">
|
|
587
567
|
{row.supplier}
|
|
588
|
-
</
|
|
568
|
+
</p>
|
|
589
569
|
),
|
|
590
570
|
hideForParent: true,
|
|
591
571
|
},
|
|
@@ -596,11 +576,11 @@ function HierarchicalDishTable() {
|
|
|
596
576
|
enableSorting: true,
|
|
597
577
|
size: 100,
|
|
598
578
|
renderForParent: (row) => (
|
|
599
|
-
<
|
|
579
|
+
<section className="text-center">
|
|
600
580
|
<span className="inline-flex items-center px-2 py-1 rounded text-xs font-medium bg-sec-100 text-sec-800">
|
|
601
581
|
{row.prepTime} min
|
|
602
582
|
</span>
|
|
603
|
-
</
|
|
583
|
+
</section>
|
|
604
584
|
),
|
|
605
585
|
renderForChild: () => null,
|
|
606
586
|
hideForChild: true,
|
|
@@ -618,11 +598,11 @@ function HierarchicalDishTable() {
|
|
|
618
598
|
Hard: 'bg-acc-100 text-acc-800'
|
|
619
599
|
};
|
|
620
600
|
return (
|
|
621
|
-
<
|
|
601
|
+
<section className="text-center">
|
|
622
602
|
<span className={`inline-flex items-center px-2 py-1 rounded text-xs font-medium ${colors[row.difficulty as keyof typeof colors] || 'bg-sec-100 text-sec-800'}`}>
|
|
623
603
|
{row.difficulty}
|
|
624
604
|
</span>
|
|
625
|
-
</
|
|
605
|
+
</section>
|
|
626
606
|
);
|
|
627
607
|
},
|
|
628
608
|
renderForChild: () => null,
|
|
@@ -812,7 +792,7 @@ interface HierarchicalConfig {
|
|
|
812
792
|
enabled: boolean;
|
|
813
793
|
defaultExpanded?: boolean | string[];
|
|
814
794
|
onExpandedChange?: (expandedIds: string[]) => void;
|
|
815
|
-
expandButton
|
|
795
|
+
// expandButton prop has been removed - expand/collapse is handled inline by RowComponent
|
|
816
796
|
indentSize?: number;
|
|
817
797
|
parentRowClassName?: string;
|
|
818
798
|
childRowClassName?: string;
|
|
@@ -449,7 +449,7 @@ function AuthenticatedApp() {
|
|
|
449
449
|
|
|
450
450
|
// Don't track inactivity if not authenticated
|
|
451
451
|
if (loading || !user) {
|
|
452
|
-
return <
|
|
452
|
+
return <p>Loading...</p>;
|
|
453
453
|
}
|
|
454
454
|
|
|
455
455
|
return (
|
|
@@ -831,5 +831,5 @@ When user extends session during warning:
|
|
|
831
831
|
|
|
832
832
|
- **[Authentication Integration](./permission-enforcement.md)** - Security patterns
|
|
833
833
|
- **[Performance Optimization](./performance.md)** - Large application considerations
|
|
834
|
-
- **[Accessibility
|
|
835
|
-
- **[Security
|
|
834
|
+
- **[Accessibility Requirements](../standards/4-code-quality-standards.md#accessibility-requirements)** - Accessibility requirements
|
|
835
|
+
- **[Security & RBAC Standards](../standards/6-security-rbac-standards.md)** - Security considerations
|
|
@@ -10,11 +10,12 @@ This guide addresses the common issues when working with large datasets (9,000+
|
|
|
10
10
|
|
|
11
11
|
**Problem**: Header and body columns were misaligned in virtualized mode due to separate table layouts.
|
|
12
12
|
|
|
13
|
-
**Solution**:
|
|
13
|
+
**Solution**: `UnifiedTableBody` component automatically handles virtualization with:
|
|
14
14
|
- Synchronized column sizing between header and body tables
|
|
15
15
|
- `table-fixed` layout for consistent column widths
|
|
16
16
|
- Dynamic column width calculation and synchronization
|
|
17
|
-
-
|
|
17
|
+
- Automatic virtualization when data exceeds 1000 records
|
|
18
|
+
- Proper virtualization handling for optimal performance
|
|
18
19
|
|
|
19
20
|
```tsx
|
|
20
21
|
// ✅ Now properly aligned
|
|
@@ -819,5 +819,5 @@ When invalid organisation IDs are provided:
|
|
|
819
819
|
|
|
820
820
|
- **[RBAC System](../rbac/README.md)** - Role-based access control
|
|
821
821
|
- **[Permission Enforcement](./permission-enforcement.md)** - UI permission patterns
|
|
822
|
-
- **[Security
|
|
823
|
-
- **[
|
|
822
|
+
- **[Security & RBAC Standards](../standards/6-security-rbac-standards.md)** - Security guidelines
|
|
823
|
+
- **[Operations Standards](../standards/9-operations-standards.md)** - Error handling and monitoring
|
|
@@ -299,9 +299,9 @@ EnhancedDataTable
|
|
|
299
299
|
│ ├── SearchIndex
|
|
300
300
|
│ ├── PerformanceMonitor
|
|
301
301
|
│ └── VisibilityTracker
|
|
302
|
-
├──
|
|
302
|
+
├── UnifiedTableBody (with automatic virtualization)
|
|
303
303
|
│ ├── MemoizedRow
|
|
304
|
-
│ └──
|
|
304
|
+
│ └── Virtualized rows (when data > 1000 records)
|
|
305
305
|
└── EnhancedPaginationControls
|
|
306
306
|
├── Performance metrics display
|
|
307
307
|
├── Jump to page functionality
|
|
@@ -49,12 +49,16 @@ setupRBAC(supabase);
|
|
|
49
49
|
|
|
50
50
|
## Layout-Level Permission Enforcement
|
|
51
51
|
|
|
52
|
+
> **📋 Contract Reference**: See [RBAC Contract](../rbac/RBAC_CONTRACT.md#enforcepermissions-configuration) for when to use `enforcePermissions={true}` vs `enforcePermissions={false}`.
|
|
53
|
+
|
|
52
54
|
### Why Layout-Level Enforcement?
|
|
53
55
|
|
|
54
56
|
Layout-level enforcement provides a safety net that prevents consuming apps from forgetting to implement permission checks. It ensures that every route is automatically validated for permissions.
|
|
55
57
|
|
|
56
58
|
**Note:** Super admins automatically bypass all permission checks in PaceAppLayout. The component checks super admin status before enforcing permissions, ensuring super admins can access any route without violations.
|
|
57
59
|
|
|
60
|
+
**⚠️ Important**: For event-based apps, set `enforcePermissions={false}` because pages handle their own checks via `PagePermissionGuard`. For organisation-based apps, set `enforcePermissions={true}` to enable layout-level checks.
|
|
61
|
+
|
|
58
62
|
### Basic Implementation
|
|
59
63
|
|
|
60
64
|
```tsx
|
|
@@ -697,7 +701,7 @@ useEffect(() => {
|
|
|
697
701
|
```tsx
|
|
698
702
|
const { selectedOrganisationId } = useUnifiedAuth();
|
|
699
703
|
if (!selectedOrganisationId) {
|
|
700
|
-
return <
|
|
704
|
+
return <p>Please select an organisation first</p>;
|
|
701
705
|
}
|
|
702
706
|
```
|
|
703
707
|
|
|
@@ -60,7 +60,7 @@ function OrganisationContextGuard({ children }) {
|
|
|
60
60
|
}, [selectedOrganisation, supabase]);
|
|
61
61
|
|
|
62
62
|
if (!contextReady) {
|
|
63
|
-
return <
|
|
63
|
+
return <p>Setting up organisation context...</p>;
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
return <>{children}</>;
|
|
@@ -239,7 +239,7 @@ function UserActions() {
|
|
|
239
239
|
'delete:users'
|
|
240
240
|
);
|
|
241
241
|
|
|
242
|
-
if (isLoadingEdit || isLoadingDelete) return <
|
|
242
|
+
if (isLoadingEdit || isLoadingDelete) return <p>Loading permissions...</p>;
|
|
243
243
|
|
|
244
244
|
return (
|
|
245
245
|
<div>
|
|
@@ -375,7 +375,7 @@ const { can: canEdit, isLoading } = useCan(
|
|
|
375
375
|
'update:users'
|
|
376
376
|
);
|
|
377
377
|
|
|
378
|
-
if (isLoading) return <
|
|
378
|
+
if (isLoading) return <p>Loading...</p>;
|
|
379
379
|
return canEdit ? <EditButton /> : null;
|
|
380
380
|
```
|
|
381
381
|
|
|
@@ -406,7 +406,7 @@ const canCreate = hasPermission('create:users');
|
|
|
406
406
|
const canUpdate = hasPermission('update:users');
|
|
407
407
|
const canDelete = hasPermission('delete:users');
|
|
408
408
|
|
|
409
|
-
if (isLoading) return <
|
|
409
|
+
if (isLoading) return <p>Loading permissions...</p>;
|
|
410
410
|
```
|
|
411
411
|
|
|
412
412
|
### Pattern 3: Component Guards
|
|
@@ -504,8 +504,8 @@ function UserActions({ userId, scope }) {
|
|
|
504
504
|
checkPermission();
|
|
505
505
|
}, [hasPermission, isLoading, userId, scope]);
|
|
506
506
|
|
|
507
|
-
if (error) return <
|
|
508
|
-
if (isLoading) return <
|
|
507
|
+
if (error) return <p>Error checking permissions</p>;
|
|
508
|
+
if (isLoading) return <p>Loading...</p>;
|
|
509
509
|
|
|
510
510
|
return (
|
|
511
511
|
<div>
|
|
@@ -595,7 +595,7 @@ const canEdit = await hasPermission('update:users', { userId, scope });
|
|
|
595
595
|
```tsx
|
|
596
596
|
const { hasPermission, isLoading } = useCan();
|
|
597
597
|
|
|
598
|
-
if (isLoading) return <
|
|
598
|
+
if (isLoading) return <p>Loading permissions...</p>;
|
|
599
599
|
```
|
|
600
600
|
|
|
601
601
|
### Getting Help
|