@jmruthers/pace-core 0.4.1 → 0.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -1
- package/README.md +231 -229
- package/dist/{DataTable-2LB6HI6V.js → DataTable-ZQDRE46Q.js} +15 -17
- package/dist/{DataTable-BDBqkU-i.d.ts → DataTable-ltTFXHS3.d.ts} +25 -51
- package/dist/{Table-CIm9IWqk.d.ts → PublicLoadingSpinner-Bq_-BeK-.d.ts} +635 -122
- package/dist/{UnifiedAuthProvider-V7y63NjT.d.ts → RBACProvider-BO4ilsQB.d.ts} +11 -36
- package/dist/UnifiedAuthProvider-DGQsy-vY.d.ts +103 -0
- package/dist/{api-AIJ3IJX3.js → api-H5A3H4IR.js} +6 -4
- package/dist/{appConfig-fB1pP_v3.d.ts → appConfig-BVGyuvI7.d.ts} +1 -1
- package/dist/appNameResolver-7GHF5ED2.js +22 -0
- package/dist/{audit-PD5L5ZSC.js → audit-BUW3LMJB.js} +3 -3
- package/dist/chunk-5H3C2SWM.js +3293 -0
- package/dist/chunk-5H3C2SWM.js.map +1 -0
- package/dist/chunk-5SIXIV7R.js +1925 -0
- package/dist/chunk-5SIXIV7R.js.map +1 -0
- package/dist/{chunk-YNU5QJ4S.js → chunk-7BNPOCLL.js} +22 -5
- package/dist/chunk-7BNPOCLL.js.map +1 -0
- package/dist/{chunk-4ZTIEYU2.js → chunk-CDQ3PX7L.js} +1 -1
- package/dist/chunk-CDQ3PX7L.js.map +1 -0
- package/dist/chunk-GNTALZV3.js +17 -0
- package/dist/chunk-GNTALZV3.js.map +1 -0
- package/dist/chunk-GWSBHC4J.js +1349 -0
- package/dist/chunk-GWSBHC4J.js.map +1 -0
- package/dist/{chunk-JUUNUW3O.js → chunk-HD7PYDUV.js} +14 -5
- package/dist/chunk-HD7PYDUV.js.map +1 -0
- package/dist/{chunk-H4PZ4B3Y.js → chunk-HXX35Q2M.js} +113 -27
- package/dist/chunk-HXX35Q2M.js.map +1 -0
- package/dist/chunk-K6B7BLSE.js +388 -0
- package/dist/chunk-K6B7BLSE.js.map +1 -0
- package/dist/chunk-M4RW7PIP.js +5441 -0
- package/dist/chunk-M4RW7PIP.js.map +1 -0
- package/dist/chunk-MZBUOP4P.js +119 -0
- package/dist/chunk-MZBUOP4P.js.map +1 -0
- package/dist/chunk-N2EUGZRW.js +98 -0
- package/dist/chunk-N2EUGZRW.js.map +1 -0
- package/dist/chunk-NQ4TOOO6.js +20 -0
- package/dist/chunk-NQ4TOOO6.js.map +1 -0
- package/dist/{chunk-DC5AMYBS.js → chunk-PLDDJCW6.js} +15 -5
- package/dist/chunk-PLDDJCW6.js.map +1 -0
- package/dist/{chunk-IOX76PSM.js → chunk-PVMYVQSM.js} +270 -28
- package/dist/chunk-PVMYVQSM.js.map +1 -0
- package/dist/{chunk-4MCJAK7J.js → chunk-QKHFMQ5R.js} +2155 -4853
- package/dist/chunk-QKHFMQ5R.js.map +1 -0
- package/dist/chunk-QVYBYGT2.js +428 -0
- package/dist/chunk-QVYBYGT2.js.map +1 -0
- package/dist/{chunk-WHLSWC6W.js → chunk-SS3E6QLB.js} +16 -61
- package/dist/chunk-SS3E6QLB.js.map +1 -0
- package/dist/chunk-WJARTBCT.js +128 -0
- package/dist/chunk-WJARTBCT.js.map +1 -0
- package/dist/chunk-YDJW5XTN.js +84 -0
- package/dist/chunk-YDJW5XTN.js.map +1 -0
- package/dist/components.d.ts +907 -10
- package/dist/components.js +3237 -204
- package/dist/components.js.map +1 -1
- package/dist/{database-CAMsquLm.d.ts → database-C3Szpi5J.d.ts} +28 -11
- package/dist/hooks.d.ts +7 -6
- package/dist/hooks.js +33 -11
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +247 -111
- package/dist/index.js +330 -185
- package/dist/index.js.map +1 -1
- package/dist/{organisation-DLNNQhPB.d.ts → organisation-CO3Sh3_D.d.ts} +1 -1
- package/dist/providers.d.ts +5 -4
- package/dist/providers.js +14 -5
- package/dist/rbac/index.d.ts +964 -839
- package/dist/rbac/index.js +58 -1970
- package/dist/rbac/index.js.map +1 -1
- package/dist/styles/core.css +364 -0
- package/dist/styles/fonts/georama-italic.woff2 +0 -0
- package/dist/styles/fonts/georama.woff2 +0 -0
- package/dist/styles/fonts/open-sans-italic.woff2 +0 -0
- package/dist/styles/fonts/open-sans.woff2 +0 -0
- package/dist/styles/fonts/reddit-mono.woff2 +0 -0
- package/dist/styles/index.d.ts +36 -0
- package/dist/styles/index.js +24 -0
- package/dist/styles/index.js.map +1 -0
- package/dist/theming/runtime.d.ts +73 -0
- package/dist/theming/runtime.js +16 -0
- package/dist/theming/runtime.js.map +1 -0
- package/dist/{types-Bavn44NW.d.ts → types-BRDU7N6w.d.ts} +79 -33
- package/dist/types.d.ts +5 -5
- package/dist/types.js +7 -2
- package/dist/types.js.map +1 -1
- package/dist/{unified-BtRpPbmp.d.ts → unified-CMPjE_fv.d.ts} +0 -1
- package/dist/usePublicRouteParams-B2OcAsur.d.ts +477 -0
- package/dist/utils.d.ts +83 -60
- package/dist/utils.js +293 -55651
- package/dist/utils.js.map +1 -1
- package/dist/validation.d.ts +1 -1
- package/dist/validation.js +1 -1
- package/docs/INDEX.md +192 -0
- package/docs/README.md +46 -32
- package/docs/api/README.md +231 -229
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/InvalidScopeError.md +73 -0
- package/docs/api/classes/MissingUserContextError.md +66 -0
- package/docs/api/classes/OrganisationContextRequiredError.md +66 -0
- package/docs/api/classes/PermissionDeniedError.md +73 -0
- package/docs/api/classes/PublicErrorBoundary.md +132 -0
- package/docs/api/classes/RBACAuditManager.md +270 -0
- package/docs/api/classes/RBACCache.md +284 -0
- package/docs/api/classes/RBACEngine.md +141 -0
- package/docs/api/classes/RBACError.md +76 -0
- package/docs/api/classes/RBACNotInitializedError.md +66 -0
- package/docs/api/classes/SecureSupabaseClient.md +135 -0
- package/docs/api/interfaces/AggregateConfig.md +4 -4
- package/docs/api/interfaces/ButtonProps.md +2 -2
- package/docs/api/interfaces/CardProps.md +2 -2
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +1 -1
- package/docs/api/interfaces/DataAccessRecord.md +96 -0
- package/docs/api/interfaces/DataTableAction.md +98 -7
- package/docs/api/interfaces/DataTableColumn.md +131 -12
- package/docs/api/interfaces/DataTableProps.md +77 -274
- package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
- package/docs/api/interfaces/EmptyStateConfig.md +5 -5
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +235 -0
- package/docs/api/interfaces/EventContextType.md +7 -7
- package/docs/api/interfaces/EventLogoProps.md +152 -0
- package/docs/api/interfaces/EventProviderProps.md +2 -2
- package/docs/api/interfaces/FileSizeLimits.md +7 -0
- package/docs/api/interfaces/FileUploadProps.md +154 -0
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +115 -0
- package/docs/api/interfaces/InputProps.md +2 -2
- package/docs/api/interfaces/LabelProps.md +1 -1
- package/docs/api/interfaces/LoginFormProps.md +1 -1
- package/docs/api/interfaces/NavigationAccessRecord.md +107 -0
- package/docs/api/interfaces/NavigationContextType.md +164 -0
- package/docs/api/interfaces/NavigationGuardProps.md +139 -0
- package/docs/api/interfaces/NavigationItem.md +1 -1
- package/docs/api/interfaces/NavigationMenuProps.md +1 -1
- package/docs/api/interfaces/NavigationProviderProps.md +117 -0
- 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 +26 -26
- package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
- package/docs/api/interfaces/PageAccessRecord.md +85 -0
- package/docs/api/interfaces/PagePermissionContextType.md +140 -0
- package/docs/api/interfaces/PagePermissionGuardProps.md +153 -0
- package/docs/api/interfaces/PagePermissionProviderProps.md +119 -0
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/PermissionEnforcerProps.md +153 -0
- package/docs/api/interfaces/PublicErrorBoundaryProps.md +94 -0
- package/docs/api/interfaces/PublicErrorBoundaryState.md +68 -0
- package/docs/api/interfaces/PublicLoadingSpinnerProps.md +86 -0
- package/docs/api/interfaces/PublicPageFooterProps.md +112 -0
- package/docs/api/interfaces/PublicPageHeaderProps.md +138 -0
- package/docs/api/interfaces/PublicPageLayoutProps.md +138 -0
- package/docs/api/interfaces/RBACConfig.md +99 -0
- package/docs/api/interfaces/RBACContextType.md +474 -0
- package/docs/api/interfaces/RBACLogger.md +112 -0
- package/docs/api/interfaces/RBACProviderProps.md +107 -0
- package/docs/api/interfaces/RoleBasedRouterContextType.md +151 -0
- package/docs/api/interfaces/RoleBasedRouterProps.md +156 -0
- package/docs/api/interfaces/RouteAccessRecord.md +107 -0
- package/docs/api/interfaces/RouteConfig.md +121 -0
- package/docs/api/interfaces/SecureDataContextType.md +168 -0
- package/docs/api/interfaces/SecureDataProviderProps.md +132 -0
- package/docs/api/interfaces/StorageConfig.md +41 -0
- package/docs/api/interfaces/StorageFileInfo.md +74 -0
- package/docs/api/interfaces/StorageFileMetadata.md +140 -0
- package/docs/api/interfaces/StorageListOptions.md +86 -0
- package/docs/api/interfaces/StorageListResult.md +41 -0
- package/docs/api/interfaces/StorageUploadOptions.md +88 -0
- package/docs/api/interfaces/StorageUploadResult.md +63 -0
- package/docs/api/interfaces/StorageUrlOptions.md +47 -0
- package/docs/api/interfaces/StyleImport.md +2 -2
- package/docs/api/interfaces/ToastActionElement.md +1 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +465 -64
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +95 -9
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +136 -0
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +123 -0
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +87 -0
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +81 -0
- package/docs/api/interfaces/UsePublicEventOptions.md +34 -0
- package/docs/api/interfaces/UsePublicEventReturn.md +68 -0
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +94 -0
- package/docs/api/interfaces/UserEventAccess.md +14 -14
- package/docs/api/interfaces/UserMenuProps.md +6 -6
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +4233 -1134
- package/docs/api-reference/components.md +761 -43
- package/docs/api-reference/hooks.md +126 -0
- package/docs/api-reference/providers.md +141 -65
- package/docs/api-reference/types.md +66 -36
- package/docs/api-reference/utilities.md +1 -1
- package/docs/architecture/README.md +1 -2
- package/docs/best-practices/README.md +400 -0
- package/docs/consuming-app-example.md +42 -96
- package/docs/consuming-app-vite-config.md +233 -0
- package/docs/core-concepts/events.md +3 -3
- package/docs/core-concepts/organisations.md +0 -1
- package/docs/core-concepts/rbac-system.md +23 -10
- package/docs/documentation-style-checklist.md +8 -2
- package/docs/examples/navigation-menu-auth-fix.md +344 -0
- package/docs/getting-started/examples/README.md +15 -1
- package/docs/getting-started/examples/basic-auth-app.md +444 -119
- package/docs/getting-started/examples/full-featured-app.md +6 -6
- package/docs/getting-started/installation.md +231 -52
- package/docs/getting-started/quick-start.md +121 -24
- package/docs/implementation-guides/app-layout.md +133 -108
- package/docs/implementation-guides/data-tables.md +1011 -29
- package/docs/implementation-guides/forms.md +3 -3
- package/docs/implementation-guides/hierarchical-datatable.md +850 -0
- package/docs/implementation-guides/large-datasets.md +2 -2
- package/docs/implementation-guides/navigation.md +1 -1
- package/docs/implementation-guides/permission-enforcement.md +4 -4
- package/docs/implementation-guides/public-pages.md +752 -0
- package/docs/migration/README.md +18 -8
- package/docs/migration/quick-migration-guide.md +320 -0
- package/docs/migration/rbac-migration.md +50 -0
- package/docs/migration/v0.4.15-tailwind-scanning.md +272 -0
- package/docs/migration/v0.4.16-css-first-approach.md +306 -0
- package/docs/migration/v0.4.17-source-path-fix.md +229 -0
- package/docs/migration-guide.md +77 -105
- package/docs/performance/README.md +1 -4
- package/docs/print-components/README.md +258 -0
- package/docs/print-components/api-reference.md +636 -0
- package/docs/print-components/examples/README.md +204 -0
- package/docs/print-components/examples/basic-report.tsx +92 -0
- package/docs/print-components/examples/card-catalog.tsx +149 -0
- package/docs/print-components/examples/cover-page-report.tsx +163 -0
- package/docs/print-components/quick-start.md +363 -0
- package/docs/quick-reference.md +53 -36
- package/docs/rbac/README.md +136 -69
- package/docs/rbac/api-reference.md +39 -8
- package/docs/rbac/examples.md +237 -66
- package/docs/rbac/getting-started.md +131 -16
- package/docs/rbac/quick-start.md +499 -323
- package/docs/rbac/troubleshooting.md +240 -262
- package/docs/security/README.md +50 -1
- package/docs/styles/README.md +226 -111
- package/docs/testing/README.md +6 -10
- package/docs/troubleshooting/README.md +497 -0
- package/docs/troubleshooting/common-issues.md +604 -14
- package/docs/troubleshooting/styling-issues.md +219 -0
- package/docs/troubleshooting/tailwind-content-scanning.md +213 -0
- package/docs/usage.md +54 -91
- package/docs/visual-testing.md +0 -7
- package/package.json +47 -25
- package/src/__mocks__/lucide-react.ts +181 -0
- 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 +71 -0
- package/src/__tests__/templates/accessibility.test.template.tsx +279 -0
- package/src/__tests__/templates/component.test.template.tsx +144 -0
- package/src/__tests__/templates/hook.test.template.ts +173 -0
- package/src/__tests__/templates/integration.test.template.tsx +199 -0
- package/src/__tests__/types/test.types.ts +106 -0
- package/src/components/Alert/Alert.test.tsx +496 -0
- package/src/components/Alert/Alert.tsx +134 -0
- package/src/components/Alert/index.ts +2 -0
- package/src/components/Avatar/Avatar.test.tsx +484 -0
- package/src/components/Avatar/Avatar.tsx +84 -0
- package/src/components/Avatar/index.ts +2 -0
- package/src/components/Button/Button.test.tsx +662 -0
- package/src/components/Button/Button.tsx +270 -0
- package/src/components/Button/index.ts +2 -0
- package/src/components/Card/Card.test.tsx +593 -0
- package/src/components/Card/Card.tsx +271 -0
- package/src/components/Card/index.ts +1 -0
- package/src/components/Checkbox/Checkbox.test.tsx +461 -0
- package/src/components/Checkbox/Checkbox.tsx +75 -0
- package/src/components/Checkbox/__mocks__/Checkbox.tsx +2 -0
- package/src/components/Checkbox/index.ts +2 -0
- package/src/components/DataTable/DataTable.tsx +446 -0
- package/src/components/DataTable/__tests__/README.md +145 -0
- package/src/components/DataTable/__tests__/mocks/MockRBACProvider.tsx +66 -0
- package/src/components/DataTable/__tests__/test-utils/dataFactories.ts +103 -0
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +381 -0
- package/src/components/DataTable/__tests__/test-utils.ts +94 -0
- package/src/components/DataTable/components/AccessDeniedPage.tsx +168 -0
- package/src/components/DataTable/components/ActionButtons.tsx +194 -0
- package/src/components/DataTable/components/BulkOperationsDropdown.tsx +160 -0
- package/src/components/DataTable/components/ColumnFilter.tsx +114 -0
- package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +100 -0
- package/src/components/DataTable/components/DataTableBody.tsx +461 -0
- package/src/components/DataTable/components/DataTableCore.tsx +1027 -0
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +214 -0
- package/src/components/DataTable/components/DataTableModals.tsx +87 -0
- package/src/components/DataTable/components/DataTableToolbar.tsx +262 -0
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +144 -0
- package/src/components/DataTable/components/EditableRow.tsx +159 -0
- package/src/components/DataTable/components/EmptyState.tsx +64 -0
- package/src/components/DataTable/components/ExpandButton.tsx +113 -0
- package/src/components/DataTable/components/FilterRow.tsx +100 -0
- package/src/components/DataTable/components/GroupHeader.tsx +42 -0
- package/src/components/DataTable/components/GroupingDropdown.tsx +96 -0
- package/src/components/DataTable/components/ImportModal.tsx +345 -0
- package/src/components/DataTable/components/LoadingState.tsx +12 -0
- package/src/components/DataTable/components/PaginationControls.tsx +332 -0
- package/src/components/DataTable/components/UnifiedTableBody.tsx +742 -0
- package/src/components/DataTable/components/ViewRowModal.tsx +68 -0
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +513 -0
- package/src/components/DataTable/components/index.ts +16 -0
- package/src/components/DataTable/context/DataTableContext.tsx +97 -0
- package/src/components/DataTable/core/ActionManager.ts +235 -0
- package/src/components/DataTable/core/ColumnFactory.ts +268 -0
- package/src/components/DataTable/core/ColumnManager.ts +205 -0
- package/src/components/DataTable/core/DataManager.ts +188 -0
- package/src/components/DataTable/core/DataTableContext.tsx +181 -0
- package/src/components/DataTable/core/LocalDataAdapter.ts +264 -0
- package/src/components/DataTable/core/PluginRegistry.ts +229 -0
- package/src/components/DataTable/core/StateManager.ts +311 -0
- package/src/components/DataTable/core/index.ts +8 -0
- package/src/components/DataTable/core/interfaces.ts +338 -0
- package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +419 -0
- package/src/components/DataTable/examples/HierarchicalExample.tsx +475 -0
- package/src/components/DataTable/examples/InitialPageSizeExample.tsx +176 -0
- package/src/components/DataTable/examples/PerformanceExample.tsx +505 -0
- package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +95 -0
- package/src/components/DataTable/hooks/useColumnReordering.ts +110 -0
- package/src/components/DataTable/hooks/useDataTableState.ts +325 -0
- package/src/components/DataTable/hooks/useHierarchicalState.ts +174 -0
- package/src/components/DataTable/index.ts +68 -0
- package/src/components/DataTable/styles.ts +171 -0
- package/src/components/DataTable/types.ts +511 -0
- package/src/components/DataTable/utils/debugTools.ts +583 -0
- package/src/components/DataTable/utils/errorHandling.ts +494 -0
- package/src/components/DataTable/utils/exportUtils.ts +126 -0
- package/src/components/DataTable/utils/flexibleImport.ts +510 -0
- package/src/components/DataTable/utils/hierarchicalSorting.ts +151 -0
- package/src/components/DataTable/utils/hierarchicalUtils.ts +218 -0
- package/src/components/DataTable/utils/index.ts +1 -0
- package/src/components/DataTable/utils/performanceUtils.ts +351 -0
- package/src/components/Dialog/Dialog.test.tsx +1139 -0
- package/src/components/Dialog/Dialog.tsx +782 -0
- package/src/components/Dialog/README.md +804 -0
- package/src/components/Dialog/examples/BasicHtmlTest.tsx +55 -0
- package/src/components/Dialog/examples/DebugHtmlExample.tsx +68 -0
- package/src/components/Dialog/examples/HtmlDialogExample.tsx +202 -0
- package/src/components/Dialog/examples/SimpleHtmlTest.tsx +61 -0
- package/src/components/Dialog/examples/SmartDialogExample.tsx +322 -0
- package/src/components/Dialog/index.ts +12 -0
- package/src/components/Dialog/utils/safeHtml.ts +185 -0
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +752 -0
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +312 -0
- package/src/components/ErrorBoundary/index.ts +8 -0
- package/src/components/EventSelector/EventSelector.tsx +360 -0
- package/src/components/EventSelector/index.ts +3 -0
- package/src/components/EventSelector/types.ts +79 -0
- package/src/components/FileUpload/FileUpload.example.tsx +218 -0
- package/src/components/FileUpload/FileUpload.test.tsx +665 -0
- package/src/components/FileUpload/FileUpload.tsx +237 -0
- package/src/components/FileUpload/index.ts +6 -0
- package/src/components/Footer/Footer.test.tsx +482 -0
- package/src/components/Footer/Footer.tsx +197 -0
- package/src/components/Footer/index.ts +17 -0
- package/src/components/Form/Form.test.tsx +1158 -0
- package/src/components/Form/Form.tsx +166 -0
- package/src/components/Form/FormErrorSummary.tsx +113 -0
- package/src/components/Form/FormField.tsx +249 -0
- package/src/components/Form/FormFieldset.tsx +127 -0
- package/src/components/Form/FormLiveRegion.tsx +198 -0
- package/src/components/Form/index.ts +26 -0
- package/src/components/Header/Header.test.tsx +582 -0
- package/src/components/Header/Header.tsx +301 -0
- package/src/components/Header/index.ts +4 -0
- package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +489 -0
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +164 -0
- package/src/components/InactivityWarningModal/index.ts +9 -0
- package/src/components/Input/Input.test.tsx +466 -0
- package/src/components/Input/Input.tsx +201 -0
- package/src/components/Input/__mocks__/Input.tsx +2 -0
- package/src/components/Input/index.ts +9 -0
- package/src/components/Label/Label.tsx +186 -0
- package/src/components/Label/index.ts +2 -0
- package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +450 -0
- package/src/components/LoadingSpinner/LoadingSpinner.tsx +98 -0
- package/src/components/LoadingSpinner/index.ts +3 -0
- package/src/components/LoginForm/LoginForm.test.tsx +816 -0
- package/src/components/LoginForm/LoginForm.tsx +273 -0
- package/src/components/LoginForm/index.ts +3 -0
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +883 -0
- package/src/components/NavigationMenu/NavigationMenu.tsx +698 -0
- package/src/components/NavigationMenu/index.ts +10 -0
- package/src/components/NavigationMenu/types.ts +85 -0
- package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +748 -0
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +304 -0
- package/src/components/OrganisationSelector/index.ts +9 -0
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +891 -0
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +699 -0
- package/src/components/PaceAppLayout/README.md +278 -0
- package/src/components/PaceAppLayout/index.ts +1 -0
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +475 -0
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +221 -0
- package/src/components/PaceLoginPage/index.ts +1 -0
- package/src/components/PasswordReset/PasswordChangeForm.test.tsx +621 -0
- package/src/components/PasswordReset/PasswordChangeForm.tsx +186 -0
- package/src/components/PasswordReset/PasswordResetForm.test.tsx +605 -0
- package/src/components/PasswordReset/PasswordResetForm.tsx +201 -0
- package/src/components/PasswordReset/index.ts +4 -0
- package/src/components/PrintButton/PrintButton.tsx +321 -0
- package/src/components/PrintButton/PrintButtonGroup.tsx +84 -0
- package/src/components/PrintButton/PrintToolbar.tsx +94 -0
- package/src/components/PrintButton/examples/PrintButtonShowcase.tsx +438 -0
- package/src/components/PrintButton/index.ts +33 -0
- package/src/components/PrintButton/types.ts +173 -0
- package/src/components/PrintCard/PrintCard.tsx +154 -0
- package/src/components/PrintCard/PrintCardContent.tsx +57 -0
- package/src/components/PrintCard/PrintCardFooter.tsx +60 -0
- package/src/components/PrintCard/PrintCardGrid.tsx +91 -0
- package/src/components/PrintCard/PrintCardHeader.tsx +78 -0
- package/src/components/PrintCard/PrintCardImage.tsx +81 -0
- package/src/components/PrintCard/examples/PrintCardShowcase.tsx +239 -0
- package/src/components/PrintCard/index.ts +34 -0
- package/src/components/PrintCard/types.ts +171 -0
- package/src/components/PrintDataTable/PrintDataTable.tsx +215 -0
- package/src/components/PrintDataTable/PrintTableGroup.tsx +90 -0
- package/src/components/PrintDataTable/PrintTableRow.tsx +76 -0
- package/src/components/PrintDataTable/index.ts +25 -0
- package/src/components/PrintDataTable/types.ts +67 -0
- package/src/components/PrintFooter/PrintFooter.tsx +183 -0
- package/src/components/PrintFooter/PrintFooterContent.tsx +71 -0
- package/src/components/PrintFooter/PrintFooterInfo.tsx +86 -0
- package/src/components/PrintFooter/PrintPageNumber.tsx +90 -0
- package/src/components/PrintFooter/examples/PrintFooterShowcase.tsx +390 -0
- package/src/components/PrintFooter/index.ts +30 -0
- package/src/components/PrintFooter/types.ts +149 -0
- package/src/components/PrintGrid/PrintGrid.tsx +180 -0
- package/src/components/PrintGrid/PrintGridBreakpoint.tsx +109 -0
- package/src/components/PrintGrid/PrintGridContainer.tsx +128 -0
- package/src/components/PrintGrid/PrintGridItem.tsx +220 -0
- package/src/components/PrintGrid/examples/PrintGridShowcase.tsx +359 -0
- package/src/components/PrintGrid/index.ts +31 -0
- package/src/components/PrintGrid/types.ts +159 -0
- package/src/components/PrintHeader/PrintCoverHeader.tsx +230 -0
- package/src/components/PrintHeader/PrintHeader.tsx +150 -0
- package/src/components/PrintHeader/index.ts +17 -0
- package/src/components/PrintHeader/types.ts +42 -0
- package/src/components/PrintLayout/PrintLayout.tsx +122 -0
- package/src/components/PrintLayout/PrintLayoutContext.tsx +66 -0
- package/src/components/PrintLayout/PrintPageBreak.tsx +52 -0
- package/src/components/PrintLayout/examples/PrintShowcase.tsx +230 -0
- package/src/components/PrintLayout/index.ts +19 -0
- package/src/components/PrintLayout/types.ts +37 -0
- package/src/components/PrintPageBreak/PrintPageBreak.tsx +120 -0
- package/src/components/PrintPageBreak/PrintPageBreakGroup.tsx +90 -0
- package/src/components/PrintPageBreak/PrintPageBreakIndicator.tsx +112 -0
- package/src/components/PrintPageBreak/examples/PrintPageBreakShowcase.tsx +279 -0
- package/src/components/PrintPageBreak/index.ts +23 -0
- package/src/components/PrintPageBreak/types.ts +94 -0
- package/src/components/PrintSection/PrintColumn.tsx +104 -0
- package/src/components/PrintSection/PrintDivider.tsx +101 -0
- package/src/components/PrintSection/PrintSection.tsx +129 -0
- package/src/components/PrintSection/PrintSectionContent.tsx +75 -0
- package/src/components/PrintSection/PrintSectionHeader.tsx +97 -0
- package/src/components/PrintSection/examples/PrintSectionShowcase.tsx +258 -0
- package/src/components/PrintSection/index.ts +33 -0
- package/src/components/PrintSection/types.ts +155 -0
- package/src/components/PrintText/PrintText.tsx +116 -0
- package/src/components/PrintText/index.ts +16 -0
- package/src/components/PrintText/types.ts +24 -0
- package/src/components/Progress/Progress.tsx +116 -0
- package/src/components/Progress/index.ts +3 -0
- package/src/components/PublicLayout/EventLogo.tsx +287 -0
- package/src/components/PublicLayout/PublicErrorBoundary.tsx +279 -0
- package/src/components/PublicLayout/PublicLoadingSpinner.tsx +208 -0
- package/src/components/PublicLayout/PublicPageContextChecker.tsx +130 -0
- package/src/components/PublicLayout/PublicPageDebugger.tsx +104 -0
- package/src/components/PublicLayout/PublicPageDiagnostic.tsx +162 -0
- package/src/components/PublicLayout/PublicPageFooter.tsx +124 -0
- package/src/components/PublicLayout/PublicPageHeader.tsx +178 -0
- package/src/components/PublicLayout/PublicPageLayout.tsx +232 -0
- package/src/components/PublicLayout/PublicPageProvider.tsx +137 -0
- package/src/components/PublicLayout/index.ts +51 -0
- package/src/components/Select/Select.test.tsx +948 -0
- package/src/components/Select/Select.tsx +660 -0
- package/src/components/Select/index.ts +1 -0
- package/src/components/SuperAdminGuard.tsx +116 -0
- package/src/components/Table/Table.tsx +222 -0
- package/src/components/Table/index.ts +11 -0
- package/src/components/Toast/Toast.test.tsx +586 -0
- package/src/components/Toast/Toast.tsx +339 -0
- package/src/components/Toast/index.ts +14 -0
- package/src/components/Tooltip/Tooltip.test.tsx +852 -0
- package/src/components/Tooltip/Tooltip.tsx +167 -0
- package/src/components/Tooltip/index.ts +7 -0
- package/src/components/UserMenu/UserMenu.test.tsx +702 -0
- package/src/components/UserMenu/UserMenu.tsx +243 -0
- package/src/components/UserMenu/index.ts +3 -0
- package/src/components/examples/PermissionExample.tsx +150 -0
- package/src/components/index.ts +434 -0
- package/src/components.ts +19 -0
- package/src/constants/performance.ts +14 -0
- package/src/examples/CorrectPublicPageImplementation.tsx +301 -0
- package/src/examples/PublicEventPage.tsx +274 -0
- package/src/examples/PublicPageApp.tsx +308 -0
- package/src/examples/PublicPageUsageExample.tsx +216 -0
- package/src/hooks/index.ts +56 -0
- package/src/hooks/public/index.ts +34 -0
- package/src/hooks/public/usePublicEvent.ts +261 -0
- package/src/hooks/public/usePublicEventLogo.ts +285 -0
- package/src/hooks/public/usePublicRouteParams.ts +259 -0
- package/src/hooks/useAppConfig.ts +94 -0
- package/src/hooks/useComponentPerformance.ts +39 -0
- package/src/hooks/useCounter.test.ts +135 -0
- package/src/hooks/useDataTablePerformance.ts +387 -0
- package/src/hooks/useDataTableState.ts +110 -0
- package/src/hooks/useDebounce.test.ts +375 -0
- package/src/hooks/useDebounce.ts +18 -0
- package/src/hooks/useFocusManagement.ts +161 -0
- package/src/hooks/useFocusTrap.ts +155 -0
- package/src/hooks/useInactivityTracker.ts +372 -0
- package/src/hooks/useIsMobile.ts +42 -0
- package/src/hooks/useKeyboardShortcuts.ts +237 -0
- package/src/hooks/useOrganisationPermissions.test.ts +528 -0
- package/src/hooks/useOrganisationPermissions.ts +208 -0
- package/src/hooks/useOrganisationSecurity.test.ts +734 -0
- package/src/hooks/useOrganisationSecurity.ts +262 -0
- package/src/hooks/usePerformanceMonitor.ts +128 -0
- package/src/hooks/usePermissionCache.test.ts +542 -0
- package/src/hooks/usePermissionCache.ts +455 -0
- package/src/hooks/useSecureDataAccess.ts +586 -0
- package/src/hooks/useStorage.ts +274 -0
- package/src/hooks/useToast.ts +242 -0
- package/src/hooks/useZodForm.ts +28 -0
- package/src/index.ts +199 -0
- package/src/providers/AuthProvider.tsx +369 -0
- package/src/providers/EventProvider.tsx +324 -0
- package/src/providers/InactivityProvider.tsx +238 -0
- package/src/providers/OrganisationProvider.tsx +588 -0
- package/src/providers/UnifiedAuthProvider.tsx +327 -0
- package/src/providers/index.ts +17 -0
- package/src/rbac/README.md +885 -0
- package/src/rbac/__tests__/integration.test.tsx +218 -0
- package/src/rbac/adapters.tsx +726 -0
- package/src/rbac/api.test.ts +441 -0
- package/src/rbac/api.ts +339 -0
- package/src/rbac/audit-enhanced.ts +339 -0
- package/src/rbac/audit.ts +338 -0
- package/src/rbac/cache.ts +215 -0
- package/src/rbac/components/EnhancedNavigationMenu.tsx +294 -0
- package/src/rbac/components/NavigationGuard.tsx +294 -0
- package/src/rbac/components/NavigationProvider.tsx +314 -0
- package/src/rbac/components/PagePermissionGuard.tsx +430 -0
- package/src/rbac/components/PagePermissionProvider.tsx +274 -0
- package/src/rbac/components/PermissionEnforcer.tsx +307 -0
- package/src/rbac/components/RoleBasedRouter.tsx +425 -0
- package/src/rbac/components/SecureDataProvider.tsx +319 -0
- package/src/rbac/components/index.ts +64 -0
- package/src/rbac/config.ts +133 -0
- package/src/rbac/docs/event-based-apps.md +285 -0
- package/src/rbac/engine.ts +1026 -0
- package/src/rbac/eslint-rules.js +285 -0
- package/src/rbac/examples/CompleteRBACExample.tsx +323 -0
- package/src/rbac/examples/EventBasedApp.tsx +238 -0
- package/src/rbac/hooks/index.ts +21 -0
- package/src/rbac/hooks/useCan.test.ts +461 -0
- package/src/rbac/hooks/usePermissions.test.ts +359 -0
- package/src/rbac/hooks/usePermissions.ts +567 -0
- package/src/rbac/hooks/useRBAC.simple.test.ts +90 -0
- package/src/rbac/hooks/useRBAC.test.ts +503 -0
- package/src/rbac/hooks/useRBAC.ts +262 -0
- package/src/rbac/index.ts +109 -0
- package/src/rbac/permissions.ts +293 -0
- package/src/rbac/providers/RBACProvider.tsx +634 -0
- package/src/rbac/providers/__tests__/RBACProvider.test.tsx +687 -0
- package/src/rbac/providers/index.ts +11 -0
- package/src/rbac/secureClient.ts +244 -0
- package/src/rbac/security.ts +346 -0
- package/src/rbac/testing/index.tsx +340 -0
- package/src/rbac/types.ts +343 -0
- package/src/rbac/utils/eventContext.ts +83 -0
- package/src/styles/core.css +364 -0
- package/src/styles/index.ts +51 -0
- package/src/theming/runtime.ts +187 -0
- package/src/types/database.ts +472 -0
- package/src/types/guards.ts +30 -0
- package/src/types/index.ts +25 -0
- package/src/types/organisation.ts +184 -0
- package/src/types/security.ts +70 -0
- package/src/types/supabase.ts +166 -0
- package/src/types/theme.ts +6 -0
- package/src/types/unified.ts +262 -0
- package/src/types/validation.ts +164 -0
- package/src/types/vitest-globals.d.ts +43 -0
- package/src/utils/__mocks__/supabaseMock.ts +75 -0
- package/src/utils/__mocks__/supabaseMock.tsx +198 -0
- package/src/utils/appConfig.ts +47 -0
- package/src/utils/appIdResolver.ts +130 -0
- package/src/utils/appNameResolver.ts +190 -0
- package/src/utils/audit.ts +127 -0
- package/src/utils/auth-utils.ts +96 -0
- package/src/utils/bundleAnalysis.ts +129 -0
- package/src/utils/cn.ts +7 -0
- package/src/utils/debugLogger.ts +46 -0
- package/src/utils/deviceFingerprint.ts +215 -0
- package/src/utils/dynamicUtils.ts +105 -0
- package/src/utils/formatDate.test.ts +241 -0
- package/src/utils/formatting.ts +77 -0
- package/src/utils/index.ts +145 -0
- package/src/utils/lazyLoad.tsx +44 -0
- package/src/utils/organisationContext.ts +135 -0
- package/src/utils/performanceBenchmark.ts +64 -0
- package/src/utils/performanceBudgets.ts +111 -0
- package/src/utils/permissionTypes.ts +37 -0
- package/src/utils/permissionUtils.ts +31 -0
- package/src/utils/print/PrintDataProcessor.ts +390 -0
- package/src/utils/print/examples/PrintUtilitiesShowcase.tsx +397 -0
- package/src/utils/print/index.ts +29 -0
- package/src/utils/print/types.ts +196 -0
- package/src/utils/print/usePrintOptimization.ts +272 -0
- package/src/utils/sanitization.ts +264 -0
- package/src/utils/schemaUtils.ts +37 -0
- package/src/utils/secureDataAccess.ts +361 -0
- package/src/utils/secureErrors.ts +79 -0
- package/src/utils/secureStorage.ts +244 -0
- package/src/utils/security.ts +156 -0
- package/src/utils/securityMonitor.ts +45 -0
- package/src/utils/sessionTracking.ts +170 -0
- package/src/utils/storage/README.md +348 -0
- package/src/utils/storage/config.ts +100 -0
- package/src/utils/storage/helpers.ts +359 -0
- package/src/utils/storage/index.ts +36 -0
- package/src/utils/storage/types.ts +90 -0
- package/src/utils/validation.ts +111 -0
- package/src/utils/validationUtils.ts +120 -0
- package/src/validation/common.ts +53 -0
- package/src/validation/csrf.ts +214 -0
- package/src/validation/index.ts +43 -0
- package/src/validation/passwordSchema.ts +125 -0
- package/src/validation/sanitization.ts +96 -0
- package/src/validation/schemaUtils.ts +42 -0
- package/src/validation/sqlInjectionProtection.ts +242 -0
- package/src/validation/user.ts +34 -0
- package/dist/chunk-4MCJAK7J.js.map +0 -1
- package/dist/chunk-4ZTIEYU2.js.map +0 -1
- package/dist/chunk-H4PZ4B3Y.js.map +0 -1
- package/dist/chunk-IOX76PSM.js.map +0 -1
- package/dist/chunk-JUUNUW3O.js.map +0 -1
- package/dist/chunk-KK6WIDK6.js +0 -63
- package/dist/chunk-KK6WIDK6.js.map +0 -1
- package/dist/chunk-U7DY5T33.js +0 -11
- package/dist/chunk-U7DY5T33.js.map +0 -1
- package/dist/chunk-WHLSWC6W.js.map +0 -1
- package/dist/chunk-XI7QFSSC.js +0 -790
- package/dist/chunk-XI7QFSSC.js.map +0 -1
- package/dist/chunk-XIJMMBDD.js +0 -73
- package/dist/chunk-XIJMMBDD.js.map +0 -1
- package/dist/chunk-YNU5QJ4S.js.map +0 -1
- package/dist/chunk-YWYCNGWH.js +0 -2070
- package/dist/chunk-YWYCNGWH.js.map +0 -1
- package/dist/chunk-ZJ3UKPIW.js +0 -952
- package/dist/chunk-ZJ3UKPIW.js.map +0 -1
- package/dist/useAppConfig-CZNJJsT_.d.ts +0 -148
- package/dist/{DataTable-2LB6HI6V.js.map → DataTable-ZQDRE46Q.js.map} +0 -0
- package/dist/{api-AIJ3IJX3.js.map → api-H5A3H4IR.js.map} +0 -0
- package/dist/{audit-PD5L5ZSC.js.map → appNameResolver-7GHF5ED2.js.map} +0 -0
- package/dist/{chunk-DC5AMYBS.js.map → audit-BUW3LMJB.js.map} +0 -0
- package/dist/{validation-D2-NNCCE.d.ts → validation-PM_iOaTI.d.ts} +6 -6
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Enhanced DataTable Component with Performance Optimizations
|
|
3
|
+
* @package @jmruthers/pace-core
|
|
4
|
+
* @module Components/DataTable
|
|
5
|
+
* @since 0.3.0
|
|
6
|
+
*
|
|
7
|
+
* A comprehensive, feature-rich data table component built on top of TanStack Table.
|
|
8
|
+
* Provides advanced data management capabilities with a clean, accessible interface.
|
|
9
|
+
*
|
|
10
|
+
* The DataTable is an enterprise-grade data table component that provides all the features
|
|
11
|
+
* you need for complex data management: sorting, filtering, pagination, search, export/import,
|
|
12
|
+
* inline editing, grouping with aggregation, virtual scrolling, and full accessibility support.
|
|
13
|
+
*
|
|
14
|
+
* ## Performance Features
|
|
15
|
+
* - 🚀 **Intelligent Virtual Scrolling** - Automatically handles 100,000+ records with smooth scrolling
|
|
16
|
+
* - ⚡ **Smart Pagination** - Automatic mode detection (client/server/hybrid)
|
|
17
|
+
* - 🔍 **Advanced Search** - Fast indexing with fuzzy search capabilities
|
|
18
|
+
* - 💾 **Memory Management** - Intelligent data chunking and cleanup
|
|
19
|
+
* - 🎯 **Intersection Observer** - Efficient visibility tracking
|
|
20
|
+
* - 🔄 **Data Chunking** - LRU cache for optimal memory usage
|
|
21
|
+
* - 🧠 **Adaptive Rendering** - Automatically switches between standard and virtualized rendering
|
|
22
|
+
*
|
|
23
|
+
* ## Features
|
|
24
|
+
* - ✅ **Search** - Global search with column-specific filters
|
|
25
|
+
* - ✅ **Pagination** - Configurable pagination with custom initial page size and page size options
|
|
26
|
+
* - ✅ **Sorting** - Multi-column sorting with visual indicators (↕️ unsorted, ↑ ascending, ↓ descending)
|
|
27
|
+
* - ✅ **Filtering** - Column-specific filtering with multiple input types
|
|
28
|
+
* - ✅ **Export/Import** - CSV and JSON data export/import
|
|
29
|
+
* - ✅ **Row Selection** - Single and multi-row selection for bulk operations
|
|
30
|
+
* - ✅ **Row Creation** - Add new rows with validation
|
|
31
|
+
* - ✅ **Row Editing** - Inline row editing with input field conversion
|
|
32
|
+
* - ✅ **Row Deletion** - Individual and bulk row deletion
|
|
33
|
+
* - ✅ **Actions** - Custom row actions and toolbar buttons
|
|
34
|
+
* - ✅ **Grouping** - Data grouping with aggregation functions
|
|
35
|
+
* - ✅ **Column Visibility** - Show/hide columns dynamically
|
|
36
|
+
* - ✅ **Column Reordering** - Drag and drop column reordering
|
|
37
|
+
* - ✅ **Intelligent Virtual Scrolling** - Automatic performance optimization for large datasets
|
|
38
|
+
* - ✅ **Responsive Design** - Mobile-friendly responsive layout
|
|
39
|
+
* - ✅ **Accessibility** - WCAG 2.1 AA compliant with keyboard navigation
|
|
40
|
+
* - ✅ **TypeScript** - Full TypeScript support with strict typing
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```tsx
|
|
44
|
+
* // Basic usage - simple data table (automatically optimized)
|
|
45
|
+
* import { DataTable, type DataTableColumn } from '@jmruthers/pace-core';
|
|
46
|
+
*
|
|
47
|
+
* interface User {
|
|
48
|
+
* id: string;
|
|
49
|
+
* name: string;
|
|
50
|
+
* email: string;
|
|
51
|
+
* role: string;
|
|
52
|
+
* status: 'active' | 'inactive';
|
|
53
|
+
* }
|
|
54
|
+
*
|
|
55
|
+
* const columns: DataTableColumn<User>[] = [
|
|
56
|
+
* {
|
|
57
|
+
* accessorKey: 'name',
|
|
58
|
+
* header: 'Name',
|
|
59
|
+
* sortable: true,
|
|
60
|
+
* searchable: true,
|
|
61
|
+
* },
|
|
62
|
+
* {
|
|
63
|
+
* accessorKey: 'email',
|
|
64
|
+
* header: 'Email',
|
|
65
|
+
* sortable: true,
|
|
66
|
+
* searchable: true,
|
|
67
|
+
* },
|
|
68
|
+
* {
|
|
69
|
+
* accessorKey: 'role',
|
|
70
|
+
* header: 'Role',
|
|
71
|
+
* sortable: true,
|
|
72
|
+
* enableGrouping: true,
|
|
73
|
+
* },
|
|
74
|
+
* {
|
|
75
|
+
* accessorKey: 'status',
|
|
76
|
+
* header: 'Status',
|
|
77
|
+
* sortable: true,
|
|
78
|
+
* cell: ({ row }) => (
|
|
79
|
+
* <span className={`px-2 py-1 rounded text-xs ${
|
|
80
|
+
* row.original.status === 'active'
|
|
81
|
+
* ? 'bg-main-100 text-main-800'
|
|
82
|
+
* : 'bg-acc-100 text-acc-800'
|
|
83
|
+
* }`}>
|
|
84
|
+
* {row.original.status}
|
|
85
|
+
* </span>
|
|
86
|
+
* ),
|
|
87
|
+
* },
|
|
88
|
+
* ];
|
|
89
|
+
*
|
|
90
|
+
* const data: User[] = [
|
|
91
|
+
* { id: '1', name: 'John Doe', email: 'john@example.com', role: 'Admin', status: 'active' },
|
|
92
|
+
* { id: '2', name: 'Jane Smith', email: 'jane@example.com', role: 'User', status: 'active' },
|
|
93
|
+
* ];
|
|
94
|
+
*
|
|
95
|
+
* <DataTable
|
|
96
|
+
* data={data}
|
|
97
|
+
* columns={columns}
|
|
98
|
+
* title="Users"
|
|
99
|
+
* description="Manage your users"
|
|
100
|
+
* features={{
|
|
101
|
+
* search: true,
|
|
102
|
+
* pagination: true,
|
|
103
|
+
* sorting: true,
|
|
104
|
+
* filtering: true,
|
|
105
|
+
* export: true,
|
|
106
|
+
* import: true,
|
|
107
|
+
* selection: true,
|
|
108
|
+
* creation: true,
|
|
109
|
+
* editing: true,
|
|
110
|
+
* deletion: true,
|
|
111
|
+
* deleteSelected: true,
|
|
112
|
+
* grouping: true,
|
|
113
|
+
* columnVisibility: true,
|
|
114
|
+
* columnReordering: true,
|
|
115
|
+
* }}
|
|
116
|
+
* initialPageSize={25} // Set custom initial page size
|
|
117
|
+
* columnOrder={['select', 'name', 'email', 'role', 'status']} // Control column order
|
|
118
|
+
* onEditRow={(row, data) => console.log('Edit:', row, data)}
|
|
119
|
+
* onDeleteRow={(row) => console.log('Delete:', row)}
|
|
120
|
+
* />
|
|
121
|
+
* ```
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* ```tsx
|
|
125
|
+
* // DataTable with custom column ordering and selection
|
|
126
|
+
* <DataTable
|
|
127
|
+
* data={data}
|
|
128
|
+
* columns={columns}
|
|
129
|
+
* title="Custom Ordered Table"
|
|
130
|
+
* features={{
|
|
131
|
+
* selection: true,
|
|
132
|
+
* sorting: true,
|
|
133
|
+
* filtering: true,
|
|
134
|
+
* // ... other features
|
|
135
|
+
* }}
|
|
136
|
+
* // Control the exact order of columns, including selection column
|
|
137
|
+
* columnOrder={['select', 'name', 'email', 'role', 'status']}
|
|
138
|
+
* // When selection is enabled but not in columnOrder, it defaults to first position
|
|
139
|
+
* // columnOrder={['name', 'email', 'role']} // selection column will be first
|
|
140
|
+
* />
|
|
141
|
+
* ```
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* ```tsx
|
|
145
|
+
* // Large dataset with performance optimizations
|
|
146
|
+
* <DataTable
|
|
147
|
+
* data={largeDataset} // 50,000+ records
|
|
148
|
+
* columns={columns}
|
|
149
|
+
* title="Large Dataset"
|
|
150
|
+
*
|
|
151
|
+
* // Features configuration
|
|
152
|
+
* features={{
|
|
153
|
+
* search: true,
|
|
154
|
+
* pagination: true,
|
|
155
|
+
* sorting: true,
|
|
156
|
+
* filtering: true,
|
|
157
|
+
* export: true,
|
|
158
|
+
* import: true,
|
|
159
|
+
* selection: true,
|
|
160
|
+
* creation: true,
|
|
161
|
+
* editing: true,
|
|
162
|
+
* deletion: true,
|
|
163
|
+
* deleteSelected: true,
|
|
164
|
+
* grouping: true,
|
|
165
|
+
* columnVisibility: true,
|
|
166
|
+
* columnReordering: true,
|
|
167
|
+
* // Virtualization is automatically enabled for large datasets
|
|
168
|
+
* }}
|
|
169
|
+
*
|
|
170
|
+
* // Performance configuration (optional)
|
|
171
|
+
* performance={{
|
|
172
|
+
* virtualScrolling: true,
|
|
173
|
+
* enableChunking: true,
|
|
174
|
+
* chunkSize: 1000,
|
|
175
|
+
* enableWebWorkers: true,
|
|
176
|
+
* }}
|
|
177
|
+
* />
|
|
178
|
+
* ```
|
|
179
|
+
*
|
|
180
|
+
* @example
|
|
181
|
+
* ```tsx
|
|
182
|
+
* // Server-side data with large datasets
|
|
183
|
+
* <DataTable
|
|
184
|
+
* data={[]} // Empty - data comes from server
|
|
185
|
+
* columns={columns}
|
|
186
|
+
* title="Server-side Data"
|
|
187
|
+
*
|
|
188
|
+
* // Features configuration
|
|
189
|
+
* features={{
|
|
190
|
+
* search: true,
|
|
191
|
+
* pagination: true,
|
|
192
|
+
* sorting: true,
|
|
193
|
+
* filtering: true,
|
|
194
|
+
* export: true,
|
|
195
|
+
* import: true,
|
|
196
|
+
* selection: true,
|
|
197
|
+
* creation: true,
|
|
198
|
+
* editing: true,
|
|
199
|
+
* deletion: true,
|
|
200
|
+
* deleteSelected: true,
|
|
201
|
+
* grouping: true,
|
|
202
|
+
* columnVisibility: true,
|
|
203
|
+
* columnReordering: true,
|
|
204
|
+
* // Virtualization is automatically enabled for large datasets
|
|
205
|
+
* }}
|
|
206
|
+
*
|
|
207
|
+
* // Server-side configuration
|
|
208
|
+
* serverSide={{
|
|
209
|
+
* fetchData: async (params) => {
|
|
210
|
+
* const response = await fetchServerData(params);
|
|
211
|
+
* return response;
|
|
212
|
+
* },
|
|
213
|
+
* enableServerSorting: true,
|
|
214
|
+
* enableServerFiltering: true,
|
|
215
|
+
* enableServerSearch: true,
|
|
216
|
+
* enableServerPagination: true,
|
|
217
|
+
* }}
|
|
218
|
+
* />
|
|
219
|
+
* ```
|
|
220
|
+
*
|
|
221
|
+
* @example
|
|
222
|
+
* ```tsx
|
|
223
|
+
* // DataTable with customized import modal text
|
|
224
|
+
* const importConfig = {
|
|
225
|
+
* title: "Import Customer Data",
|
|
226
|
+
* description: "Upload a CSV file with customer information to import multiple records.",
|
|
227
|
+
* uploadText: "Choose a customer CSV file to upload",
|
|
228
|
+
* selectFileButtonText: "Browse Files",
|
|
229
|
+
* importButtonText: "Import Customers",
|
|
230
|
+
* importButtonProcessingText: "Processing customers...",
|
|
231
|
+
* previewHeaderText: "Customer Preview (first 5 records)",
|
|
232
|
+
* totalRowsText: "Found {count} customer records to import"
|
|
233
|
+
* };
|
|
234
|
+
*
|
|
235
|
+
* <DataTable
|
|
236
|
+
* data={customerData}
|
|
237
|
+
* columns={customerColumns}
|
|
238
|
+
* title="Customer Management"
|
|
239
|
+
* features={{
|
|
240
|
+
* search: true,
|
|
241
|
+
* pagination: true,
|
|
242
|
+
* sorting: true,
|
|
243
|
+
* filtering: true,
|
|
244
|
+
* export: true,
|
|
245
|
+
* import: true,
|
|
246
|
+
* selection: true,
|
|
247
|
+
* creation: true,
|
|
248
|
+
* editing: true,
|
|
249
|
+
* deletion: true,
|
|
250
|
+
* deleteSelected: true,
|
|
251
|
+
* grouping: true,
|
|
252
|
+
* columnVisibility: true,
|
|
253
|
+
* columnReordering: true,
|
|
254
|
+
* }}
|
|
255
|
+
* importModalConfig={importConfig}
|
|
256
|
+
* onImport={(importedData) => {
|
|
257
|
+
* console.log('Imported customers:', importedData);
|
|
258
|
+
* // Handle imported customer data
|
|
259
|
+
* }}
|
|
260
|
+
* />
|
|
261
|
+
* ```
|
|
262
|
+
*/
|
|
263
|
+
|
|
264
|
+
import React from 'react';
|
|
265
|
+
import { DataTableCore } from './components/DataTableCore';
|
|
266
|
+
import type {
|
|
267
|
+
DataRecord,
|
|
268
|
+
GetRowId,
|
|
269
|
+
ServerSideParams,
|
|
270
|
+
PerformanceConfig,
|
|
271
|
+
ServerSideConfig,
|
|
272
|
+
ChunkingConfig,
|
|
273
|
+
SearchIndexConfig,
|
|
274
|
+
PaginationMode,
|
|
275
|
+
EmptyStateConfig,
|
|
276
|
+
DataTableFeatureConfig,
|
|
277
|
+
DataTableColumn,
|
|
278
|
+
SimpleColumn,
|
|
279
|
+
AggregateConfig,
|
|
280
|
+
DataTableAction,
|
|
281
|
+
HierarchicalConfig,
|
|
282
|
+
DataTableRBACConfig
|
|
283
|
+
} from './types';
|
|
284
|
+
import type { ImportModalConfig } from './components/ImportModal';
|
|
285
|
+
|
|
286
|
+
// ============================================================================
|
|
287
|
+
// ENHANCED DATATABLE PROPS
|
|
288
|
+
// ============================================================================
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Enhanced DataTable props with performance features
|
|
292
|
+
* @template TData - The type of data records in the table
|
|
293
|
+
*/
|
|
294
|
+
export interface DataTableProps<TData extends DataRecord> {
|
|
295
|
+
// ========================================
|
|
296
|
+
// CORE DATA
|
|
297
|
+
// ========================================
|
|
298
|
+
|
|
299
|
+
/** Array of data records to display in the table */
|
|
300
|
+
data: TData[];
|
|
301
|
+
/** Column definitions for the table */
|
|
302
|
+
columns: DataTableColumn<TData>[];
|
|
303
|
+
|
|
304
|
+
// ========================================
|
|
305
|
+
// MANDATORY RBAC
|
|
306
|
+
// ========================================
|
|
307
|
+
|
|
308
|
+
/** RBAC configuration - REQUIRED for all DataTables */
|
|
309
|
+
rbac: DataTableRBACConfig;
|
|
310
|
+
|
|
311
|
+
// ========================================
|
|
312
|
+
// DISPLAY
|
|
313
|
+
// ========================================
|
|
314
|
+
|
|
315
|
+
/** Optional title displayed above the table */
|
|
316
|
+
title?: string;
|
|
317
|
+
/** Optional description displayed below the title */
|
|
318
|
+
description?: string;
|
|
319
|
+
/** Visual variant of the table */
|
|
320
|
+
variant?: 'default' | 'compact' | 'spacious';
|
|
321
|
+
/** Additional CSS classes for the table container */
|
|
322
|
+
className?: string;
|
|
323
|
+
|
|
324
|
+
// ========================================
|
|
325
|
+
// NEW: UNIFIED FEATURE CONFIGURATION
|
|
326
|
+
// ========================================
|
|
327
|
+
|
|
328
|
+
/** Feature configuration - all features are disabled by default */
|
|
329
|
+
features: DataTableFeatureConfig;
|
|
330
|
+
|
|
331
|
+
// ========================================
|
|
332
|
+
// HIERARCHICAL CONFIGURATION
|
|
333
|
+
// ========================================
|
|
334
|
+
|
|
335
|
+
/** Hierarchical parent/child row configuration */
|
|
336
|
+
hierarchical?: HierarchicalConfig;
|
|
337
|
+
|
|
338
|
+
// ========================================
|
|
339
|
+
// PERFORMANCE FEATURES
|
|
340
|
+
// ========================================
|
|
341
|
+
|
|
342
|
+
/** Performance optimization configuration */
|
|
343
|
+
performance?: PerformanceConfig;
|
|
344
|
+
/** Server-side data fetching configuration */
|
|
345
|
+
serverSide?: ServerSideConfig<TData>;
|
|
346
|
+
/** Override automatic pagination mode detection */
|
|
347
|
+
paginationMode?: PaginationMode;
|
|
348
|
+
/** Data chunking configuration for memory optimization */
|
|
349
|
+
chunking?: ChunkingConfig;
|
|
350
|
+
/** Search indexing configuration for fast search */
|
|
351
|
+
searchIndex?: SearchIndexConfig;
|
|
352
|
+
/** Virtual scrolling height */
|
|
353
|
+
virtualHeight?: number;
|
|
354
|
+
/** Initial page size for pagination */
|
|
355
|
+
initialPageSize?: number;
|
|
356
|
+
/** Enable enhanced pagination controls */
|
|
357
|
+
enhancedPagination?: boolean;
|
|
358
|
+
/** Custom loading component */
|
|
359
|
+
loadingComponent?: React.ComponentType;
|
|
360
|
+
/** Custom error component */
|
|
361
|
+
errorComponent?: React.ComponentType<{ error: Error; retry: () => void }>;
|
|
362
|
+
|
|
363
|
+
// ========================================
|
|
364
|
+
// EVENT HANDLERS
|
|
365
|
+
// ========================================
|
|
366
|
+
|
|
367
|
+
/** Callback when a row is edited */
|
|
368
|
+
onEditRow?: (row: TData, data: Partial<TData>) => void;
|
|
369
|
+
/** Callback when a row is deleted */
|
|
370
|
+
onDeleteRow?: (row: TData) => void;
|
|
371
|
+
/** Callback when a new row is created */
|
|
372
|
+
onCreateRow?: (data: Partial<TData>) => void;
|
|
373
|
+
/** Callback when data is imported */
|
|
374
|
+
onImport?: (data: TData[]) => void | Promise<void>;
|
|
375
|
+
/** Callback when row selection changes */
|
|
376
|
+
onRowSelectionChange?: (selection: Record<string, boolean>) => void;
|
|
377
|
+
/** Controlled selection state */
|
|
378
|
+
selection?: Record<string, boolean>;
|
|
379
|
+
/** Callback when bulk delete selected rows is triggered */
|
|
380
|
+
onDeleteSelected?: (selectedRows: Record<string, boolean>) => void;
|
|
381
|
+
|
|
382
|
+
// ========================================
|
|
383
|
+
// UTILITIES
|
|
384
|
+
// ========================================
|
|
385
|
+
|
|
386
|
+
/** Function to generate unique row IDs */
|
|
387
|
+
getRowId?: GetRowId<TData>;
|
|
388
|
+
/** Whether the table is in a loading state */
|
|
389
|
+
isLoading?: boolean;
|
|
390
|
+
/** Custom component to display when table is empty */
|
|
391
|
+
emptyState?: EmptyStateConfig | React.ReactElement;
|
|
392
|
+
/** Array of aggregation functions for grouped data */
|
|
393
|
+
aggregates?: AggregateConfig[];
|
|
394
|
+
|
|
395
|
+
/** Import modal configuration */
|
|
396
|
+
importModalConfig?: ImportModalConfig;
|
|
397
|
+
|
|
398
|
+
/** Custom row actions - use this for custom action buttons */
|
|
399
|
+
actions?: DataTableAction<TData>[];
|
|
400
|
+
|
|
401
|
+
/** Column order configuration - array of column IDs in desired order */
|
|
402
|
+
columnOrder?: string[];
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
// ============================================================================
|
|
406
|
+
// MAIN ENHANCED DATATABLE COMPONENT
|
|
407
|
+
// ============================================================================
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
* Enhanced DataTable with comprehensive performance optimizations
|
|
411
|
+
*
|
|
412
|
+
* This component automatically detects dataset size and applies appropriate performance optimizations:
|
|
413
|
+
* - < 1,000 records: Standard rendering with full feature support
|
|
414
|
+
* - 1,000+ records: Automatic virtual scrolling with intelligent memory management
|
|
415
|
+
* - 10,000+ records: Enhanced chunking and memory optimization
|
|
416
|
+
* - 100,000+ records: Advanced server-side processing with virtualization
|
|
417
|
+
*
|
|
418
|
+
* Features are configured through the unified `features` prop for maximum flexibility.
|
|
419
|
+
*/
|
|
420
|
+
export function DataTable<TData extends DataRecord>(props: DataTableProps<TData>) {
|
|
421
|
+
// Validate required features
|
|
422
|
+
if (!props.features) {
|
|
423
|
+
throw new Error('DataTable: features configuration is required');
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
// Validate feature dependencies
|
|
427
|
+
if (props.features.deleteSelected && !props.features.deletion) {
|
|
428
|
+
console.warn('DataTable: deleteSelected requires deletion to be enabled');
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
return <DataTableCore {...props} />;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
// ============================================================================
|
|
435
|
+
// EXPORT WITH PERFORMANCE OPTIMIZATIONS
|
|
436
|
+
// ============================================================================
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* DataTable component with React.memo for performance optimization
|
|
440
|
+
*/
|
|
441
|
+
const DataTableComponent = React.memo(DataTable) as typeof DataTable;
|
|
442
|
+
|
|
443
|
+
export { DataTableComponent as default };
|
|
444
|
+
|
|
445
|
+
// Re-export for convenience
|
|
446
|
+
export { DataTable as EnhancedDataTable };
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# DataTable Test Suite
|
|
2
|
+
|
|
3
|
+
This directory contains comprehensive tests for the DataTable component, designed to prevent regressions and ensure all critical functionality works correctly.
|
|
4
|
+
|
|
5
|
+
## Test Files Overview
|
|
6
|
+
|
|
7
|
+
### Regression Prevention Tests
|
|
8
|
+
|
|
9
|
+
- **`DataTable.workflowValidation.test.tsx`** - Comprehensive workflow validation covering all core functionality
|
|
10
|
+
- **`DataTable.regressionFixes.test.tsx`** - Documents specific fixes and prevents known regressions
|
|
11
|
+
- **`DataTable.sorting.test.tsx`** - Comprehensive sorting functionality tests including visual indicators and accessibility
|
|
12
|
+
|
|
13
|
+
### Existing Tests
|
|
14
|
+
|
|
15
|
+
- **`DataTable.simple.test.tsx`** - Basic rendering tests
|
|
16
|
+
- **`DataTable.integration.test.tsx`** - Cross-component integration tests
|
|
17
|
+
- **`DataTable.performance.test.tsx`** - Performance benchmarks
|
|
18
|
+
- **`DataTable.errorHandling.test.tsx`** - Error condition handling
|
|
19
|
+
- **`DataTable.permissions.test.tsx`** - RBAC and permissions testing
|
|
20
|
+
- **`DataTable.userWorkflows.test.tsx`** - User interaction flows
|
|
21
|
+
|
|
22
|
+
## Test Strategy
|
|
23
|
+
|
|
24
|
+
### 1. Workflow Validation (23 tests)
|
|
25
|
+
The `DataTable.workflowValidation.test.tsx` file provides comprehensive coverage of:
|
|
26
|
+
|
|
27
|
+
- **Basic Rendering Workflows (3 tests)**
|
|
28
|
+
- Data display validation
|
|
29
|
+
- Header rendering
|
|
30
|
+
- Actions column conditionals
|
|
31
|
+
|
|
32
|
+
- **Editing Workflow Validation (5 tests)**
|
|
33
|
+
- Actions column presence
|
|
34
|
+
- Edit button rendering and icons
|
|
35
|
+
- Handler requirements
|
|
36
|
+
- Click behavior validation
|
|
37
|
+
|
|
38
|
+
- **Deletion Workflow Validation (4 tests)**
|
|
39
|
+
- Delete button rendering and icons
|
|
40
|
+
- Immediate handler execution
|
|
41
|
+
- Handler requirements
|
|
42
|
+
|
|
43
|
+
- **Combined Features Validation (2 tests)**
|
|
44
|
+
- Both edit and delete enabled
|
|
45
|
+
- Mixed interactions
|
|
46
|
+
|
|
47
|
+
- **Search Workflow Validation (3 tests)**
|
|
48
|
+
- Search functionality
|
|
49
|
+
- Filtering behavior
|
|
50
|
+
- Actions preservation during search
|
|
51
|
+
|
|
52
|
+
- **Sorting Workflow Validation (4 tests)**
|
|
53
|
+
- Sortable column indicators (↕️ unsorted, ↑ ascending, ↓ descending)
|
|
54
|
+
- Click behavior for sorting
|
|
55
|
+
- Non-sortable column behavior
|
|
56
|
+
- Visual feedback and accessibility
|
|
57
|
+
|
|
58
|
+
- **Data Integrity Validation (3 tests)**
|
|
59
|
+
- Exact prop data display
|
|
60
|
+
- Empty data handling
|
|
61
|
+
- Null/undefined value handling
|
|
62
|
+
|
|
63
|
+
- **Accessibility Validation (3 tests)**
|
|
64
|
+
- Semantic table structure
|
|
65
|
+
- ARIA labels
|
|
66
|
+
- Keyboard navigation support
|
|
67
|
+
|
|
68
|
+
### 2. Regression Fixes (13 tests)
|
|
69
|
+
The `DataTable.regressionFixes.test.tsx` file documents specific fixes:
|
|
70
|
+
|
|
71
|
+
- **Save and Cancel Actions in allActions Array (3 tests)**
|
|
72
|
+
- Validates the fix for the actions filtering logic
|
|
73
|
+
- Ensures Save/Cancel buttons are included in action processing
|
|
74
|
+
|
|
75
|
+
- **Action Button Icons and Behavior (4 tests)**
|
|
76
|
+
- Pencil icons for Edit buttons
|
|
77
|
+
- Trash icons for Delete buttons
|
|
78
|
+
- Correct edit mode entry behavior
|
|
79
|
+
- Immediate delete handler execution
|
|
80
|
+
|
|
81
|
+
- **Action Button Validation (3 tests)**
|
|
82
|
+
- ARIA label maintenance
|
|
83
|
+
- Conditional actions column rendering
|
|
84
|
+
- Handler requirement enforcement
|
|
85
|
+
|
|
86
|
+
- **Data Integrity Prevention (3 tests)**
|
|
87
|
+
- Exact data display
|
|
88
|
+
- Empty data graceful handling
|
|
89
|
+
- Semantic structure maintenance
|
|
90
|
+
|
|
91
|
+
## Critical Regression Fix
|
|
92
|
+
|
|
93
|
+
### The Save/Cancel Actions Bug
|
|
94
|
+
**Issue**: Edit buttons appeared but Save/Cancel buttons didn't appear in edit mode.
|
|
95
|
+
**Root Cause**: The action filtering logic in DataTable component only included `edit` and `delete` actions in the `allActions` array, excluding `save` and `cancel` actions.
|
|
96
|
+
**Fix**: Updated the filtering logic to include all built-in actions:
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
// BEFORE (broken):
|
|
100
|
+
const editActions = builtInActions.filter(action => action.testId === 'edit');
|
|
101
|
+
const deleteActions = builtInActions.filter(action => action.testId === 'delete');
|
|
102
|
+
const allActions = [...(actions || []), ...editActions, ...deleteActions];
|
|
103
|
+
|
|
104
|
+
// AFTER (fixed):
|
|
105
|
+
const editActions = builtInActions.filter(action => action.testId === 'edit');
|
|
106
|
+
const saveActions = builtInActions.filter(action => action.testId === 'save');
|
|
107
|
+
const cancelActions = builtInActions.filter(action => action.testId === 'cancel');
|
|
108
|
+
const deleteActions = builtInActions.filter(action => action.testId === 'delete');
|
|
109
|
+
const allActions = [...(actions || []), ...editActions, ...saveActions, ...cancelActions, ...deleteActions];
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Running Tests
|
|
113
|
+
|
|
114
|
+
Run all DataTable tests:
|
|
115
|
+
```bash
|
|
116
|
+
npm test -- src/components/DataTable/__tests__/
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Run specific test suites:
|
|
120
|
+
```bash
|
|
121
|
+
# Workflow validation tests
|
|
122
|
+
npm test -- src/components/DataTable/__tests__/DataTable.workflowValidation.test.tsx
|
|
123
|
+
|
|
124
|
+
# Regression fix tests
|
|
125
|
+
npm test -- src/components/DataTable/__tests__/DataTable.regressionFixes.test.tsx
|
|
126
|
+
|
|
127
|
+
# Sorting functionality tests
|
|
128
|
+
npm test -- src/components/DataTable/__tests__/DataTable.sorting.test.tsx
|
|
129
|
+
|
|
130
|
+
# Simple integration tests
|
|
131
|
+
npm test -- src/components/DataTable/__tests__/DataTable.simple.test.tsx
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Test Coverage Summary
|
|
135
|
+
|
|
136
|
+
- **91 total tests** in new regression prevention suites
|
|
137
|
+
- **100% pass rate** for workflow validation
|
|
138
|
+
- **100% pass rate** for regression fixes
|
|
139
|
+
- **100% pass rate** for auto-sizing functionality
|
|
140
|
+
- **Critical action rendering validated**
|
|
141
|
+
- **Search and data integrity confirmed**
|
|
142
|
+
- **Auto-sizing behavior verified**
|
|
143
|
+
- **Accessibility standards maintained**
|
|
144
|
+
|
|
145
|
+
This test suite ensures DataTable reliability and prevents future regressions in critical editing workflows.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Mock RBAC Provider for DataTable Tests
|
|
3
|
+
* @package @jmruthers/pace-core
|
|
4
|
+
* @module Components/DataTable/__tests__/mocks
|
|
5
|
+
* @since 0.3.0
|
|
6
|
+
*
|
|
7
|
+
* Mock provider for the new RBAC system used in DataTable tests.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import React, { createContext, useContext, ReactNode } from 'react';
|
|
11
|
+
|
|
12
|
+
// Mock types for testing - simplified version of new RBAC types
|
|
13
|
+
type AccessLevel = 'viewer' | 'participant' | 'planner' | 'admin' | 'super';
|
|
14
|
+
|
|
15
|
+
interface MockRBACContextType {
|
|
16
|
+
permissions: Record<string, boolean>;
|
|
17
|
+
accessLevel: AccessLevel;
|
|
18
|
+
hasPermission: (permission: string) => boolean;
|
|
19
|
+
hasAccessLevel: (level: AccessLevel) => boolean;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const MockRBACContext = createContext<MockRBACContextType | null>(null);
|
|
23
|
+
|
|
24
|
+
interface MockRBACProviderProps {
|
|
25
|
+
children: ReactNode;
|
|
26
|
+
permissions?: Record<string, boolean>;
|
|
27
|
+
accessLevel?: AccessLevel;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export const MockRBACProvider: React.FC<MockRBACProviderProps> = ({
|
|
31
|
+
children,
|
|
32
|
+
permissions = {},
|
|
33
|
+
accessLevel = 'viewer'
|
|
34
|
+
}) => {
|
|
35
|
+
const hasPermission = (permission: string): boolean => {
|
|
36
|
+
return permissions[permission] || false;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const hasAccessLevel = (level: AccessLevel): boolean => {
|
|
40
|
+
const levels: AccessLevel[] = ['viewer', 'participant', 'planner', 'admin', 'super'];
|
|
41
|
+
const userLevelIndex = levels.indexOf(accessLevel);
|
|
42
|
+
const requiredLevelIndex = levels.indexOf(level);
|
|
43
|
+
return userLevelIndex >= requiredLevelIndex;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const contextValue: MockRBACContextType = {
|
|
47
|
+
permissions,
|
|
48
|
+
accessLevel,
|
|
49
|
+
hasPermission,
|
|
50
|
+
hasAccessLevel
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
return (
|
|
54
|
+
<MockRBACContext.Provider value={contextValue}>
|
|
55
|
+
{children}
|
|
56
|
+
</MockRBACContext.Provider>
|
|
57
|
+
);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
export const useMockRBAC = (): MockRBACContextType => {
|
|
61
|
+
const context = useContext(MockRBACContext);
|
|
62
|
+
if (!context) {
|
|
63
|
+
throw new Error('useMockRBAC must be used within a MockRBACProvider');
|
|
64
|
+
}
|
|
65
|
+
return context;
|
|
66
|
+
};
|