@jmruthers/pace-core 0.5.180 → 0.5.182
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 +1 -1
- package/README.md +16 -2
- package/dist/{AuthService-DYuQPJj6.d.ts → AuthService-B-cd2MA4.d.ts} +9 -11
- package/dist/{DataTable-CWAZZcXC.d.ts → DataTable-Bz8ffqyA.d.ts} +1 -1
- package/dist/{DataTable-4VSEJQ7D.js → DataTable-QAB34V6K.js} +14 -15
- package/dist/UnifiedAuthProvider-7F6T4B6K.js +13 -0
- package/dist/{UnifiedAuthProvider-DJxGTftH.d.ts → UnifiedAuthProvider-F86d7dSi.d.ts} +5 -6
- package/dist/{api-45XYYO2A.js → api-ROMBCNKU.js} +5 -5
- package/dist/{audit-64X3VJXB.js → audit-WRS3KJKI.js} +4 -4
- package/dist/auth-BZOJqrdd.d.ts +49 -0
- package/dist/{chunk-CX5M4ZAG.js → chunk-5DRSZLL2.js} +1 -1
- package/dist/chunk-5DRSZLL2.js.map +1 -0
- package/dist/{chunk-BESYRHQM.js → chunk-6C4YBBJM.js} +10 -7
- package/dist/chunk-6C4YBBJM.js.map +1 -0
- package/dist/{chunk-PLDDJCW6.js → chunk-7D4SUZUM.js} +2 -13
- package/dist/{chunk-6HLVGAZG.js → chunk-CSOFYHAG.js} +55 -162
- package/dist/chunk-CSOFYHAG.js.map +1 -0
- package/dist/{chunk-ANBQRTPX.js → chunk-E66EQZE6.js} +3 -5
- package/dist/{chunk-ANBQRTPX.js.map → chunk-E66EQZE6.js.map} +1 -1
- package/dist/{chunk-Q5QRDWKI.js → chunk-F2IMUDXZ.js} +4 -6
- package/dist/chunk-F2IMUDXZ.js.map +1 -0
- package/dist/{chunk-SBVILCCA.js → chunk-FSFQFJCU.js} +28 -6
- package/dist/chunk-FSFQFJCU.js.map +1 -0
- package/dist/chunk-FUEYYMX5.js +2296 -0
- package/dist/chunk-FUEYYMX5.js.map +1 -0
- package/dist/{chunk-FFKNH6U5.js → chunk-HKIT6O7W.js} +3 -5
- package/dist/{chunk-FFKNH6U5.js.map → chunk-HKIT6O7W.js.map} +1 -1
- package/dist/chunk-KQCRWDSA.js +1 -0
- package/dist/{chunk-S5OFRT4M.js → chunk-KUEN3HFB.js} +6 -6
- package/dist/chunk-KUEN3HFB.js.map +1 -0
- package/dist/chunk-LMC26NLJ.js +84 -0
- package/dist/chunk-LMC26NLJ.js.map +1 -0
- package/dist/{chunk-BVYWGZVV.js → chunk-M7W4CP3M.js} +52 -19
- package/dist/chunk-M7W4CP3M.js.map +1 -0
- package/dist/{chunk-CPTUD43C.js → chunk-MI7HBHN3.js} +164 -243
- package/dist/chunk-MI7HBHN3.js.map +1 -0
- package/dist/{chunk-N5YCCUG5.js → chunk-PWAHJW4G.js} +180 -29
- package/dist/chunk-PWAHJW4G.js.map +1 -0
- package/dist/chunk-PWLANIRT.js +127 -0
- package/dist/{chunk-XDNLUEXI.js.map → chunk-PWLANIRT.js.map} +1 -1
- package/dist/chunk-QCDXODCA.js +75 -0
- package/dist/chunk-QCDXODCA.js.map +1 -0
- package/dist/{chunk-P6UUHOIF.js → chunk-QETLRQI6.js} +526 -887
- package/dist/chunk-QETLRQI6.js.map +1 -0
- package/dist/{chunk-GQA2LIAE.js → chunk-QUVSNGIP.js} +264 -262
- package/dist/chunk-QUVSNGIP.js.map +1 -0
- package/dist/chunk-QXHPKYJV.js +113 -0
- package/dist/chunk-QXHPKYJV.js.map +1 -0
- package/dist/{chunk-OWAG3GSU.js → chunk-R77UEZ4E.js} +11 -1
- package/dist/chunk-R77UEZ4E.js.map +1 -0
- package/dist/{chunk-ONI7Y733.js → chunk-RA3JUFMW.js} +314 -161
- package/dist/chunk-RA3JUFMW.js.map +1 -0
- package/dist/{chunk-ERISIBYU.js → chunk-SQGMNID3.js} +3 -8
- package/dist/chunk-SQGMNID3.js.map +1 -0
- package/dist/{chunk-XJ2HZOBU.js → chunk-UHNYIBXL.js} +1 -1
- package/dist/chunk-UHNYIBXL.js.map +1 -0
- package/{src/utils/secureStorage.ts → dist/chunk-VBXEHIUJ.js} +113 -88
- package/dist/{chunk-7QCC6MCP.js.map → chunk-VBXEHIUJ.js.map} +1 -1
- package/dist/{chunk-R53TUSFK.js → chunk-W22JP75J.js} +5 -13
- package/dist/{chunk-R53TUSFK.js.map → chunk-W22JP75J.js.map} +1 -1
- package/dist/components.d.ts +12 -93
- package/dist/components.js +23 -106
- package/dist/components.js.map +1 -1
- package/dist/core-CUElvH_C.d.ts +164 -0
- package/dist/database.generated-CBmg2950.d.ts +8284 -0
- package/dist/event-CW5YB_2p.d.ts +239 -0
- package/dist/{file-reference-C6Gkn77H.d.ts → file-reference-D06mEEWW.d.ts} +7 -5
- package/dist/functions-D_kgHktt.d.ts +208 -0
- package/dist/hooks.d.ts +54 -7
- package/dist/hooks.js +204 -17
- package/dist/hooks.js.map +1 -1
- package/dist/{EventLogo-B3V3otev.d.ts → index-Bl--n7-T.d.ts} +387 -397
- package/dist/index.d.ts +94 -261
- package/dist/index.js +314 -126
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +7 -8
- package/dist/providers.js +6 -13
- package/dist/rbac/index.d.ts +171 -101
- package/dist/rbac/index.js +23 -17
- package/dist/styles/index.d.ts +1 -3
- package/dist/styles/index.js +2 -17
- package/dist/theming/runtime.js +3 -3
- package/dist/types-UU913iLA.d.ts +102 -0
- package/dist/{types-Dfz9dmVH.d.ts → types-_x1f4QBF.d.ts} +6 -6
- package/dist/types.d.ts +88 -227
- package/dist/types.js +64 -112
- package/dist/types.js.map +1 -1
- package/dist/{usePublicRouteParams-B7PabvuH.d.ts → usePublicRouteParams-JJczomYq.d.ts} +203 -6
- package/dist/utils.d.ts +299 -13
- package/dist/utils.js +481 -55
- package/dist/utils.js.map +1 -1
- package/dist/validation-643vUDZW.d.ts +177 -0
- package/docs/DOCUMENTATION_REVIEW_TRACKER.md +511 -0
- package/docs/README.md +9 -8
- package/docs/api/README.md +16 -2
- package/docs/api/classes/ColumnFactory.md +1 -1
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/InvalidScopeError.md +4 -4
- package/docs/api/classes/MissingUserContextError.md +4 -4
- package/docs/api/classes/OrganisationContextRequiredError.md +4 -4
- package/docs/api/classes/PermissionDeniedError.md +4 -4
- package/docs/api/classes/RBACAuditManager.md +14 -14
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +2 -2
- package/docs/api/classes/RBACError.md +4 -4
- package/docs/api/classes/RBACNotInitializedError.md +4 -4
- package/docs/api/classes/SecureSupabaseClient.md +29 -9
- package/docs/api/classes/StorageUtils.md +1 -1
- package/docs/api/enums/FileCategory.md +17 -17
- package/docs/api/enums/RBACErrorCode.md +228 -0
- package/docs/api/enums/RPCFunction.md +118 -0
- package/docs/api/interfaces/AggregateConfig.md +1 -1
- package/docs/api/interfaces/BadgeProps.md +1 -1
- package/docs/api/interfaces/ButtonProps.md +2 -2
- package/docs/api/interfaces/CalendarProps.md +1 -1
- package/docs/api/interfaces/CardProps.md +29 -3
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +1 -1
- package/docs/api/interfaces/DataAccessRecord.md +1 -1
- package/docs/api/interfaces/DataRecord.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +2 -2
- package/docs/api/interfaces/DataTableColumn.md +6 -6
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +2 -2
- package/docs/api/interfaces/EmptyStateConfig.md +1 -1
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
- package/docs/api/interfaces/EventAppRoleData.md +1 -1
- package/docs/api/interfaces/ExportColumn.md +5 -5
- package/docs/api/interfaces/ExportOptions.md +4 -4
- package/docs/api/interfaces/FileDisplayProps.md +1 -1
- package/docs/api/interfaces/FileMetadata.md +13 -13
- package/docs/api/interfaces/FileReference.md +12 -12
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadOptions.md +10 -10
- package/docs/api/interfaces/FileUploadProps.md +19 -19
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/FormFieldProps.md +166 -0
- package/docs/api/interfaces/FormProps.md +113 -0
- package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +8 -8
- package/docs/api/interfaces/InputProps.md +2 -2
- package/docs/api/interfaces/LabelProps.md +8 -8
- package/docs/api/interfaces/LoginFormProps.md +1 -1
- package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
- package/docs/api/interfaces/NavigationContextType.md +1 -1
- package/docs/api/interfaces/NavigationGuardProps.md +1 -1
- package/docs/api/interfaces/NavigationItem.md +17 -73
- package/docs/api/interfaces/NavigationMenuProps.md +38 -53
- package/docs/api/interfaces/NavigationProviderProps.md +1 -1
- package/docs/api/interfaces/Organisation.md +13 -13
- package/docs/api/interfaces/OrganisationContextType.md +21 -21
- package/docs/api/interfaces/OrganisationMembership.md +15 -15
- package/docs/api/interfaces/OrganisationProviderProps.md +59 -2
- package/docs/api/interfaces/OrganisationSecurityError.md +5 -5
- package/docs/api/interfaces/PaceAppLayoutProps.md +26 -39
- package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
- package/docs/api/interfaces/PageAccessRecord.md +1 -1
- package/docs/api/interfaces/PagePermissionContextType.md +1 -1
- package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
- package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
- package/docs/api/interfaces/ProgressProps.md +50 -0
- package/docs/api/interfaces/ProtectedRouteProps.md +1 -1
- package/docs/api/interfaces/PublicPageFooterProps.md +9 -9
- package/docs/api/interfaces/PublicPageHeaderProps.md +10 -10
- package/docs/api/interfaces/PublicPageLayoutProps.md +15 -15
- package/docs/api/interfaces/RBACAccessValidateParams.md +52 -0
- package/docs/api/interfaces/RBACAccessValidateResult.md +41 -0
- package/docs/api/interfaces/RBACAuditLogParams.md +85 -0
- package/docs/api/interfaces/RBACAuditLogResult.md +52 -0
- package/docs/api/interfaces/RBACConfig.md +2 -2
- package/docs/api/interfaces/RBACContext.md +52 -0
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RBACPageAccessCheckParams.md +74 -0
- package/docs/api/interfaces/RBACPermissionCheckParams.md +74 -0
- package/docs/api/interfaces/RBACPermissionCheckResult.md +52 -0
- package/docs/api/interfaces/RBACPermissionsGetParams.md +63 -0
- package/docs/api/interfaces/RBACPermissionsGetResult.md +63 -0
- package/docs/api/interfaces/RBACResult.md +58 -0
- package/docs/api/interfaces/RBACRoleGrantParams.md +63 -0
- package/docs/api/interfaces/RBACRoleGrantResult.md +52 -0
- package/docs/api/interfaces/RBACRoleRevokeParams.md +63 -0
- package/docs/api/interfaces/RBACRoleRevokeResult.md +52 -0
- package/docs/api/interfaces/RBACRoleValidateParams.md +52 -0
- package/docs/api/interfaces/RBACRoleValidateResult.md +63 -0
- package/docs/api/interfaces/RBACRolesListParams.md +52 -0
- package/docs/api/interfaces/RBACRolesListResult.md +74 -0
- package/docs/api/interfaces/RBACSessionTrackParams.md +74 -0
- package/docs/api/interfaces/RBACSessionTrackResult.md +52 -0
- package/docs/api/interfaces/ResourcePermissions.md +1 -1
- package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
- package/docs/api/interfaces/RoleManagementResult.md +1 -1
- package/docs/api/interfaces/RouteAccessRecord.md +1 -1
- package/docs/api/interfaces/RouteConfig.md +1 -1
- package/docs/api/interfaces/SecureDataContextType.md +1 -1
- package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
- package/docs/api/interfaces/SessionRestorationLoaderProps.md +15 -2
- package/docs/api/interfaces/StorageConfig.md +1 -1
- package/docs/api/interfaces/StorageFileInfo.md +1 -1
- package/docs/api/interfaces/StorageFileMetadata.md +1 -1
- package/docs/api/interfaces/StorageListOptions.md +1 -1
- package/docs/api/interfaces/StorageListResult.md +1 -1
- package/docs/api/interfaces/StorageUploadOptions.md +1 -1
- package/docs/api/interfaces/StorageUploadResult.md +1 -1
- package/docs/api/interfaces/StorageUrlOptions.md +1 -1
- package/docs/api/interfaces/StyleImport.md +1 -1
- package/docs/api/interfaces/SwitchProps.md +1 -1
- package/docs/api/interfaces/TabsContentProps.md +1 -1
- package/docs/api/interfaces/TabsListProps.md +1 -1
- package/docs/api/interfaces/TabsProps.md +1 -1
- package/docs/api/interfaces/TabsTriggerProps.md +43 -2
- package/docs/api/interfaces/TextareaProps.md +2 -2
- package/docs/api/interfaces/ToastActionElement.md +1 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +61 -61
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +87 -0
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +81 -0
- package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
- package/docs/api/interfaces/UsePublicEventReturn.md +5 -5
- package/docs/api/interfaces/UsePublicFileDisplayOptions.md +2 -2
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeOptions.md +2 -2
- package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
- package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
- package/docs/api/interfaces/UserEventAccess.md +1 -1
- package/docs/api/interfaces/UserMenuProps.md +4 -4
- package/docs/api/interfaces/UserProfile.md +7 -7
- package/docs/api/modules.md +484 -462
- package/docs/api-reference/components.md +186 -15
- package/docs/api-reference/deprecated.md +376 -0
- package/docs/api-reference/hooks.md +149 -19
- package/docs/api-reference/providers.md +61 -6
- package/docs/api-reference/rpc-functions.md +397 -0
- package/docs/api-reference/types.md +135 -78
- package/docs/api-reference/utilities.md +51 -380
- package/docs/architecture/README.md +49 -3
- package/docs/architecture/database-schema-requirements.md +40 -3
- package/docs/architecture/rbac-security-architecture.md +41 -4
- package/docs/architecture/services.md +127 -42
- package/docs/best-practices/README.md +51 -5
- package/docs/best-practices/accessibility.md +32 -3
- package/docs/best-practices/common-patterns.md +50 -3
- package/docs/best-practices/deployment.md +50 -4
- package/docs/best-practices/performance.md +50 -3
- package/docs/best-practices/security.md +94 -41
- package/docs/best-practices/testing.md +33 -4
- package/docs/core-concepts/authentication.md +5 -5
- package/docs/core-concepts/events.md +3 -3
- package/docs/core-concepts/organisations.md +3 -3
- package/docs/core-concepts/permissions.md +3 -3
- package/docs/core-concepts/rbac-system.md +5 -5
- package/docs/documentation-index.md +30 -8
- package/docs/getting-started/documentation-index.md +1 -1
- package/docs/getting-started/examples/README.md +7 -5
- package/docs/getting-started/examples/basic-auth-app.md +3 -0
- package/docs/getting-started/examples/full-featured-app.md +5 -3
- package/docs/getting-started/faq.md +6 -6
- package/docs/getting-started/installation-guide.md +192 -13
- package/docs/getting-started/local-development.md +303 -0
- package/docs/getting-started/quick-reference.md +3 -3
- package/docs/getting-started/quick-start.md +517 -0
- package/docs/implementation-guides/app-layout.md +45 -3
- package/docs/implementation-guides/authentication.md +66 -7
- package/docs/implementation-guides/component-styling.md +53 -3
- package/docs/implementation-guides/data-tables.md +76 -7
- package/docs/implementation-guides/datatable-filtering.md +1 -2
- package/docs/implementation-guides/datatable-rbac-usage.md +0 -1
- package/docs/implementation-guides/dynamic-colors.md +155 -4
- package/docs/implementation-guides/file-reference-system.md +72 -3
- package/docs/implementation-guides/file-upload-storage.md +72 -3
- package/docs/implementation-guides/forms.md +53 -3
- package/docs/implementation-guides/inactivity-tracking.md +53 -3
- package/docs/implementation-guides/large-datasets.md +1 -1
- package/docs/implementation-guides/navigation.md +55 -5
- package/docs/implementation-guides/organisation-security.md +72 -3
- package/docs/implementation-guides/performance.md +57 -1
- package/docs/implementation-guides/permission-enforcement.md +81 -8
- package/docs/implementation-guides/public-pages.md +560 -14
- package/docs/migration/MIGRATION_GUIDE.md +409 -50
- package/docs/migration/README.md +37 -3
- package/docs/migration/organisation-context-timing-fix.md +39 -4
- package/docs/migration/quick-migration-guide.md +41 -5
- package/docs/migration/rbac-migration.md +59 -3
- package/docs/migration/service-architecture.md +77 -14
- package/docs/rbac/README.md +79 -3
- package/docs/rbac/advanced-patterns.md +47 -3
- package/docs/rbac/api-reference.md +77 -8
- package/docs/rbac/event-based-apps.md +50 -5
- package/docs/rbac/examples/rbac-rls-integration-example.md +3 -3
- package/docs/rbac/examples.md +39 -3
- package/docs/rbac/getting-started.md +63 -4
- package/docs/rbac/quick-start.md +57 -5
- package/docs/rbac/rbac-rls-integration.md +68 -6
- package/docs/rbac/super-admin-guide.md +47 -3
- package/docs/rbac/troubleshooting.md +3 -3
- package/docs/security/README.md +68 -3
- package/docs/security/checklist.md +50 -3
- package/docs/standards/01-architecture-standard.md +39 -0
- package/docs/standards/02-api-and-rpc-standard.md +39 -0
- package/docs/standards/03-component-standard.md +32 -0
- package/docs/standards/04-code-style-standard.md +32 -0
- package/docs/standards/05-security-standard.md +30 -0
- package/docs/standards/06-testing-and-docs-standard.md +29 -0
- package/docs/standards/README.md +35 -0
- package/docs/styles/README.md +89 -8
- package/docs/testing/README.md +175 -24
- package/docs/troubleshooting/README.md +50 -3
- package/docs/troubleshooting/common-issues.md +271 -5
- package/docs/troubleshooting/debugging.md +54 -1
- package/docs/troubleshooting/migration.md +54 -1
- package/docs/troubleshooting/organisation-context-setup.md +29 -3
- package/docs/troubleshooting/styling-issues.md +246 -4
- package/{src/components/DataTable/examples → examples/DataTable}/GroupingAggregationExample.tsx +1 -1
- package/examples/{components 2/DataTable/HierarchicalActionsExample.tsx → DataTable/HierarchicalActionsExample.tsx} +7 -6
- package/examples/{components 2/DataTable/HierarchicalExample.tsx → DataTable/HierarchicalExample.tsx} +8 -6
- package/examples/{components 2/DataTable/PerformanceExample.tsx → DataTable/PerformanceExample.tsx} +2 -2
- package/examples/{components 2/DataTable/index.ts → DataTable/index.ts} +1 -0
- package/{src/components/Dialog/examples → examples/Dialog}/HtmlDialogExample.tsx +3 -3
- package/examples/{components 2/Dialog/ScrollableDialogExample.tsx → Dialog/ScrollableDialogExample.tsx} +1 -1
- package/{src/components/Dialog/examples → examples/Dialog}/SmartDialogExample.tsx +1 -1
- package/examples/{components 2/Dialog/index.ts → Dialog/index.ts} +0 -3
- package/examples/{features/public-pages → PublicPages}/CorrectPublicPageImplementation.tsx +52 -17
- package/examples/{features/public-pages → PublicPages}/PublicEventPage.tsx +65 -35
- package/examples/{features/public-pages → PublicPages}/PublicPageApp.tsx +52 -18
- package/examples/{features/public-pages → PublicPages}/PublicPageUsageExample.tsx +28 -15
- package/examples/README.md +81 -33
- package/examples/index.ts +14 -12
- package/examples/{RBAC → rbac}/CompleteRBACExample.tsx +1 -1
- package/examples/{features/rbac → rbac}/EventBasedApp.tsx +4 -4
- package/examples/{features/rbac → rbac}/PermissionExample.tsx +5 -3
- package/package.json +21 -27
- package/src/__tests__/helpers/test-utils.tsx +29 -3
- package/src/__tests__/rbac/PagePermissionGuard.test.tsx +7 -5
- package/src/components/Alert/Alert.test.tsx +2 -2
- package/src/components/Alert/Alert.tsx +4 -4
- package/src/components/Avatar/Avatar.test.tsx +17 -6
- package/src/components/Badge/Badge.test.tsx +1 -1
- package/src/components/Badge/Badge.tsx +2 -2
- package/src/components/Button/Button.test.tsx +2 -2
- package/src/components/Button/Button.tsx +11 -7
- package/src/components/Calendar/Calendar.test.tsx +41 -8
- package/src/components/Calendar/Calendar.tsx +39 -36
- package/src/components/Card/Card.tsx +51 -13
- package/src/components/Checkbox/Checkbox.test.tsx +36 -12
- package/src/components/DataTable/DataTable.test.tsx +1 -1
- package/src/components/DataTable/__tests__/DataTable.comprehensive.test.tsx +13 -7
- package/src/components/DataTable/__tests__/DataTable.default-state.test.tsx +14 -42
- package/src/components/DataTable/__tests__/DataTable.export.test.tsx +13 -10
- package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +14 -11
- package/src/components/DataTable/__tests__/DataTable.hooks.test.tsx +4 -2
- package/src/components/DataTable/__tests__/DataTable.test.tsx +13 -7
- package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +13 -10
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +15 -11
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +12 -6
- package/src/components/DataTable/__tests__/keyboard.test.tsx +12 -6
- package/src/components/DataTable/__tests__/pagination.modes.test.tsx +10 -6
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +1 -1
- package/src/components/DataTable/components/DataTableBody.tsx +10 -25
- package/src/components/DataTable/components/DataTableCore.tsx +1 -1
- package/src/components/DataTable/components/FilterRow.tsx +3 -1
- package/src/components/DataTable/components/ImportModal.tsx +1 -1
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +9 -9
- package/src/components/DataTable/core/ColumnFactory.ts +6 -6
- package/src/components/DataTable/core/DataTableContext.tsx +14 -10
- package/src/components/DataTable/core/LocalDataAdapter.ts +2 -1
- package/src/components/DataTable/core/PluginRegistry.ts +3 -3
- package/src/components/DataTable/core/StateManager.ts +12 -11
- package/src/components/DataTable/core/__tests__/ActionManager.test.ts +104 -0
- package/src/components/DataTable/core/__tests__/DataManager.test.ts +101 -0
- package/src/components/DataTable/core/__tests__/LocalDataAdapter.test.ts +84 -0
- package/src/components/DataTable/core/__tests__/PluginRegistry.test.ts +102 -0
- package/src/components/DataTable/core/__tests__/StateManager.test.ts +104 -0
- package/src/components/DataTable/core/interfaces.ts +17 -17
- package/src/components/DataTable/hooks/__tests__/useDataTableConfiguration.test.ts +124 -0
- package/src/components/DataTable/hooks/__tests__/useDataTableDataPipeline.test.ts +117 -0
- package/src/components/DataTable/hooks/__tests__/useDataTablePermissions.test.ts +102 -0
- package/src/components/DataTable/hooks/__tests__/useEffectiveColumnOrder.test.ts +53 -0
- package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +0 -2
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +9 -8
- package/src/components/DataTable/types.ts +5 -5
- package/src/components/DataTable/utils/aggregationUtils.ts +4 -4
- package/src/components/DataTable/utils/columnUtils.ts +3 -2
- package/src/components/DataTable/utils/debugTools.ts +1 -1
- package/src/components/DataTable/utils/exportUtils.ts +6 -6
- package/src/components/DataTable/utils/hierarchicalSorting.ts +6 -6
- package/src/components/DataTable/utils/hierarchicalUtils.ts +0 -8
- package/src/components/DataTable/utils/index.ts +0 -1
- package/src/components/DataTable/utils/performanceUtils.ts +9 -4
- package/src/components/Dialog/Dialog.test.tsx +49 -27
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +13 -8
- package/src/components/EventSelector/EventSelector.test.tsx +60 -12
- package/src/components/EventSelector/EventSelector.tsx +38 -15
- package/src/components/EventSelector/index.ts +2 -2
- package/src/components/FileDisplay/FileDisplay.test.tsx +143 -85
- package/src/components/FileDisplay/FileDisplay.tsx +1 -0
- package/src/components/FileUpload/FileUpload.test.tsx +532 -152
- package/src/components/FileUpload/FileUpload.tsx +43 -8
- package/src/components/Footer/Footer.test.tsx +19 -14
- package/src/components/Form/Form.test.tsx +96 -14
- package/src/components/Form/Form.tsx +210 -1
- package/src/components/Form/index.ts +3 -7
- package/src/components/Header/Header.test.tsx +24 -17
- package/src/components/Header/Header.tsx +3 -1
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +2 -4
- package/src/components/Input/Input.test.tsx +61 -36
- package/src/components/Label/{__tests__/Label.test.tsx → Label.test.tsx} +2 -2
- package/src/components/Label/Label.tsx +2 -3
- package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +6 -5
- package/src/components/LoadingSpinner/LoadingSpinner.tsx +6 -2
- package/src/components/LoginForm/LoginForm.test.tsx +14 -13
- package/src/components/LoginForm/LoginForm.tsx +1 -1
- package/src/components/LoginForm/index.ts +7 -0
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +233 -20
- package/src/components/NavigationMenu/NavigationMenu.tsx +191 -55
- package/src/components/NavigationMenu/index.ts +1 -1
- package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +20 -11
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +1 -1
- package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.integration.test.tsx → PaceAppLayout.integration.test.tsx} +272 -79
- package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.performance.test.tsx → PaceAppLayout.performance.test.tsx} +155 -32
- package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.security.test.tsx → PaceAppLayout.security.test.tsx} +211 -65
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +498 -210
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +63 -64
- package/src/components/PaceAppLayout/test-setup.tsx +192 -0
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +193 -39
- package/src/components/{PasswordReset → PasswordChange}/PasswordChangeForm.test.tsx +2 -2
- package/src/components/{PasswordReset → PasswordChange}/PasswordChangeForm.tsx +10 -4
- package/src/components/PasswordChange/index.ts +2 -0
- package/src/components/Progress/Progress.test.tsx +11 -0
- package/src/components/Progress/Progress.tsx +1 -1
- package/src/components/Progress/index.ts +10 -0
- package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +2 -1
- package/src/components/PublicLayout/PublicLayout.test.tsx +1210 -0
- package/src/components/PublicLayout/PublicPageLayout.tsx +190 -36
- package/src/components/PublicLayout/PublicPageProvider.tsx +8 -7
- package/src/components/PublicLayout/index.ts +10 -28
- package/src/components/Select/Select.test.tsx +7 -7
- package/src/components/Select/Select.tsx +277 -11
- package/src/components/Select/index.ts +1 -2
- package/src/components/SessionRestorationLoader/SessionRestorationLoader.test.tsx +232 -0
- package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +40 -19
- package/src/components/Table/{__tests__/Table.test.tsx → Table.test.tsx} +94 -41
- package/src/components/Tabs/Tabs.test.tsx +10 -9
- package/src/components/Tabs/Tabs.tsx +61 -33
- package/src/components/Textarea/Textarea.test.tsx +31 -18
- package/src/components/Toast/Toast.tsx +2 -2
- package/src/components/Tooltip/Tooltip.test.tsx +1 -1
- package/src/components/UserMenu/UserMenu.test.tsx +7 -6
- package/src/components/UserMenu/UserMenu.tsx +2 -2
- package/src/components/index.ts +5 -4
- package/src/constants/performance.ts +19 -8
- package/src/hooks/__tests__/useAppConfig.unit.test.ts +21 -22
- package/src/hooks/__tests__/useEvents.unit.test.ts +5 -4
- package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +2 -2
- package/src/hooks/__tests__/usePermissionCache.simple.test.ts +17 -0
- package/src/hooks/__tests__/usePermissionCache.unit.test.ts +16 -11
- package/src/hooks/__tests__/usePublicEvent.simple.test.ts +1 -3
- package/src/hooks/__tests__/usePublicEvent.unit.test.ts +1 -3
- package/src/hooks/__tests__/useRBAC.unit.test.ts +24 -2
- package/src/hooks/index.ts +4 -0
- package/src/hooks/public/index.ts +2 -0
- package/src/hooks/public/usePublicEvent.ts +4 -6
- package/src/hooks/public/usePublicRouteParams.ts +1 -1
- package/src/hooks/services/useAuth.ts +2 -4
- package/src/hooks/services/useCurrentEvent.ts +1 -1
- package/src/hooks/useAppConfig.ts +1 -1
- package/src/hooks/useDataTablePerformance.ts +2 -2
- package/src/hooks/useEventTheme.ts +1 -1
- package/src/hooks/useEvents.ts +51 -10
- package/src/hooks/useOrganisationPermissions.test.ts +3 -3
- package/src/hooks/useOrganisationPermissions.ts +1 -1
- package/src/hooks/useOrganisationSecurity.ts +2 -2
- package/src/hooks/usePermissionCache.test.ts +9 -9
- package/src/hooks/usePermissionCache.ts +2 -2
- package/src/index.ts +19 -12
- package/src/providers/OrganisationProvider.tsx +73 -9
- package/src/providers/UnifiedAuthProvider.smoke.test.tsx +113 -13
- package/src/providers/__tests__/AuthProvider.test.tsx +2 -1
- package/src/providers/__tests__/EventProvider.test.tsx +24 -15
- package/src/providers/__tests__/OrganisationProvider.test.tsx +87 -36
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +80 -24
- package/src/providers/index.ts +0 -3
- package/src/providers/services/AuthServiceProvider.tsx +2 -17
- package/src/providers/services/EventServiceProvider.tsx +11 -16
- package/src/providers/services/InactivityServiceProvider.tsx +9 -12
- package/src/providers/services/OrganisationServiceProvider.tsx +9 -12
- package/src/providers/services/UnifiedAuthProvider.tsx +85 -18
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +11 -4
- package/src/rbac/__tests__/scenarios.user-role.test.tsx +105 -21
- package/src/rbac/adapters.tsx +1 -1
- package/src/rbac/api.ts +20 -4
- package/src/rbac/audit-enhanced.ts +47 -2
- package/src/rbac/audit.ts +47 -2
- package/src/rbac/components/NavigationGuard.tsx +1 -1
- package/src/rbac/components/NavigationProvider.test.tsx +7 -6
- package/src/rbac/components/NavigationProvider.tsx +1 -1
- package/src/rbac/components/PagePermissionGuard.tsx +1 -1
- package/src/rbac/components/PagePermissionProvider.test.tsx +7 -6
- package/src/rbac/components/PagePermissionProvider.tsx +1 -1
- package/src/rbac/components/PermissionEnforcer.tsx +1 -1
- package/src/rbac/components/RoleBasedRouter.tsx +1 -1
- package/src/rbac/components/SecureDataProvider.test.tsx +7 -6
- package/src/rbac/components/SecureDataProvider.tsx +1 -1
- package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +6 -6
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +11 -10
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +10 -11
- package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +19 -15
- package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +13 -12
- package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +19 -15
- package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +18 -18
- package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +11 -10
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +8 -7
- package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +10 -11
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +48 -19
- package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +476 -0
- package/src/rbac/hooks/index.ts +3 -0
- package/src/rbac/hooks/usePermissions.ts +31 -85
- package/src/rbac/hooks/useRBAC.test.ts +13 -1
- package/src/rbac/hooks/useRBAC.ts +13 -67
- package/src/rbac/hooks/useResolvedScope.ts +11 -0
- package/src/rbac/hooks/useSecureSupabase.ts +308 -0
- package/src/rbac/index.ts +3 -0
- package/src/rbac/secureClient.ts +53 -6
- package/src/rbac/security.ts +37 -1
- package/src/{types/rbac-functions.ts → rbac/types/functions.ts} +30 -30
- package/src/rbac/types.ts +3 -2
- package/src/services/AuthService.ts +33 -25
- package/src/services/EventService.ts +57 -31
- package/src/services/InactivityService.ts +33 -53
- package/src/services/OrganisationService.ts +36 -40
- package/src/services/__tests__/AuthService.restoreSession.test.ts +6 -2
- package/src/services/__tests__/EventService.test.ts +67 -33
- package/src/services/interfaces/IEventService.ts +1 -1
- package/src/styles/core.css +2 -2
- package/src/styles/index.ts +1 -5
- package/src/types/__tests__/guards.test.ts +1 -1
- package/src/types/__tests__/type-validation.test.ts +0 -1
- package/src/types/auth.ts +42 -2
- package/src/types/core.ts +251 -0
- package/src/types/database.ts +11 -496
- package/src/types/event.ts +102 -0
- package/src/types/file-reference.ts +6 -4
- package/src/types/guards.ts +2 -1
- package/src/types/index.ts +48 -14
- package/src/types/lodash.debounce.d.ts +15 -0
- package/src/types/organisation.ts +14 -10
- package/src/types/supabase.ts +15 -17
- package/src/utils/__tests__/secureErrors.unit.test.ts +1 -1
- package/src/utils/__tests__/validationUtils.unit.test.ts +0 -29
- package/src/utils/app/appNameResolver.ts +1 -1
- package/src/utils/dynamic/dynamicUtils.ts +3 -2
- package/src/utils/file-reference/index.ts +25 -6
- package/src/utils/security/secureErrors.ts +1 -1
- package/src/utils/validation/index.ts +6 -12
- package/src/utils/validation/validationUtils.ts +0 -13
- package/dist/UnifiedAuthProvider-BMJAP6Z7.js +0 -16
- package/dist/auth-DReDSLq9.d.ts +0 -16
- package/dist/chunk-56XJ3TU6.js +0 -11
- package/dist/chunk-56XJ3TU6.js.map +0 -1
- package/dist/chunk-6HLVGAZG.js.map +0 -1
- package/dist/chunk-7QCC6MCP.js +0 -288
- package/dist/chunk-BESYRHQM.js.map +0 -1
- package/dist/chunk-BJPBT3CU.js +0 -21
- package/dist/chunk-BJPBT3CU.js.map +0 -1
- package/dist/chunk-BVYWGZVV.js.map +0 -1
- package/dist/chunk-CPTUD43C.js.map +0 -1
- package/dist/chunk-CX5M4ZAG.js.map +0 -1
- package/dist/chunk-ERGKJX4D.js +0 -15
- package/dist/chunk-ERGKJX4D.js.map +0 -1
- package/dist/chunk-ERISIBYU.js.map +0 -1
- package/dist/chunk-GQA2LIAE.js.map +0 -1
- package/dist/chunk-JISYG63F.js +0 -70
- package/dist/chunk-JISYG63F.js.map +0 -1
- package/dist/chunk-MSHEVJXS.js +0 -27
- package/dist/chunk-MSHEVJXS.js.map +0 -1
- package/dist/chunk-N5YCCUG5.js.map +0 -1
- package/dist/chunk-ONI7Y733.js.map +0 -1
- package/dist/chunk-OWAG3GSU.js.map +0 -1
- package/dist/chunk-P6UUHOIF.js.map +0 -1
- package/dist/chunk-PKW27QVS.js +0 -61
- package/dist/chunk-PKW27QVS.js.map +0 -1
- package/dist/chunk-Q5QRDWKI.js.map +0 -1
- package/dist/chunk-S5OFRT4M.js.map +0 -1
- package/dist/chunk-SBVILCCA.js.map +0 -1
- package/dist/chunk-WM26XK7I.js +0 -2432
- package/dist/chunk-WM26XK7I.js.map +0 -1
- package/dist/chunk-XDNLUEXI.js +0 -138
- package/dist/chunk-XJ2HZOBU.js.map +0 -1
- package/dist/chunk-ZZ2SS7NI.js +0 -237
- package/dist/chunk-ZZ2SS7NI.js.map +0 -1
- package/dist/database-C6jy7EOu.d.ts +0 -500
- package/dist/organisation-D6qRDtbF.d.ts +0 -93
- package/dist/schema-DTDZQe2u.d.ts +0 -28
- package/dist/unified-DQ4VcT7H.d.ts +0 -198
- package/dist/useInactivityTracker-TO6ZOF35.js +0 -11
- package/dist/validation.d.ts +0 -47
- package/dist/validation.js +0 -24
- package/dist/validation.js.map +0 -1
- package/docs/DOCUMENTATION_AUDIT.md +0 -172
- package/docs/DOCUMENTATION_STANDARD.md +0 -137
- package/docs/api/classes/PublicErrorBoundary.md +0 -132
- package/docs/api/interfaces/EventLogoProps.md +0 -152
- package/docs/api/interfaces/PublicErrorBoundaryProps.md +0 -94
- package/docs/api/interfaces/PublicErrorBoundaryState.md +0 -68
- package/docs/api/interfaces/PublicLoadingSpinnerProps.md +0 -86
- package/docs/architecture/rpc-function-standards.md +0 -1106
- package/docs/getting-started/consuming-app-vite-config.md +0 -239
- package/docs/implementation-guides/event-theming-summary.md +0 -226
- package/docs/implementation-guides/public-pages-advanced.md +0 -1038
- package/docs/migration/v0.4.15-tailwind-scanning.md +0 -278
- package/docs/migration/v0.4.16-css-first-approach.md +0 -312
- package/docs/migration/v0.4.17-source-path-fix.md +0 -235
- package/docs/rbac/RBAC_EVENT_CONTEXT_LOADING.md +0 -222
- package/docs/rbac/RBAC_LOGIN_SAFETY_FIX.md +0 -95
- package/docs/rbac/RBAC_V0.5.147_FIX.md +0 -117
- package/docs/rbac/README-rbac-rls-integration.md +0 -374
- package/docs/styles/usage.md +0 -227
- package/docs/testing/visual-testing.md +0 -120
- package/docs/troubleshooting/DEBUG_NETWORK_ERROR.md +0 -152
- package/docs/troubleshooting/FIX_SUPABASE_CORS.md +0 -184
- package/docs/troubleshooting/cake-page-permission-guard-issue-summary.md +0 -193
- package/docs/troubleshooting/database-view-compatibility.md +0 -125
- package/docs/troubleshooting/react-hooks-issue-analysis.md +0 -172
- package/docs/troubleshooting/tailwind-content-scanning.md +0 -219
- package/examples/RBAC/EventBasedApp.tsx +0 -239
- package/examples/RBAC/PermissionExample.tsx +0 -151
- package/examples/STRUCTURE.md +0 -125
- package/examples/components 2/Dialog/BasicHtmlTest.tsx +0 -55
- package/examples/components 2/Dialog/DebugHtmlExample.tsx +0 -68
- package/examples/components 2/Dialog/HtmlDialogExample.tsx +0 -202
- package/examples/components 2/Dialog/SimpleHtmlTest.tsx +0 -61
- package/examples/components 2/Dialog/SmartDialogExample.tsx +0 -322
- package/examples/components 2/index.ts +0 -11
- package/examples/features/index.ts +0 -12
- package/examples/features/rbac/CompleteRBACExample.tsx +0 -324
- package/examples/features/rbac/index.ts +0 -13
- package/examples/public-pages/CorrectPublicPageImplementation.tsx +0 -301
- package/examples/public-pages/PublicEventPage.tsx +0 -274
- package/examples/public-pages/PublicPageApp.tsx +0 -308
- package/examples/public-pages/PublicPageUsageExample.tsx +0 -216
- package/examples/public-pages/index.ts +0 -14
- package/src/__tests__/TEST_STANDARD.md +0 -1008
- package/src/components/Checkbox/__mocks__/Checkbox.tsx +0 -2
- package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +0 -421
- package/src/components/DataTable/examples/HierarchicalExample.tsx +0 -475
- package/src/components/DataTable/examples/InitialPageSizeExample.tsx +0 -177
- package/src/components/DataTable/examples/PerformanceExample.tsx +0 -506
- package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +0 -316
- package/src/components/DataTable/examples/__tests__/HierarchicalExample.test.tsx +0 -45
- package/src/components/DataTable/examples/__tests__/InitialPageSizeExample.test.tsx +0 -211
- package/src/components/DataTable/examples/__tests__/PerformanceExample.test.tsx +0 -126
- package/src/components/Dialog/README.md +0 -804
- package/src/components/Dialog/examples/BasicHtmlTest.tsx +0 -55
- package/src/components/Dialog/examples/DebugHtmlExample.tsx +0 -68
- package/src/components/Dialog/examples/ScrollableDialogExample.tsx +0 -290
- package/src/components/Dialog/examples/SimpleHtmlTest.tsx +0 -61
- package/src/components/Dialog/examples/__tests__/HtmlDialogExample.test.tsx +0 -71
- package/src/components/Dialog/examples/__tests__/SimpleHtmlTest.test.tsx +0 -122
- package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +0 -147
- package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +0 -611
- package/src/components/Dialog/utils/safeHtml.ts +0 -185
- package/src/components/EventSelector/types.ts +0 -79
- package/src/components/Form/FormErrorSummary.tsx +0 -113
- package/src/components/Form/FormField.tsx +0 -249
- package/src/components/Form/FormFieldset.tsx +0 -127
- package/src/components/Form/FormLiveRegion.tsx +0 -198
- package/src/components/Input/__mocks__/Input.tsx +0 -2
- package/src/components/NavigationMenu/types.ts +0 -85
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +0 -326
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -1078
- package/src/components/PasswordReset/PasswordResetForm.test.tsx +0 -597
- package/src/components/PasswordReset/PasswordResetForm.tsx +0 -201
- package/src/components/PasswordReset/index.ts +0 -2
- package/src/components/ProtectedRoute/README.md +0 -164
- package/src/components/PublicLayout/EventLogo.tsx +0 -175
- package/src/components/PublicLayout/PublicErrorBoundary.tsx +0 -282
- package/src/components/PublicLayout/PublicLoadingSpinner.tsx +0 -216
- package/src/components/PublicLayout/PublicPageContextChecker.tsx +0 -131
- package/src/components/PublicLayout/PublicPageDebugger.tsx +0 -104
- package/src/components/PublicLayout/PublicPageDiagnostic.tsx +0 -162
- package/src/components/PublicLayout/PublicPageFooter.tsx +0 -124
- package/src/components/PublicLayout/PublicPageHeader.tsx +0 -209
- package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +0 -449
- package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +0 -393
- package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +0 -192
- package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +0 -351
- package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +0 -402
- package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +0 -460
- package/src/components/PublicLayout/__tests__/PublicPageProvider.test.tsx +0 -313
- package/src/components/Select/hooks.ts +0 -289
- package/src/hooks/useCounter.test.ts +0 -131
- package/src/hooks/useDebounce.test.ts +0 -375
- package/src/providers/AuthProvider.tsx +0 -15
- package/src/providers/EventProvider.tsx +0 -16
- package/src/providers/InactivityProvider.tsx +0 -15
- package/src/providers/OrganisationProvider.context.test.tsx +0 -169
- package/src/providers/UnifiedAuthProvider.tsx +0 -15
- package/src/types/theme.ts +0 -6
- package/src/types/unified.ts +0 -265
- package/src/utils/appConfig.ts +0 -47
- package/src/utils/appIdResolver.test.ts +0 -499
- package/src/utils/appIdResolver.ts +0 -130
- package/src/utils/appNameResolver.simple.test.ts +0 -212
- package/src/utils/appNameResolver.test.ts +0 -121
- package/src/utils/appNameResolver.ts +0 -191
- package/src/utils/audit.ts +0 -127
- package/src/utils/auth-utils.ts +0 -96
- package/src/utils/bundleAnalysis.ts +0 -129
- package/src/utils/debugLogger.ts +0 -67
- package/src/utils/deviceFingerprint.ts +0 -215
- package/src/utils/dynamicUtils.ts +0 -105
- package/src/utils/file-reference.test.ts +0 -788
- package/src/utils/file-reference.ts +0 -519
- package/src/utils/formatDate.test.ts +0 -237
- package/src/utils/formatting.ts +0 -170
- package/src/utils/lazyLoad.tsx +0 -44
- package/src/utils/logger.ts +0 -179
- package/src/utils/organisationContext.test.ts +0 -322
- package/src/utils/organisationContext.ts +0 -153
- package/src/utils/performanceBenchmark.ts +0 -64
- package/src/utils/performanceBudgets.ts +0 -110
- package/src/utils/permissionTypes.ts +0 -37
- package/src/utils/permissionUtils.test.ts +0 -393
- package/src/utils/permissionUtils.ts +0 -34
- package/src/utils/sanitization.ts +0 -264
- package/src/utils/schemaUtils.ts +0 -37
- package/src/utils/secureDataAccess.test.ts +0 -711
- package/src/utils/secureDataAccess.ts +0 -377
- package/src/utils/secureErrors.ts +0 -79
- package/src/utils/security.ts +0 -156
- package/src/utils/securityMonitor.ts +0 -45
- package/src/utils/sessionTracking.ts +0 -126
- package/src/utils/validation.ts +0 -111
- package/src/utils/validationUtils.ts +0 -120
- package/src/validation/index.ts +0 -12
- /package/dist/{DataTable-4VSEJQ7D.js.map → DataTable-QAB34V6K.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-BMJAP6Z7.js.map → UnifiedAuthProvider-7F6T4B6K.js.map} +0 -0
- /package/dist/{api-45XYYO2A.js.map → api-ROMBCNKU.js.map} +0 -0
- /package/dist/{audit-64X3VJXB.js.map → audit-WRS3KJKI.js.map} +0 -0
- /package/dist/{chunk-PLDDJCW6.js.map → chunk-7D4SUZUM.js.map} +0 -0
- /package/dist/{useInactivityTracker-TO6ZOF35.js.map → chunk-KQCRWDSA.js.map} +0 -0
- /package/examples/{components 2/DataTable → DataTable}/InitialPageSizeExample.tsx +0 -0
- /package/examples/{features/public-pages → PublicPages}/index.ts +0 -0
- /package/examples/{RBAC → rbac}/index.ts +0 -0
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file Safe HTML Utilities for Dialog Component
|
|
3
|
-
* @package @jmruthers/pace-core
|
|
4
|
-
* @module Components/Dialog/Utils/safeHtml
|
|
5
|
-
* @since 0.4.36
|
|
6
|
-
*
|
|
7
|
-
* Utilities for safely rendering HTML content in Dialog components.
|
|
8
|
-
* Provides sanitization and validation for basic HTML elements.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Allowed HTML tags for safe rendering in Dialog components
|
|
13
|
-
*/
|
|
14
|
-
const ALLOWED_TAGS = [
|
|
15
|
-
'p', 'div', 'span', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
|
|
16
|
-
'strong', 'em', 'b', 'i', 'u', 's', 'mark', 'small', 'sub', 'sup',
|
|
17
|
-
'ul', 'ol', 'li', 'dl', 'dt', 'dd',
|
|
18
|
-
'blockquote', 'pre', 'code', 'kbd', 'samp',
|
|
19
|
-
'a', 'br', 'hr',
|
|
20
|
-
'table', 'thead', 'tbody', 'tfoot', 'tr', 'th', 'td',
|
|
21
|
-
'img', 'figure', 'figcaption',
|
|
22
|
-
'section', 'article', 'aside', 'header', 'footer', 'main', 'nav',
|
|
23
|
-
'details', 'summary'
|
|
24
|
-
] as const;
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Allowed HTML attributes for safe rendering
|
|
28
|
-
*/
|
|
29
|
-
const ALLOWED_ATTRIBUTES = [
|
|
30
|
-
'id', 'class', 'style', 'title', 'lang', 'dir',
|
|
31
|
-
'href', 'target', 'rel', 'download',
|
|
32
|
-
'src', 'alt', 'width', 'height', 'loading',
|
|
33
|
-
'colspan', 'rowspan', 'scope', 'headers',
|
|
34
|
-
'open', 'datetime', 'cite'
|
|
35
|
-
] as const;
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Basic HTML sanitization function using regex-based approach
|
|
39
|
-
* Removes potentially dangerous elements and attributes while preserving basic formatting
|
|
40
|
-
* This approach is more reliable in SSR environments and doesn't require DOM manipulation
|
|
41
|
-
*
|
|
42
|
-
* @param html - The HTML string to sanitize
|
|
43
|
-
* @returns Sanitized HTML string safe for rendering
|
|
44
|
-
*
|
|
45
|
-
* @example
|
|
46
|
-
* ```tsx
|
|
47
|
-
* const safeHtml = sanitizeHtml('<p>Hello <strong>world</strong>!</p>');
|
|
48
|
-
* // Returns: '<p>Hello <strong>world</strong>!</p>'
|
|
49
|
-
*
|
|
50
|
-
* const dangerousHtml = sanitizeHtml('<script>alert("xss")</script><p>Safe content</p>');
|
|
51
|
-
* // Returns: '<p>Safe content</p>'
|
|
52
|
-
* ```
|
|
53
|
-
*/
|
|
54
|
-
export function sanitizeHtml(html: string): string {
|
|
55
|
-
if (!html || typeof html !== 'string') {
|
|
56
|
-
return '';
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// For debugging, let's just return the HTML as-is for now
|
|
60
|
-
// This will help us see if the issue is with sanitization or rendering
|
|
61
|
-
console.log('🔍 sanitizeHtml input:', html);
|
|
62
|
-
|
|
63
|
-
// Basic safety: just remove script tags and dangerous attributes
|
|
64
|
-
let sanitized = html
|
|
65
|
-
// Remove script tags (including self-closing and malformed)
|
|
66
|
-
.replace(/<script\b[^>]*>.*?<\/script>/gi, '')
|
|
67
|
-
.replace(/<script\b[^>]*\/>/gi, '')
|
|
68
|
-
// Remove iframe tags (including self-closing and malformed)
|
|
69
|
-
.replace(/<iframe\b[^>]*>.*?<\/iframe>/gi, '')
|
|
70
|
-
.replace(/<iframe\b[^>]*\/>/gi, '')
|
|
71
|
-
// Remove object tags (including self-closing and malformed)
|
|
72
|
-
.replace(/<object\b[^>]*>.*?<\/object>/gi, '')
|
|
73
|
-
.replace(/<object\b[^>]*\/>/gi, '')
|
|
74
|
-
// Remove embed tags (including self-closing)
|
|
75
|
-
.replace(/<embed\b[^>]*\/?>/gi, '')
|
|
76
|
-
// Remove form tags (including self-closing and malformed)
|
|
77
|
-
.replace(/<form\b[^>]*>.*?<\/form>/gi, '')
|
|
78
|
-
.replace(/<form\b[^>]*\/>/gi, '')
|
|
79
|
-
// Remove input tags (including self-closing)
|
|
80
|
-
.replace(/<input\b[^>]*\/?>/gi, '')
|
|
81
|
-
// Remove button tags (including self-closing and malformed)
|
|
82
|
-
.replace(/<button\b[^>]*>.*?<\/button>/gi, '')
|
|
83
|
-
.replace(/<button\b[^>]*\/>/gi, '')
|
|
84
|
-
// Remove event handlers from any remaining tags - correct pattern
|
|
85
|
-
.replace(/\s*on\w+\s*=\s*["'][^"']*["']/gi, '')
|
|
86
|
-
// Remove javascript: protocols - correct pattern
|
|
87
|
-
.replace(/javascript:[^"'\s>]*/gi, '')
|
|
88
|
-
// Remove data: protocols - correct pattern
|
|
89
|
-
.replace(/data:[^"'\s>]*/gi, '');
|
|
90
|
-
|
|
91
|
-
console.log('🔍 sanitizeHtml output:', sanitized);
|
|
92
|
-
return sanitized;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Validates if HTML content is safe for rendering
|
|
97
|
-
*
|
|
98
|
-
* @param html - The HTML string to validate
|
|
99
|
-
* @returns Object with validation result and any warnings
|
|
100
|
-
*
|
|
101
|
-
* @example
|
|
102
|
-
* ```tsx
|
|
103
|
-
* const validation = validateHtml('<p>Safe content</p>');
|
|
104
|
-
* console.log(validation.isValid); // true
|
|
105
|
-
* console.log(validation.warnings); // []
|
|
106
|
-
* ```
|
|
107
|
-
*/
|
|
108
|
-
export function validateHtml(html: string): { isValid: boolean; warnings: string[] } {
|
|
109
|
-
const warnings: string[] = [];
|
|
110
|
-
|
|
111
|
-
if (!html || typeof html !== 'string') {
|
|
112
|
-
return { isValid: false, warnings: ['HTML content must be a non-empty string'] };
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// Check for potentially dangerous patterns
|
|
116
|
-
const dangerousPatterns = [
|
|
117
|
-
{ pattern: /<script\b[^>]*>.*?<\/script>/gi, message: 'Script tags are not allowed' },
|
|
118
|
-
{ pattern: /<script\b[^>]*\/>/gi, message: 'Script tags are not allowed' },
|
|
119
|
-
{ pattern: /<iframe\b[^>]*>.*?<\/iframe>/gi, message: 'Iframe tags are not allowed' },
|
|
120
|
-
{ pattern: /<iframe\b[^>]*\/>/gi, message: 'Iframe tags are not allowed' },
|
|
121
|
-
{ pattern: /<object\b[^>]*>.*?<\/object>/gi, message: 'Object tags are not allowed' },
|
|
122
|
-
{ pattern: /<object\b[^>]*\/>/gi, message: 'Object tags are not allowed' },
|
|
123
|
-
{ pattern: /<embed\b[^>]*\/?>/gi, message: 'Embed tags are not allowed' },
|
|
124
|
-
{ pattern: /<form\b[^>]*>.*?<\/form>/gi, message: 'Form tags are not allowed' },
|
|
125
|
-
{ pattern: /<form\b[^>]*\/>/gi, message: 'Form tags are not allowed' },
|
|
126
|
-
{ pattern: /<input\b[^>]*\/?>/gi, message: 'Input tags are not allowed' },
|
|
127
|
-
{ pattern: /<button\b[^>]*>.*?<\/button>/gi, message: 'Button tags are not allowed' },
|
|
128
|
-
{ pattern: /<button\b[^>]*\/>/gi, message: 'Button tags are not allowed' },
|
|
129
|
-
{ pattern: /on\w+\s*=/gi, message: 'Event handlers are not allowed' },
|
|
130
|
-
{ pattern: /javascript:/gi, message: 'JavaScript protocols are not allowed' },
|
|
131
|
-
{ pattern: /data:/gi, message: 'Data protocols are not allowed' }
|
|
132
|
-
];
|
|
133
|
-
|
|
134
|
-
dangerousPatterns.forEach(({ pattern, message }) => {
|
|
135
|
-
if (pattern.test(html)) {
|
|
136
|
-
warnings.push(message);
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
return {
|
|
141
|
-
isValid: warnings.length === 0,
|
|
142
|
-
warnings
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Safely renders HTML content with sanitization
|
|
148
|
-
*
|
|
149
|
-
* @param html - The HTML string to render
|
|
150
|
-
* @param options - Rendering options
|
|
151
|
-
* @returns Object with sanitized HTML and validation info
|
|
152
|
-
*
|
|
153
|
-
* @example
|
|
154
|
-
* ```tsx
|
|
155
|
-
* const result = renderSafeHtml('<p>Hello <strong>world</strong>!</p>');
|
|
156
|
-
* console.log(result.html); // Sanitized HTML
|
|
157
|
-
* console.log(result.isValid); // true
|
|
158
|
-
* ```
|
|
159
|
-
*/
|
|
160
|
-
export function renderSafeHtml(
|
|
161
|
-
html: string,
|
|
162
|
-
options: {
|
|
163
|
-
strict?: boolean;
|
|
164
|
-
logWarnings?: boolean;
|
|
165
|
-
} = {}
|
|
166
|
-
): {
|
|
167
|
-
html: string;
|
|
168
|
-
isValid: boolean;
|
|
169
|
-
warnings: string[]
|
|
170
|
-
} {
|
|
171
|
-
const { strict = true, logWarnings = false } = options;
|
|
172
|
-
|
|
173
|
-
const validation = validateHtml(html);
|
|
174
|
-
const sanitizedHtml = sanitizeHtml(html);
|
|
175
|
-
|
|
176
|
-
if (logWarnings && validation.warnings.length > 0) {
|
|
177
|
-
console.warn('Dialog HTML content warnings:', validation.warnings);
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
return {
|
|
181
|
-
html: sanitizedHtml,
|
|
182
|
-
isValid: validation.isValid,
|
|
183
|
-
warnings: validation.warnings
|
|
184
|
-
};
|
|
185
|
-
}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file Types for event selector component
|
|
3
|
-
*/
|
|
4
|
-
import type { SupabaseClient } from '@supabase/supabase-js';
|
|
5
|
-
import { Event } from '../../types/unified';
|
|
6
|
-
|
|
7
|
-
interface ColorLCH {
|
|
8
|
-
L: number;
|
|
9
|
-
C: number;
|
|
10
|
-
H: number;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
interface ColorPalette {
|
|
14
|
-
[shade: string]: ColorLCH;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export interface EventColors {
|
|
18
|
-
[paletteKey: string]: ColorPalette;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Props for EventSelector component
|
|
23
|
-
*/
|
|
24
|
-
export interface EventSelectorProps {
|
|
25
|
-
/**
|
|
26
|
-
* Events data to be displayed in the dropdown
|
|
27
|
-
*/
|
|
28
|
-
events?: Event[];
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* ID of the currently selected event
|
|
32
|
-
*/
|
|
33
|
-
currentEventId?: string;
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Function called when an event is selected
|
|
37
|
-
*/
|
|
38
|
-
onSelectEvent?: (eventId: string) => void;
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Custom CSS class for styling
|
|
42
|
-
*/
|
|
43
|
-
className?: string;
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Whether to display in compact mode
|
|
47
|
-
*/
|
|
48
|
-
compact?: boolean;
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Function called when an event is changed with full event object
|
|
52
|
-
*/
|
|
53
|
-
onEventChange?: (event: Event | null) => void;
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Supabase client instance
|
|
57
|
-
*/
|
|
58
|
-
supabaseClient?: SupabaseClient;
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Application name for session tracking
|
|
62
|
-
*/
|
|
63
|
-
appName?: string;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Props for EventTheme component
|
|
68
|
-
*/
|
|
69
|
-
export interface EventThemeProps {
|
|
70
|
-
/**
|
|
71
|
-
* Event ID to use for theming
|
|
72
|
-
*/
|
|
73
|
-
eventId?: string;
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Children to apply the theme to
|
|
77
|
-
*/
|
|
78
|
-
children: React.ReactNode;
|
|
79
|
-
}
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* @file FormErrorSummary Component
|
|
4
|
-
* @package @jmruthers/pace-core
|
|
5
|
-
* @module Components/Form
|
|
6
|
-
* @since 0.1.0
|
|
7
|
-
*
|
|
8
|
-
* A form error summary component that displays validation errors in a user-friendly format.
|
|
9
|
-
* Provides a centralized location for users to see all form errors at once.
|
|
10
|
-
*
|
|
11
|
-
* Features:
|
|
12
|
-
* - Displays all form errors in one place
|
|
13
|
-
* - Configurable error display format
|
|
14
|
-
* - Optional field name display
|
|
15
|
-
* - Accessible error presentation
|
|
16
|
-
* - Consistent styling with Alert component
|
|
17
|
-
* - Automatic error filtering
|
|
18
|
-
* - Responsive design
|
|
19
|
-
*
|
|
20
|
-
* @example
|
|
21
|
-
* ```tsx
|
|
22
|
-
* // Basic error summary
|
|
23
|
-
* <FormErrorSummary errors={formErrors} />
|
|
24
|
-
*
|
|
25
|
-
* // With custom title
|
|
26
|
-
* <FormErrorSummary
|
|
27
|
-
* errors={formErrors}
|
|
28
|
-
* title="Please correct the following issues:"
|
|
29
|
-
* />
|
|
30
|
-
*
|
|
31
|
-
* // Show field names with errors
|
|
32
|
-
* <FormErrorSummary
|
|
33
|
-
* errors={formErrors}
|
|
34
|
-
* showFieldNames={true}
|
|
35
|
-
* />
|
|
36
|
-
*
|
|
37
|
-
* // In a form with React Hook Form
|
|
38
|
-
* const { formState: { errors } } = useForm();
|
|
39
|
-
*
|
|
40
|
-
* <Form onSubmit={handleSubmit}>
|
|
41
|
-
* <FormField name="email" label="Email" />
|
|
42
|
-
* <FormField name="password" label="Password" />
|
|
43
|
-
* <FormErrorSummary errors={errors} />
|
|
44
|
-
* <Button type="submit">Submit</Button>
|
|
45
|
-
* </Form>
|
|
46
|
-
* ```
|
|
47
|
-
*
|
|
48
|
-
* @accessibility
|
|
49
|
-
* - Uses Alert component for consistent accessibility
|
|
50
|
-
* - Proper heading hierarchy with h3
|
|
51
|
-
* - List structure for error items
|
|
52
|
-
* - Screen reader friendly error announcements
|
|
53
|
-
* - High contrast support via Alert component
|
|
54
|
-
*
|
|
55
|
-
* @dependencies
|
|
56
|
-
* - Alert component for consistent styling
|
|
57
|
-
* - React 18+ - Component framework
|
|
58
|
-
* - Tailwind CSS - Styling
|
|
59
|
-
*/
|
|
60
|
-
|
|
61
|
-
import { Alert } from '../Alert';
|
|
62
|
-
|
|
63
|
-
export interface FormErrorSummaryProps {
|
|
64
|
-
/** Form validation errors object */
|
|
65
|
-
errors?: Record<string, any>;
|
|
66
|
-
/** Title displayed above the error list */
|
|
67
|
-
title?: string;
|
|
68
|
-
/** Whether to show field names alongside error messages */
|
|
69
|
-
showFieldNames?: boolean;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* FormErrorSummary component for displaying form validation errors
|
|
74
|
-
*
|
|
75
|
-
* This component provides a user-friendly way to display all form errors
|
|
76
|
-
* in one centralized location, improving the user experience by making
|
|
77
|
-
* it clear what needs to be fixed.
|
|
78
|
-
*
|
|
79
|
-
* @param props - Component configuration
|
|
80
|
-
* @param props.errors - Form validation errors object
|
|
81
|
-
* @param props.title - Title displayed above the error list
|
|
82
|
-
* @param props.showFieldNames - Whether to show field names with errors
|
|
83
|
-
* @returns JSX.Element - The rendered error summary or null if no errors
|
|
84
|
-
*/
|
|
85
|
-
export function FormErrorSummary({
|
|
86
|
-
errors = {},
|
|
87
|
-
title = "Please fix the following errors:",
|
|
88
|
-
showFieldNames = false
|
|
89
|
-
}: FormErrorSummaryProps) {
|
|
90
|
-
const errorEntries = Object.entries(errors).filter(([, value]) => Boolean(value));
|
|
91
|
-
|
|
92
|
-
if (errorEntries.length === 0) {
|
|
93
|
-
return null;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
return (
|
|
97
|
-
<Alert variant="destructive" className="mb-4">
|
|
98
|
-
<div>
|
|
99
|
-
<h3>{title}</h3>
|
|
100
|
-
<ul className="list-disc list-inside space-y-1">
|
|
101
|
-
{errorEntries.map(([field, error], index) => {
|
|
102
|
-
const message = typeof error === 'object' && error.message ? error.message : String(error);
|
|
103
|
-
return (
|
|
104
|
-
<li key={index} className="text-sm">
|
|
105
|
-
{showFieldNames ? `${field}: ${message}` : message}
|
|
106
|
-
</li>
|
|
107
|
-
);
|
|
108
|
-
})}
|
|
109
|
-
</ul>
|
|
110
|
-
</div>
|
|
111
|
-
</Alert>
|
|
112
|
-
);
|
|
113
|
-
}
|
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file FormField Component
|
|
3
|
-
* @package @jmruthers/pace-core
|
|
4
|
-
* @module Components/Form
|
|
5
|
-
* @since 0.1.0
|
|
6
|
-
*
|
|
7
|
-
* A flexible form field component that integrates with React Hook Form and provides
|
|
8
|
-
* built-in validation, error handling, and accessibility features.
|
|
9
|
-
*
|
|
10
|
-
* Features:
|
|
11
|
-
* - React Hook Form integration with Controller
|
|
12
|
-
* - Built-in validation with error display
|
|
13
|
-
* - Accessible labels and error messages
|
|
14
|
-
* - Custom render function support
|
|
15
|
-
* - TypeScript support with generic field paths
|
|
16
|
-
* - Consistent styling with error states
|
|
17
|
-
* - Test ID support for testing
|
|
18
|
-
* - Flexible input types and props
|
|
19
|
-
*
|
|
20
|
-
* @example
|
|
21
|
-
* ```tsx
|
|
22
|
-
* // Basic text field
|
|
23
|
-
* <FormField
|
|
24
|
-
* name="username"
|
|
25
|
-
* label="Username"
|
|
26
|
-
* placeholder="Enter your username"
|
|
27
|
-
* validation={{ required: true }}
|
|
28
|
-
* />
|
|
29
|
-
*
|
|
30
|
-
* // Email field with custom validation
|
|
31
|
-
* <FormField
|
|
32
|
-
* name="email"
|
|
33
|
-
* label="Email Address"
|
|
34
|
-
* type="email"
|
|
35
|
-
* validation={{
|
|
36
|
-
* required: true,
|
|
37
|
-
* pattern: {
|
|
38
|
-
* value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i,
|
|
39
|
-
* message: "Invalid email address"
|
|
40
|
-
* }
|
|
41
|
-
* }}
|
|
42
|
-
* />
|
|
43
|
-
*
|
|
44
|
-
* // Custom render function
|
|
45
|
-
* <FormField
|
|
46
|
-
* name="avatar"
|
|
47
|
-
* label="Profile Picture"
|
|
48
|
-
* render={({ field }) => (
|
|
49
|
-
* <input
|
|
50
|
-
* {...field}
|
|
51
|
-
* type="file"
|
|
52
|
-
* accept="image/*"
|
|
53
|
-
* className="file:mr-4 file:py-2 file:px-4 file:rounded-full file:border-0 file:text-sm file:font-semibold file:bg-sec-50 file:text-sec-700 hover:file:bg-sec-100"
|
|
54
|
-
* />
|
|
55
|
-
* )}
|
|
56
|
-
* />
|
|
57
|
-
*
|
|
58
|
-
* // With test ID for testing
|
|
59
|
-
* <FormField
|
|
60
|
-
* name="password"
|
|
61
|
-
* label="Password"
|
|
62
|
-
* type="password"
|
|
63
|
-
* data-testid="password-field"
|
|
64
|
-
* validation={{
|
|
65
|
-
* required: true,
|
|
66
|
-
* minLength: {
|
|
67
|
-
* value: 8,
|
|
68
|
-
* message: "Password must be at least 8 characters"
|
|
69
|
-
* }
|
|
70
|
-
* }}
|
|
71
|
-
* />
|
|
72
|
-
* ```
|
|
73
|
-
*
|
|
74
|
-
* @accessibility
|
|
75
|
-
* - Proper label association with htmlFor
|
|
76
|
-
* - Error messages with role="alert"
|
|
77
|
-
* - Required field indicators
|
|
78
|
-
* - Focus management
|
|
79
|
-
* - Screen reader friendly error announcements
|
|
80
|
-
* - Keyboard navigation support
|
|
81
|
-
*
|
|
82
|
-
* @dependencies
|
|
83
|
-
* - react-hook-form - Form integration
|
|
84
|
-
* - React 18+ - Hooks and context
|
|
85
|
-
* - Tailwind CSS - Styling
|
|
86
|
-
*/
|
|
87
|
-
|
|
88
|
-
import React from 'react';
|
|
89
|
-
import { useFormContext, Controller, FieldPath, FieldValues } from 'react-hook-form';
|
|
90
|
-
import { cn } from '../../utils/core/cn';
|
|
91
|
-
import { Label } from '../Label';
|
|
92
|
-
|
|
93
|
-
export interface FormFieldProps<
|
|
94
|
-
TFieldValues extends FieldValues = FieldValues,
|
|
95
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>
|
|
96
|
-
> {
|
|
97
|
-
/**
|
|
98
|
-
* Field name
|
|
99
|
-
*/
|
|
100
|
-
name: TName;
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Field label
|
|
104
|
-
*/
|
|
105
|
-
label?: string;
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Field type
|
|
109
|
-
*/
|
|
110
|
-
type?: string;
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Placeholder text
|
|
114
|
-
*/
|
|
115
|
-
placeholder?: string;
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Additional props for the input
|
|
119
|
-
*/
|
|
120
|
-
inputProps?: React.InputHTMLAttributes<HTMLInputElement>;
|
|
121
|
-
|
|
122
|
-
/**
|
|
123
|
-
* Validation rules
|
|
124
|
-
*/
|
|
125
|
-
validation?: {
|
|
126
|
-
required?: boolean;
|
|
127
|
-
pattern?: {
|
|
128
|
-
value: RegExp;
|
|
129
|
-
message: string;
|
|
130
|
-
};
|
|
131
|
-
minLength?: {
|
|
132
|
-
value: number;
|
|
133
|
-
message: string;
|
|
134
|
-
};
|
|
135
|
-
maxLength?: {
|
|
136
|
-
value: number;
|
|
137
|
-
message: string;
|
|
138
|
-
};
|
|
139
|
-
};
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Custom render function
|
|
143
|
-
*/
|
|
144
|
-
render?: ({ field }: { field: any }) => React.ReactElement;
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Test ID
|
|
148
|
-
*/
|
|
149
|
-
'data-testid'?: string;
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* Class name
|
|
153
|
-
*/
|
|
154
|
-
className?: string;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* FormField component for React Hook Form integration
|
|
159
|
-
*
|
|
160
|
-
* @template TFieldValues - The type of form field values
|
|
161
|
-
* @template TName - The type of the field name (must be a valid field path)
|
|
162
|
-
* @param props - Form field configuration and validation
|
|
163
|
-
* @returns JSX.Element - The rendered form field with validation
|
|
164
|
-
*
|
|
165
|
-
* @example
|
|
166
|
-
* ```tsx
|
|
167
|
-
* <FormField
|
|
168
|
-
* name="email"
|
|
169
|
-
* label="Email"
|
|
170
|
-
* type="email"
|
|
171
|
-
* validation={{
|
|
172
|
-
* required: true,
|
|
173
|
-
* pattern: {
|
|
174
|
-
* value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i,
|
|
175
|
-
* message: "Please enter a valid email address"
|
|
176
|
-
* }
|
|
177
|
-
* }}
|
|
178
|
-
* />
|
|
179
|
-
* ```
|
|
180
|
-
*/
|
|
181
|
-
export function FormField<
|
|
182
|
-
TFieldValues extends FieldValues = FieldValues,
|
|
183
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>
|
|
184
|
-
>({
|
|
185
|
-
name,
|
|
186
|
-
label,
|
|
187
|
-
type = "text",
|
|
188
|
-
placeholder,
|
|
189
|
-
inputProps,
|
|
190
|
-
validation,
|
|
191
|
-
render,
|
|
192
|
-
'data-testid': testId,
|
|
193
|
-
className,
|
|
194
|
-
}: FormFieldProps<TFieldValues, TName>) {
|
|
195
|
-
const { control, formState: { errors } } = useFormContext<TFieldValues>();
|
|
196
|
-
const fieldError = errors[name];
|
|
197
|
-
|
|
198
|
-
// Safely extract error message
|
|
199
|
-
const errorMessage = fieldError && typeof fieldError === 'object' && 'message' in fieldError
|
|
200
|
-
? String(fieldError.message)
|
|
201
|
-
: undefined;
|
|
202
|
-
|
|
203
|
-
return (
|
|
204
|
-
<div className={cn("space-y-2", className)}>
|
|
205
|
-
{label && (
|
|
206
|
-
<Label htmlFor={name}>
|
|
207
|
-
{label}
|
|
208
|
-
{validation?.required && (
|
|
209
|
-
<span className="text-destructive ml-1" aria-label="required">
|
|
210
|
-
*
|
|
211
|
-
</span>
|
|
212
|
-
)}
|
|
213
|
-
</Label>
|
|
214
|
-
)}
|
|
215
|
-
|
|
216
|
-
<Controller
|
|
217
|
-
name={name}
|
|
218
|
-
control={control}
|
|
219
|
-
rules={validation}
|
|
220
|
-
render={({ field }) => {
|
|
221
|
-
if (render) {
|
|
222
|
-
return render({ field });
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
return (
|
|
226
|
-
<input
|
|
227
|
-
{...field}
|
|
228
|
-
id={name}
|
|
229
|
-
type={type}
|
|
230
|
-
placeholder={placeholder}
|
|
231
|
-
data-testid={testId}
|
|
232
|
-
className={cn(
|
|
233
|
-
"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
|
|
234
|
-
fieldError && "border-destructive focus-visible:ring-destructive"
|
|
235
|
-
)}
|
|
236
|
-
{...inputProps}
|
|
237
|
-
/>
|
|
238
|
-
);
|
|
239
|
-
}}
|
|
240
|
-
/>
|
|
241
|
-
|
|
242
|
-
{errorMessage && (
|
|
243
|
-
<p className="text-destructive" role="alert">
|
|
244
|
-
{errorMessage}
|
|
245
|
-
</p>
|
|
246
|
-
)}
|
|
247
|
-
</div>
|
|
248
|
-
);
|
|
249
|
-
}
|