@jmruthers/pace-core 0.6.1 → 0.6.3
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 +88 -10
- package/cursor-rules/00-pace-core-compliance.mdc +46 -87
- package/cursor-rules/01-standards-compliance.mdc +16 -47
- package/cursor-rules/02-project-structure.mdc +4 -4
- package/cursor-rules/03-solid-principles.mdc +45 -164
- package/cursor-rules/04-testing-standards.mdc +22 -69
- package/cursor-rules/05-bug-reports-and-features.mdc +2 -2
- package/cursor-rules/06-code-quality.mdc +42 -125
- package/cursor-rules/07-tech-stack-compliance.mdc +33 -128
- package/cursor-rules/08-markup-quality.mdc +452 -0
- package/cursor-rules/CHANGELOG.md +18 -0
- package/cursor-rules/README.md +2 -1
- package/dist/{AuthService-DjnJHDtC.d.ts → AuthService-Cb34EQs3.d.ts} +63 -1
- package/dist/{DataTable-CH1U5Tpy.d.ts → DataTable-BMRU8a1j.d.ts} +33 -1
- package/dist/{DataTable-DQ7RSOHE.js → DataTable-THFPBKTP.js} +12 -10
- package/dist/{PublicPageProvider-ce4xlHYA.d.ts → PublicPageProvider-DEMpysFR.d.ts} +394 -171
- package/dist/{UnifiedAuthProvider-185Ih4dj.d.ts → UnifiedAuthProvider-CKvHP1MK.d.ts} +30 -8
- package/dist/{UnifiedAuthProvider-ATAP5UTR.js → UnifiedAuthProvider-KAGUYQ4J.js} +5 -4
- package/dist/{api-N774RPUA.js → api-IAGWF3ZG.js} +10 -10
- package/dist/{audit-B5P6FFIR.js → audit-V53FV5AG.js} +2 -2
- package/dist/{chunk-JBKQ3SAO.js → chunk-2T2IG7T7.js} +107 -57
- package/dist/chunk-2T2IG7T7.js.map +1 -0
- package/dist/{chunk-3QRJFVBR.js → chunk-6SOIHG6Z.js} +1 -1
- package/dist/chunk-6SOIHG6Z.js.map +1 -0
- package/dist/{chunk-3XTALGJF.js → chunk-6Z7LTB3D.js} +69 -240
- package/dist/chunk-6Z7LTB3D.js.map +1 -0
- package/dist/{chunk-4ZC4GX36.js → chunk-CNCQDFLN.js} +199 -46
- package/dist/chunk-CNCQDFLN.js.map +1 -0
- package/dist/chunk-DGUM43GV.js +11 -0
- package/dist/{chunk-BYFSK72L.js → chunk-DWUBLJJM.js} +361 -187
- package/dist/chunk-DWUBLJJM.js.map +1 -0
- package/dist/{chunk-LXQLPRQ2.js → chunk-FFQEQTNW.js} +6 -8
- package/dist/chunk-FFQEQTNW.js.map +1 -0
- package/dist/chunk-FMUCXFII.js +76 -0
- package/dist/chunk-FMUCXFII.js.map +1 -0
- package/dist/{chunk-4N5C5XZU.js → chunk-HFZBI76P.js} +4 -4
- package/dist/chunk-HFZBI76P.js.map +1 -0
- package/dist/{chunk-SQGMNID3.js → chunk-L4OXEN46.js} +4 -5
- package/dist/chunk-L4OXEN46.js.map +1 -0
- package/dist/{chunk-R77UEZ4E.js → chunk-M43Y4SSO.js} +1 -1
- package/dist/chunk-M43Y4SSO.js.map +1 -0
- package/dist/{chunk-I7PSE6JW.js → chunk-M7MPQISP.js} +3 -76
- package/dist/chunk-M7MPQISP.js.map +1 -0
- package/dist/chunk-PQBSKX33.js +7793 -0
- package/dist/chunk-PQBSKX33.js.map +1 -0
- package/dist/chunk-QRPVRXYT.js +226 -0
- package/dist/chunk-QRPVRXYT.js.map +1 -0
- package/dist/{chunk-KNC55RTG.js → chunk-RWEBCB47.js} +194 -416
- package/dist/chunk-RWEBCB47.js.map +1 -0
- package/dist/{chunk-XM25TVIE.js → chunk-YDQHOZNA.js} +843 -388
- package/dist/chunk-YDQHOZNA.js.map +1 -0
- package/dist/{chunk-GLK6VM3F.js → chunk-ZNIWI3UC.js} +739 -737
- package/dist/chunk-ZNIWI3UC.js.map +1 -0
- package/dist/components.d.ts +5 -5
- package/dist/components.js +18 -16
- package/dist/components.js.map +1 -1
- package/dist/contextValidator-3JNZKUTX.js +9 -0
- package/dist/contextValidator-3JNZKUTX.js.map +1 -0
- package/dist/eslint-rules/pace-core-compliance.cjs +106 -0
- package/dist/{functions-D_kgHktt.d.ts → functions-DHebl8-F.d.ts} +1 -1
- package/dist/hooks.d.ts +55 -122
- package/dist/hooks.js +10 -13
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +60 -13
- package/dist/index.js +30 -25
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +21 -3
- package/dist/providers.js +4 -3
- package/dist/rbac/index.d.ts +210 -139
- package/dist/rbac/index.js +17 -13
- package/dist/styles/index.js +1 -1
- package/dist/theming/runtime.d.ts +1 -13
- package/dist/theming/runtime.js +2 -2
- package/dist/{timezone-_pgH8qrY.d.ts → timezone-CHhWg6b4.d.ts} +3 -10
- package/dist/{types-UU913iLA.d.ts → types-BeoeWV5I.d.ts} +8 -0
- package/dist/{types-CEpcvwwF.d.ts → types-CkbwOr4Y.d.ts} +6 -0
- package/dist/types.d.ts +2 -2
- package/dist/types.js +1 -1
- package/dist/{usePublicRouteParams-BJAlWfuJ.d.ts → usePublicRouteParams-i3qtoBgg.d.ts} +38 -17
- package/dist/utils.d.ts +4 -5
- package/dist/utils.js +17 -19
- package/dist/utils.js.map +1 -1
- package/docs/api/README.md +21 -17
- package/docs/api/modules.md +4191 -2967
- package/docs/architecture/database-schema-requirements.md +161 -0
- package/docs/components/context-selector.md +126 -0
- package/docs/core-concepts/rbac-system.md +3 -3
- package/docs/documentation-index.md +2 -4
- package/docs/getting-started/cursor-rules.md +2 -1
- package/docs/migration/DOCUMENTATION_STRUCTURE.md +441 -0
- package/docs/migration/MIGRATION_GUIDE.md +2 -24
- package/docs/migration/RBAC_SCOPE_MIGRATION.md +385 -0
- package/docs/migration/README.md +52 -6
- package/docs/migration/V0.5.190_TO_V0.6.1_MIGRATION.md +1153 -0
- package/docs/migration/database-changes-december-2025.md +3 -3
- package/docs/pace-mint-fix-auto-selection.md +218 -0
- package/docs/pace-mint-rbac-setup.md +391 -0
- package/docs/rbac/event-based-apps.md +1 -1
- package/docs/rbac/getting-started.md +1 -1
- package/docs/rbac/quick-start.md +1 -1
- package/docs/rbac/secure-client-protection.md +330 -0
- package/docs/standards/README.md +1 -0
- package/package.json +4 -3
- package/scripts/audit/core/checks/accessibility.cjs +197 -0
- package/scripts/audit/core/checks/api-usage.cjs +191 -0
- package/scripts/audit/core/checks/bundle.cjs +142 -0
- package/scripts/{check-pace-core-compliance.cjs → audit/core/checks/compliance.cjs} +784 -685
- package/scripts/audit/core/checks/config.cjs +54 -0
- package/scripts/audit/core/checks/coverage.cjs +84 -0
- package/scripts/audit/core/checks/dependencies.cjs +985 -0
- package/scripts/audit/core/checks/documentation.cjs +268 -0
- package/scripts/audit/core/checks/environment.cjs +116 -0
- package/scripts/audit/core/checks/error-handling.cjs +340 -0
- package/scripts/audit/core/checks/forms.cjs +172 -0
- package/scripts/audit/core/checks/heuristics.cjs +68 -0
- package/scripts/audit/core/checks/hooks.cjs +334 -0
- package/scripts/audit/core/checks/imports.cjs +244 -0
- package/scripts/audit/core/checks/performance.cjs +325 -0
- package/scripts/audit/core/checks/routes.cjs +117 -0
- package/scripts/audit/core/checks/state.cjs +130 -0
- package/scripts/audit/core/checks/structure.cjs +65 -0
- package/scripts/audit/core/checks/style.cjs +584 -0
- package/scripts/audit/core/checks/testing.cjs +122 -0
- package/scripts/audit/core/checks/typescript.cjs +61 -0
- package/scripts/audit/core/scanner.cjs +199 -0
- package/scripts/audit/core/utils.cjs +137 -0
- package/scripts/audit/index.cjs +223 -0
- package/scripts/audit/reporters/console.cjs +151 -0
- package/scripts/audit/reporters/json.cjs +54 -0
- package/scripts/audit/reporters/markdown.cjs +124 -0
- package/scripts/audit-consuming-app.cjs +61 -936
- package/scripts/build-docs/build-decision.js +240 -0
- package/scripts/build-docs/cache-utils.js +105 -0
- package/scripts/build-docs/content-normalization.js +150 -0
- package/scripts/build-docs/file-utils.js +105 -0
- package/scripts/build-docs/git-utils.js +86 -0
- package/scripts/build-docs/hash-utils.js +116 -0
- package/scripts/build-docs/typedoc-runner.js +220 -0
- package/scripts/build-docs-incremental.js +77 -913
- package/scripts/utils/command-runner.js +16 -11
- package/scripts/validate-formats.js +61 -56
- package/scripts/validate-master.js +74 -69
- package/scripts/validate-pre-publish.js +70 -65
- package/src/__tests__/hooks/usePermissions.test.ts +2 -2
- package/src/components/Alert/Alert.test.tsx +12 -18
- package/src/components/Alert/Alert.tsx +5 -7
- package/src/components/Avatar/Avatar.test.tsx +4 -4
- package/src/components/Badge/Badge.tsx +14 -0
- package/src/components/Button/Button.tsx +22 -0
- package/src/components/Calendar/Calendar.tsx +8 -2
- package/src/components/Card/Card.tsx +4 -0
- package/src/components/Checkbox/Checkbox.test.tsx +12 -12
- package/src/components/Checkbox/Checkbox.tsx +2 -2
- package/src/components/ContextSelector/ContextSelector.tsx +384 -0
- package/src/components/ContextSelector/index.ts +3 -0
- package/src/components/DataTable/DataTable.tsx +38 -4
- package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +5 -6
- package/src/components/DataTable/__tests__/pagination.modes.test.tsx +18 -4
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +2 -3
- package/src/components/DataTable/components/AccessDeniedPage.tsx +16 -25
- package/src/components/DataTable/components/ActionButtons.tsx +10 -7
- package/src/components/DataTable/components/BulkOperationsDropdown.tsx +1 -1
- package/src/components/DataTable/components/ColumnFilter.tsx +10 -0
- package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +12 -0
- package/src/components/DataTable/components/DataTableBody.tsx +8 -0
- package/src/components/DataTable/components/DataTableCore.tsx +196 -554
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +11 -0
- package/src/components/DataTable/components/DataTableLayout.tsx +559 -0
- package/src/components/DataTable/components/DataTableModals.tsx +8 -0
- package/src/components/DataTable/components/DataTableToolbar.tsx +8 -0
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +12 -0
- package/src/components/DataTable/components/EditFields.tsx +307 -0
- package/src/components/DataTable/components/EditableRow.tsx +8 -0
- package/src/components/DataTable/components/EmptyState.tsx +10 -0
- package/src/components/DataTable/components/FilterRow.tsx +12 -0
- package/src/components/DataTable/components/GroupHeader.tsx +12 -0
- package/src/components/DataTable/components/GroupingDropdown.tsx +12 -0
- package/src/components/DataTable/components/ImportModal.tsx +7 -0
- package/src/components/DataTable/components/LoadingState.tsx +6 -0
- package/src/components/DataTable/components/PaginationControls.tsx +16 -1
- package/src/components/DataTable/components/RowComponent.tsx +391 -0
- package/src/components/DataTable/components/UnifiedTableBody.tsx +63 -851
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +16 -4
- package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +4 -2
- package/src/components/DataTable/components/cellValueUtils.ts +40 -0
- package/src/components/DataTable/components/hooks/useImportModalFocus.ts +53 -0
- package/src/components/DataTable/components/hooks/usePermissionTracking.ts +126 -0
- package/src/components/DataTable/context/DataTableContext.tsx +50 -0
- package/src/components/DataTable/core/ColumnFactory.ts +31 -0
- package/src/components/DataTable/core/DataTableContext.tsx +32 -1
- package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +10 -0
- package/src/components/DataTable/hooks/useColumnReordering.ts +12 -0
- package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +10 -0
- package/src/components/DataTable/hooks/useDataTableDataPipeline.ts +16 -0
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +127 -33
- package/src/components/DataTable/hooks/useDataTableState.ts +35 -1
- package/src/components/DataTable/hooks/useEffectiveColumnOrder.ts +12 -0
- package/src/components/DataTable/hooks/useServerSideDataEffect.ts +11 -0
- package/src/components/DataTable/hooks/useTableColumns.ts +8 -0
- package/src/components/DataTable/hooks/useTableHandlers.ts +14 -0
- package/src/components/DataTable/styles.ts +6 -6
- package/src/components/DataTable/types.ts +6 -10
- package/src/components/DataTable/utils/a11yUtils.ts +7 -0
- package/src/components/DataTable/utils/debugTools.ts +18 -113
- package/src/components/DataTable/utils/errorHandling.ts +12 -0
- package/src/components/DataTable/utils/exportUtils.ts +9 -0
- package/src/components/DataTable/utils/flexibleImport.ts +12 -48
- package/src/components/DataTable/utils/paginationUtils.ts +8 -0
- package/src/components/DataTable/utils/performanceUtils.ts +5 -1
- package/src/components/Dialog/Dialog.tsx +31 -3
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +180 -1
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +45 -5
- package/src/components/ErrorBoundary/ErrorBoundaryContext.tsx +129 -0
- package/src/components/ErrorBoundary/index.ts +27 -2
- package/src/components/FileDisplay/FileDisplay.tsx +74 -28
- package/src/components/FileUpload/FileUpload.tsx +22 -2
- package/src/components/Footer/Footer.test.tsx +16 -16
- package/src/components/Footer/Footer.tsx +14 -11
- package/src/components/Form/Form.tsx +1 -0
- package/src/components/Header/Header.test.tsx +43 -73
- package/src/components/Header/Header.tsx +59 -49
- package/src/components/Input/Input.test.tsx +2 -2
- package/src/components/Input/Input.tsx +8 -4
- package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +4 -4
- package/src/components/LoginForm/LoginForm.tsx +4 -0
- package/src/components/NavigationMenu/NavigationMenu.tsx +14 -513
- package/src/components/NavigationMenu/types.ts +56 -0
- package/src/components/NavigationMenu/useNavigationFiltering.ts +390 -0
- package/src/components/PaceAppLayout/PaceAppLayout.integration.test.tsx +10 -19
- package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +2 -2
- package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +5 -5
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +13 -11
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +167 -44
- package/src/components/PaceAppLayout/README.md +14 -17
- package/src/components/PaceAppLayout/test-setup.tsx +3 -4
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +3 -0
- package/src/components/PasswordChange/PasswordChangeForm.tsx +9 -0
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -9
- package/src/components/PublicLayout/PublicPageLayout.tsx +2 -5
- package/src/components/PublicLayout/PublicPageProvider.tsx +4 -0
- package/src/components/Select/Select.tsx +80 -434
- package/src/components/Select/context.ts +23 -0
- package/src/components/Select/hooks/useSelectEvents.ts +87 -0
- package/src/components/Select/hooks/useSelectSearch.ts +91 -0
- package/src/components/Select/hooks/useSelectState.ts +104 -0
- package/src/components/Select/index.ts +9 -1
- package/src/components/Select/types.ts +123 -0
- package/src/components/Select/utils/text.ts +26 -0
- package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +4 -5
- package/src/components/Switch/Switch.tsx +4 -4
- package/src/components/Tabs/Tabs.tsx +1 -1
- package/src/components/Toast/Toast.tsx +4 -0
- package/src/components/Tooltip/Tooltip.tsx +2 -2
- package/src/components/UserMenu/UserMenu.test.tsx +24 -11
- package/src/components/UserMenu/UserMenu.tsx +21 -18
- package/src/components/index.ts +7 -7
- package/src/eslint-rules/pace-core-compliance.cjs +106 -0
- package/src/hooks/__tests__/index.unit.test.ts +2 -5
- package/src/hooks/__tests__/useAppConfig.unit.test.ts +4 -98
- package/src/hooks/index.ts +1 -2
- package/src/hooks/public/usePublicEvent.ts +4 -0
- package/src/hooks/public/usePublicEventLogo.ts +4 -0
- package/src/hooks/public/usePublicFileDisplay.ts +4 -0
- package/src/hooks/public/usePublicRouteParams.ts +4 -0
- package/src/hooks/services/useAuth.ts +32 -0
- package/src/hooks/services/useCurrentEvent.ts +6 -0
- package/src/hooks/services/useCurrentOrganisation.ts +6 -0
- package/src/hooks/useAppConfig.ts +15 -30
- package/src/hooks/useDebounce.ts +9 -0
- package/src/hooks/useEventTheme.ts +6 -0
- package/src/hooks/useFileDisplay.ts +81 -50
- package/src/hooks/useFileReference.ts +25 -7
- package/src/hooks/useFileUrl.ts +11 -1
- package/src/hooks/useFocusManagement.ts +14 -0
- package/src/hooks/useFocusTrap.ts +3 -0
- package/src/hooks/useInactivityTracker.ts +3 -0
- package/src/hooks/useKeyboardShortcuts.ts +4 -0
- package/src/hooks/useOrganisationPermissions.ts +4 -0
- package/src/hooks/useOrganisationSecurity.ts +4 -0
- package/src/hooks/usePerformanceMonitor.ts +4 -0
- package/src/hooks/usePermissionCache.ts +7 -0
- package/src/hooks/useQueryCache.ts +12 -1
- package/src/hooks/useSessionRestoration.ts +4 -0
- package/src/hooks/useStorage.ts +4 -0
- package/src/hooks/useToast.ts +1 -1
- package/src/index.ts +6 -6
- package/src/providers/__tests__/OrganisationProvider.test.tsx +92 -70
- package/src/providers/services/AuthServiceProvider.tsx +35 -7
- package/src/providers/services/EventServiceProvider.tsx +51 -5
- package/src/providers/services/InactivityServiceProvider.tsx +18 -0
- package/src/providers/services/OrganisationServiceProvider.tsx +18 -0
- package/src/providers/services/UnifiedAuthProvider.tsx +126 -134
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +29 -13
- package/src/rbac/README.md +1 -1
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +1 -1
- package/src/rbac/__tests__/scenarios.user-role.test.tsx +4 -5
- package/src/rbac/adapters.tsx +12 -3
- package/src/rbac/api.test.ts +59 -51
- package/src/rbac/api.ts +246 -167
- package/src/rbac/components/NavigationProvider.tsx +4 -1
- package/src/rbac/components/PagePermissionGuard.tsx +185 -17
- package/src/rbac/components/RoleBasedRouter.tsx +5 -1
- package/src/rbac/components/SecureDataProvider.test.tsx +84 -49
- package/src/rbac/components/SecureDataProvider.tsx +20 -5
- package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +24 -14
- package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +7 -0
- package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +14 -6
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +15 -4
- package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +148 -24
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +81 -15
- package/src/rbac/engine.ts +38 -14
- package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +32 -21
- package/src/rbac/hooks/permissions/index.ts +7 -0
- package/src/rbac/hooks/permissions/useAccessLevel.ts +105 -0
- package/src/rbac/hooks/permissions/useCachedPermissions.ts +79 -0
- package/src/rbac/hooks/permissions/useCan.ts +377 -0
- package/src/rbac/hooks/permissions/useHasAllPermissions.ts +90 -0
- package/src/rbac/hooks/permissions/useHasAnyPermission.ts +90 -0
- package/src/rbac/hooks/permissions/useMultiplePermissions.ts +93 -0
- package/src/rbac/hooks/permissions/usePermissions.ts +253 -0
- package/src/rbac/hooks/useCan.test.ts +64 -66
- package/src/rbac/hooks/usePermissions.ts +14 -995
- package/src/rbac/hooks/useRBAC.test.ts +1 -5
- package/src/rbac/hooks/useRBAC.ts +36 -37
- package/src/rbac/hooks/useResolvedScope.test.ts +120 -35
- package/src/rbac/hooks/useResolvedScope.ts +35 -40
- package/src/rbac/hooks/useResourcePermissions.test.ts +54 -18
- package/src/rbac/hooks/useResourcePermissions.ts +14 -4
- package/src/rbac/hooks/useSecureSupabase.ts +27 -7
- package/src/rbac/index.ts +7 -0
- package/src/rbac/permissions.ts +0 -30
- package/src/rbac/secureClient.test.ts +22 -18
- package/src/rbac/secureClient.ts +294 -68
- package/src/rbac/security.ts +0 -17
- package/src/rbac/types.ts +9 -0
- package/src/rbac/utils/__tests__/contextValidator.test.ts +64 -86
- package/src/rbac/utils/clientSecurity.ts +93 -0
- package/src/rbac/utils/contextValidator.ts +77 -168
- package/src/services/AuthService.ts +39 -7
- package/src/services/EventService.ts +186 -54
- package/src/services/OrganisationService.ts +81 -14
- package/src/services/__tests__/EventService.test.ts +1 -2
- package/src/services/base/BaseService.ts +3 -0
- package/src/theming/__tests__/parseEventColours.test.ts +6 -9
- package/src/theming/parseEventColours.ts +5 -19
- package/src/types/vitest-globals.d.ts +51 -26
- package/src/utils/__mocks__/supabaseMock.ts +1 -3
- package/src/utils/__tests__/formatting.unit.test.ts +4 -4
- package/src/utils/__tests__/index.unit.test.ts +2 -2
- package/src/utils/audit/audit.ts +0 -3
- package/src/utils/core/cn.ts +1 -1
- package/src/utils/dynamic/dynamicUtils.ts +7 -4
- package/src/utils/file-reference/index.ts +53 -1
- package/src/utils/formatting/formatting.ts +8 -18
- package/src/utils/index.ts +0 -1
- package/dist/chunk-3QRJFVBR.js.map +0 -1
- package/dist/chunk-3XTALGJF.js.map +0 -1
- package/dist/chunk-4N5C5XZU.js.map +0 -1
- package/dist/chunk-4ZC4GX36.js.map +0 -1
- package/dist/chunk-7D4SUZUM.js +0 -38
- package/dist/chunk-BYFSK72L.js.map +0 -1
- package/dist/chunk-EXUD6RNJ.js +0 -451
- package/dist/chunk-EXUD6RNJ.js.map +0 -1
- package/dist/chunk-GLK6VM3F.js.map +0 -1
- package/dist/chunk-I7PSE6JW.js.map +0 -1
- package/dist/chunk-JBKQ3SAO.js.map +0 -1
- package/dist/chunk-KNC55RTG.js.map +0 -1
- package/dist/chunk-LXQLPRQ2.js.map +0 -1
- package/dist/chunk-R77UEZ4E.js.map +0 -1
- package/dist/chunk-SQGMNID3.js.map +0 -1
- package/dist/chunk-T33XF5ZC.js +0 -12922
- package/dist/chunk-T33XF5ZC.js.map +0 -1
- package/dist/chunk-XM25TVIE.js.map +0 -1
- package/docs/api/classes/ColumnFactory.md +0 -243
- package/docs/api/classes/ErrorBoundary.md +0 -144
- package/docs/api/classes/InvalidScopeError.md +0 -73
- package/docs/api/classes/Logger.md +0 -178
- package/docs/api/classes/MissingUserContextError.md +0 -66
- package/docs/api/classes/OrganisationContextRequiredError.md +0 -66
- package/docs/api/classes/PermissionDeniedError.md +0 -73
- package/docs/api/classes/RBACAuditManager.md +0 -297
- package/docs/api/classes/RBACCache.md +0 -322
- package/docs/api/classes/RBACEngine.md +0 -171
- package/docs/api/classes/RBACError.md +0 -76
- package/docs/api/classes/RBACNotInitializedError.md +0 -66
- package/docs/api/classes/SecureSupabaseClient.md +0 -160
- package/docs/api/classes/StorageUtils.md +0 -328
- package/docs/api/enums/FileCategory.md +0 -184
- package/docs/api/enums/LogLevel.md +0 -54
- package/docs/api/enums/RBACErrorCode.md +0 -228
- package/docs/api/enums/RPCFunction.md +0 -118
- package/docs/api/interfaces/AddressFieldProps.md +0 -241
- package/docs/api/interfaces/AddressFieldRef.md +0 -94
- package/docs/api/interfaces/AggregateConfig.md +0 -43
- package/docs/api/interfaces/AutocompleteOptions.md +0 -75
- package/docs/api/interfaces/AvatarProps.md +0 -128
- package/docs/api/interfaces/BadgeProps.md +0 -27
- package/docs/api/interfaces/ButtonProps.md +0 -53
- package/docs/api/interfaces/CalendarProps.md +0 -70
- package/docs/api/interfaces/CardProps.md +0 -66
- package/docs/api/interfaces/ColorPalette.md +0 -7
- package/docs/api/interfaces/ColorShade.md +0 -66
- package/docs/api/interfaces/ComplianceResult.md +0 -30
- package/docs/api/interfaces/DataAccessRecord.md +0 -96
- package/docs/api/interfaces/DataRecord.md +0 -11
- package/docs/api/interfaces/DataTableAction.md +0 -249
- package/docs/api/interfaces/DataTableColumn.md +0 -504
- package/docs/api/interfaces/DataTableProps.md +0 -625
- package/docs/api/interfaces/DataTableToolbarButton.md +0 -96
- package/docs/api/interfaces/DatabaseComplianceResult.md +0 -85
- package/docs/api/interfaces/DatabaseIssue.md +0 -41
- package/docs/api/interfaces/EmptyStateConfig.md +0 -61
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +0 -235
- package/docs/api/interfaces/EventAppRoleData.md +0 -71
- package/docs/api/interfaces/ExportColumn.md +0 -90
- package/docs/api/interfaces/ExportOptions.md +0 -126
- package/docs/api/interfaces/FileDisplayProps.md +0 -249
- package/docs/api/interfaces/FileMetadata.md +0 -129
- package/docs/api/interfaces/FileReference.md +0 -118
- package/docs/api/interfaces/FileSizeLimits.md +0 -7
- package/docs/api/interfaces/FileUploadOptions.md +0 -139
- package/docs/api/interfaces/FileUploadProps.md +0 -293
- package/docs/api/interfaces/FooterProps.md +0 -105
- package/docs/api/interfaces/FormFieldProps.md +0 -166
- package/docs/api/interfaces/FormProps.md +0 -113
- package/docs/api/interfaces/GrantEventAppRoleParams.md +0 -122
- package/docs/api/interfaces/InactivityWarningModalProps.md +0 -115
- package/docs/api/interfaces/InputProps.md +0 -53
- package/docs/api/interfaces/LabelProps.md +0 -107
- package/docs/api/interfaces/LoggerConfig.md +0 -62
- package/docs/api/interfaces/LoginFormProps.md +0 -184
- package/docs/api/interfaces/NavigationAccessRecord.md +0 -107
- package/docs/api/interfaces/NavigationContextType.md +0 -164
- package/docs/api/interfaces/NavigationGuardProps.md +0 -139
- package/docs/api/interfaces/NavigationItem.md +0 -120
- package/docs/api/interfaces/NavigationMenuProps.md +0 -221
- package/docs/api/interfaces/NavigationProviderProps.md +0 -117
- package/docs/api/interfaces/Organisation.md +0 -140
- package/docs/api/interfaces/OrganisationContextType.md +0 -388
- package/docs/api/interfaces/OrganisationMembership.md +0 -140
- package/docs/api/interfaces/OrganisationProviderProps.md +0 -76
- package/docs/api/interfaces/OrganisationSecurityError.md +0 -62
- package/docs/api/interfaces/PaceAppLayoutProps.md +0 -406
- package/docs/api/interfaces/PaceLoginPageProps.md +0 -47
- package/docs/api/interfaces/PageAccessRecord.md +0 -85
- package/docs/api/interfaces/PagePermissionContextType.md +0 -140
- package/docs/api/interfaces/PagePermissionGuardProps.md +0 -153
- package/docs/api/interfaces/PagePermissionProviderProps.md +0 -119
- package/docs/api/interfaces/PaletteData.md +0 -41
- package/docs/api/interfaces/ParsedAddress.md +0 -120
- package/docs/api/interfaces/PermissionEnforcerProps.md +0 -153
- package/docs/api/interfaces/ProgressProps.md +0 -42
- package/docs/api/interfaces/ProtectedRouteProps.md +0 -97
- package/docs/api/interfaces/PublicPageFooterProps.md +0 -112
- package/docs/api/interfaces/PublicPageHeaderProps.md +0 -125
- package/docs/api/interfaces/PublicPageLayoutProps.md +0 -198
- package/docs/api/interfaces/QuickFix.md +0 -52
- package/docs/api/interfaces/RBACAccessValidateParams.md +0 -52
- package/docs/api/interfaces/RBACAccessValidateResult.md +0 -41
- package/docs/api/interfaces/RBACAuditLogParams.md +0 -85
- package/docs/api/interfaces/RBACAuditLogResult.md +0 -52
- package/docs/api/interfaces/RBACConfig.md +0 -133
- package/docs/api/interfaces/RBACContext.md +0 -52
- package/docs/api/interfaces/RBACLogger.md +0 -112
- package/docs/api/interfaces/RBACPageAccessCheckParams.md +0 -74
- package/docs/api/interfaces/RBACPerformanceMetrics.md +0 -138
- package/docs/api/interfaces/RBACPermissionCheckParams.md +0 -74
- package/docs/api/interfaces/RBACPermissionCheckResult.md +0 -52
- package/docs/api/interfaces/RBACPermissionsGetParams.md +0 -63
- package/docs/api/interfaces/RBACPermissionsGetResult.md +0 -63
- package/docs/api/interfaces/RBACResult.md +0 -58
- package/docs/api/interfaces/RBACRoleGrantParams.md +0 -63
- package/docs/api/interfaces/RBACRoleGrantResult.md +0 -52
- package/docs/api/interfaces/RBACRoleRevokeParams.md +0 -63
- package/docs/api/interfaces/RBACRoleRevokeResult.md +0 -52
- package/docs/api/interfaces/RBACRoleValidateParams.md +0 -52
- package/docs/api/interfaces/RBACRoleValidateResult.md +0 -63
- package/docs/api/interfaces/RBACRolesListParams.md +0 -52
- package/docs/api/interfaces/RBACRolesListResult.md +0 -74
- package/docs/api/interfaces/RBACSessionTrackParams.md +0 -74
- package/docs/api/interfaces/RBACSessionTrackResult.md +0 -52
- package/docs/api/interfaces/ResourcePermissions.md +0 -155
- package/docs/api/interfaces/RevokeEventAppRoleParams.md +0 -100
- package/docs/api/interfaces/RoleBasedRouterContextType.md +0 -151
- package/docs/api/interfaces/RoleBasedRouterProps.md +0 -156
- package/docs/api/interfaces/RoleManagementResult.md +0 -52
- package/docs/api/interfaces/RouteAccessRecord.md +0 -107
- package/docs/api/interfaces/RouteConfig.md +0 -134
- package/docs/api/interfaces/RuntimeComplianceResult.md +0 -55
- package/docs/api/interfaces/SecureDataContextType.md +0 -168
- package/docs/api/interfaces/SecureDataProviderProps.md +0 -132
- package/docs/api/interfaces/SessionRestorationLoaderProps.md +0 -34
- package/docs/api/interfaces/SetupIssue.md +0 -41
- package/docs/api/interfaces/StorageConfig.md +0 -41
- package/docs/api/interfaces/StorageFileInfo.md +0 -74
- package/docs/api/interfaces/StorageFileMetadata.md +0 -151
- package/docs/api/interfaces/StorageListOptions.md +0 -99
- package/docs/api/interfaces/StorageListResult.md +0 -41
- package/docs/api/interfaces/StorageUploadOptions.md +0 -101
- package/docs/api/interfaces/StorageUploadResult.md +0 -63
- package/docs/api/interfaces/StorageUrlOptions.md +0 -60
- package/docs/api/interfaces/StyleImport.md +0 -19
- package/docs/api/interfaces/SwitchProps.md +0 -34
- package/docs/api/interfaces/TabsContentProps.md +0 -9
- package/docs/api/interfaces/TabsListProps.md +0 -9
- package/docs/api/interfaces/TabsProps.md +0 -9
- package/docs/api/interfaces/TabsTriggerProps.md +0 -50
- package/docs/api/interfaces/TextareaProps.md +0 -53
- package/docs/api/interfaces/ToastActionElement.md +0 -9
- package/docs/api/interfaces/ToastProps.md +0 -9
- package/docs/api/interfaces/UnifiedAuthContextType.md +0 -820
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +0 -171
- package/docs/api/interfaces/UseFormDialogOptions.md +0 -62
- package/docs/api/interfaces/UseFormDialogReturn.md +0 -117
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +0 -136
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +0 -123
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +0 -87
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +0 -81
- package/docs/api/interfaces/UsePublicEventOptions.md +0 -34
- package/docs/api/interfaces/UsePublicEventReturn.md +0 -68
- package/docs/api/interfaces/UsePublicFileDisplayOptions.md +0 -47
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +0 -120
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +0 -94
- package/docs/api/interfaces/UseResolvedScopeOptions.md +0 -47
- package/docs/api/interfaces/UseResolvedScopeReturn.md +0 -47
- package/docs/api/interfaces/UseResourcePermissionsOptions.md +0 -34
- package/docs/api/interfaces/UserEventAccess.md +0 -118
- package/docs/api/interfaces/UserMenuProps.md +0 -86
- package/docs/api/interfaces/UserProfile.md +0 -63
- package/docs/migration/quick-migration-guide.md +0 -356
- package/docs/migration/service-architecture.md +0 -281
- package/src/components/EventSelector/EventSelector.test.tsx +0 -720
- package/src/components/EventSelector/EventSelector.tsx +0 -420
- package/src/components/EventSelector/index.ts +0 -3
- package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +0 -784
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +0 -324
- package/src/components/OrganisationSelector/index.ts +0 -9
- package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +0 -680
- package/src/hooks/useSecureDataAccess.test.ts +0 -559
- package/src/hooks/useSecureDataAccess.ts +0 -681
- /package/dist/{DataTable-DQ7RSOHE.js.map → DataTable-THFPBKTP.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-ATAP5UTR.js.map → UnifiedAuthProvider-KAGUYQ4J.js.map} +0 -0
- /package/dist/{api-N774RPUA.js.map → api-IAGWF3ZG.js.map} +0 -0
- /package/dist/{audit-B5P6FFIR.js.map → audit-V53FV5AG.js.map} +0 -0
- /package/dist/{chunk-7D4SUZUM.js.map → chunk-DGUM43GV.js.map} +0 -0
- /package/docs/migration/{organisation-context-timing-fix.md → V0.3.44_organisation-context-timing-fix.md} +0 -0
- /package/docs/migration/{rbac-migration.md → V0.4.0_rbac-migration.md} +0 -0
- /package/docs/migration/{person-scoped-profiles-migration-guide.md → V0.5.190_person-scoped-profiles-migration-guide.md} +0 -0
- /package/docs/migration/{REACT_19_MIGRATION.md → V0.6.0_REACT_19_MIGRATION.md} +0 -0
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
# RBAC Scope Migration Guide
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This migration moves RBAC scope from app-level (`rbac_apps.requires_event`) to page-level (`rbac_app_pages.scope_type`). This enables hybrid apps like `pace-mint` to have both event-based and organisation-based pages within the same app.
|
|
6
|
+
|
|
7
|
+
**⚠️ BREAKING CHANGE**: This migration removes app-level scope configuration entirely. All scope is now configured at the page level with no backward compatibility.
|
|
8
|
+
|
|
9
|
+
## What Changed
|
|
10
|
+
|
|
11
|
+
**Removed**: App-level scope configuration (`rbac_apps.requires_event`)
|
|
12
|
+
**Now**: Page-level scope only (`rbac_app_pages.scope_type`)
|
|
13
|
+
|
|
14
|
+
### Why This Change?
|
|
15
|
+
|
|
16
|
+
1. **Single Source of Truth**: Scope is stored in one place (page-level), making it easier to understand and maintain
|
|
17
|
+
2. **More Flexible**: Each page can have its own scope, enabling hybrid apps like pace-mint
|
|
18
|
+
3. **Simpler Queries**: No need to join with `rbac_apps` to determine scope
|
|
19
|
+
4. **More Explicit**: No inheritance logic - scope is always clear from the page itself
|
|
20
|
+
5. **No Backward Compatibility Overhead**: Clean break from old patterns
|
|
21
|
+
|
|
22
|
+
## Breaking Changes
|
|
23
|
+
|
|
24
|
+
### Removed APIs
|
|
25
|
+
|
|
26
|
+
1. **`UnifiedAuthProvider.appConfig` prop** - No longer needed
|
|
27
|
+
2. **`useAppConfig().requiresEvent`** - Use `getPageScopeType(pageId)` instead
|
|
28
|
+
3. **`useAppConfig().supportsDirectAccess`** - No longer relevant
|
|
29
|
+
4. **`ContextValidator.validateScope()`** - Use `resolveScopeForPage()` instead
|
|
30
|
+
5. **`ContextValidator.resolveRequiredContext()`** - Use `resolveScopeForPage()` instead
|
|
31
|
+
6. **`ContextValidator.isContextReady()`** - Context readiness checked per page
|
|
32
|
+
7. **`RBACSecurityValidator.validateContextRequirements()`** - No longer needed
|
|
33
|
+
8. **`getAppConfig()`, `getAppConfigByName()`, `getAppConfigWithClient()`** - Use `getPageScopeType()` instead
|
|
34
|
+
|
|
35
|
+
### Changed APIs
|
|
36
|
+
|
|
37
|
+
1. **`useRBAC(pageId)`** - Now requires `pageId` parameter for proper scope resolution
|
|
38
|
+
2. **`getPermissionMap()`, `getRoleContext()`, `getAccessLevel()`, `isPermitted()`** - No longer accept `appConfig` parameter
|
|
39
|
+
|
|
40
|
+
### Removed Components
|
|
41
|
+
|
|
42
|
+
- `OrganisationSelector` - Use `ContextSelector` instead
|
|
43
|
+
- `EventSelector` - Use `ContextSelector` instead
|
|
44
|
+
- `HybridContextSelector` - Use `ContextSelector` instead
|
|
45
|
+
|
|
46
|
+
### Removed Props
|
|
47
|
+
|
|
48
|
+
- `Header.showEventSelector` - Use `showContextSelector` instead
|
|
49
|
+
- `Header.showOrgSelector` - Use `showContextSelector` instead
|
|
50
|
+
- `PaceAppLayout.showEventSelector` - Use `showContextSelector` instead
|
|
51
|
+
- `PaceAppLayout.showOrgSelector` - Use `showContextSelector` instead
|
|
52
|
+
|
|
53
|
+
## Migration Steps
|
|
54
|
+
|
|
55
|
+
### Step 1: Run Database Migration
|
|
56
|
+
|
|
57
|
+
Run the migration to populate `rbac_app_pages.scope_type`:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
supabase migration up
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Migration 1:** `supabase/migrations/20251231124932_add_page_scope_type_to_rbac_app_pages.sql`
|
|
64
|
+
- Adds `scope_type` column to `rbac_app_pages`
|
|
65
|
+
- Populates `scope_type` for all existing pages based on their app's `requires_event`
|
|
66
|
+
- Makes `scope_type` NOT NULL (required for all pages)
|
|
67
|
+
- Creates `get_page_scope_type()` function
|
|
68
|
+
- **Drops `rbac_apps.requires_event` column** (no longer needed)
|
|
69
|
+
|
|
70
|
+
**Migration 2:** `supabase/migrations/20251231131610_update_rpc_functions_remove_requires_event.sql`
|
|
71
|
+
- Updates `data_rbac_apps_list` to remove `requires_event` from return type
|
|
72
|
+
- Updates `data_user_events_get` to remove `requires_event` check (always checks event app roles if app_id provided)
|
|
73
|
+
|
|
74
|
+
### Step 2: Verify Page Scope Types
|
|
75
|
+
|
|
76
|
+
Check that all pages have `scope_type` set:
|
|
77
|
+
|
|
78
|
+
```sql
|
|
79
|
+
-- Check for any pages without scope_type (should return 0 rows after migration)
|
|
80
|
+
SELECT
|
|
81
|
+
ap.page_name,
|
|
82
|
+
ap.scope_type,
|
|
83
|
+
a.name as app_name
|
|
84
|
+
FROM rbac_app_pages ap
|
|
85
|
+
JOIN rbac_apps a ON ap.app_id = a.id
|
|
86
|
+
WHERE ap.scope_type IS NULL;
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
If any pages have `NULL` scope_type after migration, update them:
|
|
90
|
+
|
|
91
|
+
```sql
|
|
92
|
+
-- For event-based pages
|
|
93
|
+
UPDATE rbac_app_pages
|
|
94
|
+
SET scope_type = 'event'
|
|
95
|
+
WHERE page_name = 'your-page-name'
|
|
96
|
+
AND app_id = (SELECT id FROM rbac_apps WHERE name = 'YOUR_APP');
|
|
97
|
+
|
|
98
|
+
-- For organisation-based pages
|
|
99
|
+
UPDATE rbac_app_pages
|
|
100
|
+
SET scope_type = 'organisation'
|
|
101
|
+
WHERE page_name = 'your-page-name'
|
|
102
|
+
AND app_id = (SELECT id FROM rbac_apps WHERE name = 'YOUR_APP');
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Step 3: Update UnifiedAuthProvider
|
|
106
|
+
|
|
107
|
+
**Before:**
|
|
108
|
+
```tsx
|
|
109
|
+
<UnifiedAuthProvider
|
|
110
|
+
appConfig={{ requires_event: true }}
|
|
111
|
+
// ... other props
|
|
112
|
+
>
|
|
113
|
+
{children}
|
|
114
|
+
</UnifiedAuthProvider>
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**After:**
|
|
118
|
+
```tsx
|
|
119
|
+
<UnifiedAuthProvider
|
|
120
|
+
// appConfig prop removed - scope is now page-level
|
|
121
|
+
// ... other props
|
|
122
|
+
>
|
|
123
|
+
{children}
|
|
124
|
+
</UnifiedAuthProvider>
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Step 4: Update useRBAC Calls
|
|
128
|
+
|
|
129
|
+
**Before:**
|
|
130
|
+
```tsx
|
|
131
|
+
const { permissionMap } = useRBAC(); // No pageId
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**After:**
|
|
135
|
+
```tsx
|
|
136
|
+
const { permissionMap } = useRBAC(pageId); // Pass pageId for proper scope resolution
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Step 5: Replace useAppConfig Usage
|
|
140
|
+
|
|
141
|
+
**Before:**
|
|
142
|
+
```tsx
|
|
143
|
+
const { requiresEvent, supportsDirectAccess } = useAppConfig();
|
|
144
|
+
|
|
145
|
+
if (requiresEvent) {
|
|
146
|
+
// Show event selector
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
**After:**
|
|
151
|
+
```tsx
|
|
152
|
+
import { getPageScopeType } from '@jmruthers/pace-core';
|
|
153
|
+
|
|
154
|
+
const pageScopeType = await getPageScopeType(pageId, appId, appName);
|
|
155
|
+
|
|
156
|
+
if (pageScopeType === 'event' || pageScopeType === 'both') {
|
|
157
|
+
// Show event selector (or use ContextSelector which handles this automatically)
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Step 6: Update ContextValidator Usage
|
|
162
|
+
|
|
163
|
+
**Before:**
|
|
164
|
+
```tsx
|
|
165
|
+
import { ContextValidator } from '@jmruthers/pace-core';
|
|
166
|
+
|
|
167
|
+
const validation = await ContextValidator.resolveRequiredContext(
|
|
168
|
+
scope,
|
|
169
|
+
appConfig,
|
|
170
|
+
appName,
|
|
171
|
+
supabase
|
|
172
|
+
);
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
**After:**
|
|
176
|
+
```tsx
|
|
177
|
+
import { ContextValidator, getPageScopeType } from '@jmruthers/pace-core';
|
|
178
|
+
|
|
179
|
+
const pageScopeType = await getPageScopeType(pageId, appId, appName);
|
|
180
|
+
const validation = await ContextValidator.resolveScopeForPage(
|
|
181
|
+
scope,
|
|
182
|
+
pageScopeType,
|
|
183
|
+
appName,
|
|
184
|
+
supabase
|
|
185
|
+
);
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Step 7: Update Permission Checks
|
|
189
|
+
|
|
190
|
+
**Before:**
|
|
191
|
+
```tsx
|
|
192
|
+
const permissionMap = await getPermissionMap(
|
|
193
|
+
{ userId, scope },
|
|
194
|
+
appConfig,
|
|
195
|
+
appName
|
|
196
|
+
);
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
**After:**
|
|
200
|
+
```tsx
|
|
201
|
+
const permissionMap = await getPermissionMap(
|
|
202
|
+
{ userId, scope }
|
|
203
|
+
// appConfig and appName no longer needed
|
|
204
|
+
);
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Step 8: Update Selector Components
|
|
208
|
+
|
|
209
|
+
**Before:**
|
|
210
|
+
```tsx
|
|
211
|
+
<Header
|
|
212
|
+
showOrgSelector={true}
|
|
213
|
+
showEventSelector={true}
|
|
214
|
+
/>
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
**After:**
|
|
218
|
+
```tsx
|
|
219
|
+
<Header
|
|
220
|
+
showContextSelector={true} // Single unified selector
|
|
221
|
+
/>
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
## Page Scope Types
|
|
225
|
+
|
|
226
|
+
After migration, all pages must have one of these `scope_type` values:
|
|
227
|
+
|
|
228
|
+
### `'event'`
|
|
229
|
+
Page requires event context. Organisation is derived from event.
|
|
230
|
+
|
|
231
|
+
### `'organisation'`
|
|
232
|
+
Page requires organisation context. Event is optional.
|
|
233
|
+
|
|
234
|
+
### `'both'`
|
|
235
|
+
Page can be accessed with either event or organisation context. Permissions are merged (union), with higher permissions taking precedence.
|
|
236
|
+
|
|
237
|
+
## Creating New Pages
|
|
238
|
+
|
|
239
|
+
When creating new pages, always set `scope_type` explicitly:
|
|
240
|
+
|
|
241
|
+
```sql
|
|
242
|
+
-- Create an event-based page
|
|
243
|
+
INSERT INTO rbac_app_pages (app_id, page_name, page_description, scope_type)
|
|
244
|
+
VALUES (
|
|
245
|
+
(SELECT id FROM rbac_apps WHERE name = 'MINT'),
|
|
246
|
+
'budget',
|
|
247
|
+
'Event Budget Management',
|
|
248
|
+
'event' -- ✅ Explicit scope type
|
|
249
|
+
);
|
|
250
|
+
|
|
251
|
+
-- Create an organisation-based page
|
|
252
|
+
INSERT INTO rbac_app_pages (app_id, page_name, page_description, scope_type)
|
|
253
|
+
VALUES (
|
|
254
|
+
(SELECT id FROM rbac_apps WHERE name = 'MINT'),
|
|
255
|
+
'dashboard',
|
|
256
|
+
'Organisation Dashboard',
|
|
257
|
+
'organisation' -- ✅ Explicit scope type
|
|
258
|
+
);
|
|
259
|
+
|
|
260
|
+
-- Create a 'both' page (can use either context)
|
|
261
|
+
INSERT INTO rbac_app_pages (app_id, page_name, page_description, scope_type)
|
|
262
|
+
VALUES (
|
|
263
|
+
(SELECT id FROM rbac_apps WHERE name = 'MINT'),
|
|
264
|
+
'reports',
|
|
265
|
+
'Reports (Event or Organisation)',
|
|
266
|
+
'both' -- ✅ Can be accessed with either context
|
|
267
|
+
);
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## Hybrid Apps (e.g., pace-mint)
|
|
271
|
+
|
|
272
|
+
For apps that have both event-based and organisation-based pages:
|
|
273
|
+
|
|
274
|
+
1. Set `scope_type = 'event'` for event-based pages (e.g., budget pages)
|
|
275
|
+
2. Set `scope_type = 'organisation'` for organisation-based pages (e.g., settings pages)
|
|
276
|
+
3. Set `scope_type = 'both'` for pages that can use either context
|
|
277
|
+
|
|
278
|
+
Example:
|
|
279
|
+
```sql
|
|
280
|
+
-- Event-based budget page
|
|
281
|
+
UPDATE rbac_app_pages
|
|
282
|
+
SET scope_type = 'event'
|
|
283
|
+
WHERE page_name = 'budget' AND app_id = (SELECT id FROM rbac_apps WHERE name = 'MINT');
|
|
284
|
+
|
|
285
|
+
-- Organisation-based settings page
|
|
286
|
+
UPDATE rbac_app_pages
|
|
287
|
+
SET scope_type = 'organisation'
|
|
288
|
+
WHERE page_name = 'settings' AND app_id = (SELECT id FROM rbac_apps WHERE name = 'MINT');
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
## API Changes Summary
|
|
292
|
+
|
|
293
|
+
### `getPageScopeType()`
|
|
294
|
+
|
|
295
|
+
**Before**: Could return `null` (inherit from app)
|
|
296
|
+
|
|
297
|
+
**After**: Always returns a value (`'event'`, `'organisation'`, or `'both'`)
|
|
298
|
+
|
|
299
|
+
```typescript
|
|
300
|
+
// After migration, this always returns a value
|
|
301
|
+
const scopeType = await getPageScopeType(pageId, appId, appName);
|
|
302
|
+
// scopeType is now: 'event' | 'organisation' | 'both' (never null)
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### `resolveScopeForPage()`
|
|
306
|
+
|
|
307
|
+
**Before**: Accepted `appConfig` parameter and could inherit from app
|
|
308
|
+
|
|
309
|
+
**After**: `pageScopeType` is required (never null), `appConfig` removed
|
|
310
|
+
|
|
311
|
+
```typescript
|
|
312
|
+
// After migration
|
|
313
|
+
const validation = await ContextValidator.resolveScopeForPage(
|
|
314
|
+
scope,
|
|
315
|
+
pageScopeType, // Required, never null
|
|
316
|
+
appName,
|
|
317
|
+
supabase
|
|
318
|
+
);
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
## Benefits
|
|
322
|
+
|
|
323
|
+
1. **Clearer Intent**: Each page explicitly declares its scope requirements
|
|
324
|
+
2. **Easier Debugging**: No need to trace through app-level config to understand page scope
|
|
325
|
+
3. **Better Performance**: Direct lookup from page table, no join needed
|
|
326
|
+
4. **More Flexible**: Hybrid apps can have mixed scopes without special handling
|
|
327
|
+
5. **No Backward Compatibility Overhead**: Clean, maintainable codebase
|
|
328
|
+
|
|
329
|
+
## Testing Checklist
|
|
330
|
+
|
|
331
|
+
- [ ] Database migration completed successfully
|
|
332
|
+
- [ ] All pages have `scope_type` set (no NULL values)
|
|
333
|
+
- [ ] `UnifiedAuthProvider` no longer uses `appConfig` prop
|
|
334
|
+
- [ ] All `useRBAC()` calls pass `pageId` parameter
|
|
335
|
+
- [ ] All `useAppConfig().requiresEvent` replaced with `getPageScopeType()`
|
|
336
|
+
- [ ] All deprecated `ContextValidator` methods replaced
|
|
337
|
+
- [ ] All selector components updated to use `ContextSelector`
|
|
338
|
+
- [ ] Permission checks work correctly for all page types
|
|
339
|
+
- [ ] Event-based pages work correctly
|
|
340
|
+
- [ ] Organisation-based pages work correctly
|
|
341
|
+
- [ ] Hybrid pages (scope_type = 'both') work correctly
|
|
342
|
+
|
|
343
|
+
## Troubleshooting
|
|
344
|
+
|
|
345
|
+
### Pages Not Showing in Navigation
|
|
346
|
+
|
|
347
|
+
If pages aren't showing after migration:
|
|
348
|
+
|
|
349
|
+
1. **Check scope_type is set**:
|
|
350
|
+
```sql
|
|
351
|
+
SELECT page_name, scope_type FROM rbac_app_pages WHERE app_id = 'your-app-id';
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
2. **Verify scope matches context**:
|
|
355
|
+
- Event-based pages require `eventId` to be selected
|
|
356
|
+
- Organisation-based pages require `organisationId` to be selected
|
|
357
|
+
- 'both' pages work with either context
|
|
358
|
+
|
|
359
|
+
3. **Check permissions**: Ensure user has permissions for the page in the correct scope
|
|
360
|
+
|
|
361
|
+
### Permission Denied Errors
|
|
362
|
+
|
|
363
|
+
If you get permission denied errors:
|
|
364
|
+
|
|
365
|
+
1. **Verify scope_type matches selected context**:
|
|
366
|
+
- If page is `'event'`, ensure an event is selected
|
|
367
|
+
- If page is `'organisation'`, ensure an organisation is selected
|
|
368
|
+
|
|
369
|
+
2. **Check page permissions are configured** for the correct scope type
|
|
370
|
+
|
|
371
|
+
3. **Verify user's roles are active** (valid_from/valid_to dates)
|
|
372
|
+
|
|
373
|
+
### ContextSelector Not Showing Items
|
|
374
|
+
|
|
375
|
+
1. Check user has organisation memberships or event-app roles
|
|
376
|
+
2. Verify organisations/events are active
|
|
377
|
+
3. Check RLS policies allow user to see the items
|
|
378
|
+
4. Ensure super admin status if testing as super admin
|
|
379
|
+
|
|
380
|
+
## Related Documentation
|
|
381
|
+
|
|
382
|
+
- [pace-mint RBAC Setup Guide](../pace-mint-rbac-setup.md) - Specific guide for hybrid apps
|
|
383
|
+
- [Context Selector Component](../components/context-selector.md) - Unified selector documentation
|
|
384
|
+
- [RBAC System Overview](../rbac/README.md) - General RBAC documentation
|
|
385
|
+
- [Event-Based Apps](../rbac/event-based-apps.md) - Event-based app patterns
|
package/docs/migration/README.md
CHANGED
|
@@ -6,12 +6,25 @@ reviewedBy: documentation-standards-audit
|
|
|
6
6
|
|
|
7
7
|
# Migration Guide
|
|
8
8
|
|
|
9
|
-
> **🔄 Upgrade and Migration** | [Unified Migration Guide](./MIGRATION_GUIDE.md) | [RBAC Migration](./
|
|
9
|
+
> **🔄 Upgrade and Migration** | [Unified Migration Guide](./MIGRATION_GUIDE.md) | [RBAC Migration](./V0.4.0_rbac-migration.md)
|
|
10
10
|
|
|
11
11
|
[← Back to Documentation](../README.md) | [↑ Table of Contents](#table-of-contents) | [Next: Unified Migration Guide →](./MIGRATION_GUIDE.md)
|
|
12
12
|
|
|
13
13
|
Complete migration guides for upgrading to and between versions of `@jmruthers/pace-core`.
|
|
14
14
|
|
|
15
|
+
## 📖 Documentation Structure
|
|
16
|
+
|
|
17
|
+
This migration documentation follows a clear structure to help you find the information you need:
|
|
18
|
+
|
|
19
|
+
- **CHANGELOG.md**: High-level announcements and summaries with links to detailed guides
|
|
20
|
+
- **Migration Guides**: Step-by-step instructions, code examples, and troubleshooting
|
|
21
|
+
- **Version-Specific**: `V0.5.190_TO_V0.6.1_MIGRATION.md` - Complete migration for specific versions
|
|
22
|
+
- **Feature-Specific**: `V0.6.0_REACT_19_MIGRATION.md`, `V0.4.0_rbac-migration.md` - Focused guides for specific features (with version stamps at start)
|
|
23
|
+
- **Database-Specific**: `database-changes-december-2025.md` - Database schema changes
|
|
24
|
+
- **General**: `MIGRATION_GUIDE.md` - General migration patterns and best practices
|
|
25
|
+
|
|
26
|
+
**For documentation structure guidelines, see:** [Documentation Structure](./DOCUMENTATION_STRUCTURE.md)
|
|
27
|
+
|
|
15
28
|
## 📚 Start Here: Unified Migration Guide
|
|
16
29
|
|
|
17
30
|
**For all migrations, start with:** [Complete Migration Guide](./MIGRATION_GUIDE.md)
|
|
@@ -29,6 +42,8 @@ The unified guide provides:
|
|
|
29
42
|
- [Quick Migration Checklist](#-quick-migration-checklist)
|
|
30
43
|
- [Version Migrations](#-version-migrations)
|
|
31
44
|
- [Critical Fixes](#-critical-fixes)
|
|
45
|
+
- [v0.5.190 → v0.6.1 Comprehensive Migration Guide](#v05190--v061-comprehensive-migration-guide)
|
|
46
|
+
- [Person-Scoped Profiles Migration](#person-scoped-profiles-migration-v05190)
|
|
32
47
|
- [From Other Libraries](#-from-other-libraries)
|
|
33
48
|
- [RBAC Migration](#-rbac-migration)
|
|
34
49
|
- [Migration Tools](#-migration-tools)
|
|
@@ -64,6 +79,25 @@ This guide covers:
|
|
|
64
79
|
|
|
65
80
|
## 🚨 Critical Fixes
|
|
66
81
|
|
|
82
|
+
### v0.5.190 → v0.6.1 Comprehensive Migration Guide
|
|
83
|
+
|
|
84
|
+
**NEW**: Complete migration guide for upgrading from v0.5.190 to v0.6.1.
|
|
85
|
+
|
|
86
|
+
**Breaking Changes:**
|
|
87
|
+
- React 19 upgrade (all apps must upgrade)
|
|
88
|
+
- Database schema changes (table naming standardization)
|
|
89
|
+
- Person-scoped profiles migration
|
|
90
|
+
|
|
91
|
+
**Migration Guide**: [v0.5.190 → v0.6.1 Migration Guide](./V0.5.190_TO_V0.6.1_MIGRATION.md)
|
|
92
|
+
|
|
93
|
+
**Quick Summary**:
|
|
94
|
+
- Upgrade React to 19.2.3+
|
|
95
|
+
- Apply database migrations
|
|
96
|
+
- Update all table name references
|
|
97
|
+
- Remove `organisation_id` filters from profile queries
|
|
98
|
+
- Configure React Compiler
|
|
99
|
+
- See full guide for detailed instructions
|
|
100
|
+
|
|
67
101
|
### Person-Scoped Profiles Migration (v0.5.190+)
|
|
68
102
|
|
|
69
103
|
**BREAKING CHANGE**: Profiles (membership, medical, and contact) have been migrated from organisation-scoped to person-scoped.
|
|
@@ -74,7 +108,7 @@ This guide covers:
|
|
|
74
108
|
- One membership per person (enforced by unique constraint)
|
|
75
109
|
- Related tables (`pace_consent`, `pace_identification`, `pace_qualification`, etc.) also no longer have `organisation_id`
|
|
76
110
|
|
|
77
|
-
**Migration Guide**: [Person-Scoped Profiles Migration Guide](./
|
|
111
|
+
**Migration Guide**: [Person-Scoped Profiles Migration Guide](./V0.5.190_person-scoped-profiles-migration-guide.md)
|
|
78
112
|
|
|
79
113
|
**Quick Summary**:
|
|
80
114
|
- Remove all `organisation_id` filters/queries for profile tables
|
|
@@ -91,7 +125,7 @@ This guide covers:
|
|
|
91
125
|
- Super admin permissions returning false
|
|
92
126
|
- Potential data leakage between organisations
|
|
93
127
|
|
|
94
|
-
**Migration**: [Organisation Context Timing Fix](./
|
|
128
|
+
**Migration**: [Organisation Context Timing Fix](./V0.3.44_organisation-context-timing-fix.md)
|
|
95
129
|
|
|
96
130
|
**Quick Fix**:
|
|
97
131
|
```bash
|
|
@@ -393,7 +427,7 @@ function MyComponent() {
|
|
|
393
427
|
|
|
394
428
|
## 🔐 RBAC Migration
|
|
395
429
|
|
|
396
|
-
For detailed RBAC migration, see the [RBAC Migration Guide](./
|
|
430
|
+
For detailed RBAC migration, see the [RBAC Migration Guide](./V0.4.0_rbac-migration.md).
|
|
397
431
|
|
|
398
432
|
### Quick RBAC Migration
|
|
399
433
|
|
|
@@ -487,8 +521,20 @@ import '@jmruthers/pace-core/src/styles/core.css';
|
|
|
487
521
|
|
|
488
522
|
## 📚 Additional Resources
|
|
489
523
|
|
|
490
|
-
|
|
491
|
-
|
|
524
|
+
### Migration Guides
|
|
525
|
+
|
|
526
|
+
- **[Complete Migration Guide](./MIGRATION_GUIDE.md)** - General migration patterns and best practices
|
|
527
|
+
- **[v0.5.190 → v0.6.1 Migration Guide](./V0.5.190_TO_V0.6.1_MIGRATION.md)** - Comprehensive migration for v0.6.1
|
|
528
|
+
- **[React 19 Migration Guide](./V0.6.0_REACT_19_MIGRATION.md)** - React 19 upgrade instructions (v0.6.0)
|
|
529
|
+
- **[RBAC Migration Guide](./V0.4.0_rbac-migration.md)** - RBAC system migration (v0.4.0+)
|
|
530
|
+
- **[Person-Scoped Profiles Migration](./V0.5.190_person-scoped-profiles-migration-guide.md)** - Profile migration guide (v0.5.190+)
|
|
531
|
+
- **[Database Changes December 2025](./database-changes-december-2025.md)** - Database schema changes
|
|
532
|
+
- **[Migration Guide](./MIGRATION_GUIDE.md)** - Comprehensive migration guide with quick reference table
|
|
533
|
+
|
|
534
|
+
### Documentation
|
|
535
|
+
|
|
536
|
+
- **[Documentation Structure](./DOCUMENTATION_STRUCTURE.md)** - Guidelines for CHANGELOG and migration docs
|
|
537
|
+
- **[CHANGELOG.md](../../CHANGELOG.md)** - Version history and change announcements
|
|
492
538
|
- **[Common Issues](../troubleshooting/common-issues.md)** - Troubleshooting migration issues
|
|
493
539
|
- **[API Reference](../api-reference/)** - Complete API documentation
|
|
494
540
|
|