@jmruthers/pace-core 0.2.7 → 0.5.1
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/dist/{DataTable-EEUDXPE5.js → DataTable-GX3XERFJ.js} +8 -4
- package/dist/{DataTable-C1AEm9Cx.d.ts → DataTable-ltTFXHS3.d.ts} +3 -1
- package/dist/{chunk-VYG4AXYW.js → chunk-5EL3KHOQ.js} +2 -2
- package/dist/{chunk-ETEJVKYK.js → chunk-6CR3MRZN.js} +1426 -62
- package/dist/chunk-6CR3MRZN.js.map +1 -0
- package/dist/chunk-AUE24LVR.js +268 -0
- package/dist/chunk-AUE24LVR.js.map +1 -0
- package/dist/chunk-COBPIXXQ.js +379 -0
- package/dist/chunk-COBPIXXQ.js.map +1 -0
- package/dist/{chunk-EWKPTNPO.js → chunk-GSNM5D6H.js} +388 -86
- package/dist/chunk-GSNM5D6H.js.map +1 -0
- package/dist/{chunk-2V3Y6YBC.js → chunk-OEGRKULD.js} +1 -42
- package/dist/chunk-OEGRKULD.js.map +1 -0
- package/dist/chunk-OYRY44Q2.js +62 -0
- package/dist/chunk-OYRY44Q2.js.map +1 -0
- package/dist/{chunk-RRUYHORU.js → chunk-T3XIA4AJ.js} +297 -433
- package/dist/chunk-T3XIA4AJ.js.map +1 -0
- package/dist/{chunk-HEMJ4SUJ.js → chunk-TGDCLPP2.js} +11 -7
- package/dist/{chunk-HEMJ4SUJ.js.map → chunk-TGDCLPP2.js.map} +1 -1
- package/dist/{chunk-HNDFPXUU.js → chunk-U6JDHVC2.js} +6 -4
- package/dist/{chunk-HNDFPXUU.js.map → chunk-U6JDHVC2.js.map} +1 -1
- package/dist/{chunk-TIVL4UQ7.js → chunk-XJK2J4N6.js} +6 -4
- package/dist/{chunk-TIVL4UQ7.js.map → chunk-XJK2J4N6.js.map} +1 -1
- package/dist/components.d.ts +2 -2
- package/dist/components.js +21 -20
- package/dist/components.js.map +1 -1
- package/dist/hooks.d.ts +1 -1
- package/dist/hooks.js +7 -7
- package/dist/index.d.ts +2 -2
- package/dist/index.js +26 -25
- package/dist/index.js.map +1 -1
- package/dist/providers.js +8 -7
- package/dist/rbac/index.d.ts +806 -806
- package/dist/rbac/index.js +937 -1179
- package/dist/rbac/index.js.map +1 -1
- package/dist/{types-DiRQsGJs.d.ts → types-BRDU7N6w.d.ts} +12 -1
- package/dist/utils.d.ts +2 -2
- package/dist/utils.js +6 -6
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/PublicErrorBoundary.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +4 -4
- 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/DataTableAction.md +21 -8
- package/docs/api/interfaces/DataTableColumn.md +1 -1
- package/docs/api/interfaces/DataTableProps.md +46 -33
- package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
- package/docs/api/interfaces/EmptyStateConfig.md +5 -5
- 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/NavigationItem.md +1 -1
- package/docs/api/interfaces/NavigationMenuProps.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 +2 -2
- 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/PaletteData.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 +1 -1
- package/docs/api/interfaces/PublicPageLayoutProps.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/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 +1 -1
- 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 +3 -3
- package/package.json +5 -2
- package/src/__tests__/REBUILD_PLAN.md +223 -0
- package/src/__tests__/TESTING_GUIDELINES.md +341 -0
- package/src/__tests__/fixtures/mocks.ts +93 -0
- package/src/__tests__/helpers/component-test-utils.tsx +145 -0
- package/src/__tests__/helpers/test-utils.tsx +117 -0
- package/src/__tests__/integration/UserProfile.test.tsx +128 -0
- package/src/__tests__/setup.ts +37 -225
- package/src/__tests__/templates/component.test.template.tsx +97 -75
- package/src/__tests__/templates/hook.test.template.ts +173 -0
- package/src/__tests__/types/test.types.ts +106 -0
- package/src/components/Alert/Alert.test.tsx +496 -0
- package/src/components/Avatar/Avatar.test.tsx +484 -0
- package/src/components/Button/Button.test.tsx +662 -0
- package/src/components/Card/Card.test.tsx +593 -0
- package/src/components/Checkbox/Checkbox.test.tsx +461 -0
- package/src/components/DataTable/DataTable.tsx +9 -1
- package/src/components/DataTable/components/AccessDeniedPage.tsx +168 -0
- package/src/components/DataTable/components/ActionButtons.tsx +18 -1
- package/src/components/DataTable/components/DataTableCore.tsx +97 -11
- package/src/components/DataTable/components/DataTableToolbar.tsx +22 -10
- package/src/components/DataTable/components/UnifiedTableBody.tsx +33 -4
- package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +1 -0
- package/src/components/DataTable/examples/HierarchicalExample.tsx +3 -0
- package/src/components/DataTable/examples/InitialPageSizeExample.tsx +3 -0
- package/src/components/DataTable/examples/PerformanceExample.tsx +3 -0
- package/src/components/DataTable/types.ts +39 -1
- package/src/components/Dialog/Dialog.test.tsx +1139 -0
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +752 -0
- package/src/components/FileUpload/FileUpload.test.tsx +665 -0
- package/src/hooks/useCounter.test.ts +135 -0
- package/src/rbac/index.ts +3 -3
- package/dist/chunk-2V3Y6YBC.js.map +0 -1
- package/dist/chunk-BEZRLNK3.js +0 -1744
- package/dist/chunk-BEZRLNK3.js.map +0 -1
- package/dist/chunk-ETEJVKYK.js.map +0 -1
- package/dist/chunk-EWKPTNPO.js.map +0 -1
- package/dist/chunk-OHXGNT3K.js +0 -21
- package/dist/chunk-OHXGNT3K.js.map +0 -1
- package/dist/chunk-RRUYHORU.js.map +0 -1
- package/src/__tests__/README.md +0 -404
- package/src/__tests__/debug-provider.unit.test.tsx +0 -67
- package/src/__tests__/e2e/workflows.test.tsx +0 -373
- package/src/__tests__/hybridPermissions.unit.test.tsx +0 -474
- package/src/__tests__/index.integration.test.ts +0 -491
- package/src/__tests__/mocks/MockAuthProvider-standalone.tsx +0 -47
- package/src/__tests__/mocks/MockAuthProvider.tsx +0 -63
- package/src/__tests__/mocks/enhancedSupabaseMock.ts +0 -252
- package/src/__tests__/mocks/index.test.ts +0 -23
- package/src/__tests__/mocks/index.ts +0 -16
- package/src/__tests__/mocks/mockAuth.ts +0 -155
- package/src/__tests__/mocks/mockSupabase.ts +0 -83
- package/src/__tests__/mocks/mockSupabaseClient.ts +0 -63
- package/src/__tests__/mocks/providers.tsx +0 -22
- package/src/__tests__/patterns/__tests__/testPatterns.test.ts +0 -394
- package/src/__tests__/patterns/testPatterns.ts +0 -124
- package/src/__tests__/performance/componentPerformance.performance.test.ts +0 -27
- package/src/__tests__/performance/index.ts +0 -24
- package/src/__tests__/performance/performanceValidation.performance.test.ts +0 -15
- package/src/__tests__/security/security.unit.test.tsx +0 -7
- package/src/__tests__/security/securityValidation.security.test.tsx +0 -153
- package/src/__tests__/setupTests.d.ts +0 -1
- package/src/__tests__/shared/componentTestUtils.tsx +0 -475
- package/src/__tests__/shared/errorHandlingTestUtils.ts +0 -107
- package/src/__tests__/shared/index.ts +0 -81
- package/src/__tests__/shared/integrationTestUtils.tsx +0 -375
- package/src/__tests__/shared/performanceTestUtils.tsx +0 -476
- package/src/__tests__/shared/testUtils.optimized.tsx +0 -685
- package/src/__tests__/simple.test.tsx +0 -20
- package/src/__tests__/test-utils/dataFactories.ts +0 -60
- package/src/__tests__/test-utils/index.ts +0 -6
- package/src/__tests__/typeSafety.unit.test.ts +0 -65
- package/src/__tests__/unifiedAuth.unit.test.tsx +0 -151
- package/src/__tests__/utils/accessibilityHelpers.ts +0 -254
- package/src/__tests__/utils/assertions.ts +0 -50
- package/src/__tests__/utils/deterministicHelpers.ts +0 -31
- package/src/__tests__/utils/edgeCaseConfig.test.ts +0 -75
- package/src/__tests__/utils/edgeCaseConfig.ts +0 -98
- package/src/__tests__/utils/mockHelpers.ts +0 -149
- package/src/__tests__/utils/mockLoader.ts +0 -101
- package/src/__tests__/utils/performanceHelpers.ts +0 -55
- package/src/__tests__/utils/performanceTestHelpers.ts +0 -68
- package/src/__tests__/utils/testDataFactories.ts +0 -28
- package/src/__tests__/utils/testIsolation.ts +0 -67
- package/src/__tests__/utils/visualTestHelpers.ts +0 -20
- package/src/__tests__/visual/__snapshots__/componentSnapshots.visual.test.tsx.snap +0 -68
- package/src/__tests__/visual/__snapshots__/componentVisuals.visual.test.tsx.snap +0 -14
- package/src/__tests__/visual/__snapshots__/visualRegression.test.tsx.snap +0 -217
- package/src/__tests__/visual/__snapshots__/visualRegression.visual.test.tsx.snap +0 -24
- package/src/__tests__/visual/componentSnapshots.visual.test.tsx +0 -33
- package/src/__tests__/visual/componentVisuals.visual.test.tsx +0 -12
- package/src/__tests__/visual/visualRegression.visual.test.tsx +0 -20
- package/src/components/Alert/__tests__/Alert.unit.test.tsx +0 -381
- package/src/components/Avatar/__tests__/Avatar.unit.test.tsx +0 -232
- package/src/components/Button/__tests__/Button.accessibility.test.tsx +0 -131
- package/src/components/Button/__tests__/Button.comprehensive.test.tsx +0 -721
- package/src/components/Button/__tests__/Button.unit.test.tsx +0 -189
- package/src/components/Button/__tests__/EventSelector.integration.test.tsx +0 -285
- package/src/components/Card/__tests__/Card.accessibility.test.tsx +0 -394
- package/src/components/Card/__tests__/Card.comprehensive.test.tsx +0 -599
- package/src/components/Card/__tests__/Card.integration.test.tsx +0 -673
- package/src/components/Card/__tests__/Card.performance.test.tsx +0 -546
- package/src/components/Card/__tests__/Card.unit.test.tsx +0 -330
- package/src/components/Card/__tests__/Card.visual.test.tsx +0 -599
- package/src/components/Card/__tests__/README.md +0 -211
- package/src/components/Checkbox/__tests__/Checkbox.unit.test.tsx +0 -520
- package/src/components/DataTable/__tests__/DataTable.errorHandling.test.tsx +0 -251
- package/src/components/DataTable/__tests__/DataTable.hierarchical.test.tsx +0 -680
- package/src/components/DataTable/__tests__/DataTable.infinite-loop.test.tsx +0 -323
- package/src/components/DataTable/__tests__/DataTable.integration.test.tsx +0 -716
- package/src/components/DataTable/__tests__/DataTable.performance.test.tsx +0 -589
- package/src/components/DataTable/__tests__/DataTable.permissions.test.tsx +0 -316
- package/src/components/DataTable/__tests__/DataTable.regressionFixes.test.tsx +0 -546
- package/src/components/DataTable/__tests__/DataTable.selection.controlled.test.tsx +0 -386
- package/src/components/DataTable/__tests__/DataTable.selection.test.tsx +0 -338
- package/src/components/DataTable/__tests__/DataTable.sorting.test.tsx +0 -321
- package/src/components/DataTable/__tests__/DataTable.userWorkflows.test.tsx +0 -320
- package/src/components/DataTable/__tests__/DataTable.workflowValidation.test.tsx +0 -583
- package/src/components/DataTable/__tests__/DataTable.workflows.test.tsx +0 -711
- package/src/components/DataTable/__tests__/performance-regression.test.tsx +0 -777
- package/src/components/DataTable/__tests__/performance.test.tsx +0 -365
- package/src/components/DataTable/components/__tests__/ActionButtons.unit.test.tsx +0 -150
- package/src/components/DataTable/components/__tests__/BulkOperationsDropdown.test.tsx +0 -224
- package/src/components/DataTable/components/__tests__/ColumnVisibilityDropdown.unit.test.tsx +0 -244
- package/src/components/DataTable/components/__tests__/DataTable.accessibility.test.tsx +0 -629
- package/src/components/DataTable/components/__tests__/DataTable.integration.test.tsx +0 -470
- package/src/components/DataTable/components/__tests__/DataTable.performance.test.tsx +0 -160
- package/src/components/DataTable/components/__tests__/DataTable.real.test.tsx +0 -251
- package/src/components/DataTable/components/__tests__/DataTable.security.test.tsx +0 -171
- package/src/components/DataTable/components/__tests__/DataTable.unit.test.tsx +0 -290
- package/src/components/DataTable/components/__tests__/DataTableBody.unit.test.tsx +0 -147
- package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.unit.test.tsx +0 -182
- package/src/components/DataTable/components/__tests__/DataTableModals.unit.test.tsx +0 -123
- package/src/components/DataTable/components/__tests__/EditableRow.unit.test.tsx +0 -660
- package/src/components/DataTable/components/__tests__/EmptyState.unit.test.tsx +0 -256
- package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -498
- package/src/components/DataTable/components/__tests__/FilterRow.unit.test.tsx +0 -112
- package/src/components/DataTable/components/__tests__/FilteringToggle.unit.test.tsx +0 -133
- package/src/components/DataTable/components/__tests__/GroupHeader.unit.test.tsx +0 -172
- package/src/components/DataTable/components/__tests__/GroupingDropdown.unit.test.tsx +0 -222
- package/src/components/DataTable/components/__tests__/ImportModal.unit.test.tsx +0 -780
- package/src/components/DataTable/components/__tests__/LoadingState.unit.test.tsx +0 -65
- package/src/components/DataTable/components/__tests__/PaginationControls.unit.test.tsx +0 -634
- package/src/components/DataTable/components/__tests__/StateComponents.unit.test.tsx +0 -48
- package/src/components/DataTable/components/__tests__/UnifiedTableBody.hierarchical.test.tsx +0 -541
- package/src/components/DataTable/components/__tests__/ViewRowModal.unit.test.tsx +0 -228
- package/src/components/DataTable/components/__tests__/VirtualizedDataTable.unit.test.tsx +0 -568
- package/src/components/DataTable/core/__tests__/ActionManager.unit.test.ts +0 -405
- package/src/components/DataTable/core/__tests__/ArchitectureIntegration.unit.test.tsx +0 -445
- package/src/components/DataTable/core/__tests__/ColumnFactory.unit.test.ts +0 -288
- package/src/components/DataTable/core/__tests__/ColumnManager.unit.test.ts +0 -623
- package/src/components/DataTable/core/__tests__/DataManager.unit.test.ts +0 -431
- package/src/components/DataTable/core/__tests__/DataTableContext.unit.test.tsx +0 -433
- package/src/components/DataTable/core/__tests__/LocalDataAdapter.unit.test.ts +0 -422
- package/src/components/DataTable/core/__tests__/PluginRegistry.unit.test.tsx +0 -207
- package/src/components/DataTable/core/__tests__/StateManager.unit.test.ts +0 -278
- package/src/components/DataTable/examples/__tests__/PerformanceExample.unit.test.tsx +0 -281
- package/src/components/DataTable/hooks/__tests__/useColumnOrderPersistence.unit.test.ts +0 -407
- package/src/components/DataTable/hooks/__tests__/useColumnReordering.unit.test.ts +0 -679
- package/src/components/DataTable/utils/__tests__/debugTools.unit.test.ts +0 -267
- package/src/components/DataTable/utils/__tests__/errorHandling.unit.test.ts +0 -467
- package/src/components/DataTable/utils/__tests__/exportUtils.unit.test.ts +0 -380
- package/src/components/DataTable/utils/__tests__/flexibleImport.unit.test.ts +0 -233
- package/src/components/DataTable/utils/__tests__/performanceUtils.unit.test.ts +0 -414
- package/src/components/Dialog/__tests__/Dialog.accessibility.test.tsx +0 -521
- package/src/components/Dialog/__tests__/Dialog.auto-size.example.tsx +0 -157
- package/src/components/Dialog/__tests__/Dialog.enhanced.test.tsx +0 -538
- package/src/components/Dialog/__tests__/Dialog.unit.test.tsx +0 -1373
- package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +0 -151
- package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +0 -611
- package/src/components/ErrorBoundary/__tests__/ErrorBoundary.accessibility.test.tsx +0 -517
- package/src/components/ErrorBoundary/__tests__/ErrorBoundary.integration.test.tsx +0 -572
- package/src/components/ErrorBoundary/__tests__/ErrorBoundary.unit.test.tsx +0 -579
- package/src/components/EventSelector/__tests__/EventSelector.test.tsx +0 -528
- package/src/components/FileUpload/__tests__/FileUpload.integration.test.tsx +0 -992
- package/src/components/FileUpload/__tests__/FileUpload.real.test.tsx +0 -927
- package/src/components/FileUpload/__tests__/FileUpload.test.tsx +0 -855
- package/src/components/FileUpload/__tests__/FileUpload.unit.test.tsx +0 -1311
- package/src/components/FileUpload/__tests__/FileUpload.unmocked.test.tsx +0 -937
- package/src/components/Footer/__tests__/Footer.accessibility.test.tsx +0 -359
- package/src/components/Footer/__tests__/Footer.integration.test.tsx +0 -353
- package/src/components/Footer/__tests__/Footer.performance.test.tsx +0 -309
- package/src/components/Footer/__tests__/Footer.unit.test.tsx +0 -309
- package/src/components/Footer/__tests__/Footer.visual.test.tsx +0 -335
- package/src/components/Form/__tests__/Form.accessibility.test.tsx +0 -820
- package/src/components/Form/__tests__/Form.unit.test.tsx +0 -305
- package/src/components/Form/__tests__/FormErrorSummary.unit.test.tsx +0 -285
- package/src/components/Form/__tests__/FormFieldset.unit.test.tsx +0 -241
- package/src/components/Header/__tests__/Header.accessibility.test.tsx +0 -382
- package/src/components/Header/__tests__/Header.comprehensive.test.tsx +0 -509
- package/src/components/Header/__tests__/Header.unit.test.tsx +0 -335
- package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +0 -196
- package/src/components/InactivityWarningModal/__tests__/InactivityWarningModal.unit.test.tsx +0 -224
- package/src/components/Input/__tests__/Input.accessibility.test.tsx +0 -632
- package/src/components/Input/__tests__/Input.unit.test.tsx +0 -1121
- package/src/components/Label/__tests__/Label.accessibility.test.tsx +0 -239
- package/src/components/Label/__tests__/Label.unit.test.tsx +0 -331
- package/src/components/LoadingSpinner/__tests__/LoadingSpinner.accessibility.test.tsx +0 -116
- package/src/components/LoadingSpinner/__tests__/LoadingSpinner.unit.test.tsx +0 -144
- package/src/components/LoginForm/__tests__/LoginForm.accessibility.test.tsx +0 -201
- package/src/components/LoginForm/__tests__/LoginForm.unit.test.tsx +0 -119
- package/src/components/NavigationMenu/__tests__/NavigationMenu.accessibility.test.tsx +0 -378
- package/src/components/NavigationMenu/__tests__/NavigationMenu.enhanced.test.tsx +0 -768
- package/src/components/NavigationMenu/__tests__/NavigationMenu.integration.test.tsx +0 -576
- package/src/components/NavigationMenu/__tests__/NavigationMenu.performance.test.tsx +0 -585
- package/src/components/NavigationMenu/__tests__/NavigationMenu.real.component.test.tsx +0 -783
- package/src/components/NavigationMenu/__tests__/NavigationMenu.security.enhanced.test.tsx +0 -810
- package/src/components/NavigationMenu/__tests__/NavigationMenu.security.test.tsx +0 -494
- package/src/components/NavigationMenu/__tests__/NavigationMenu.unit.test.tsx +0 -331
- package/src/components/NavigationMenu/__tests__/NavigationMenu.userWorkflows.test.tsx +0 -347
- package/src/components/NavigationMenu/__tests__/NavigationMenu.workflows.test.tsx +0 -584
- package/src/components/OrganisationSelector/__tests__/OrganisationSelector.unit.test.tsx +0 -664
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +0 -288
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +0 -893
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +0 -629
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +0 -782
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -904
- package/src/components/PaceLoginPage/__tests__/PaceLoginPage.accessibility.test.tsx +0 -463
- package/src/components/PaceLoginPage/__tests__/PaceLoginPage.integration.test.tsx +0 -586
- package/src/components/PaceLoginPage/__tests__/PaceLoginPage.unit.test.tsx +0 -533
- package/src/components/PasswordReset/__tests__/PasswordChangeForm.accessibility.test.tsx +0 -408
- package/src/components/PasswordReset/__tests__/PasswordChangeForm.unit.test.tsx +0 -561
- package/src/components/PasswordReset/__tests__/PasswordReset.integration.test.tsx +0 -304
- package/src/components/PasswordReset/__tests__/PasswordResetForm.accessibility.test.tsx +0 -20
- package/src/components/PasswordReset/__tests__/PasswordResetForm.unit.test.tsx +0 -523
- package/src/components/PasswordReset/__tests__/__mocks__/UnifiedAuthProvider.ts +0 -29
- package/src/components/Print/__tests__/Print.comprehensive.test.tsx +0 -331
- package/src/components/PrintButton/__tests__/PrintButton.unit.test.tsx +0 -429
- package/src/components/PrintButton/__tests__/PrintButtonGroup.unit.test.tsx +0 -277
- package/src/components/PrintButton/__tests__/PrintToolbar.unit.test.tsx +0 -264
- package/src/components/PrintCard/__tests__/PrintCard.unit.test.tsx +0 -233
- package/src/components/PrintCard/__tests__/PrintCardContent.test.tsx +0 -284
- package/src/components/PrintCard/__tests__/PrintCardGrid.unit.test.tsx +0 -214
- package/src/components/PrintCard/__tests__/PrintCardImage.unit.test.tsx +0 -264
- package/src/components/PrintDataTable/__tests__/PrintDataTable.unit.test.tsx +0 -361
- package/src/components/PrintDataTable/__tests__/PrintTableGroup.unit.test.tsx +0 -314
- package/src/components/PrintDataTable/__tests__/PrintTableRow.unit.test.tsx +0 -362
- package/src/components/PrintFooter/__tests__/PrintFooter.unit.test.tsx +0 -500
- package/src/components/PrintFooter/__tests__/PrintFooterContent.unit.test.tsx +0 -321
- package/src/components/PrintFooter/__tests__/PrintFooterInfo.unit.test.tsx +0 -335
- package/src/components/PrintFooter/__tests__/PrintPageNumber.unit.test.tsx +0 -340
- package/src/components/PrintGrid/__tests__/PrintGrid.unit.test.tsx +0 -340
- package/src/components/PrintGrid/__tests__/PrintGridBreakpoint.unit.test.tsx +0 -261
- package/src/components/PrintGrid/__tests__/PrintGridContainer.unit.test.tsx +0 -338
- package/src/components/PrintGrid/__tests__/PrintGridItem.unit.test.tsx +0 -338
- package/src/components/PrintHeader/__tests__/PrintCoverHeader.unit.test.tsx +0 -309
- package/src/components/PrintHeader/__tests__/PrintHeader.unit.test.tsx +0 -202
- package/src/components/PrintLayout/__tests__/PrintLayout.unit.test.tsx +0 -238
- package/src/components/PrintPageBreak/__tests__/PrintPageBreak.unit.test.tsx +0 -263
- package/src/components/PrintPageBreak/__tests__/PrintPageBreakGroup.unit.test.tsx +0 -239
- package/src/components/PrintPageBreak/__tests__/PrintPageBreakIndicator.unit.test.tsx +0 -235
- package/src/components/PrintSection/__tests__/PrintColumn.unit.test.tsx +0 -385
- package/src/components/PrintSection/__tests__/PrintDivider.unit.test.tsx +0 -373
- package/src/components/PrintSection/__tests__/PrintSection.unit.test.tsx +0 -390
- package/src/components/PrintSection/__tests__/PrintSectionContent.unit.test.tsx +0 -321
- package/src/components/PrintSection/__tests__/PrintSectionHeader.unit.test.tsx +0 -334
- package/src/components/PrintText/__tests__/PrintText.unit.test.tsx +0 -351
- package/src/components/Progress/__tests__/Progress.accessibility.test.tsx +0 -240
- package/src/components/Progress/__tests__/Progress.unit.test.tsx +0 -242
- package/src/components/PublicLayout/__tests__/EventLogo.test.tsx +0 -761
- package/src/components/PublicLayout/__tests__/PublicErrorBoundary.simplified.test.tsx +0 -228
- package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +0 -228
- package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +0 -459
- package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +0 -362
- package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +0 -522
- package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +0 -599
- package/src/components/PublicLayout/__tests__/PublicPageProvider.test.tsx +0 -513
- package/src/components/RBAC/__tests__/PagePermissionGuard.unit.test.tsx +0 -683
- package/src/components/RBAC/__tests__/RBAC.integration.test.tsx +0 -573
- package/src/components/RBAC/__tests__/RBACGuard.unit.test.tsx +0 -467
- package/src/components/RBAC/__tests__/RBACProvider.accessibility.test.tsx +0 -475
- package/src/components/RBAC/__tests__/RBACProvider.advanced.test.tsx +0 -569
- package/src/components/RBAC/__tests__/RBACProvider.integration.test.tsx +0 -352
- package/src/components/RBAC/__tests__/RBACProvider.unit.test.tsx +0 -128
- package/src/components/RBAC/__tests__/RoleBasedContent.unit.test.tsx +0 -657
- package/src/components/Select/__tests__/SearchableSelect.unit.test.tsx +0 -437
- package/src/components/Select/__tests__/Select.accessibility.test.tsx +0 -1202
- package/src/components/Select/__tests__/Select.actual.test.tsx +0 -774
- package/src/components/Select/__tests__/Select.comprehensive.test.tsx +0 -837
- package/src/components/Select/__tests__/Select.enhanced.test.tsx +0 -1101
- package/src/components/Select/__tests__/Select.integration.test.tsx +0 -772
- package/src/components/Select/__tests__/Select.performance.test.tsx +0 -695
- package/src/components/Select/__tests__/Select.real-world.test.tsx +0 -1046
- package/src/components/Select/__tests__/Select.search-algorithms.test.tsx +0 -968
- package/src/components/Select/__tests__/Select.unit.test.tsx +0 -647
- package/src/components/Select/__tests__/Select.utils.test.tsx +0 -890
- package/src/components/Table/__tests__/Table.accessibility.test.tsx +0 -233
- package/src/components/Table/__tests__/Table.unit.test.tsx +0 -235
- package/src/components/Toast/__tests__/Toast.accessibility.test.tsx +0 -238
- package/src/components/Toast/__tests__/Toast.integration.test.tsx +0 -699
- package/src/components/Toast/__tests__/Toast.unit.test.tsx +0 -750
- package/src/components/Tooltip/__tests__/Tooltip.accessibility.test.tsx +0 -121
- package/src/components/Tooltip/__tests__/Tooltip.unit.test.tsx +0 -185
- package/src/components/UserMenu/__tests__/UserMenu.accessibility.test.tsx +0 -139
- package/src/components/UserMenu/__tests__/UserMenu.integration.test.tsx +0 -188
- package/src/components/UserMenu/__tests__/UserMenu.unit.test.tsx +0 -458
- package/src/components/__tests__/EdgeCaseTesting.enhanced.test.tsx +0 -524
- package/src/components/__tests__/ErrorTesting.enhanced.test.tsx +0 -455
- package/src/components/__tests__/SuperAdminGuard.test.tsx +0 -456
- package/src/components/__tests__/SuperAdminGuard.unit.test.tsx +0 -456
- package/src/components/examples/__tests__/PermissionExample.unit.test.tsx +0 -360
- package/src/hooks/__tests__/hooks.integration.test.tsx +0 -575
- package/src/hooks/__tests__/useApiFetch.unit.test.ts +0 -115
- package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +0 -133
- package/src/hooks/__tests__/useDebounce.unit.test.ts +0 -82
- package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +0 -293
- package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +0 -385
- package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +0 -286
- package/src/hooks/__tests__/useOrganisationSecurity.unit.test.tsx +0 -838
- package/src/hooks/__tests__/usePermissionCache.unit.test.ts +0 -627
- package/src/hooks/__tests__/useRBAC.unit.test.ts +0 -911
- package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +0 -537
- package/src/hooks/__tests__/useToast.unit.test.tsx +0 -62
- package/src/hooks/__tests__/useZodForm.unit.test.tsx +0 -37
- package/src/hooks/public/__tests__/usePublicEvent.test.tsx +0 -397
- package/src/hooks/public/__tests__/usePublicEventLogo.test.tsx +0 -690
- package/src/hooks/public/__tests__/usePublicRouteParams.test.tsx +0 -449
- package/src/providers/__tests__/EventProvider.unit.test.tsx +0 -768
- package/src/providers/__tests__/OrganisationProvider.basic.test.tsx +0 -116
- package/src/providers/__tests__/OrganisationProvider.unit.test.tsx +0 -1312
- package/src/providers/__tests__/UnifiedAuthProvider.inactivity.test.tsx +0 -601
- package/src/providers/__tests__/UnifiedAuthProvider.unit.test.tsx +0 -683
- package/src/providers/__tests__/index.unit.test.ts +0 -78
- package/src/rbac/__tests__/PagePermissionGuard.test.tsx +0 -673
- package/src/rbac/__tests__/README.md +0 -170
- package/src/rbac/__tests__/RoleBasedRouter.test.tsx +0 -709
- package/src/rbac/__tests__/TestContext.tsx +0 -72
- package/src/rbac/__tests__/__mocks__/cache.ts +0 -144
- package/src/rbac/__tests__/__mocks__/supabase.ts +0 -152
- package/src/rbac/__tests__/adapters-hooks-comprehensive.test.tsx +0 -782
- package/src/rbac/__tests__/adapters-hooks.test.tsx +0 -561
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +0 -963
- package/src/rbac/__tests__/adapters.test.tsx +0 -444
- package/src/rbac/__tests__/api.test.ts +0 -620
- package/src/rbac/__tests__/audit-observability-comprehensive.test.ts +0 -792
- package/src/rbac/__tests__/audit-observability.test.ts +0 -549
- package/src/rbac/__tests__/audit.test.ts +0 -616
- package/src/rbac/__tests__/build-contract-compliance-simple.test.ts +0 -230
- package/src/rbac/__tests__/cache-invalidation-comprehensive.test.ts +0 -889
- package/src/rbac/__tests__/cache-invalidation.test.ts +0 -457
- package/src/rbac/__tests__/cache.test.ts +0 -458
- package/src/rbac/__tests__/components-navigation-guard.enhanced.test.tsx +0 -859
- package/src/rbac/__tests__/components-navigation-guard.test.tsx +0 -895
- package/src/rbac/__tests__/components-navigation-provider.test.tsx +0 -692
- package/src/rbac/__tests__/components-page-permission-guard.test.tsx +0 -673
- package/src/rbac/__tests__/components-page-permission-provider.test.tsx +0 -614
- package/src/rbac/__tests__/components-permission-enforcer.enhanced.fixed.test.tsx +0 -836
- package/src/rbac/__tests__/components-permission-enforcer.enhanced.test.tsx +0 -837
- package/src/rbac/__tests__/components-permission-enforcer.test.tsx +0 -825
- package/src/rbac/__tests__/components-role-based-router.test.tsx +0 -709
- package/src/rbac/__tests__/components-secure-data-provider.test.tsx +0 -607
- package/src/rbac/__tests__/config.test.ts +0 -583
- package/src/rbac/__tests__/core-logic-unit.test.ts +0 -190
- package/src/rbac/__tests__/core-permission-logic-comprehensive.test.ts +0 -1467
- package/src/rbac/__tests__/core-permission-logic-fixed.test.ts +0 -151
- package/src/rbac/__tests__/core-permission-logic-simple.test.ts +0 -968
- package/src/rbac/__tests__/core-permission-logic.test.ts +0 -966
- package/src/rbac/__tests__/edge-cases-comprehensive.test.ts +0 -988
- package/src/rbac/__tests__/edge-cases.test.ts +0 -654
- package/src/rbac/__tests__/engine.test.ts +0 -361
- package/src/rbac/__tests__/engine.unit.test.ts +0 -361
- package/src/rbac/__tests__/hooks.enhanced.test.tsx +0 -979
- package/src/rbac/__tests__/hooks.fixed.test.tsx +0 -475
- package/src/rbac/__tests__/hooks.test.tsx +0 -385
- package/src/rbac/__tests__/index.test.ts +0 -269
- package/src/rbac/__tests__/integration.enhanced.test.tsx +0 -824
- package/src/rbac/__tests__/page-permission-guard-super-admin.test.tsx +0 -261
- package/src/rbac/__tests__/performance.enhanced.test.tsx +0 -724
- package/src/rbac/__tests__/permissions.test.ts +0 -383
- package/src/rbac/__tests__/requires-event.test.ts +0 -330
- package/src/rbac/__tests__/scope-isolation-comprehensive.test.ts +0 -1349
- package/src/rbac/__tests__/scope-isolation.test.ts +0 -755
- package/src/rbac/__tests__/secure-client-rls-comprehensive.test.ts +0 -592
- package/src/rbac/__tests__/secure-client-rls.test.ts +0 -377
- package/src/rbac/__tests__/security.test.ts +0 -296
- package/src/rbac/__tests__/setup.ts +0 -228
- package/src/rbac/__tests__/test-utils-enhanced.tsx +0 -400
- package/src/rbac/__tests__/types.test.ts +0 -685
- package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +0 -631
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +0 -667
- package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +0 -647
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +0 -496
- package/src/rbac/testing/__tests__/index.test.tsx +0 -342
- package/src/rbac/utils/__tests__/eventContext.test.ts +0 -428
- package/src/rbac/utils/__tests__/eventContext.unit.test.ts +0 -428
- package/src/styles/__tests__/styles.unit.test.ts +0 -164
- package/src/test-dom-cleanup.test.tsx +0 -38
- package/src/theming/__tests__/README.md +0 -335
- package/src/theming/__tests__/runtime.accessibility.test.ts +0 -474
- package/src/theming/__tests__/runtime.error.test.ts +0 -616
- package/src/theming/__tests__/runtime.integration.test.ts +0 -376
- package/src/theming/__tests__/runtime.performance.test.ts +0 -411
- package/src/theming/__tests__/runtime.unit.test.ts +0 -470
- package/src/types/__tests__/database.unit.test.ts +0 -489
- package/src/types/__tests__/guards.unit.test.ts +0 -146
- package/src/types/__tests__/index.unit.test.ts +0 -77
- package/src/types/__tests__/organisation.unit.test.ts +0 -713
- package/src/types/__tests__/rbac.unit.test.ts +0 -621
- package/src/types/__tests__/security.unit.test.ts +0 -347
- package/src/types/__tests__/supabase.unit.test.ts +0 -658
- package/src/types/__tests__/theme.unit.test.ts +0 -218
- package/src/types/__tests__/unified.unit.test.ts +0 -537
- package/src/types/__tests__/validation.unit.test.ts +0 -616
- package/src/utils/__tests__/appConfig.unit.test.ts +0 -55
- package/src/utils/__tests__/appNameResolver.unit.test.ts +0 -137
- package/src/utils/__tests__/audit.unit.test.ts +0 -69
- package/src/utils/__tests__/auth-utils.unit.test.ts +0 -70
- package/src/utils/__tests__/bundleAnalysis.unit.test.ts +0 -317
- package/src/utils/__tests__/cn.unit.test.ts +0 -34
- package/src/utils/__tests__/deviceFingerprint.unit.test.ts +0 -480
- package/src/utils/__tests__/dynamicUtils.unit.test.ts +0 -322
- package/src/utils/__tests__/formatDate.unit.test.ts +0 -109
- package/src/utils/__tests__/formatting.unit.test.ts +0 -66
- package/src/utils/__tests__/index.unit.test.ts +0 -251
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +0 -304
- package/src/utils/__tests__/organisationContext.unit.test.ts +0 -192
- package/src/utils/__tests__/performanceBudgets.unit.test.ts +0 -259
- package/src/utils/__tests__/permissionTypes.unit.test.ts +0 -250
- package/src/utils/__tests__/permissionUtils.unit.test.ts +0 -362
- package/src/utils/__tests__/sanitization.unit.test.ts +0 -346
- package/src/utils/__tests__/schemaUtils.unit.test.ts +0 -441
- package/src/utils/__tests__/secureDataAccess.unit.test.ts +0 -334
- package/src/utils/__tests__/secureErrors.unit.test.ts +0 -377
- package/src/utils/__tests__/secureStorage.unit.test.ts +0 -293
- package/src/utils/__tests__/security.unit.test.ts +0 -127
- package/src/utils/__tests__/securityMonitor.unit.test.ts +0 -280
- package/src/utils/__tests__/sessionTracking.unit.test.ts +0 -370
- package/src/utils/__tests__/validation.unit.test.ts +0 -84
- package/src/utils/__tests__/validationUtils.unit.test.ts +0 -571
- package/src/utils/print/__tests__/PrintDataProcessor.unit.test.ts +0 -219
- package/src/utils/print/__tests__/usePrintOptimization.unit.test.tsx +0 -353
- package/src/utils/storage/__tests__/config.unit.test.ts +0 -206
- package/src/utils/storage/__tests__/helpers.unit.test.ts +0 -648
- package/src/utils/storage/__tests__/index.unit.test.ts +0 -167
- package/src/utils/storage/__tests__/types.unit.test.ts +0 -441
- package/src/validation/__tests__/common.unit.test.ts +0 -101
- package/src/validation/__tests__/csrf.unit.test.ts +0 -302
- package/src/validation/__tests__/passwordSchema.unit.test.ts +0 -98
- package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +0 -466
- /package/dist/{DataTable-EEUDXPE5.js.map → DataTable-GX3XERFJ.js.map} +0 -0
- /package/dist/{chunk-VYG4AXYW.js.map → chunk-5EL3KHOQ.js.map} +0 -0
|
@@ -1,521 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file Dialog Accessibility Tests
|
|
3
|
-
* @description Comprehensive accessibility tests for Dialog component with enhanced features
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import React, { useState } from 'react';
|
|
7
|
-
import { screen, fireEvent, waitFor } from '@testing-library/react';
|
|
8
|
-
import { axe, toHaveNoViolations } from 'jest-axe';
|
|
9
|
-
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
10
|
-
import '@testing-library/jest-dom';
|
|
11
|
-
import { renderWithProviders } from '../../../__tests__/shared';
|
|
12
|
-
import {
|
|
13
|
-
Dialog,
|
|
14
|
-
DialogTrigger,
|
|
15
|
-
DialogContent,
|
|
16
|
-
DialogHeader,
|
|
17
|
-
DialogFooter,
|
|
18
|
-
DialogTitle,
|
|
19
|
-
DialogDescription,
|
|
20
|
-
DialogClose,
|
|
21
|
-
type DialogSize,
|
|
22
|
-
} from '../Dialog';
|
|
23
|
-
import { Button } from '../../Button/Button';
|
|
24
|
-
import { Input } from '../../Input/Input';
|
|
25
|
-
|
|
26
|
-
// Extend expect with axe matchers
|
|
27
|
-
expect.extend(toHaveNoViolations);
|
|
28
|
-
|
|
29
|
-
// Mock Radix UI for consistent testing
|
|
30
|
-
vi.mock('@radix-ui/react-dialog', () => ({
|
|
31
|
-
Root: ({ children, open = false, onOpenChange }: { children: React.ReactNode; open?: boolean; onOpenChange?: (open: boolean) => void }) => (
|
|
32
|
-
<div data-testid="dialog-root" data-open={String(open)} role="none">
|
|
33
|
-
{open && children}
|
|
34
|
-
</div>
|
|
35
|
-
),
|
|
36
|
-
Trigger: React.forwardRef<HTMLButtonElement, React.ButtonHTMLAttributes<HTMLButtonElement> & { asChild?: boolean }>(({ children, onClick, asChild, ...props }, ref) => {
|
|
37
|
-
// If asChild is true, don't render a button wrapper
|
|
38
|
-
if (asChild) {
|
|
39
|
-
return <>{children}</>;
|
|
40
|
-
}
|
|
41
|
-
return (
|
|
42
|
-
<button ref={ref} onClick={onClick} {...props}>
|
|
43
|
-
{children}
|
|
44
|
-
</button>
|
|
45
|
-
);
|
|
46
|
-
}),
|
|
47
|
-
Portal: ({ children }: { children: React.ReactNode }) => (
|
|
48
|
-
<div data-testid="dialog-portal">{children}</div>
|
|
49
|
-
),
|
|
50
|
-
Overlay: React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ className, ...props }, ref) => (
|
|
51
|
-
<div ref={ref} className={className} data-testid="dialog-overlay" aria-hidden="true" {...props} />
|
|
52
|
-
)),
|
|
53
|
-
Content: React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement> & {
|
|
54
|
-
onEscapeKeyDown?: (event: KeyboardEvent) => void;
|
|
55
|
-
onPointerDownOutside?: (event: Event) => void;
|
|
56
|
-
}>(({ children, className, onEscapeKeyDown, onPointerDownOutside, ...props }, ref) => {
|
|
57
|
-
// For accessibility, always provide aria-labelledby since our dialogs should have titles
|
|
58
|
-
return (
|
|
59
|
-
<div
|
|
60
|
-
ref={ref}
|
|
61
|
-
className={className}
|
|
62
|
-
role="dialog"
|
|
63
|
-
aria-modal="true"
|
|
64
|
-
aria-labelledby="dialog-title"
|
|
65
|
-
tabIndex={-1}
|
|
66
|
-
{...props}
|
|
67
|
-
>
|
|
68
|
-
{children}
|
|
69
|
-
</div>
|
|
70
|
-
);
|
|
71
|
-
}),
|
|
72
|
-
Title: React.forwardRef<HTMLHeadingElement, React.HTMLAttributes<HTMLHeadingElement>>(({ children, className, ...props }, ref) => (
|
|
73
|
-
<h2 ref={ref} id="dialog-title" className={className} {...props}>
|
|
74
|
-
{children}
|
|
75
|
-
</h2>
|
|
76
|
-
)),
|
|
77
|
-
Description: React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(({ children, className, ...props }, ref) => (
|
|
78
|
-
<p ref={ref} className={className} {...props}>
|
|
79
|
-
{children}
|
|
80
|
-
</p>
|
|
81
|
-
)),
|
|
82
|
-
Close: React.forwardRef<HTMLButtonElement, React.ButtonHTMLAttributes<HTMLButtonElement> & { asChild?: boolean }>(({ children, className, onClick, asChild, ...props }, ref) => {
|
|
83
|
-
// If asChild is true, don't render a button wrapper
|
|
84
|
-
if (asChild) {
|
|
85
|
-
return <>{children}</>;
|
|
86
|
-
}
|
|
87
|
-
return (
|
|
88
|
-
<button ref={ref} className={className} onClick={onClick} aria-label="Close dialog" {...props}>
|
|
89
|
-
{children}
|
|
90
|
-
</button>
|
|
91
|
-
);
|
|
92
|
-
}),
|
|
93
|
-
}));
|
|
94
|
-
|
|
95
|
-
// Test component that uses Dialog with state management
|
|
96
|
-
const DialogTestComponent = ({
|
|
97
|
-
isOpen = false,
|
|
98
|
-
size = 'md',
|
|
99
|
-
showCloseButton = true,
|
|
100
|
-
preventCloseOnEscape = false,
|
|
101
|
-
preventCloseOnOutsideClick = false,
|
|
102
|
-
children,
|
|
103
|
-
...dialogProps
|
|
104
|
-
}: {
|
|
105
|
-
isOpen?: boolean;
|
|
106
|
-
size?: DialogSize;
|
|
107
|
-
showCloseButton?: boolean;
|
|
108
|
-
preventCloseOnEscape?: boolean;
|
|
109
|
-
preventCloseOnOutsideClick?: boolean;
|
|
110
|
-
children?: React.ReactNode;
|
|
111
|
-
} & Omit<React.ComponentProps<typeof Dialog>, 'children'>) => {
|
|
112
|
-
const [open, setOpen] = useState(isOpen);
|
|
113
|
-
|
|
114
|
-
return (
|
|
115
|
-
<Dialog open={open} onOpenChange={setOpen} {...dialogProps}>
|
|
116
|
-
<DialogTrigger asChild>
|
|
117
|
-
<Button>Open Dialog</Button>
|
|
118
|
-
</DialogTrigger>
|
|
119
|
-
<DialogContent
|
|
120
|
-
size={size}
|
|
121
|
-
showCloseButton={showCloseButton}
|
|
122
|
-
preventCloseOnEscape={preventCloseOnEscape}
|
|
123
|
-
preventCloseOnOutsideClick={preventCloseOnOutsideClick}
|
|
124
|
-
>
|
|
125
|
-
<DialogHeader>
|
|
126
|
-
<DialogTitle>Dialog Title</DialogTitle>
|
|
127
|
-
<DialogDescription>
|
|
128
|
-
This is a dialog description that explains what the dialog is for.
|
|
129
|
-
</DialogDescription>
|
|
130
|
-
</DialogHeader>
|
|
131
|
-
<div className="grid gap-4 py-4">
|
|
132
|
-
<Input placeholder="Enter your name" aria-label="Name input" />
|
|
133
|
-
<Input placeholder="Enter your email" aria-label="Email input" type="email" />
|
|
134
|
-
</div>
|
|
135
|
-
<DialogFooter>
|
|
136
|
-
<DialogClose asChild>
|
|
137
|
-
<Button variant="outline">Cancel</Button>
|
|
138
|
-
</DialogClose>
|
|
139
|
-
<Button type="submit">Save changes</Button>
|
|
140
|
-
</DialogFooter>
|
|
141
|
-
{children}
|
|
142
|
-
</DialogContent>
|
|
143
|
-
</Dialog>
|
|
144
|
-
);
|
|
145
|
-
};
|
|
146
|
-
|
|
147
|
-
describe('Dialog Accessibility', () => {
|
|
148
|
-
beforeEach(() => {
|
|
149
|
-
// Mock console.log to reduce noise
|
|
150
|
-
vi.spyOn(console, 'log').mockImplementation(() => {});
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
describe('ARIA Attributes and Roles', () => {
|
|
154
|
-
it('should have proper ARIA attributes when open', async () => {
|
|
155
|
-
renderWithProviders(<DialogTestComponent isOpen={true} />);
|
|
156
|
-
|
|
157
|
-
// Wait for dialog to render
|
|
158
|
-
await waitFor(() => {
|
|
159
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
const dialog = screen.getByRole('dialog');
|
|
163
|
-
|
|
164
|
-
// Check role
|
|
165
|
-
expect(dialog).toHaveAttribute('role', 'dialog');
|
|
166
|
-
|
|
167
|
-
// Check aria-modal
|
|
168
|
-
expect(dialog).toHaveAttribute('aria-modal', 'true');
|
|
169
|
-
|
|
170
|
-
// Check tabindex for focus management
|
|
171
|
-
expect(dialog).toHaveAttribute('tabindex', '-1');
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
it('should have proper backdrop ARIA attributes', async () => {
|
|
175
|
-
renderWithProviders(<DialogTestComponent isOpen={true} />);
|
|
176
|
-
|
|
177
|
-
await waitFor(() => {
|
|
178
|
-
expect(screen.getByTestId('dialog-overlay')).toBeInTheDocument();
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
const backdrop = screen.getByTestId('dialog-overlay');
|
|
182
|
-
expect(backdrop).toHaveAttribute('aria-hidden', 'true');
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
it('should maintain proper heading hierarchy with DialogTitle', async () => {
|
|
186
|
-
renderWithProviders(<DialogTestComponent isOpen={true} />);
|
|
187
|
-
|
|
188
|
-
await waitFor(() => {
|
|
189
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
const title = screen.getByText('Dialog Title');
|
|
193
|
-
expect(title.tagName).toBe('H2');
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
it('should have proper close button accessibility', async () => {
|
|
197
|
-
renderWithProviders(<DialogTestComponent isOpen={true} showCloseButton={true} />);
|
|
198
|
-
|
|
199
|
-
await waitFor(() => {
|
|
200
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
// Look for close button with aria-label
|
|
204
|
-
const closeButtons = screen.getAllByLabelText('Close dialog');
|
|
205
|
-
expect(closeButtons.length).toBeGreaterThan(0);
|
|
206
|
-
});
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
describe('Focus Management', () => {
|
|
210
|
-
it('should focus the dialog when opened', async () => {
|
|
211
|
-
renderWithProviders(<DialogTestComponent isOpen={true} />);
|
|
212
|
-
|
|
213
|
-
await waitFor(() => {
|
|
214
|
-
const dialog = screen.getByRole('dialog');
|
|
215
|
-
expect(dialog).toBeInTheDocument();
|
|
216
|
-
// In our mock setup, we can't test actual focus behavior
|
|
217
|
-
// but we can verify the dialog is focusable
|
|
218
|
-
expect(dialog).toHaveAttribute('tabindex', '-1');
|
|
219
|
-
});
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
it('should trap focus within dialog', async () => {
|
|
223
|
-
renderWithProviders(<DialogTestComponent isOpen={true} />);
|
|
224
|
-
|
|
225
|
-
await waitFor(() => {
|
|
226
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
227
|
-
});
|
|
228
|
-
|
|
229
|
-
const nameInput = screen.getByLabelText('Name input');
|
|
230
|
-
const emailInput = screen.getByLabelText('Email input');
|
|
231
|
-
const cancelButton = screen.getByText('Cancel');
|
|
232
|
-
const saveButton = screen.getByText('Save changes');
|
|
233
|
-
|
|
234
|
-
// Test that all focusable elements are accessible
|
|
235
|
-
nameInput.focus();
|
|
236
|
-
expect(document.activeElement).toBe(nameInput);
|
|
237
|
-
|
|
238
|
-
emailInput.focus();
|
|
239
|
-
expect(document.activeElement).toBe(emailInput);
|
|
240
|
-
|
|
241
|
-
cancelButton.focus();
|
|
242
|
-
expect(document.activeElement).toBe(cancelButton);
|
|
243
|
-
|
|
244
|
-
saveButton.focus();
|
|
245
|
-
expect(document.activeElement).toBe(saveButton);
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
it('should handle focus management with no close button', async () => {
|
|
249
|
-
renderWithProviders(<DialogTestComponent isOpen={true} showCloseButton={false} />);
|
|
250
|
-
|
|
251
|
-
await waitFor(() => {
|
|
252
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
253
|
-
});
|
|
254
|
-
|
|
255
|
-
// Should still maintain focus management without close button
|
|
256
|
-
const dialog = screen.getByRole('dialog');
|
|
257
|
-
expect(dialog).toHaveAttribute('tabindex', '-1');
|
|
258
|
-
|
|
259
|
-
// Should still be able to focus on other interactive elements
|
|
260
|
-
const nameInput = screen.getByLabelText('Name input');
|
|
261
|
-
nameInput.focus();
|
|
262
|
-
expect(document.activeElement).toBe(nameInput);
|
|
263
|
-
});
|
|
264
|
-
});
|
|
265
|
-
|
|
266
|
-
describe('Keyboard Navigation', () => {
|
|
267
|
-
it('should close dialog with Escape key by default', async () => {
|
|
268
|
-
renderWithProviders(<DialogTestComponent isOpen={true} />);
|
|
269
|
-
|
|
270
|
-
await waitFor(() => {
|
|
271
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
272
|
-
});
|
|
273
|
-
|
|
274
|
-
// Press Escape
|
|
275
|
-
fireEvent.keyDown(document, { key: 'Escape' });
|
|
276
|
-
|
|
277
|
-
// Note: In real implementation, this would close the dialog
|
|
278
|
-
// Here we're testing that the event handler is properly set up
|
|
279
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
280
|
-
});
|
|
281
|
-
|
|
282
|
-
it('should prevent closing with Escape when preventCloseOnEscape is true', async () => {
|
|
283
|
-
renderWithProviders(<DialogTestComponent isOpen={true} preventCloseOnEscape={true} />);
|
|
284
|
-
|
|
285
|
-
await waitFor(() => {
|
|
286
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
287
|
-
});
|
|
288
|
-
|
|
289
|
-
// Press Escape - should not close
|
|
290
|
-
fireEvent.keyDown(document, { key: 'Escape' });
|
|
291
|
-
|
|
292
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
293
|
-
});
|
|
294
|
-
});
|
|
295
|
-
|
|
296
|
-
describe('Size Variants Accessibility', () => {
|
|
297
|
-
it('should maintain accessibility across all size variants', async () => {
|
|
298
|
-
const sizes: DialogSize[] = ['sm', 'md', 'lg', 'xl', 'full'];
|
|
299
|
-
|
|
300
|
-
for (const size of sizes) {
|
|
301
|
-
const { unmount } = renderWithProviders(<DialogTestComponent isOpen={true} size={size} />);
|
|
302
|
-
|
|
303
|
-
await waitFor(() => {
|
|
304
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
305
|
-
});
|
|
306
|
-
|
|
307
|
-
const dialog = screen.getByRole('dialog');
|
|
308
|
-
expect(dialog).toHaveAttribute('role', 'dialog');
|
|
309
|
-
expect(dialog).toHaveAttribute('aria-modal', 'true');
|
|
310
|
-
|
|
311
|
-
unmount();
|
|
312
|
-
}
|
|
313
|
-
});
|
|
314
|
-
|
|
315
|
-
it('should handle full-screen dialog accessibility', async () => {
|
|
316
|
-
renderWithProviders(<DialogTestComponent isOpen={true} size="full" />);
|
|
317
|
-
|
|
318
|
-
await waitFor(() => {
|
|
319
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
320
|
-
});
|
|
321
|
-
|
|
322
|
-
const dialog = screen.getByRole('dialog');
|
|
323
|
-
|
|
324
|
-
// Should maintain proper ARIA attributes even in full-screen mode
|
|
325
|
-
expect(dialog).toHaveAttribute('role', 'dialog');
|
|
326
|
-
expect(dialog).toHaveAttribute('aria-modal', 'true');
|
|
327
|
-
expect(dialog).toHaveAttribute('tabindex', '-1');
|
|
328
|
-
});
|
|
329
|
-
});
|
|
330
|
-
|
|
331
|
-
describe('Screen Reader Compatibility', () => {
|
|
332
|
-
it('should announce dialog content to screen readers', async () => {
|
|
333
|
-
renderWithProviders(<DialogTestComponent isOpen={true} />);
|
|
334
|
-
|
|
335
|
-
await waitFor(() => {
|
|
336
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
337
|
-
});
|
|
338
|
-
|
|
339
|
-
// Title should be accessible to screen readers
|
|
340
|
-
expect(screen.getByText('Dialog Title')).toBeInTheDocument();
|
|
341
|
-
|
|
342
|
-
// Description should be accessible to screen readers
|
|
343
|
-
expect(screen.getByText('This is a dialog description that explains what the dialog is for.')).toBeInTheDocument();
|
|
344
|
-
});
|
|
345
|
-
|
|
346
|
-
it('should provide proper labels for form controls', async () => {
|
|
347
|
-
renderWithProviders(<DialogTestComponent isOpen={true} />);
|
|
348
|
-
|
|
349
|
-
await waitFor(() => {
|
|
350
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
351
|
-
});
|
|
352
|
-
|
|
353
|
-
// Form inputs should have proper labels
|
|
354
|
-
expect(screen.getByLabelText('Name input')).toBeInTheDocument();
|
|
355
|
-
expect(screen.getByLabelText('Email input')).toBeInTheDocument();
|
|
356
|
-
});
|
|
357
|
-
|
|
358
|
-
it('should handle screen reader announcements for close button', async () => {
|
|
359
|
-
renderWithProviders(<DialogTestComponent isOpen={true} showCloseButton={true} />);
|
|
360
|
-
|
|
361
|
-
await waitFor(() => {
|
|
362
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
363
|
-
});
|
|
364
|
-
|
|
365
|
-
// Close button should have screen reader text
|
|
366
|
-
const closeButtons = screen.getAllByLabelText('Close dialog');
|
|
367
|
-
expect(closeButtons.length).toBeGreaterThan(0);
|
|
368
|
-
});
|
|
369
|
-
});
|
|
370
|
-
|
|
371
|
-
describe('Error Handling and Edge Cases', () => {
|
|
372
|
-
it('should handle dialog with minimal content gracefully', async () => {
|
|
373
|
-
const MinimalDialog = () => (
|
|
374
|
-
<Dialog open={true}>
|
|
375
|
-
<DialogContent>
|
|
376
|
-
<DialogTitle>Minimal Dialog</DialogTitle>
|
|
377
|
-
</DialogContent>
|
|
378
|
-
</Dialog>
|
|
379
|
-
);
|
|
380
|
-
|
|
381
|
-
renderWithProviders(<MinimalDialog />);
|
|
382
|
-
|
|
383
|
-
await waitFor(() => {
|
|
384
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
385
|
-
});
|
|
386
|
-
|
|
387
|
-
const dialog = screen.getByRole('dialog');
|
|
388
|
-
expect(dialog).toHaveAttribute('role', 'dialog');
|
|
389
|
-
expect(dialog).toHaveAttribute('aria-modal', 'true');
|
|
390
|
-
});
|
|
391
|
-
|
|
392
|
-
it('should handle dialog without title gracefully', async () => {
|
|
393
|
-
const NoTitleDialog = () => (
|
|
394
|
-
<Dialog open={true}>
|
|
395
|
-
<DialogContent>
|
|
396
|
-
<DialogDescription>Dialog without title</DialogDescription>
|
|
397
|
-
</DialogContent>
|
|
398
|
-
</Dialog>
|
|
399
|
-
);
|
|
400
|
-
|
|
401
|
-
renderWithProviders(<NoTitleDialog />);
|
|
402
|
-
|
|
403
|
-
await waitFor(() => {
|
|
404
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
405
|
-
});
|
|
406
|
-
|
|
407
|
-
// Should still be accessible even without title
|
|
408
|
-
const dialog = screen.getByRole('dialog');
|
|
409
|
-
expect(dialog).toHaveAttribute('role', 'dialog');
|
|
410
|
-
expect(dialog).toHaveAttribute('aria-modal', 'true');
|
|
411
|
-
});
|
|
412
|
-
});
|
|
413
|
-
|
|
414
|
-
describe('Custom Styling Accessibility', () => {
|
|
415
|
-
it('should maintain accessibility with custom overlay styling', async () => {
|
|
416
|
-
renderWithProviders(
|
|
417
|
-
<DialogTestComponent
|
|
418
|
-
isOpen={true}
|
|
419
|
-
// Custom overlay styling should not affect accessibility
|
|
420
|
-
/>
|
|
421
|
-
);
|
|
422
|
-
|
|
423
|
-
await waitFor(() => {
|
|
424
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
425
|
-
});
|
|
426
|
-
|
|
427
|
-
const overlay = screen.getByTestId('dialog-overlay');
|
|
428
|
-
expect(overlay).toHaveAttribute('aria-hidden', 'true');
|
|
429
|
-
});
|
|
430
|
-
|
|
431
|
-
it('should maintain focus management with custom content styling', async () => {
|
|
432
|
-
renderWithProviders(<DialogTestComponent isOpen={true} />);
|
|
433
|
-
|
|
434
|
-
await waitFor(() => {
|
|
435
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
436
|
-
});
|
|
437
|
-
|
|
438
|
-
// Custom styling should not interfere with focus management
|
|
439
|
-
const dialog = screen.getByRole('dialog');
|
|
440
|
-
expect(dialog).toHaveAttribute('tabindex', '-1');
|
|
441
|
-
});
|
|
442
|
-
});
|
|
443
|
-
|
|
444
|
-
describe('Axe Accessibility Testing', () => {
|
|
445
|
-
it('should not have any accessibility violations', async () => {
|
|
446
|
-
const { container } = renderWithProviders(<DialogTestComponent isOpen={true} />);
|
|
447
|
-
|
|
448
|
-
await waitFor(() => {
|
|
449
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
450
|
-
});
|
|
451
|
-
|
|
452
|
-
const results = await axe(container);
|
|
453
|
-
expect(results).toHaveNoViolations();
|
|
454
|
-
});
|
|
455
|
-
|
|
456
|
-
it('should not have accessibility violations with full-screen dialog', async () => {
|
|
457
|
-
const { container } = renderWithProviders(<DialogTestComponent isOpen={true} size="full" />);
|
|
458
|
-
|
|
459
|
-
await waitFor(() => {
|
|
460
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
461
|
-
});
|
|
462
|
-
|
|
463
|
-
const results = await axe(container);
|
|
464
|
-
expect(results).toHaveNoViolations();
|
|
465
|
-
});
|
|
466
|
-
|
|
467
|
-
it('should not have accessibility violations without close button', async () => {
|
|
468
|
-
const { container } = renderWithProviders(<DialogTestComponent isOpen={true} showCloseButton={false} />);
|
|
469
|
-
|
|
470
|
-
await waitFor(() => {
|
|
471
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
472
|
-
});
|
|
473
|
-
|
|
474
|
-
const results = await axe(container);
|
|
475
|
-
expect(results).toHaveNoViolations();
|
|
476
|
-
});
|
|
477
|
-
});
|
|
478
|
-
|
|
479
|
-
describe('Integration with Form Elements', () => {
|
|
480
|
-
it('should maintain proper form accessibility within dialog', async () => {
|
|
481
|
-
const FormDialog = () => (
|
|
482
|
-
<Dialog open={true}>
|
|
483
|
-
<DialogContent>
|
|
484
|
-
<DialogHeader>
|
|
485
|
-
<DialogTitle>Form Dialog</DialogTitle>
|
|
486
|
-
<DialogDescription>Fill out this form</DialogDescription>
|
|
487
|
-
</DialogHeader>
|
|
488
|
-
<form role="form">
|
|
489
|
-
<div className="grid gap-4 py-4">
|
|
490
|
-
<div>
|
|
491
|
-
<label htmlFor="name">Name</label>
|
|
492
|
-
<Input id="name" placeholder="Enter your name" />
|
|
493
|
-
</div>
|
|
494
|
-
<div>
|
|
495
|
-
<label htmlFor="email">Email</label>
|
|
496
|
-
<Input id="email" type="email" placeholder="Enter your email" />
|
|
497
|
-
</div>
|
|
498
|
-
</div>
|
|
499
|
-
<DialogFooter>
|
|
500
|
-
<Button type="submit">Submit</Button>
|
|
501
|
-
</DialogFooter>
|
|
502
|
-
</form>
|
|
503
|
-
</DialogContent>
|
|
504
|
-
</Dialog>
|
|
505
|
-
);
|
|
506
|
-
|
|
507
|
-
renderWithProviders(<FormDialog />);
|
|
508
|
-
|
|
509
|
-
await waitFor(() => {
|
|
510
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
511
|
-
});
|
|
512
|
-
|
|
513
|
-
// Form elements should be properly associated with labels
|
|
514
|
-
expect(screen.getByLabelText('Name')).toBeInTheDocument();
|
|
515
|
-
expect(screen.getByLabelText('Email')).toBeInTheDocument();
|
|
516
|
-
|
|
517
|
-
// Form should be accessible
|
|
518
|
-
expect(screen.getByRole('form', { hidden: true })).toBeInTheDocument();
|
|
519
|
-
});
|
|
520
|
-
});
|
|
521
|
-
});
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file Dialog Auto Size Example
|
|
3
|
-
* @package @jmruthers/pace-core
|
|
4
|
-
* @module Components/Dialog/Examples
|
|
5
|
-
* @since 0.4.32
|
|
6
|
-
*
|
|
7
|
-
* Example demonstrating the new auto-size functionality for Dialog components.
|
|
8
|
-
* This shows how to use size="auto" to make dialogs automatically adjust their width to fit content.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import React from 'react';
|
|
12
|
-
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogBody, DialogFooter, DialogTrigger } from '../Dialog';
|
|
13
|
-
import { Button } from '../../Button/Button';
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Example: Auto-sizing dialog for data tables
|
|
17
|
-
* This dialog will automatically adjust its width to fit the table content
|
|
18
|
-
*/
|
|
19
|
-
export function AutoSizeDataTableDialog() {
|
|
20
|
-
return (
|
|
21
|
-
<Dialog>
|
|
22
|
-
<DialogTrigger asChild>
|
|
23
|
-
<Button>Import Recipe Data</Button>
|
|
24
|
-
</DialogTrigger>
|
|
25
|
-
<DialogContent size="auto">
|
|
26
|
-
<DialogHeader>
|
|
27
|
-
<DialogTitle>Import Recipe Data</DialogTitle>
|
|
28
|
-
<DialogDescription>
|
|
29
|
-
Upload a CSV file with recipe data. The file must contain exactly these columns:
|
|
30
|
-
dish_code, dish_name, mealtype_name, diettype_name, item_name, item_brand,
|
|
31
|
-
recipe_qtypp, recipe_uptake. The import will replace all existing recipe data
|
|
32
|
-
for dishes that appear in the file. Empty brand fields will be skipped.
|
|
33
|
-
</DialogDescription>
|
|
34
|
-
</DialogHeader>
|
|
35
|
-
<DialogBody>
|
|
36
|
-
<div className="space-y-4">
|
|
37
|
-
{/* File selection area */}
|
|
38
|
-
<div className="border-2 border-dashed border-main-300 rounded-lg p-8 text-center">
|
|
39
|
-
<div className="text-main-600 mb-2">Selected: cake_dish.csv</div>
|
|
40
|
-
<div className="text-main-500 text-sm">File selected, processing preview...</div>
|
|
41
|
-
<Button className="mt-4">Select Recipe File</Button>
|
|
42
|
-
</div>
|
|
43
|
-
|
|
44
|
-
{/* Data preview table */}
|
|
45
|
-
<div>
|
|
46
|
-
<h4 className="font-medium mb-2">Preview (first 5 rows)</h4>
|
|
47
|
-
<div className="overflow-x-auto">
|
|
48
|
-
<table className="w-full border border-main-200 rounded-md">
|
|
49
|
-
<thead className="bg-main-50">
|
|
50
|
-
<tr>
|
|
51
|
-
<th className="px-3 py-2 text-left text-sm font-medium border-b border-main-200">dish_code</th>
|
|
52
|
-
<th className="px-3 py-2 text-left text-sm font-medium border-b border-main-200">dish_name</th>
|
|
53
|
-
<th className="px-3 py-2 text-left text-sm font-medium border-b border-main-200">mealtype_name</th>
|
|
54
|
-
<th className="px-3 py-2 text-left text-sm font-medium border-b border-main-200">diettype_name</th>
|
|
55
|
-
<th className="px-3 py-2 text-left text-sm font-medium border-b border-main-200">item_name</th>
|
|
56
|
-
<th className="px-3 py-2 text-left text-sm font-medium border-b border-main-200">item_brand</th>
|
|
57
|
-
<th className="px-3 py-2 text-left text-sm font-medium border-b border-main-200">recipe_qtypp</th>
|
|
58
|
-
<th className="px-3 py-2 text-left text-sm font-medium border-b border-main-200">recipe_uptake</th>
|
|
59
|
-
</tr>
|
|
60
|
-
</thead>
|
|
61
|
-
<tbody>
|
|
62
|
-
<tr>
|
|
63
|
-
<td className="px-3 py-2 text-sm border-b border-main-100">BBQ</td>
|
|
64
|
-
<td className="px-3 py-2 text-sm border-b border-main-100">BBQ hamburgers and potato salad</td>
|
|
65
|
-
<td className="px-3 py-2 text-sm border-b border-main-100">Dinner</td>
|
|
66
|
-
<td className="px-3 py-2 text-sm border-b border-main-100">Standard</td>
|
|
67
|
-
<td className="px-3 py-2 text-sm border-b border-main-100">Lettuce iceberg shredded</td>
|
|
68
|
-
<td className="px-3 py-2 text-sm border-b border-main-100"></td>
|
|
69
|
-
<td className="px-3 py-2 text-sm border-b border-main-100">35</td>
|
|
70
|
-
<td className="px-3 py-2 text-sm border-b border-main-100">1</td>
|
|
71
|
-
</tr>
|
|
72
|
-
<tr>
|
|
73
|
-
<td className="px-3 py-2 text-sm border-b border-main-100">BBQ</td>
|
|
74
|
-
<td className="px-3 py-2 text-sm border-b border-main-100">BBQ hamburgers and potato salad</td>
|
|
75
|
-
<td className="px-3 py-2 text-sm border-b border-main-100">Dinner</td>
|
|
76
|
-
<td className="px-3 py-2 text-sm border-b border-main-100">Standard</td>
|
|
77
|
-
<td className="px-3 py-2 text-sm border-b border-main-100">Sauce tomato GF</td>
|
|
78
|
-
<td className="px-3 py-2 text-sm border-b border-main-100">Masterfoods</td>
|
|
79
|
-
<td className="px-3 py-2 text-sm border-b border-main-100">30</td>
|
|
80
|
-
<td className="px-3 py-2 text-sm border-b border-main-100">0.75</td>
|
|
81
|
-
</tr>
|
|
82
|
-
</tbody>
|
|
83
|
-
</table>
|
|
84
|
-
</div>
|
|
85
|
-
</div>
|
|
86
|
-
</div>
|
|
87
|
-
</DialogBody>
|
|
88
|
-
<DialogFooter>
|
|
89
|
-
<div className="flex justify-between items-center w-full">
|
|
90
|
-
<span className="text-sm text-main-600">Total rows to import: 281</span>
|
|
91
|
-
<div className="flex gap-2">
|
|
92
|
-
<Button variant="outline">Cancel</Button>
|
|
93
|
-
<Button>Import Recipes</Button>
|
|
94
|
-
</div>
|
|
95
|
-
</div>
|
|
96
|
-
</DialogFooter>
|
|
97
|
-
</DialogContent>
|
|
98
|
-
</Dialog>
|
|
99
|
-
);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Example: Auto-sizing dialog for forms
|
|
104
|
-
* This dialog will automatically adjust its width to fit the form content
|
|
105
|
-
*/
|
|
106
|
-
export function AutoSizeFormDialog() {
|
|
107
|
-
return (
|
|
108
|
-
<Dialog>
|
|
109
|
-
<DialogTrigger asChild>
|
|
110
|
-
<Button>Create User</Button>
|
|
111
|
-
</DialogTrigger>
|
|
112
|
-
<DialogContent size="auto">
|
|
113
|
-
<DialogHeader>
|
|
114
|
-
<DialogTitle>Create New User</DialogTitle>
|
|
115
|
-
<DialogDescription>
|
|
116
|
-
Fill out the form below to create a new user account.
|
|
117
|
-
</DialogDescription>
|
|
118
|
-
</DialogHeader>
|
|
119
|
-
<DialogBody>
|
|
120
|
-
<form className="space-y-4 min-w-96">
|
|
121
|
-
<div className="grid grid-cols-2 gap-4">
|
|
122
|
-
<div>
|
|
123
|
-
<label className="block text-sm font-medium mb-1">First Name</label>
|
|
124
|
-
<input className="w-full px-3 py-2 border border-main-200 rounded-md" />
|
|
125
|
-
</div>
|
|
126
|
-
<div>
|
|
127
|
-
<label className="block text-sm font-medium mb-1">Last Name</label>
|
|
128
|
-
<input className="w-full px-3 py-2 border border-main-200 rounded-md" />
|
|
129
|
-
</div>
|
|
130
|
-
</div>
|
|
131
|
-
<div>
|
|
132
|
-
<label className="block text-sm font-medium mb-1">Email</label>
|
|
133
|
-
<input type="email" className="w-full px-3 py-2 border border-main-200 rounded-md" />
|
|
134
|
-
</div>
|
|
135
|
-
<div>
|
|
136
|
-
<label className="block text-sm font-medium mb-1">Role</label>
|
|
137
|
-
<select className="w-full px-3 py-2 border border-main-200 rounded-md">
|
|
138
|
-
<option>User</option>
|
|
139
|
-
<option>Admin</option>
|
|
140
|
-
<option>Manager</option>
|
|
141
|
-
</select>
|
|
142
|
-
</div>
|
|
143
|
-
</form>
|
|
144
|
-
</DialogBody>
|
|
145
|
-
<DialogFooter>
|
|
146
|
-
<Button variant="outline">Cancel</Button>
|
|
147
|
-
<Button>Create User</Button>
|
|
148
|
-
</DialogFooter>
|
|
149
|
-
</DialogContent>
|
|
150
|
-
</Dialog>
|
|
151
|
-
);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
export default {
|
|
155
|
-
AutoSizeDataTableDialog,
|
|
156
|
-
AutoSizeFormDialog,
|
|
157
|
-
};
|