@jmruthers/pace-core 0.5.67 → 0.5.69
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/README.md +26 -0
- package/dist/{DataTable-MFUXNGPR.js → DataTable-MPBSXUC6.js} +5 -6
- package/dist/{PublicLoadingSpinner-DdKXTkCZ.d.ts → PublicLoadingSpinner-BOdyU3u-.d.ts} +1 -1
- package/dist/{UnifiedAuthProvider-CQNiemcB.d.ts → UnifiedAuthProvider-D02AMXgO.d.ts} +3 -3
- package/dist/{chunk-CKNY7HYS.js → chunk-2ARQW6VX.js} +3 -3
- package/dist/{chunk-T2MQY57J.js → chunk-6JILXFEA.js} +335 -5
- package/dist/chunk-6JILXFEA.js.map +1 -0
- package/dist/{chunk-D7ARGIA3.js → chunk-6RBH67W7.js} +23 -6
- package/dist/chunk-6RBH67W7.js.map +1 -0
- package/dist/{chunk-C7GUF747.js → chunk-FJTAWPAQ.js} +3 -5
- package/dist/{chunk-C7GUF747.js.map → chunk-FJTAWPAQ.js.map} +1 -1
- package/dist/{chunk-4HQ5BOVZ.js → chunk-NO5QHMDX.js} +7 -6
- package/dist/chunk-NO5QHMDX.js.map +1 -0
- package/dist/{chunk-ZPK5656W.js → chunk-O3NWNXDY.js} +4 -5
- package/dist/chunk-O3NWNXDY.js.map +1 -0
- package/dist/{chunk-BTCA3ENN.js → chunk-Q2UP3ZWQ.js} +4 -4
- package/dist/{chunk-QVEOQVD4.js → chunk-RVYGJPOD.js} +173 -20
- package/dist/chunk-RVYGJPOD.js.map +1 -0
- package/dist/{chunk-FVDOEGGG.js → chunk-UCMHBF7Y.js} +3 -5
- package/dist/{chunk-FVDOEGGG.js.map → chunk-UCMHBF7Y.js.map} +1 -1
- package/dist/{chunk-T6HVDA24.js → chunk-V3QO3LL7.js} +5 -7
- package/dist/chunk-V3QO3LL7.js.map +1 -0
- package/dist/{chunk-ZB6AEA7I.js → chunk-ZXJGZLLO.js} +17 -17
- package/dist/{chunk-ZB6AEA7I.js.map → chunk-ZXJGZLLO.js.map} +1 -1
- package/dist/components.d.ts +2 -2
- package/dist/components.js +8 -9
- package/dist/components.js.map +1 -1
- package/dist/hooks.d.ts +1 -1
- package/dist/hooks.js +9 -6
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +16 -16
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +1 -1
- package/dist/providers.js +5 -7
- package/dist/rbac/index.js +5 -6
- package/dist/{usePublicRouteParams-CdoFxnJK.d.ts → usePublicRouteParams-Ua1Vz-HG.d.ts} +35 -1
- package/dist/utils.d.ts +4 -1
- package/dist/utils.js +3 -3
- package/docs/DOCUMENTATION_CHECKLIST.md +281 -0
- package/docs/README.md +22 -10
- package/docs/api/README.md +26 -0
- package/docs/api/classes/ColumnFactory.md +1 -1
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/InvalidScopeError.md +1 -1
- package/docs/api/classes/MissingUserContextError.md +1 -1
- package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
- package/docs/api/classes/PermissionDeniedError.md +1 -1
- package/docs/api/classes/PublicErrorBoundary.md +1 -1
- package/docs/api/classes/RBACAuditManager.md +1 -1
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +1 -1
- package/docs/api/classes/RBACError.md +1 -1
- package/docs/api/classes/RBACNotInitializedError.md +1 -1
- package/docs/api/classes/SecureSupabaseClient.md +1 -1
- package/docs/api/classes/StorageUtils.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +1 -1
- package/docs/api/interfaces/ButtonProps.md +1 -1
- package/docs/api/interfaces/CardProps.md +1 -1
- 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/DataTableAction.md +1 -1
- package/docs/api/interfaces/DataTableColumn.md +1 -1
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
- package/docs/api/interfaces/EmptyStateConfig.md +1 -1
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
- package/docs/api/interfaces/EventContextType.md +1 -1
- package/docs/api/interfaces/EventLogoProps.md +1 -1
- package/docs/api/interfaces/EventProviderProps.md +1 -1
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadProps.md +1 -1
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
- package/docs/api/interfaces/InputProps.md +1 -1
- package/docs/api/interfaces/LabelProps.md +1 -1
- 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 +1 -1
- package/docs/api/interfaces/NavigationMenuProps.md +1 -1
- package/docs/api/interfaces/NavigationProviderProps.md +1 -1
- package/docs/api/interfaces/Organisation.md +1 -1
- package/docs/api/interfaces/OrganisationContextType.md +1 -1
- package/docs/api/interfaces/OrganisationMembership.md +1 -1
- package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
- package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
- package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
- 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/PublicErrorBoundaryProps.md +1 -1
- package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
- package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
- package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
- package/docs/api/interfaces/PublicPageHeaderProps.md +2 -2
- package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
- package/docs/api/interfaces/RBACConfig.md +1 -1
- package/docs/api/interfaces/RBACContextType.md +1 -1
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RBACProviderProps.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterProps.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/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/ToastActionElement.md +1 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +4 -4
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UserEventAccess.md +1 -1
- package/docs/api/interfaces/UserMenuProps.md +1 -1
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +39 -14
- package/docs/api-reference/providers.md +16 -7
- package/docs/architecture/services.md +374 -0
- package/docs/best-practices/README.md +1 -1
- package/docs/best-practices/testing.md +1 -1
- package/docs/breaking-changes.md +182 -0
- package/docs/common-patterns.md +445 -0
- package/docs/core-concepts/authentication.md +26 -11
- package/docs/core-concepts/events.md +2 -0
- package/docs/core-concepts/organisations.md +2 -0
- package/docs/core-concepts/permissions.md +2 -0
- package/docs/{INDEX.md → documentation-index.md} +26 -38
- package/docs/faq.md +286 -0
- package/docs/{FILE_REFERENCE_SYSTEM.md → file-reference-system.md} +1 -1
- package/docs/getting-started/installation-guide.md +284 -0
- package/docs/getting-started/quick-start.md +8 -1
- package/docs/implementation-guides/app-layout.md +3 -1
- package/docs/implementation-guides/data-tables.md +2 -0
- package/docs/implementation-guides/dynamic-colors.md +47 -2
- package/docs/implementation-guides/event-theming-summary.md +220 -0
- package/docs/implementation-guides/forms.md +9 -7
- package/docs/implementation-guides/navigation.md +2 -0
- package/docs/migration/service-architecture.md +351 -0
- package/docs/migration-guides/unified-auth-provider-mandatory-timeouts.md +226 -0
- package/docs/rbac/README-rbac-rls-integration.md +2 -2
- package/docs/rbac/README.md +1 -1
- package/docs/rbac/examples/rbac-rls-integration-example.md +3 -3
- package/docs/rbac/quick-start.md +2 -0
- package/docs/rbac/rbac-rls-integration.md +2 -2
- package/docs/security/README.md +5 -1
- package/docs/style-guide.md +136 -1
- package/docs/testing/README.md +1 -1
- package/docs/troubleshooting/authentication-issues.md +334 -0
- package/docs/troubleshooting/common-issues.md +2 -0
- package/docs/troubleshooting/styling-issues.md +199 -144
- package/docs/usage.md +23 -2
- package/package.json +1 -1
- package/src/__tests__/{TESTING_GUIDELINES.md → TEST_GUIDE_CURSOR.md} +20 -0
- package/src/__tests__/TEST_GUIDE_HUMAN.md +103 -0
- package/src/__tests__/fixtures/test-data.ts +90 -0
- package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +260 -0
- package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +224 -0
- package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +273 -0
- package/src/__tests__/helpers/__tests__/test-providers.test.tsx +98 -0
- package/src/__tests__/helpers/__tests__/test-utils.test.tsx +436 -0
- package/src/__tests__/helpers/__tests__/timer-utils.test.ts +371 -0
- package/src/__tests__/helpers/component-test-utils.tsx +14 -4
- package/src/__tests__/helpers/optimized-test-setup.ts +68 -0
- package/src/__tests__/helpers/test-providers.tsx +329 -0
- package/src/__tests__/helpers/test-utils.tsx +91 -45
- package/src/__tests__/helpers/timer-utils.ts +71 -0
- package/src/__tests__/hooks/usePermissions.test.ts +1 -5
- package/src/__tests__/integration/UserProfile.test.tsx +1 -5
- package/src/__tests__/rbac/PagePermissionGuard.test.tsx +42 -12
- package/src/__tests__/setup.ts +34 -28
- package/src/components/Alert/Alert.test.tsx +1 -5
- package/src/components/Avatar/Avatar.test.tsx +1 -5
- package/src/components/Button/Button.test.tsx +4 -20
- package/src/components/Card/Card.test.tsx +1 -5
- package/src/components/Checkbox/Checkbox.test.tsx +1 -5
- package/src/components/DataTable/__tests__/DataTable.comprehensive.test.tsx +1 -5
- package/src/components/DataTable/__tests__/DataTable.test.tsx +45 -49
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +1 -5
- package/src/components/DataTable/__tests__/styles.test.ts +382 -0
- package/src/components/DataTable/context/__tests__/DataTableContext.test.tsx +409 -0
- package/src/components/DataTable/core/__tests__/ActionManager.test.ts +634 -0
- package/src/components/DataTable/core/__tests__/DataManager.test.ts +519 -0
- package/src/components/DataTable/core/__tests__/StateManager.test.ts +714 -0
- package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +592 -0
- package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +354 -0
- package/src/components/DataTable/utils/__tests__/hierarchicalUtils.test.ts +539 -0
- package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +1 -5
- package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +1 -8
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +34 -38
- package/src/components/Footer/Footer.test.tsx +1 -5
- package/src/components/Form/Form.test.tsx +22 -35
- package/src/components/Header/Header.test.tsx +1 -9
- package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +1 -5
- package/src/components/Input/Input.test.tsx +2 -10
- package/src/components/LoginForm/LoginForm.test.tsx +1 -5
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +24 -24
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +1 -6
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +6 -16
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +1 -5
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.rbac.test.tsx +1 -5
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +1 -7
- package/src/components/PasswordReset/PasswordChangeForm.test.tsx +1 -9
- package/src/components/PasswordReset/PasswordResetForm.test.tsx +1 -9
- package/src/components/PublicLayout/PublicErrorBoundary.tsx +4 -5
- package/src/components/PublicLayout/PublicPageHeader.tsx +13 -9
- package/src/components/PublicLayout/__tests__/EventLogo.test.tsx +666 -0
- package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +457 -0
- package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +393 -0
- package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +351 -0
- package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +374 -0
- package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +388 -0
- package/src/components/Select/Select.bug-test.tsx +69 -0
- package/src/components/Select/Select.refactored.tsx +497 -0
- package/src/components/Select/Select.test.tsx +42 -49
- package/src/components/Select/Select.tsx +5 -2
- package/src/components/Select/hooks.ts +254 -0
- package/src/components/Switch/Switch.test.tsx +1 -5
- package/src/components/Table/__tests__/Table.test.tsx +775 -0
- package/src/components/Toast/Toast.test.tsx +15 -8
- package/src/components/Tooltip/Tooltip.test.tsx +1 -5
- package/src/components/UserMenu/UserMenu.test.tsx +3 -15
- package/src/components/__tests__/FileDisplay.test.tsx +575 -0
- package/src/components/__tests__/FileUpload.test.tsx +446 -0
- package/src/components/__tests__/SuperAdminGuard.test.tsx +422 -354
- package/src/hooks/__tests__/ServiceHooks.test.tsx +613 -0
- package/src/hooks/__tests__/hooks.integration.test.tsx +1 -10
- package/src/hooks/__tests__/useApiFetch.unit.test.ts +10 -14
- package/src/hooks/__tests__/useAppConfig.unit.test.ts +307 -0
- package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +1 -6
- package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +1 -5
- package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +6 -9
- package/src/hooks/__tests__/usePublicEvent.simple.test.ts +321 -0
- package/src/hooks/__tests__/usePublicEvent.unit.test.ts +583 -0
- package/src/hooks/__tests__/usePublicEventLogo.unit.test.ts +640 -0
- package/src/hooks/__tests__/usePublicRouteParams.unit.test.ts +435 -0
- package/src/hooks/__tests__/useRBAC.unit.test.ts +10 -10
- package/src/hooks/__tests__/useStorage.unit.test.ts +751 -0
- package/src/hooks/index.ts +3 -0
- package/src/hooks/public/usePublicEvent.ts +181 -13
- package/src/hooks/public/usePublicRouteParams.ts +13 -3
- package/src/hooks/services/useAuth.ts +50 -0
- package/src/hooks/services/useAuthService.ts +30 -0
- package/src/hooks/services/useCurrentEvent.ts +36 -0
- package/src/hooks/services/useCurrentOrganisation.ts +52 -0
- package/src/hooks/services/useEventService.ts +30 -0
- package/src/hooks/services/useInactivityService.ts +30 -0
- package/src/hooks/services/useOrganisationService.ts +30 -0
- package/src/hooks/services/usePermissions.ts +70 -0
- package/src/hooks/services/useRBACService.ts +30 -0
- package/src/hooks/useCounter.test.ts +1 -5
- package/src/hooks/useEventTheme.ts +86 -0
- package/src/hooks/useOrganisationPermissions.test.ts +2 -5
- package/src/hooks/useOrganisationSecurity.test.ts +1 -5
- package/src/hooks/usePermissionCache.test.ts +1 -5
- package/src/hooks/usePermissionCheck.ts +150 -0
- package/src/hooks/useSecureDataAccess.test.ts +1 -5
- package/src/index.ts +1 -0
- package/src/providers/OrganisationProvider.test.tsx +1 -5
- package/src/providers/OrganisationProvider.tsx +56 -4
- package/src/providers/UnifiedAuthProvider.test.simple.tsx +42 -6
- package/src/providers/UnifiedAuthProvider.test.tsx +1 -5
- package/src/providers/UnifiedAuthProvider.tsx +4 -4
- package/src/providers/__tests__/AuthProvider.test.tsx +105 -439
- package/src/providers/__tests__/AuthProvider.test.tsx.backup +771 -0
- package/src/providers/__tests__/EventProvider.test.tsx +211 -110
- package/src/providers/__tests__/EventProvider.test.tsx.backup +824 -0
- package/src/providers/__tests__/InactivityProvider.test.tsx +1 -5
- package/src/providers/__tests__/OrganisationProvider.test.tsx +97 -261
- package/src/providers/__tests__/OrganisationProvider.test.tsx.backup +820 -0
- package/src/providers/__tests__/ServiceProviders.test.tsx +477 -0
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +72 -504
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx.backup +911 -0
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx.backup2 +166 -0
- package/src/providers/services/AuthServiceProvider.tsx +65 -0
- package/src/providers/services/EventServiceProvider.tsx +83 -0
- package/src/providers/services/InactivityServiceProvider.tsx +83 -0
- package/src/providers/services/OrganisationServiceProvider.tsx +77 -0
- package/src/providers/services/RBACServiceProvider.tsx +79 -0
- package/src/providers/services/UnifiedAuthProvider.tsx +368 -0
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +210 -0
- package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +269 -0
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +892 -0
- package/src/rbac/__tests__/engine.comprehensive.test.ts +954 -0
- package/src/rbac/__tests__/integration.authflow.test.tsx +1 -5
- package/src/rbac/__tests__/integration.navigation.test.tsx +1 -4
- package/src/rbac/__tests__/rbac-core.test.tsx +2 -7
- package/src/rbac/__tests__/rbac-functions.test.ts +1 -9
- package/src/rbac/__tests__/rbac-integration.test.ts +1 -9
- package/src/rbac/api.test.ts +1 -9
- package/src/rbac/cache.test.ts +10 -8
- package/src/rbac/cli/__tests__/policy-manager.test.ts +339 -0
- package/src/rbac/components/EnhancedNavigationMenu.test.tsx +1 -5
- package/src/rbac/components/NavigationProvider.test.tsx +1 -5
- package/src/rbac/components/PagePermissionProvider.test.tsx +1 -5
- package/src/rbac/components/SecureDataProvider.test.tsx +1 -5
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +25 -29
- package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +27 -30
- package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +23 -27
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +18 -22
- package/src/rbac/config.test.ts +1 -5
- package/src/rbac/hooks/useCan.test.ts +262 -9
- package/src/rbac/hooks/usePermissions.test.ts +246 -6
- package/src/rbac/hooks/useRBAC.simple.test.ts +1 -5
- package/src/rbac/hooks/useRBAC.test.ts +472 -198
- package/src/rbac/providers/__tests__/RBACProvider.test.tsx +1 -9
- package/src/services/AuthService.ts +416 -0
- package/src/services/EventService.ts +366 -0
- package/src/services/InactivityService.ts +388 -0
- package/src/services/OrganisationService.ts +592 -0
- package/src/services/RBACService.ts +522 -0
- package/src/services/__tests__/AuthService.test.ts +356 -0
- package/src/services/__tests__/BaseService.test.ts +314 -0
- package/src/services/__tests__/EventService.test.ts +489 -0
- package/src/services/__tests__/InactivityService.test.ts +403 -0
- package/src/services/__tests__/OrganisationService.test.ts +660 -0
- package/src/services/__tests__/RBACService.test.ts +492 -0
- package/src/services/base/BaseService.ts +87 -0
- package/src/services/interfaces/IAuthService.ts +39 -0
- package/src/services/interfaces/IEventService.ts +30 -0
- package/src/services/interfaces/IInactivityService.ts +31 -0
- package/src/services/interfaces/IOrganisationService.ts +41 -0
- package/src/services/interfaces/IRBACService.ts +62 -0
- package/src/theming/__tests__/runtime.test.ts +540 -0
- package/src/types/__tests__/file-reference.test.ts +447 -0
- package/src/types/__tests__/organisation.test.ts +1133 -0
- package/src/types/__tests__/theme.test.ts +830 -0
- package/src/types/__tests__/type-validation.test.ts +527 -0
- package/src/utils/__tests__/bundleAnalysis.unit.test.ts +1 -5
- package/src/utils/__tests__/debugLogger.test.ts +417 -0
- package/src/utils/__tests__/deviceFingerprint.unit.test.ts +1 -6
- package/src/utils/__tests__/dynamicUtils.unit.test.ts +1 -5
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +35 -35
- package/src/utils/__tests__/organisationContext.unit.test.ts +1 -5
- package/src/utils/__tests__/performanceBudgets.unit.test.ts +5 -11
- package/src/utils/__tests__/secureErrors.unit.test.ts +1 -6
- package/src/utils/__tests__/secureStorage.unit.test.ts +1 -5
- package/src/utils/__tests__/securityMonitor.unit.test.ts +1 -5
- package/src/utils/__tests__/sessionTracking.unit.test.ts +1 -5
- package/src/utils/appIdResolver.test.ts +6 -10
- package/src/utils/appNameResolver.simple.test.ts +142 -0
- package/src/utils/appNameResolver.test.ts +31 -458
- package/src/utils/appNameResolver.test.ts.backup +494 -0
- package/src/utils/debugLogger.ts +26 -5
- package/src/utils/formatDate.test.ts +1 -5
- package/src/utils/organisationContext.test.ts +1 -5
- package/src/utils/performanceBudgets.ts +3 -4
- package/src/utils/secureDataAccess.test.ts +1 -5
- package/src/utils/storage/__tests__/helpers.unit.test.ts +1 -5
- package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +1 -5
- package/dist/chunk-4HQ5BOVZ.js.map +0 -1
- package/dist/chunk-D7ARGIA3.js.map +0 -1
- package/dist/chunk-QVEOQVD4.js.map +0 -1
- package/dist/chunk-T2MQY57J.js.map +0 -1
- package/dist/chunk-T6HVDA24.js.map +0 -1
- package/dist/chunk-VTJ5HCZB.js +0 -315
- package/dist/chunk-VTJ5HCZB.js.map +0 -1
- package/dist/chunk-ZPK5656W.js.map +0 -1
- package/docs/getting-started/installation.md +0 -269
- package/src/__tests__/REBUILD_PLAN.md +0 -223
- /package/dist/{DataTable-MFUXNGPR.js.map → DataTable-MPBSXUC6.js.map} +0 -0
- /package/dist/{chunk-CKNY7HYS.js.map → chunk-2ARQW6VX.js.map} +0 -0
- /package/dist/{chunk-BTCA3ENN.js.map → chunk-Q2UP3ZWQ.js.map} +0 -0
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file DataTable Styles Tests
|
|
3
|
+
* @description Comprehensive test suite for DataTable styling utilities
|
|
4
|
+
* @package @jmruthers/pace-core
|
|
5
|
+
* @module Components/DataTable/styles
|
|
6
|
+
* @since 0.4.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
10
|
+
import {
|
|
11
|
+
tableStyles,
|
|
12
|
+
getTableCellClasses,
|
|
13
|
+
getTableHeadClasses,
|
|
14
|
+
getTableRowClasses,
|
|
15
|
+
getTableContainerClasses,
|
|
16
|
+
getTableClasses,
|
|
17
|
+
getMainContainerClasses,
|
|
18
|
+
} from '../styles';
|
|
19
|
+
|
|
20
|
+
// Mock the cn utility
|
|
21
|
+
vi.mock('../../../utils/cn', () => ({
|
|
22
|
+
cn: (...classes: (string | undefined | null | false)[]) =>
|
|
23
|
+
classes.filter(Boolean).join(' '),
|
|
24
|
+
}));
|
|
25
|
+
|
|
26
|
+
describe('DataTable Styles', () => {
|
|
27
|
+
describe('tableStyles constants', () => {
|
|
28
|
+
it('has all required table style constants', () => {
|
|
29
|
+
expect(tableStyles).toHaveProperty('table');
|
|
30
|
+
expect(tableStyles).toHaveProperty('tableFixed');
|
|
31
|
+
expect(tableStyles).toHaveProperty('header');
|
|
32
|
+
expect(tableStyles).toHaveProperty('body');
|
|
33
|
+
expect(tableStyles).toHaveProperty('footer');
|
|
34
|
+
expect(tableStyles).toHaveProperty('row');
|
|
35
|
+
expect(tableStyles).toHaveProperty('rowHover');
|
|
36
|
+
expect(tableStyles).toHaveProperty('rowSelected');
|
|
37
|
+
expect(tableStyles).toHaveProperty('head');
|
|
38
|
+
expect(tableStyles).toHaveProperty('headSortable');
|
|
39
|
+
expect(tableStyles).toHaveProperty('cell');
|
|
40
|
+
expect(tableStyles).toHaveProperty('cellCompact');
|
|
41
|
+
expect(tableStyles).toHaveProperty('cellVirtualized');
|
|
42
|
+
expect(tableStyles).toHaveProperty('cellSortable');
|
|
43
|
+
expect(tableStyles).toHaveProperty('mainContainer');
|
|
44
|
+
expect(tableStyles).toHaveProperty('container');
|
|
45
|
+
expect(tableStyles).toHaveProperty('containerVirtualized');
|
|
46
|
+
expect(tableStyles).toHaveProperty('stickyHeader');
|
|
47
|
+
expect(tableStyles).toHaveProperty('emptyState');
|
|
48
|
+
expect(tableStyles).toHaveProperty('emptyStateContent');
|
|
49
|
+
expect(tableStyles).toHaveProperty('emptyStateIcon');
|
|
50
|
+
expect(tableStyles).toHaveProperty('emptyStateText');
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('has correct table base styles', () => {
|
|
54
|
+
expect(tableStyles.table).toBe('w-full caption-bottom text-sm');
|
|
55
|
+
expect(tableStyles.tableFixed).toBe('w-full table-fixed');
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('has correct table section styles', () => {
|
|
59
|
+
expect(tableStyles.header).toBe('[&_tr]:border-b');
|
|
60
|
+
expect(tableStyles.body).toBe('[&_tr:last-child]:border-0');
|
|
61
|
+
expect(tableStyles.footer).toBe('border-t bg-muted/50 font-medium [&>tr]:last:border-b-0');
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('has correct row styles', () => {
|
|
65
|
+
expect(tableStyles.row).toBe('border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted');
|
|
66
|
+
expect(tableStyles.rowHover).toBe('hover:bg-sec-50 transition-colors');
|
|
67
|
+
expect(tableStyles.rowSelected).toBe('bg-main-50');
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('has correct cell styles', () => {
|
|
71
|
+
expect(tableStyles.head).toBe('h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0');
|
|
72
|
+
expect(tableStyles.headSortable).toBe('cursor-pointer select-none hover:bg-muted/50');
|
|
73
|
+
expect(tableStyles.cell).toBe('p-4 align-middle [&:has([role=checkbox])]:pr-0');
|
|
74
|
+
expect(tableStyles.cellCompact).toBe('px-3 py-2 align-middle [&:has([role=checkbox])]:pr-0');
|
|
75
|
+
expect(tableStyles.cellVirtualized).toBe('px-4 py-2 text-sm border-b border-sec-200 whitespace-normal');
|
|
76
|
+
expect(tableStyles.cellSortable).toBe('cursor-pointer select-none');
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('has correct container styles', () => {
|
|
80
|
+
expect(tableStyles.mainContainer).toBe('w-full max-w-full');
|
|
81
|
+
expect(tableStyles.container).toBe('overflow-x-auto w-full');
|
|
82
|
+
expect(tableStyles.containerVirtualized).toBe('overflow-hidden');
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('has correct empty state styles', () => {
|
|
86
|
+
expect(tableStyles.emptyState).toBe('flex items-center justify-center py-12');
|
|
87
|
+
expect(tableStyles.emptyStateContent).toBe('text-center');
|
|
88
|
+
expect(tableStyles.emptyStateIcon).toBe('text-sec-400 text-lg mb-2');
|
|
89
|
+
expect(tableStyles.emptyStateText).toBe('text-sec-500');
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
describe('getTableCellClasses', () => {
|
|
94
|
+
it('returns default cell classes', () => {
|
|
95
|
+
const result = getTableCellClasses();
|
|
96
|
+
expect(result).toBe('p-4 align-middle [&:has([role=checkbox])]:pr-0');
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it('returns compact cell classes when isCompact is true', () => {
|
|
100
|
+
const result = getTableCellClasses({ isCompact: true });
|
|
101
|
+
expect(result).toBe('px-3 py-2 align-middle [&:has([role=checkbox])]:pr-0');
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('returns virtualized cell classes when isVirtualized is true', () => {
|
|
105
|
+
const result = getTableCellClasses({ isVirtualized: true });
|
|
106
|
+
expect(result).toBe('px-4 py-2 text-sm border-b border-sec-200 whitespace-normal');
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it('returns sortable cell classes when isSortable is true', () => {
|
|
110
|
+
const result = getTableCellClasses({ isSortable: true });
|
|
111
|
+
expect(result).toBe('p-4 align-middle [&:has([role=checkbox])]:pr-0 cursor-pointer select-none');
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it('combines virtualized and sortable classes', () => {
|
|
115
|
+
const result = getTableCellClasses({ isVirtualized: true, isSortable: true });
|
|
116
|
+
expect(result).toBe('px-4 py-2 text-sm border-b border-sec-200 whitespace-normal cursor-pointer select-none');
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it('adds custom className', () => {
|
|
120
|
+
const result = getTableCellClasses({ className: 'custom-class' });
|
|
121
|
+
expect(result).toBe('p-4 align-middle [&:has([role=checkbox])]:pr-0 custom-class');
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it('combines all options correctly', () => {
|
|
125
|
+
const result = getTableCellClasses({
|
|
126
|
+
isVirtualized: true,
|
|
127
|
+
isSortable: true,
|
|
128
|
+
className: 'custom-class',
|
|
129
|
+
});
|
|
130
|
+
expect(result).toBe('px-4 py-2 text-sm border-b border-sec-200 whitespace-normal cursor-pointer select-none custom-class');
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it('prioritizes virtualized over compact', () => {
|
|
134
|
+
const result = getTableCellClasses({ isVirtualized: true, isCompact: true });
|
|
135
|
+
expect(result).toBe('px-4 py-2 text-sm border-b border-sec-200 whitespace-normal');
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
describe('getTableHeadClasses', () => {
|
|
140
|
+
it('returns default head classes', () => {
|
|
141
|
+
const result = getTableHeadClasses();
|
|
142
|
+
expect(result).toBe('h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0');
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it('returns sortable head classes when isSortable is true', () => {
|
|
146
|
+
const result = getTableHeadClasses({ isSortable: true });
|
|
147
|
+
expect(result).toBe('h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 cursor-pointer select-none hover:bg-muted/50');
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it('adds custom className', () => {
|
|
151
|
+
const result = getTableHeadClasses({ className: 'custom-head-class' });
|
|
152
|
+
expect(result).toBe('h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 custom-head-class');
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
it('combines sortable and custom className', () => {
|
|
156
|
+
const result = getTableHeadClasses({ isSortable: true, className: 'custom-head-class' });
|
|
157
|
+
expect(result).toBe('h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 cursor-pointer select-none hover:bg-muted/50 custom-head-class');
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
describe('getTableRowClasses', () => {
|
|
162
|
+
it('returns default row classes', () => {
|
|
163
|
+
const result = getTableRowClasses();
|
|
164
|
+
expect(result).toBe('border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted');
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
it('returns selected row classes when isSelected is true', () => {
|
|
168
|
+
const result = getTableRowClasses({ isSelected: true });
|
|
169
|
+
expect(result).toBe('border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted bg-main-50');
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it('returns virtualized row classes when isVirtualized is true', () => {
|
|
173
|
+
const result = getTableRowClasses({ isVirtualized: true });
|
|
174
|
+
expect(result).toBe('hover:bg-sec-50 transition-colors');
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it('combines virtualized and selected classes', () => {
|
|
178
|
+
const result = getTableRowClasses({ isVirtualized: true, isSelected: true });
|
|
179
|
+
expect(result).toBe('hover:bg-sec-50 transition-colors bg-main-50');
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
it('adds custom className', () => {
|
|
183
|
+
const result = getTableRowClasses({ className: 'custom-row-class' });
|
|
184
|
+
expect(result).toBe('border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted custom-row-class');
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
it('combines all options correctly', () => {
|
|
188
|
+
const result = getTableRowClasses({
|
|
189
|
+
isVirtualized: true,
|
|
190
|
+
isSelected: true,
|
|
191
|
+
className: 'custom-row-class',
|
|
192
|
+
});
|
|
193
|
+
expect(result).toBe('hover:bg-sec-50 transition-colors bg-main-50 custom-row-class');
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
describe('getTableContainerClasses', () => {
|
|
198
|
+
it('returns default container classes', () => {
|
|
199
|
+
const result = getTableContainerClasses();
|
|
200
|
+
expect(result).toBe('overflow-x-auto w-full');
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
it('returns virtualized container classes when isVirtualized is true', () => {
|
|
204
|
+
const result = getTableContainerClasses({ isVirtualized: true });
|
|
205
|
+
expect(result).toBe('overflow-hidden');
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
it('adds custom className', () => {
|
|
209
|
+
const result = getTableContainerClasses({ className: 'custom-container-class' });
|
|
210
|
+
expect(result).toBe('overflow-x-auto w-full custom-container-class');
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
it('combines virtualized and custom className', () => {
|
|
214
|
+
const result = getTableContainerClasses({ isVirtualized: true, className: 'custom-container-class' });
|
|
215
|
+
expect(result).toBe('overflow-hidden custom-container-class');
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
describe('getTableClasses', () => {
|
|
220
|
+
it('returns default table classes', () => {
|
|
221
|
+
const result = getTableClasses();
|
|
222
|
+
expect(result).toBe('w-full caption-bottom text-sm');
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
it('returns fixed table classes when isFixed is true', () => {
|
|
226
|
+
const result = getTableClasses({ isFixed: true });
|
|
227
|
+
expect(result).toBe('w-full table-fixed');
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
it('returns compact variant classes', () => {
|
|
231
|
+
const result = getTableClasses({ variant: 'compact' });
|
|
232
|
+
expect(result).toBe('w-full caption-bottom text-sm text-sm');
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
it('returns spacious variant classes', () => {
|
|
236
|
+
const result = getTableClasses({ variant: 'spacious' });
|
|
237
|
+
expect(result).toBe('w-full caption-bottom text-sm text-base');
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
it('adds custom className', () => {
|
|
241
|
+
const result = getTableClasses({ className: 'custom-table-class' });
|
|
242
|
+
expect(result).toBe('w-full caption-bottom text-sm custom-table-class');
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
it('combines all options correctly', () => {
|
|
246
|
+
const result = getTableClasses({
|
|
247
|
+
isFixed: true,
|
|
248
|
+
variant: 'compact',
|
|
249
|
+
className: 'custom-table-class',
|
|
250
|
+
});
|
|
251
|
+
expect(result).toBe('w-full table-fixed text-sm custom-table-class');
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
it('prioritizes isFixed over variant', () => {
|
|
255
|
+
const result = getTableClasses({ isFixed: true, variant: 'spacious' });
|
|
256
|
+
expect(result).toBe('w-full table-fixed text-base');
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
describe('getMainContainerClasses', () => {
|
|
261
|
+
it('returns default main container classes', () => {
|
|
262
|
+
const result = getMainContainerClasses();
|
|
263
|
+
expect(result).toBe('w-full max-w-full');
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
it('adds custom className', () => {
|
|
267
|
+
const result = getMainContainerClasses({ className: 'custom-main-class' });
|
|
268
|
+
expect(result).toBe('w-full max-w-full custom-main-class');
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
describe('Style Consistency', () => {
|
|
273
|
+
it('maintains consistent spacing patterns', () => {
|
|
274
|
+
// Check that padding/margin values are consistent
|
|
275
|
+
expect(tableStyles.cell).toContain('p-4');
|
|
276
|
+
expect(tableStyles.cellCompact).toContain('px-3 py-2');
|
|
277
|
+
expect(tableStyles.cellVirtualized).toContain('px-4 py-2');
|
|
278
|
+
expect(tableStyles.head).toContain('px-4');
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
it('maintains consistent color patterns', () => {
|
|
282
|
+
// Check that color classes follow the design system
|
|
283
|
+
expect(tableStyles.rowHover).toContain('bg-sec-50');
|
|
284
|
+
expect(tableStyles.rowSelected).toContain('bg-main-50');
|
|
285
|
+
expect(tableStyles.emptyStateIcon).toContain('text-sec-400');
|
|
286
|
+
expect(tableStyles.emptyStateText).toContain('text-sec-500');
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
it('maintains consistent border patterns', () => {
|
|
290
|
+
// Check that border classes are consistent
|
|
291
|
+
expect(tableStyles.cellVirtualized).toContain('border-b border-sec-200');
|
|
292
|
+
expect(tableStyles.footer).toContain('border-t');
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
it('maintains consistent transition patterns', () => {
|
|
296
|
+
// Check that transition classes are consistent
|
|
297
|
+
expect(tableStyles.row).toContain('transition-colors');
|
|
298
|
+
expect(tableStyles.rowHover).toContain('transition-colors');
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
describe('Accessibility Considerations', () => {
|
|
303
|
+
it('includes proper cursor styles for interactive elements', () => {
|
|
304
|
+
expect(tableStyles.headSortable).toContain('cursor-pointer');
|
|
305
|
+
expect(tableStyles.cellSortable).toContain('cursor-pointer');
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
it('includes proper select styles for sortable elements', () => {
|
|
309
|
+
expect(tableStyles.headSortable).toContain('select-none');
|
|
310
|
+
expect(tableStyles.cellSortable).toContain('select-none');
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
it('includes proper hover states for interactive elements', () => {
|
|
314
|
+
expect(tableStyles.headSortable).toContain('hover:bg-muted/50');
|
|
315
|
+
expect(tableStyles.row).toContain('hover:bg-muted/50');
|
|
316
|
+
expect(tableStyles.rowHover).toContain('hover:bg-sec-50');
|
|
317
|
+
});
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
describe('Responsive Design', () => {
|
|
321
|
+
it('includes responsive overflow handling', () => {
|
|
322
|
+
expect(tableStyles.container).toContain('overflow-x-auto');
|
|
323
|
+
expect(tableStyles.containerVirtualized).toContain('overflow-hidden');
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
it('includes proper width constraints', () => {
|
|
327
|
+
expect(tableStyles.mainContainer).toContain('w-full max-w-full');
|
|
328
|
+
expect(tableStyles.table).toContain('w-full');
|
|
329
|
+
expect(tableStyles.tableFixed).toContain('w-full');
|
|
330
|
+
});
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
describe('Virtualization Support', () => {
|
|
334
|
+
it('provides distinct styles for virtualized tables', () => {
|
|
335
|
+
expect(tableStyles.cellVirtualized).not.toBe(tableStyles.cell);
|
|
336
|
+
expect(tableStyles.containerVirtualized).not.toBe(tableStyles.container);
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
it('maintains performance-optimized styles for virtualized elements', () => {
|
|
340
|
+
// Virtualized cells should have simpler styles for better performance
|
|
341
|
+
expect(tableStyles.cellVirtualized).toContain('whitespace-normal');
|
|
342
|
+
expect(tableStyles.cellVirtualized).not.toContain('hover:bg-muted/50');
|
|
343
|
+
});
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
describe('Edge Cases', () => {
|
|
347
|
+
it('handles undefined options gracefully', () => {
|
|
348
|
+
const result = getTableCellClasses({ isVirtualized: undefined, isSortable: undefined });
|
|
349
|
+
expect(result).toBe('p-4 align-middle [&:has([role=checkbox])]:pr-0');
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
it('handles null className gracefully', () => {
|
|
353
|
+
const result = getTableCellClasses({ className: null });
|
|
354
|
+
expect(result).toBe('p-4 align-middle [&:has([role=checkbox])]:pr-0');
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
it('handles empty string className gracefully', () => {
|
|
358
|
+
const result = getTableCellClasses({ className: '' });
|
|
359
|
+
expect(result).toBe('p-4 align-middle [&:has([role=checkbox])]:pr-0');
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
it('handles multiple className values', () => {
|
|
363
|
+
const result = getTableCellClasses({ className: 'class1 class2 class3' });
|
|
364
|
+
expect(result).toBe('p-4 align-middle [&:has([role=checkbox])]:pr-0 class1 class2 class3');
|
|
365
|
+
});
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
describe('Type Safety', () => {
|
|
369
|
+
it('accepts valid variant options', () => {
|
|
370
|
+
expect(() => getTableClasses({ variant: 'default' })).not.toThrow();
|
|
371
|
+
expect(() => getTableClasses({ variant: 'compact' })).not.toThrow();
|
|
372
|
+
expect(() => getTableClasses({ variant: 'spacious' })).not.toThrow();
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
it('handles boolean options correctly', () => {
|
|
376
|
+
expect(() => getTableCellClasses({ isVirtualized: true })).not.toThrow();
|
|
377
|
+
expect(() => getTableCellClasses({ isVirtualized: false })).not.toThrow();
|
|
378
|
+
expect(() => getTableRowClasses({ isSelected: true })).not.toThrow();
|
|
379
|
+
expect(() => getTableRowClasses({ isSelected: false })).not.toThrow();
|
|
380
|
+
});
|
|
381
|
+
});
|
|
382
|
+
});
|