@jmruthers/pace-core 0.2.6 → 0.4.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/CHANGELOG.md +1 -26
- package/README.md +229 -231
- package/dist/{DataTable-EEUDXPE5.js → DataTable-2LB6HI6V.js} +17 -10
- package/dist/{DataTable-C1AEm9Cx.d.ts → DataTable-BDBqkU-i.d.ts} +51 -23
- package/dist/{PublicLoadingSpinner-DztrzuJr.d.ts → Table-CIm9IWqk.d.ts} +122 -635
- package/dist/UnifiedAuthProvider-V7y63NjT.d.ts +88 -0
- package/dist/{api-ETQ6YJ3C.js → api-AIJ3IJX3.js} +4 -6
- package/dist/{appConfig-BVGyuvI7.d.ts → appConfig-fB1pP_v3.d.ts} +1 -1
- package/dist/{audit-BUW3LMJB.js → audit-PD5L5ZSC.js} +3 -3
- package/dist/{chunk-ETEJVKYK.js → chunk-4MCJAK7J.js} +4927 -504
- package/dist/chunk-4MCJAK7J.js.map +1 -0
- package/dist/{chunk-CDQ3PX7L.js → chunk-4ZTIEYU2.js} +1 -1
- package/dist/chunk-4ZTIEYU2.js.map +1 -0
- package/dist/{chunk-PLDDJCW6.js → chunk-DC5AMYBS.js} +5 -15
- package/dist/{chunk-HEMJ4SUJ.js → chunk-H4PZ4B3Y.js} +27 -124
- package/dist/chunk-H4PZ4B3Y.js.map +1 -0
- package/dist/{chunk-HNDFPXUU.js → chunk-IOX76PSM.js} +28 -270
- package/dist/chunk-IOX76PSM.js.map +1 -0
- package/dist/{chunk-TIVL4UQ7.js → chunk-JUUNUW3O.js} +5 -14
- package/dist/chunk-JUUNUW3O.js.map +1 -0
- package/dist/chunk-KK6WIDK6.js +63 -0
- package/dist/chunk-KK6WIDK6.js.map +1 -0
- package/dist/chunk-U7DY5T33.js +11 -0
- package/dist/chunk-U7DY5T33.js.map +1 -0
- package/dist/{chunk-SS3E6QLB.js → chunk-WHLSWC6W.js} +61 -16
- package/dist/chunk-WHLSWC6W.js.map +1 -0
- package/dist/chunk-XI7QFSSC.js +790 -0
- package/dist/chunk-XI7QFSSC.js.map +1 -0
- package/dist/chunk-XIJMMBDD.js +73 -0
- package/dist/chunk-XIJMMBDD.js.map +1 -0
- package/dist/{chunk-7BNPOCLL.js → chunk-YNU5QJ4S.js} +5 -22
- package/dist/chunk-YNU5QJ4S.js.map +1 -0
- package/dist/chunk-YWYCNGWH.js +2070 -0
- package/dist/chunk-YWYCNGWH.js.map +1 -0
- package/dist/chunk-ZJ3UKPIW.js +952 -0
- package/dist/chunk-ZJ3UKPIW.js.map +1 -0
- package/dist/components.d.ts +10 -906
- package/dist/components.js +77 -3255
- package/dist/components.js.map +1 -1
- package/dist/{database-C3Szpi5J.d.ts → database-CAMsquLm.d.ts} +11 -28
- package/dist/hooks.d.ts +6 -7
- package/dist/hooks.js +11 -35
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +111 -245
- package/dist/index.js +178 -187
- package/dist/index.js.map +1 -1
- package/dist/{organisation-CO3Sh3_D.d.ts → organisation-DLNNQhPB.d.ts} +1 -1
- package/dist/providers.d.ts +4 -4
- package/dist/providers.js +5 -19
- package/dist/rbac/index.d.ts +5 -61
- package/dist/rbac/index.js +93 -256
- package/dist/rbac/index.js.map +1 -1
- package/dist/{types-DiRQsGJs.d.ts → types-Bavn44NW.d.ts} +36 -71
- package/dist/types.d.ts +5 -5
- package/dist/types.js +2 -7
- package/dist/types.js.map +1 -1
- package/dist/{unified-CM7T0aTK.d.ts → unified-BtRpPbmp.d.ts} +2 -1
- package/dist/useAppConfig-CZNJJsT_.d.ts +148 -0
- package/dist/utils.d.ts +60 -83
- package/dist/utils.js +55633 -277
- package/dist/utils.js.map +1 -1
- package/dist/validation.d.ts +1 -1
- package/dist/validation.js +1 -1
- package/docs/README.md +32 -46
- package/docs/api/README.md +229 -231
- package/docs/api/classes/ErrorBoundary.md +1 -1
- 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/DataTableAction.md +7 -85
- package/docs/api/interfaces/DataTableColumn.md +12 -131
- package/docs/api/interfaces/DataTableProps.md +274 -64
- package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
- package/docs/api/interfaces/EmptyStateConfig.md +5 -5
- package/docs/api/interfaces/EventContextType.md +7 -7
- package/docs/api/interfaces/EventProviderProps.md +2 -2
- package/docs/api/interfaces/FooterProps.md +1 -1
- 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/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 +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/PaletteData.md +1 -1
- 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 +46 -447
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +9 -95
- 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 +773 -1631
- package/docs/api-reference/components.md +43 -761
- package/docs/api-reference/hooks.md +0 -126
- package/docs/api-reference/providers.md +65 -141
- package/docs/api-reference/types.md +36 -66
- package/docs/api-reference/utilities.md +1 -1
- package/docs/architecture/README.md +2 -1
- package/docs/consuming-app-example.md +96 -42
- package/docs/core-concepts/events.md +3 -3
- package/docs/core-concepts/organisations.md +1 -0
- package/docs/core-concepts/rbac-system.md +10 -23
- package/docs/documentation-style-checklist.md +2 -8
- package/docs/getting-started/examples/README.md +1 -15
- package/docs/getting-started/examples/basic-auth-app.md +119 -444
- package/docs/getting-started/examples/full-featured-app.md +6 -6
- package/docs/getting-started/installation.md +52 -231
- package/docs/getting-started/quick-start.md +24 -121
- package/docs/implementation-guides/app-layout.md +108 -133
- package/docs/implementation-guides/data-tables.md +29 -1011
- package/docs/implementation-guides/forms.md +3 -3
- 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/migration/README.md +8 -18
- package/docs/migration/rbac-migration.md +0 -50
- package/docs/migration-guide.md +104 -51
- package/docs/performance/README.md +4 -1
- package/docs/quick-reference.md +36 -53
- package/docs/rbac/README.md +69 -136
- package/docs/rbac/api-reference.md +8 -39
- package/docs/rbac/examples.md +66 -237
- package/docs/rbac/getting-started.md +16 -131
- package/docs/rbac/quick-start.md +323 -499
- package/docs/rbac/troubleshooting.md +262 -240
- package/docs/security/README.md +1 -50
- package/docs/styles/README.md +117 -143
- package/docs/testing/README.md +10 -6
- package/docs/troubleshooting/common-issues.md +14 -604
- package/docs/usage.md +90 -28
- package/docs/visual-testing.md +7 -0
- package/package.json +24 -43
- package/dist/UnifiedAuthProvider-w66zSCUf.d.ts +0 -160
- package/dist/appNameResolver-7GHF5ED2.js +0 -22
- package/dist/chunk-2V3Y6YBC.js +0 -114
- package/dist/chunk-2V3Y6YBC.js.map +0 -1
- package/dist/chunk-7BNPOCLL.js.map +0 -1
- package/dist/chunk-BEZRLNK3.js +0 -1744
- package/dist/chunk-BEZRLNK3.js.map +0 -1
- package/dist/chunk-C5G2A4PO.js +0 -1349
- package/dist/chunk-C5G2A4PO.js.map +0 -1
- package/dist/chunk-CDQ3PX7L.js.map +0 -1
- package/dist/chunk-ETEJVKYK.js.map +0 -1
- package/dist/chunk-EWKPTNPO.js +0 -5139
- package/dist/chunk-EWKPTNPO.js.map +0 -1
- package/dist/chunk-HEMJ4SUJ.js.map +0 -1
- package/dist/chunk-HNDFPXUU.js.map +0 -1
- package/dist/chunk-MZBUOP4P.js +0 -119
- package/dist/chunk-MZBUOP4P.js.map +0 -1
- package/dist/chunk-N2EUGZRW.js +0 -98
- package/dist/chunk-N2EUGZRW.js.map +0 -1
- package/dist/chunk-NQ4TOOO6.js +0 -20
- package/dist/chunk-NQ4TOOO6.js.map +0 -1
- package/dist/chunk-OHXGNT3K.js +0 -21
- package/dist/chunk-OHXGNT3K.js.map +0 -1
- package/dist/chunk-PLDDJCW6.js.map +0 -1
- package/dist/chunk-RRUYHORU.js +0 -3431
- package/dist/chunk-RRUYHORU.js.map +0 -1
- package/dist/chunk-SS3E6QLB.js.map +0 -1
- package/dist/chunk-TIVL4UQ7.js.map +0 -1
- package/dist/chunk-VYG4AXYW.js +0 -388
- package/dist/chunk-VYG4AXYW.js.map +0 -1
- package/dist/chunk-YDJW5XTN.js +0 -84
- package/dist/chunk-YDJW5XTN.js.map +0 -1
- package/dist/styles/core.css +0 -401
- 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 +0 -36
- package/dist/styles/index.js +0 -24
- package/dist/styles/index.js.map +0 -1
- package/dist/theming/runtime.d.ts +0 -73
- package/dist/theming/runtime.js +0 -16
- package/dist/theming/runtime.js.map +0 -1
- package/dist/usePublicRouteParams-B6i0KtXW.d.ts +0 -477
- package/docs/INDEX.md +0 -192
- package/docs/api/classes/PublicErrorBoundary.md +0 -132
- package/docs/api/interfaces/EventLogoProps.md +0 -152
- package/docs/api/interfaces/FileSizeLimits.md +0 -7
- package/docs/api/interfaces/FileUploadProps.md +0 -154
- package/docs/api/interfaces/InactivityWarningModalProps.md +0 -115
- package/docs/api/interfaces/PublicErrorBoundaryProps.md +0 -94
- package/docs/api/interfaces/PublicErrorBoundaryState.md +0 -68
- package/docs/api/interfaces/PublicLoadingSpinnerProps.md +0 -86
- package/docs/api/interfaces/PublicPageFooterProps.md +0 -112
- package/docs/api/interfaces/PublicPageHeaderProps.md +0 -138
- package/docs/api/interfaces/PublicPageLayoutProps.md +0 -138
- package/docs/api/interfaces/StorageConfig.md +0 -41
- package/docs/api/interfaces/StorageFileInfo.md +0 -74
- package/docs/api/interfaces/StorageFileMetadata.md +0 -140
- package/docs/api/interfaces/StorageListOptions.md +0 -86
- package/docs/api/interfaces/StorageListResult.md +0 -41
- package/docs/api/interfaces/StorageUploadOptions.md +0 -88
- package/docs/api/interfaces/StorageUploadResult.md +0 -63
- package/docs/api/interfaces/StorageUrlOptions.md +0 -47
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +0 -136
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +0 -123
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +0 -87
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +0 -81
- package/docs/api/interfaces/UsePublicEventOptions.md +0 -34
- package/docs/api/interfaces/UsePublicEventReturn.md +0 -68
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +0 -94
- package/docs/best-practices/README.md +0 -400
- package/docs/consuming-app-vite-config.md +0 -233
- package/docs/examples/navigation-menu-auth-fix.md +0 -344
- package/docs/implementation-guides/hierarchical-datatable.md +0 -850
- package/docs/implementation-guides/public-pages.md +0 -752
- package/docs/migration/quick-migration-guide.md +0 -320
- package/docs/migration/v0.4.15-tailwind-scanning.md +0 -272
- package/docs/migration/v0.4.16-css-first-approach.md +0 -306
- package/docs/migration/v0.4.17-source-path-fix.md +0 -229
- package/docs/print-components/README.md +0 -258
- package/docs/print-components/api-reference.md +0 -636
- package/docs/print-components/examples/README.md +0 -204
- package/docs/print-components/examples/basic-report.tsx +0 -92
- package/docs/print-components/examples/card-catalog.tsx +0 -149
- package/docs/print-components/examples/cover-page-report.tsx +0 -163
- package/docs/print-components/quick-start.md +0 -363
- package/docs/troubleshooting/README.md +0 -497
- package/docs/troubleshooting/styling-issues.md +0 -219
- package/docs/troubleshooting/tailwind-content-scanning.md +0 -213
- package/src/__mocks__/lucide-react.ts +0 -181
- 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__/setup.ts +0 -259
- 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__/templates/accessibility.test.template.tsx +0 -279
- package/src/__tests__/templates/component.test.template.tsx +0 -122
- package/src/__tests__/templates/integration.test.template.tsx +0 -199
- 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/Alert.tsx +0 -134
- package/src/components/Alert/__tests__/Alert.unit.test.tsx +0 -381
- package/src/components/Alert/index.ts +0 -2
- package/src/components/Avatar/Avatar.tsx +0 -84
- package/src/components/Avatar/__tests__/Avatar.unit.test.tsx +0 -232
- package/src/components/Avatar/index.ts +0 -2
- package/src/components/Button/Button.tsx +0 -270
- 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/Button/index.ts +0 -2
- package/src/components/Card/Card.tsx +0 -271
- 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/Card/index.ts +0 -1
- package/src/components/Checkbox/Checkbox.tsx +0 -75
- package/src/components/Checkbox/__mocks__/Checkbox.tsx +0 -2
- package/src/components/Checkbox/__tests__/Checkbox.unit.test.tsx +0 -520
- package/src/components/Checkbox/index.ts +0 -2
- package/src/components/DataTable/DataTable.tsx +0 -438
- 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__/README.md +0 -145
- package/src/components/DataTable/__tests__/mocks/MockRBACProvider.tsx +0 -66
- 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/__tests__/test-utils/dataFactories.ts +0 -103
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +0 -381
- package/src/components/DataTable/__tests__/test-utils.ts +0 -94
- package/src/components/DataTable/components/ActionButtons.tsx +0 -177
- package/src/components/DataTable/components/BulkOperationsDropdown.tsx +0 -160
- package/src/components/DataTable/components/ColumnFilter.tsx +0 -114
- package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +0 -100
- package/src/components/DataTable/components/DataTableBody.tsx +0 -461
- package/src/components/DataTable/components/DataTableCore.tsx +0 -941
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +0 -214
- package/src/components/DataTable/components/DataTableModals.tsx +0 -87
- package/src/components/DataTable/components/DataTableToolbar.tsx +0 -250
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -144
- package/src/components/DataTable/components/EditableRow.tsx +0 -159
- package/src/components/DataTable/components/EmptyState.tsx +0 -64
- package/src/components/DataTable/components/ExpandButton.tsx +0 -113
- package/src/components/DataTable/components/FilterRow.tsx +0 -100
- package/src/components/DataTable/components/GroupHeader.tsx +0 -42
- package/src/components/DataTable/components/GroupingDropdown.tsx +0 -96
- package/src/components/DataTable/components/ImportModal.tsx +0 -345
- package/src/components/DataTable/components/LoadingState.tsx +0 -12
- package/src/components/DataTable/components/PaginationControls.tsx +0 -332
- package/src/components/DataTable/components/UnifiedTableBody.tsx +0 -713
- package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -513
- 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/components/index.ts +0 -16
- package/src/components/DataTable/context/DataTableContext.tsx +0 -97
- package/src/components/DataTable/core/ActionManager.ts +0 -235
- package/src/components/DataTable/core/ColumnFactory.ts +0 -268
- package/src/components/DataTable/core/ColumnManager.ts +0 -205
- package/src/components/DataTable/core/DataManager.ts +0 -188
- package/src/components/DataTable/core/DataTableContext.tsx +0 -181
- package/src/components/DataTable/core/LocalDataAdapter.ts +0 -264
- package/src/components/DataTable/core/PluginRegistry.ts +0 -229
- package/src/components/DataTable/core/StateManager.ts +0 -311
- 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/core/index.ts +0 -8
- package/src/components/DataTable/core/interfaces.ts +0 -338
- package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +0 -418
- package/src/components/DataTable/examples/HierarchicalExample.tsx +0 -472
- package/src/components/DataTable/examples/InitialPageSizeExample.tsx +0 -173
- package/src/components/DataTable/examples/PerformanceExample.tsx +0 -502
- 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/hooks/useColumnOrderPersistence.ts +0 -95
- package/src/components/DataTable/hooks/useColumnReordering.ts +0 -110
- package/src/components/DataTable/hooks/useDataTableState.ts +0 -325
- package/src/components/DataTable/hooks/useHierarchicalState.ts +0 -174
- package/src/components/DataTable/index.ts +0 -68
- package/src/components/DataTable/styles.ts +0 -171
- package/src/components/DataTable/types.ts +0 -473
- 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/DataTable/utils/debugTools.ts +0 -583
- package/src/components/DataTable/utils/errorHandling.ts +0 -494
- package/src/components/DataTable/utils/exportUtils.ts +0 -126
- package/src/components/DataTable/utils/flexibleImport.ts +0 -510
- package/src/components/DataTable/utils/hierarchicalSorting.ts +0 -151
- package/src/components/DataTable/utils/hierarchicalUtils.ts +0 -218
- package/src/components/DataTable/utils/index.ts +0 -1
- package/src/components/DataTable/utils/performanceUtils.ts +0 -351
- package/src/components/Dialog/Dialog.tsx +0 -782
- package/src/components/Dialog/README.md +0 -804
- 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/BasicHtmlTest.tsx +0 -55
- package/src/components/Dialog/examples/DebugHtmlExample.tsx +0 -68
- package/src/components/Dialog/examples/HtmlDialogExample.tsx +0 -202
- package/src/components/Dialog/examples/SimpleHtmlTest.tsx +0 -61
- package/src/components/Dialog/examples/SmartDialogExample.tsx +0 -322
- package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +0 -151
- package/src/components/Dialog/index.ts +0 -12
- package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +0 -611
- package/src/components/Dialog/utils/safeHtml.ts +0 -185
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +0 -312
- 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/ErrorBoundary/index.ts +0 -8
- package/src/components/EventSelector/EventSelector.tsx +0 -360
- package/src/components/EventSelector/__tests__/EventSelector.test.tsx +0 -528
- package/src/components/EventSelector/index.ts +0 -3
- package/src/components/EventSelector/types.ts +0 -79
- package/src/components/FileUpload/FileUpload.example.tsx +0 -218
- package/src/components/FileUpload/FileUpload.tsx +0 -237
- 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/FileUpload/index.ts +0 -6
- package/src/components/Footer/Footer.tsx +0 -197
- 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/Footer/index.ts +0 -17
- package/src/components/Form/Form.tsx +0 -166
- package/src/components/Form/FormErrorSummary.tsx +0 -113
- package/src/components/Form/FormField.tsx +0 -249
- package/src/components/Form/FormFieldset.tsx +0 -127
- package/src/components/Form/FormLiveRegion.tsx +0 -198
- package/src/components/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/Form/index.ts +0 -26
- package/src/components/Header/Header.tsx +0 -301
- 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/Header/index.ts +0 -4
- package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +0 -196
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +0 -164
- package/src/components/InactivityWarningModal/__tests__/InactivityWarningModal.unit.test.tsx +0 -224
- package/src/components/InactivityWarningModal/index.ts +0 -9
- package/src/components/Input/Input.tsx +0 -201
- package/src/components/Input/__mocks__/Input.tsx +0 -2
- 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/Input/index.ts +0 -9
- package/src/components/Label/Label.tsx +0 -186
- 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/Label/index.ts +0 -2
- package/src/components/LoadingSpinner/LoadingSpinner.tsx +0 -98
- 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/LoadingSpinner/index.ts +0 -3
- package/src/components/LoginForm/LoginForm.tsx +0 -273
- 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/LoginForm/index.ts +0 -3
- package/src/components/NavigationMenu/NavigationMenu.tsx +0 -698
- 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/NavigationMenu/index.ts +0 -10
- package/src/components/NavigationMenu/types.ts +0 -85
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +0 -304
- package/src/components/OrganisationSelector/__tests__/OrganisationSelector.unit.test.tsx +0 -664
- package/src/components/OrganisationSelector/index.ts +0 -9
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +0 -699
- package/src/components/PaceAppLayout/README.md +0 -278
- 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/PaceAppLayout/index.ts +0 -1
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +0 -221
- 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/PaceLoginPage/index.ts +0 -1
- package/src/components/PasswordReset/PasswordChangeForm.tsx +0 -186
- package/src/components/PasswordReset/PasswordResetForm.tsx +0 -201
- 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/PasswordReset/index.ts +0 -4
- package/src/components/Print/__tests__/Print.comprehensive.test.tsx +0 -331
- package/src/components/PrintButton/PrintButton.tsx +0 -321
- package/src/components/PrintButton/PrintButtonGroup.tsx +0 -84
- package/src/components/PrintButton/PrintToolbar.tsx +0 -94
- 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/PrintButton/examples/PrintButtonShowcase.tsx +0 -438
- package/src/components/PrintButton/index.ts +0 -33
- package/src/components/PrintButton/types.ts +0 -173
- package/src/components/PrintCard/PrintCard.tsx +0 -154
- package/src/components/PrintCard/PrintCardContent.tsx +0 -57
- package/src/components/PrintCard/PrintCardFooter.tsx +0 -60
- package/src/components/PrintCard/PrintCardGrid.tsx +0 -91
- package/src/components/PrintCard/PrintCardHeader.tsx +0 -78
- package/src/components/PrintCard/PrintCardImage.tsx +0 -81
- 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/PrintCard/examples/PrintCardShowcase.tsx +0 -239
- package/src/components/PrintCard/index.ts +0 -34
- package/src/components/PrintCard/types.ts +0 -171
- package/src/components/PrintDataTable/PrintDataTable.tsx +0 -215
- package/src/components/PrintDataTable/PrintTableGroup.tsx +0 -90
- package/src/components/PrintDataTable/PrintTableRow.tsx +0 -76
- 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/PrintDataTable/index.ts +0 -25
- package/src/components/PrintDataTable/types.ts +0 -67
- package/src/components/PrintFooter/PrintFooter.tsx +0 -183
- package/src/components/PrintFooter/PrintFooterContent.tsx +0 -71
- package/src/components/PrintFooter/PrintFooterInfo.tsx +0 -86
- package/src/components/PrintFooter/PrintPageNumber.tsx +0 -90
- 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/PrintFooter/examples/PrintFooterShowcase.tsx +0 -390
- package/src/components/PrintFooter/index.ts +0 -30
- package/src/components/PrintFooter/types.ts +0 -149
- package/src/components/PrintGrid/PrintGrid.tsx +0 -180
- package/src/components/PrintGrid/PrintGridBreakpoint.tsx +0 -109
- package/src/components/PrintGrid/PrintGridContainer.tsx +0 -128
- package/src/components/PrintGrid/PrintGridItem.tsx +0 -220
- 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/PrintGrid/examples/PrintGridShowcase.tsx +0 -359
- package/src/components/PrintGrid/index.ts +0 -31
- package/src/components/PrintGrid/types.ts +0 -159
- package/src/components/PrintHeader/PrintCoverHeader.tsx +0 -230
- package/src/components/PrintHeader/PrintHeader.tsx +0 -150
- 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/PrintHeader/index.ts +0 -17
- package/src/components/PrintHeader/types.ts +0 -42
- package/src/components/PrintLayout/PrintLayout.tsx +0 -122
- package/src/components/PrintLayout/PrintLayoutContext.tsx +0 -66
- package/src/components/PrintLayout/PrintPageBreak.tsx +0 -52
- package/src/components/PrintLayout/__tests__/PrintLayout.unit.test.tsx +0 -238
- package/src/components/PrintLayout/examples/PrintShowcase.tsx +0 -230
- package/src/components/PrintLayout/index.ts +0 -19
- package/src/components/PrintLayout/types.ts +0 -37
- package/src/components/PrintPageBreak/PrintPageBreak.tsx +0 -120
- package/src/components/PrintPageBreak/PrintPageBreakGroup.tsx +0 -90
- package/src/components/PrintPageBreak/PrintPageBreakIndicator.tsx +0 -112
- 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/PrintPageBreak/examples/PrintPageBreakShowcase.tsx +0 -279
- package/src/components/PrintPageBreak/index.ts +0 -23
- package/src/components/PrintPageBreak/types.ts +0 -94
- package/src/components/PrintSection/PrintColumn.tsx +0 -104
- package/src/components/PrintSection/PrintDivider.tsx +0 -101
- package/src/components/PrintSection/PrintSection.tsx +0 -129
- package/src/components/PrintSection/PrintSectionContent.tsx +0 -75
- package/src/components/PrintSection/PrintSectionHeader.tsx +0 -97
- 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/PrintSection/examples/PrintSectionShowcase.tsx +0 -258
- package/src/components/PrintSection/index.ts +0 -33
- package/src/components/PrintSection/types.ts +0 -155
- package/src/components/PrintText/PrintText.tsx +0 -116
- package/src/components/PrintText/__tests__/PrintText.unit.test.tsx +0 -351
- package/src/components/PrintText/index.ts +0 -16
- package/src/components/PrintText/types.ts +0 -24
- package/src/components/Progress/Progress.tsx +0 -116
- 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/Progress/index.ts +0 -3
- package/src/components/PublicLayout/EventLogo.tsx +0 -287
- package/src/components/PublicLayout/PublicErrorBoundary.tsx +0 -279
- package/src/components/PublicLayout/PublicLoadingSpinner.tsx +0 -208
- package/src/components/PublicLayout/PublicPageContextChecker.tsx +0 -130
- package/src/components/PublicLayout/PublicPageDebugger.tsx +0 -104
- package/src/components/PublicLayout/PublicPageDiagnostic.tsx +0 -162
- package/src/components/PublicLayout/PublicPageFooter.tsx +0 -124
- package/src/components/PublicLayout/PublicPageHeader.tsx +0 -178
- package/src/components/PublicLayout/PublicPageLayout.tsx +0 -232
- package/src/components/PublicLayout/PublicPageProvider.tsx +0 -137
- 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/PublicLayout/index.ts +0 -51
- package/src/components/RBAC/PagePermissionGuard.tsx +0 -287
- package/src/components/RBAC/RBACGuard.tsx +0 -143
- package/src/components/RBAC/RBACProvider.tsx +0 -186
- package/src/components/RBAC/RoleBasedContent.tsx +0 -129
- 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/RBAC/index.ts +0 -23
- package/src/components/Select/Select.tsx +0 -660
- 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/Select/index.ts +0 -1
- package/src/components/SuperAdminGuard.tsx +0 -116
- package/src/components/Table/Table.tsx +0 -222
- 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/Table/index.ts +0 -11
- package/src/components/Toast/Toast.tsx +0 -339
- 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/Toast/index.ts +0 -14
- package/src/components/Tooltip/Tooltip.tsx +0 -167
- 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/Tooltip/index.ts +0 -7
- package/src/components/UserMenu/UserMenu.tsx +0 -243
- 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/UserMenu/index.ts +0 -3
- 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/PermissionExample.tsx +0 -150
- package/src/components/examples/__tests__/PermissionExample.unit.test.tsx +0 -360
- package/src/components/index.ts +0 -434
- package/src/components.ts +0 -19
- package/src/constants/performance.ts +0 -14
- package/src/examples/CorrectPublicPageImplementation.tsx +0 -301
- package/src/examples/PublicEventPage.tsx +0 -274
- package/src/examples/PublicPageApp.tsx +0 -308
- package/src/examples/PublicPageUsageExample.tsx +0 -216
- 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/index.ts +0 -56
- 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/hooks/public/index.ts +0 -34
- package/src/hooks/public/usePublicEvent.ts +0 -261
- package/src/hooks/public/usePublicEventLogo.ts +0 -285
- package/src/hooks/public/usePublicRouteParams.ts +0 -259
- package/src/hooks/useAppConfig.ts +0 -94
- package/src/hooks/useComponentPerformance.ts +0 -39
- package/src/hooks/useDataTablePerformance.ts +0 -387
- package/src/hooks/useDataTableState.ts +0 -110
- package/src/hooks/useDebounce.ts +0 -18
- package/src/hooks/useFocusManagement.ts +0 -161
- package/src/hooks/useFocusTrap.ts +0 -155
- package/src/hooks/useInactivityTracker.ts +0 -372
- package/src/hooks/useIsMobile.ts +0 -42
- package/src/hooks/useKeyboardShortcuts.ts +0 -237
- package/src/hooks/useOrganisationPermissions.ts +0 -208
- package/src/hooks/useOrganisationSecurity.ts +0 -262
- package/src/hooks/usePerformanceMonitor.ts +0 -128
- package/src/hooks/usePermissionCache.ts +0 -455
- package/src/hooks/useRBAC.ts +0 -262
- package/src/hooks/useSecureDataAccess.ts +0 -586
- package/src/hooks/useStorage.ts +0 -274
- package/src/hooks/useToast.ts +0 -242
- package/src/hooks/useZodForm.ts +0 -28
- package/src/index.ts +0 -200
- package/src/providers/AuthProvider.tsx +0 -369
- package/src/providers/EventProvider.tsx +0 -324
- package/src/providers/InactivityProvider.tsx +0 -238
- package/src/providers/OrganisationProvider.tsx +0 -588
- package/src/providers/RBACProvider.tsx +0 -634
- package/src/providers/UnifiedAuthProvider.tsx +0 -327
- 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/providers/index.ts +0 -15
- package/src/rbac/README.md +0 -885
- 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/adapters.tsx +0 -726
- package/src/rbac/api.ts +0 -339
- package/src/rbac/audit-enhanced.ts +0 -339
- package/src/rbac/audit.ts +0 -338
- package/src/rbac/cache.ts +0 -215
- package/src/rbac/components/EnhancedNavigationMenu.tsx +0 -294
- package/src/rbac/components/NavigationGuard.tsx +0 -294
- package/src/rbac/components/NavigationProvider.tsx +0 -314
- package/src/rbac/components/PagePermissionGuard.tsx +0 -430
- package/src/rbac/components/PagePermissionProvider.tsx +0 -274
- package/src/rbac/components/PermissionEnforcer.tsx +0 -307
- package/src/rbac/components/RoleBasedRouter.tsx +0 -425
- package/src/rbac/components/SecureDataProvider.tsx +0 -319
- 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/components/index.ts +0 -64
- package/src/rbac/config.ts +0 -133
- package/src/rbac/docs/event-based-apps.md +0 -285
- package/src/rbac/engine.ts +0 -1026
- package/src/rbac/eslint-rules.js +0 -285
- package/src/rbac/examples/CompleteRBACExample.tsx +0 -323
- package/src/rbac/examples/EventBasedApp.tsx +0 -238
- package/src/rbac/hooks.ts +0 -570
- package/src/rbac/index.ts +0 -114
- package/src/rbac/permissions.ts +0 -293
- package/src/rbac/secureClient.ts +0 -244
- package/src/rbac/security.ts +0 -346
- package/src/rbac/testing/__tests__/index.test.tsx +0 -342
- package/src/rbac/testing/index.tsx +0 -340
- package/src/rbac/types.ts +0 -343
- package/src/rbac/utils/__tests__/eventContext.test.ts +0 -428
- package/src/rbac/utils/__tests__/eventContext.unit.test.ts +0 -428
- package/src/rbac/utils/eventContext.ts +0 -83
- package/src/styles/__tests__/styles.unit.test.ts +0 -164
- package/src/styles/core.css +0 -401
- package/src/styles/index.ts +0 -51
- 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/theming/runtime.ts +0 -187
- 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/types/database.ts +0 -472
- package/src/types/guards.ts +0 -30
- package/src/types/index.ts +0 -25
- package/src/types/organisation.ts +0 -184
- package/src/types/security.ts +0 -70
- package/src/types/supabase.ts +0 -166
- package/src/types/theme.ts +0 -6
- package/src/types/unified.ts +0 -262
- package/src/types/validation.ts +0 -164
- package/src/types/vitest-globals.d.ts +0 -43
- package/src/utils/__mocks__/supabaseMock.ts +0 -75
- package/src/utils/__mocks__/supabaseMock.tsx +0 -198
- 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/appConfig.ts +0 -47
- package/src/utils/appIdResolver.ts +0 -130
- package/src/utils/appNameResolver.ts +0 -190
- package/src/utils/audit.ts +0 -127
- package/src/utils/auth-utils.ts +0 -96
- package/src/utils/bundleAnalysis.ts +0 -129
- package/src/utils/cn.ts +0 -7
- package/src/utils/debugLogger.ts +0 -46
- package/src/utils/deviceFingerprint.ts +0 -215
- package/src/utils/dynamicUtils.ts +0 -105
- package/src/utils/formatting.ts +0 -77
- package/src/utils/index.ts +0 -145
- package/src/utils/lazyLoad.tsx +0 -44
- package/src/utils/organisationContext.ts +0 -135
- package/src/utils/performanceBenchmark.ts +0 -64
- package/src/utils/performanceBudgets.ts +0 -111
- package/src/utils/permissionTypes.ts +0 -37
- package/src/utils/permissionUtils.ts +0 -31
- package/src/utils/print/PrintDataProcessor.ts +0 -390
- 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/print/examples/PrintUtilitiesShowcase.tsx +0 -397
- package/src/utils/print/index.ts +0 -29
- package/src/utils/print/types.ts +0 -196
- package/src/utils/print/usePrintOptimization.ts +0 -272
- package/src/utils/sanitization.ts +0 -264
- package/src/utils/schemaUtils.ts +0 -37
- package/src/utils/secureDataAccess.ts +0 -361
- package/src/utils/secureErrors.ts +0 -79
- package/src/utils/secureStorage.ts +0 -244
- package/src/utils/security.ts +0 -156
- package/src/utils/securityMonitor.ts +0 -45
- package/src/utils/sessionTracking.ts +0 -170
- package/src/utils/storage/README.md +0 -348
- 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/utils/storage/config.ts +0 -100
- package/src/utils/storage/helpers.ts +0 -359
- package/src/utils/storage/index.ts +0 -36
- package/src/utils/storage/types.ts +0 -90
- package/src/utils/validation.ts +0 -111
- package/src/utils/validationUtils.ts +0 -120
- 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/src/validation/common.ts +0 -53
- package/src/validation/csrf.ts +0 -214
- package/src/validation/index.ts +0 -43
- package/src/validation/passwordSchema.ts +0 -125
- package/src/validation/sanitization.ts +0 -96
- package/src/validation/schemaUtils.ts +0 -42
- package/src/validation/sqlInjectionProtection.ts +0 -242
- package/src/validation/user.ts +0 -34
- package/dist/{DataTable-EEUDXPE5.js.map → DataTable-2LB6HI6V.js.map} +0 -0
- package/dist/{api-ETQ6YJ3C.js.map → api-AIJ3IJX3.js.map} +0 -0
- package/dist/{appNameResolver-7GHF5ED2.js.map → audit-PD5L5ZSC.js.map} +0 -0
- package/dist/{audit-BUW3LMJB.js.map → chunk-DC5AMYBS.js.map} +0 -0
- package/dist/{validation-PM_iOaTI.d.ts → validation-D2-NNCCE.d.ts} +6 -6
|
@@ -8,11 +8,9 @@ The PACE Core DataTable is an enterprise-grade data table component built on Tan
|
|
|
8
8
|
|
|
9
9
|
- **🚀 Performance Optimized** - Virtual scrolling, intelligent chunking, and automatic mode detection
|
|
10
10
|
- **📊 Data Management** - Sorting, filtering, pagination, search, export/import
|
|
11
|
-
- **🌳 Hierarchical Rows** - Parent/child row relationships with expand/collapse all and smart sorting ([Detailed Guide](./hierarchical-datatable.md))
|
|
12
11
|
- **✏️ Inline Editing** - Row editing, creation, and deletion
|
|
13
12
|
- **🎯 Actions** - Custom row actions and toolbar buttons
|
|
14
13
|
- **📈 Grouping** - Data grouping with aggregation functions
|
|
15
|
-
- **📏 Auto Column Sizing** - Automatic column width adjustment based on content
|
|
16
14
|
- **🎨 Customizable** - Column visibility, responsive design, accessibility
|
|
17
15
|
- **🔧 TypeScript** - Full TypeScript support with strict typing
|
|
18
16
|
|
|
@@ -57,8 +55,8 @@ const columns: DataTableColumn<User>[] = [
|
|
|
57
55
|
cell: ({ row }) => (
|
|
58
56
|
<span className={`px-2 py-1 rounded text-xs ${
|
|
59
57
|
row.original.status === 'active'
|
|
60
|
-
? 'bg-
|
|
61
|
-
: 'bg-
|
|
58
|
+
? 'bg-green-100 text-green-800'
|
|
59
|
+
: 'bg-red-100 text-red-800'
|
|
62
60
|
}`}>
|
|
63
61
|
{row.original.status}
|
|
64
62
|
</span>
|
|
@@ -84,7 +82,6 @@ function UserTable() {
|
|
|
84
82
|
sorting: true,
|
|
85
83
|
filtering: true,
|
|
86
84
|
}}
|
|
87
|
-
columnOrder={['name', 'email', 'role', 'status']} // Control column order
|
|
88
85
|
// Performance and other settings can be configured via performance prop
|
|
89
86
|
/>
|
|
90
87
|
);
|
|
@@ -144,22 +141,19 @@ The DataTable component has a comprehensive prop interface. Here are the key pro
|
|
|
144
141
|
- `description?: string` - Table description
|
|
145
142
|
- `variant?: 'default' | 'compact' | 'spacious'` - Visual variant
|
|
146
143
|
- `className?: string` - Additional CSS classes
|
|
147
|
-
- `columnOrder?: string[]` - **Column ordering** - Array of column IDs in desired order
|
|
148
144
|
|
|
149
145
|
### Event Handlers
|
|
150
146
|
- `onEditRow?: (row: TData, data: Partial<TData>) => void` - Row edit handler
|
|
151
|
-
- `onDeleteRow?: (row: TData) => void` - Row deletion handler
|
|
147
|
+
- `onDeleteRow?: (row: TData) => void` - Row deletion handler
|
|
152
148
|
- `onCreateRow?: (data: Partial<TData>) => void` - Row creation handler
|
|
153
149
|
- `onImport?: (data: TData[]) => void | Promise<void>` - Import handler
|
|
154
|
-
- `
|
|
155
|
-
- `onDeleteSelected?: (selectedRows: Record<string, boolean>) => void` - **Bulk delete handler** - Called when delete selected button is clicked
|
|
150
|
+
- `onDeleteSelected?: (selectedRows: Record<string, boolean>) => void` - Bulk delete handler
|
|
156
151
|
|
|
157
152
|
### Performance Props
|
|
158
153
|
- `performance?: PerformanceConfig` - Performance optimization settings
|
|
159
154
|
- `serverSide?: ServerSideConfig<TData>` - Server-side data fetching
|
|
160
155
|
- `virtualHeight?: number` - Virtual scrolling height (default: 600)
|
|
161
156
|
- `showPerformanceMetrics?: boolean` - Show performance metrics
|
|
162
|
-
- `initialPageSize?: number` - Initial page size for pagination (default: 10)
|
|
163
157
|
|
|
164
158
|
### Feature-Specific Configuration
|
|
165
159
|
- `bulkOperationsConfig?: BulkOperationsConfig` - Bulk operations config
|
|
@@ -171,30 +165,6 @@ The DataTable component has a comprehensive prop interface. Here are the key pro
|
|
|
171
165
|
|
|
172
166
|
The DataTable component uses a unified `features` prop to control all table functionality. This provides a consistent and intuitive way to enable or disable features.
|
|
173
167
|
|
|
174
|
-
### DataTableFeatureConfig Properties
|
|
175
|
-
|
|
176
|
-
| Property | Type | Default | Description |
|
|
177
|
-
|----------|------|---------|-------------|
|
|
178
|
-
| **Core Features** |
|
|
179
|
-
| `search` | `boolean` | `false` | Enable global search functionality |
|
|
180
|
-
| `pagination` | `boolean` | `false` | Enable pagination controls |
|
|
181
|
-
| `sorting` | `boolean` | `false` | Enable column sorting |
|
|
182
|
-
| `filtering` | `boolean` | `false` | Enable column filtering |
|
|
183
|
-
| **Data Management** |
|
|
184
|
-
| `import` | `boolean` | `false` | Enable data import functionality |
|
|
185
|
-
| `export` | `boolean` | `false` | Enable data export functionality |
|
|
186
|
-
| **Row Operations** |
|
|
187
|
-
| `selection` | `boolean` | `false` | Enable row selection for bulk operations |
|
|
188
|
-
| `creation` | `boolean` | `false` | Enable row creation |
|
|
189
|
-
| `editing` | `boolean` | `false` | Enable row editing |
|
|
190
|
-
| `deletion` | `boolean` | `false` | Enable row deletion |
|
|
191
|
-
| `deleteSelected` | `boolean` | `false` | Enable bulk deletion of selected rows |
|
|
192
|
-
| **Table Customization** |
|
|
193
|
-
| `grouping` | `boolean` | `false` | Enable data grouping |
|
|
194
|
-
| `columnVisibility` | `boolean` | `false` | Enable column visibility controls |
|
|
195
|
-
| `columnReordering` | `boolean` | `false` | Enable column reordering |
|
|
196
|
-
| `autoColumnSizing` | `boolean` | `false` | Enable automatic column width adjustment based on content |
|
|
197
|
-
|
|
198
168
|
### Basic Feature Configuration
|
|
199
169
|
|
|
200
170
|
```tsx
|
|
@@ -213,17 +183,25 @@ The DataTable component uses a unified `features` prop to control all table func
|
|
|
213
183
|
export: true,
|
|
214
184
|
|
|
215
185
|
// Row Operations
|
|
216
|
-
selection: true,
|
|
186
|
+
selection: true,
|
|
217
187
|
creation: true,
|
|
218
188
|
editing: true,
|
|
219
|
-
deletion: true,
|
|
220
|
-
deleteSelected: true,
|
|
189
|
+
deletion: true,
|
|
190
|
+
deleteSelected: true,
|
|
221
191
|
|
|
222
192
|
// Table Customization
|
|
223
193
|
grouping: true,
|
|
224
194
|
columnVisibility: true,
|
|
225
195
|
columnReordering: true,
|
|
226
|
-
|
|
196
|
+
|
|
197
|
+
// Performance
|
|
198
|
+
virtualization: true,
|
|
199
|
+
performanceMetrics: true,
|
|
200
|
+
|
|
201
|
+
// Advanced Features
|
|
202
|
+
inlineEditing: true,
|
|
203
|
+
bulkOperations: true,
|
|
204
|
+
rowActions: true,
|
|
227
205
|
}}
|
|
228
206
|
/>
|
|
229
207
|
```
|
|
@@ -261,93 +239,17 @@ For a full-featured data management table:
|
|
|
261
239
|
creation: true,
|
|
262
240
|
editing: true,
|
|
263
241
|
deletion: true,
|
|
264
|
-
deleteSelected: true, // Enable delete selected functionality
|
|
265
242
|
export: true,
|
|
266
243
|
import: true,
|
|
267
244
|
grouping: true,
|
|
268
245
|
columnVisibility: true,
|
|
269
246
|
bulkOperations: true,
|
|
270
247
|
}}
|
|
271
|
-
columnOrder={['select', 'name', 'email', 'role', 'status', 'actions']} // Custom column order
|
|
272
248
|
onEditRow={handleEdit}
|
|
273
249
|
onDeleteRow={handleDelete}
|
|
274
250
|
onCreateRow={handleCreate}
|
|
275
251
|
onImport={handleImport}
|
|
276
|
-
onRowSelectionChange={handleSelectionChange}
|
|
277
252
|
onDeleteSelected={handleBulkDelete}
|
|
278
|
-
getRowId={(row) => row.id} // Important: Required for selection and delete operations
|
|
279
|
-
/>
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
## Auto Column Sizing
|
|
283
|
-
|
|
284
|
-
The DataTable component includes automatic column width adjustment based on content, which helps optimize space usage and improve readability.
|
|
285
|
-
|
|
286
|
-
### How Auto-Sizing Works
|
|
287
|
-
|
|
288
|
-
When `autoColumnSizing: true` is enabled:
|
|
289
|
-
|
|
290
|
-
1. **Content Analysis**: Analyzes both header text and data content to determine optimal widths
|
|
291
|
-
2. **Smart Calculation**: Uses character count estimation (8px per character + padding)
|
|
292
|
-
3. **Constraints**: Respects min-width (80px) and max-width (400px) limits
|
|
293
|
-
4. **Performance**: Only samples first 100 rows for large datasets
|
|
294
|
-
5. **Table Layout**: Switches from `tableLayout: 'fixed'` to `tableLayout: 'auto'`
|
|
295
|
-
|
|
296
|
-
### Benefits
|
|
297
|
-
|
|
298
|
-
- **Better Space Utilization**: Columns automatically adjust to content width
|
|
299
|
-
- **Improved Readability**: Long text gets more space, short text takes less space
|
|
300
|
-
- **No Text Wrapping**: Prevents unnecessary text wrapping in narrow columns
|
|
301
|
-
- **Consistent Layout**: Maintains proper spacing and alignment
|
|
302
|
-
|
|
303
|
-
### Enabling Auto-Sizing
|
|
304
|
-
|
|
305
|
-
```tsx
|
|
306
|
-
<DataTable
|
|
307
|
-
data={data}
|
|
308
|
-
columns={columns}
|
|
309
|
-
features={{
|
|
310
|
-
search: true,
|
|
311
|
-
pagination: true,
|
|
312
|
-
sorting: true,
|
|
313
|
-
autoColumnSizing: true, // Enable automatic column width adjustment
|
|
314
|
-
}}
|
|
315
|
-
/>
|
|
316
|
-
```
|
|
317
|
-
|
|
318
|
-
### Auto-Sizing vs Fixed Widths
|
|
319
|
-
|
|
320
|
-
**With Auto-Sizing (Recommended):**
|
|
321
|
-
- Columns automatically adjust to content width
|
|
322
|
-
- Long text gets more space, short text takes less space
|
|
323
|
-
- Better space utilization
|
|
324
|
-
- Improved readability
|
|
325
|
-
|
|
326
|
-
**Without Auto-Sizing:**
|
|
327
|
-
- All columns have equal width
|
|
328
|
-
- Long text may wrap unnecessarily
|
|
329
|
-
- Short columns have wasted space
|
|
330
|
-
- Consistent but potentially inefficient layout
|
|
331
|
-
|
|
332
|
-
### Example: Content-Based Sizing
|
|
333
|
-
|
|
334
|
-
```tsx
|
|
335
|
-
const data = [
|
|
336
|
-
{ id: '1', name: 'John', description: 'A short description' },
|
|
337
|
-
{ id: '2', name: 'Jane', description: 'A very long description that should make this column wider' },
|
|
338
|
-
{ id: '3', name: 'Bob', description: 'Medium length description' }
|
|
339
|
-
];
|
|
340
|
-
|
|
341
|
-
const columns = [
|
|
342
|
-
{ accessorKey: 'name', header: 'Name' },
|
|
343
|
-
{ accessorKey: 'description', header: 'Description' }
|
|
344
|
-
];
|
|
345
|
-
|
|
346
|
-
// With auto-sizing: Description column will be wider than Name column
|
|
347
|
-
<DataTable
|
|
348
|
-
data={data}
|
|
349
|
-
columns={columns}
|
|
350
|
-
features={{ autoColumnSizing: true }}
|
|
351
253
|
/>
|
|
352
254
|
```
|
|
353
255
|
|
|
@@ -459,275 +361,6 @@ const columns: DataTableColumn<User>[] = [
|
|
|
459
361
|
];
|
|
460
362
|
```
|
|
461
363
|
|
|
462
|
-
## Column Ordering
|
|
463
|
-
|
|
464
|
-
The DataTable component supports custom column ordering through the `columnOrder` prop, allowing you to control the exact position of columns including selection and actions columns.
|
|
465
|
-
|
|
466
|
-
### Basic Column Ordering
|
|
467
|
-
|
|
468
|
-
```tsx
|
|
469
|
-
<DataTable
|
|
470
|
-
data={data}
|
|
471
|
-
columns={columns}
|
|
472
|
-
features={{
|
|
473
|
-
selection: true,
|
|
474
|
-
sorting: true,
|
|
475
|
-
filtering: true,
|
|
476
|
-
}}
|
|
477
|
-
columnOrder={['select', 'name', 'email', 'role', 'status']}
|
|
478
|
-
/>
|
|
479
|
-
```
|
|
480
|
-
|
|
481
|
-
### Column Order Behavior
|
|
482
|
-
|
|
483
|
-
#### When `columnOrder` is provided:
|
|
484
|
-
- **Exact positioning**: Columns appear in the exact order specified
|
|
485
|
-
- **Selection column**: Include `'select'` in the array to position the selection column
|
|
486
|
-
- **Actions column**: Include `'actions'` in the array to position the actions column
|
|
487
|
-
- **Data columns**: Use the column's `accessorKey` or `id` to reference data columns
|
|
488
|
-
|
|
489
|
-
#### When `columnOrder` is not provided:
|
|
490
|
-
- **Default behavior**: Selection column first (if enabled), then data columns, then actions column
|
|
491
|
-
- **Automatic ordering**: Columns appear in the order they're defined in the `columns` array
|
|
492
|
-
|
|
493
|
-
### Selection Column Positioning
|
|
494
|
-
|
|
495
|
-
The selection column can be positioned anywhere in the column order:
|
|
496
|
-
|
|
497
|
-
```tsx
|
|
498
|
-
// Selection column first (default when not in columnOrder)
|
|
499
|
-
<DataTable
|
|
500
|
-
data={data}
|
|
501
|
-
columns={columns}
|
|
502
|
-
features={{ selection: true }}
|
|
503
|
-
columnOrder={['select', 'name', 'email', 'role']}
|
|
504
|
-
/>
|
|
505
|
-
|
|
506
|
-
// Selection column in the middle
|
|
507
|
-
<DataTable
|
|
508
|
-
data={data}
|
|
509
|
-
columns={columns}
|
|
510
|
-
features={{ selection: true }}
|
|
511
|
-
columnOrder={['name', 'select', 'email', 'role']}
|
|
512
|
-
/>
|
|
513
|
-
|
|
514
|
-
// Selection column last
|
|
515
|
-
<DataTable
|
|
516
|
-
data={data}
|
|
517
|
-
columns={columns}
|
|
518
|
-
features={{ selection: true }}
|
|
519
|
-
columnOrder={['name', 'email', 'role', 'select']}
|
|
520
|
-
/>
|
|
521
|
-
|
|
522
|
-
// Selection column not in columnOrder - defaults to first position
|
|
523
|
-
<DataTable
|
|
524
|
-
data={data}
|
|
525
|
-
columns={columns}
|
|
526
|
-
features={{ selection: true }}
|
|
527
|
-
columnOrder={['name', 'email', 'role']} // selection will be first
|
|
528
|
-
/>
|
|
529
|
-
```
|
|
530
|
-
|
|
531
|
-
### Actions Column Positioning
|
|
532
|
-
|
|
533
|
-
The actions column can also be positioned anywhere:
|
|
534
|
-
|
|
535
|
-
```tsx
|
|
536
|
-
// Actions column last (default when not in columnOrder)
|
|
537
|
-
<DataTable
|
|
538
|
-
data={data}
|
|
539
|
-
columns={columns}
|
|
540
|
-
features={{ editing: true, deletion: true }}
|
|
541
|
-
columnOrder={['name', 'email', 'role', 'actions']}
|
|
542
|
-
/>
|
|
543
|
-
|
|
544
|
-
// Actions column first
|
|
545
|
-
<DataTable
|
|
546
|
-
data={data}
|
|
547
|
-
columns={columns}
|
|
548
|
-
features={{ editing: true, deletion: true }}
|
|
549
|
-
columnOrder={['actions', 'name', 'email', 'role']}
|
|
550
|
-
/>
|
|
551
|
-
|
|
552
|
-
// Actions column in the middle
|
|
553
|
-
<DataTable
|
|
554
|
-
data={data}
|
|
555
|
-
columns={columns}
|
|
556
|
-
features={{ editing: true, deletion: true }}
|
|
557
|
-
columnOrder={['name', 'actions', 'email', 'role']}
|
|
558
|
-
/>
|
|
559
|
-
```
|
|
560
|
-
|
|
561
|
-
### Complete Column Ordering Example
|
|
562
|
-
|
|
563
|
-
```tsx
|
|
564
|
-
interface User {
|
|
565
|
-
id: string;
|
|
566
|
-
name: string;
|
|
567
|
-
email: string;
|
|
568
|
-
role: string;
|
|
569
|
-
status: 'active' | 'inactive';
|
|
570
|
-
createdAt: Date;
|
|
571
|
-
}
|
|
572
|
-
|
|
573
|
-
const columns: DataTableColumn<User>[] = [
|
|
574
|
-
{
|
|
575
|
-
accessorKey: 'name',
|
|
576
|
-
header: 'Name',
|
|
577
|
-
sortable: true,
|
|
578
|
-
},
|
|
579
|
-
{
|
|
580
|
-
accessorKey: 'email',
|
|
581
|
-
header: 'Email',
|
|
582
|
-
sortable: true,
|
|
583
|
-
},
|
|
584
|
-
{
|
|
585
|
-
accessorKey: 'role',
|
|
586
|
-
header: 'Role',
|
|
587
|
-
sortable: true,
|
|
588
|
-
enableGrouping: true,
|
|
589
|
-
},
|
|
590
|
-
{
|
|
591
|
-
accessorKey: 'status',
|
|
592
|
-
header: 'Status',
|
|
593
|
-
sortable: true,
|
|
594
|
-
},
|
|
595
|
-
{
|
|
596
|
-
accessorKey: 'createdAt',
|
|
597
|
-
header: 'Created',
|
|
598
|
-
sortable: true,
|
|
599
|
-
},
|
|
600
|
-
];
|
|
601
|
-
|
|
602
|
-
function UserTable() {
|
|
603
|
-
return (
|
|
604
|
-
<DataTable
|
|
605
|
-
data={users}
|
|
606
|
-
columns={columns}
|
|
607
|
-
title="User Management"
|
|
608
|
-
features={{
|
|
609
|
-
selection: true,
|
|
610
|
-
sorting: true,
|
|
611
|
-
filtering: true,
|
|
612
|
-
editing: true,
|
|
613
|
-
deletion: true,
|
|
614
|
-
}}
|
|
615
|
-
// Custom column order: selection first, then name, email, role, status, actions, created last
|
|
616
|
-
columnOrder={['select', 'name', 'email', 'role', 'status', 'actions', 'createdAt']}
|
|
617
|
-
onEditRow={handleEdit}
|
|
618
|
-
onDeleteRow={handleDelete}
|
|
619
|
-
/>
|
|
620
|
-
);
|
|
621
|
-
}
|
|
622
|
-
```
|
|
623
|
-
|
|
624
|
-
### Column Ordering with Hierarchical Data
|
|
625
|
-
|
|
626
|
-
When using hierarchical data, column ordering works the same way:
|
|
627
|
-
|
|
628
|
-
```tsx
|
|
629
|
-
<DataTable
|
|
630
|
-
data={hierarchicalData}
|
|
631
|
-
columns={columns}
|
|
632
|
-
features={{
|
|
633
|
-
hierarchical: true,
|
|
634
|
-
selection: true,
|
|
635
|
-
editing: true,
|
|
636
|
-
deletion: true,
|
|
637
|
-
}}
|
|
638
|
-
hierarchical={{
|
|
639
|
-
enabled: true,
|
|
640
|
-
defaultExpanded: false,
|
|
641
|
-
}}
|
|
642
|
-
// Custom order for hierarchical table
|
|
643
|
-
columnOrder={['select', 'name', 'ingredient', 'quantity', 'actions']}
|
|
644
|
-
/>
|
|
645
|
-
```
|
|
646
|
-
|
|
647
|
-
### Dynamic Column Ordering
|
|
648
|
-
|
|
649
|
-
You can dynamically change column order based on user preferences or application state:
|
|
650
|
-
|
|
651
|
-
```tsx
|
|
652
|
-
function DynamicUserTable() {
|
|
653
|
-
const [columnOrder, setColumnOrder] = useState(['select', 'name', 'email', 'role', 'status']);
|
|
654
|
-
|
|
655
|
-
const handleColumnReorder = (newOrder: string[]) => {
|
|
656
|
-
setColumnOrder(newOrder);
|
|
657
|
-
// Save to localStorage or user preferences
|
|
658
|
-
localStorage.setItem('userTableColumnOrder', JSON.stringify(newOrder));
|
|
659
|
-
};
|
|
660
|
-
|
|
661
|
-
return (
|
|
662
|
-
<DataTable
|
|
663
|
-
data={users}
|
|
664
|
-
columns={columns}
|
|
665
|
-
features={{
|
|
666
|
-
selection: true,
|
|
667
|
-
sorting: true,
|
|
668
|
-
columnReordering: true, // Enable drag-and-drop reordering
|
|
669
|
-
}}
|
|
670
|
-
columnOrder={columnOrder}
|
|
671
|
-
onColumnOrderChange={handleColumnReorder}
|
|
672
|
-
/>
|
|
673
|
-
);
|
|
674
|
-
}
|
|
675
|
-
```
|
|
676
|
-
|
|
677
|
-
### Column Ordering Best Practices
|
|
678
|
-
|
|
679
|
-
#### 1. **Consistent Ordering**
|
|
680
|
-
```tsx
|
|
681
|
-
// ✅ Good - Consistent ordering across similar tables
|
|
682
|
-
const userTableOrder = ['select', 'name', 'email', 'role', 'status', 'actions'];
|
|
683
|
-
const productTableOrder = ['select', 'name', 'sku', 'price', 'status', 'actions'];
|
|
684
|
-
|
|
685
|
-
// ❌ Avoid - Inconsistent ordering
|
|
686
|
-
const userTableOrder = ['select', 'name', 'email', 'role', 'status', 'actions'];
|
|
687
|
-
const productTableOrder = ['name', 'select', 'sku', 'actions', 'price', 'status'];
|
|
688
|
-
```
|
|
689
|
-
|
|
690
|
-
#### 2. **Logical Grouping**
|
|
691
|
-
```tsx
|
|
692
|
-
// ✅ Good - Logical grouping of related columns
|
|
693
|
-
columnOrder={[
|
|
694
|
-
'select', // Selection controls
|
|
695
|
-
'name', 'email', // Identity information
|
|
696
|
-
'role', 'status', // Access and state
|
|
697
|
-
'createdAt', // Metadata
|
|
698
|
-
'actions' // Actions
|
|
699
|
-
]}
|
|
700
|
-
|
|
701
|
-
// ❌ Avoid - Random column order
|
|
702
|
-
columnOrder={['email', 'actions', 'name', 'select', 'status', 'role', 'createdAt']}
|
|
703
|
-
```
|
|
704
|
-
|
|
705
|
-
#### 3. **User Experience Considerations**
|
|
706
|
-
```tsx
|
|
707
|
-
// ✅ Good - Most important columns first
|
|
708
|
-
columnOrder={['select', 'name', 'email', 'role', 'status', 'actions']}
|
|
709
|
-
|
|
710
|
-
// ✅ Good - Actions column last (standard pattern)
|
|
711
|
-
columnOrder={['select', 'name', 'email', 'role', 'status', 'actions']}
|
|
712
|
-
|
|
713
|
-
// ❌ Avoid - Actions column in the middle (confusing)
|
|
714
|
-
columnOrder={['select', 'name', 'actions', 'email', 'role', 'status']}
|
|
715
|
-
```
|
|
716
|
-
|
|
717
|
-
#### 4. **Responsive Considerations**
|
|
718
|
-
```tsx
|
|
719
|
-
// For mobile-first design, put most important columns first
|
|
720
|
-
const mobileColumnOrder = ['select', 'name', 'status', 'actions'];
|
|
721
|
-
const desktopColumnOrder = ['select', 'name', 'email', 'role', 'status', 'createdAt', 'actions'];
|
|
722
|
-
|
|
723
|
-
<DataTable
|
|
724
|
-
data={users}
|
|
725
|
-
columns={columns}
|
|
726
|
-
features={{ selection: true, sorting: true }}
|
|
727
|
-
columnOrder={isMobile ? mobileColumnOrder : desktopColumnOrder}
|
|
728
|
-
/>
|
|
729
|
-
```
|
|
730
|
-
|
|
731
364
|
## Data Management
|
|
732
365
|
|
|
733
366
|
### Sorting
|
|
@@ -769,35 +402,6 @@ const desktopColumnOrder = ['select', 'name', 'email', 'role', 'status', 'create
|
|
|
769
402
|
/>
|
|
770
403
|
```
|
|
771
404
|
|
|
772
|
-
#### Custom Initial Page Size
|
|
773
|
-
|
|
774
|
-
```tsx
|
|
775
|
-
<DataTable
|
|
776
|
-
data={data}
|
|
777
|
-
columns={columns}
|
|
778
|
-
features={{ pagination: true }}
|
|
779
|
-
initialPageSize={25} // Start with 25 items per page instead of default 10
|
|
780
|
-
/>
|
|
781
|
-
```
|
|
782
|
-
|
|
783
|
-
#### Page Size Validation
|
|
784
|
-
|
|
785
|
-
The DataTable automatically validates the `initialPageSize` against available page size options:
|
|
786
|
-
|
|
787
|
-
```tsx
|
|
788
|
-
<DataTable
|
|
789
|
-
data={data}
|
|
790
|
-
columns={columns}
|
|
791
|
-
features={{ pagination: true }}
|
|
792
|
-
initialPageSize={15} // Will fallback to closest valid option (10) with console warning
|
|
793
|
-
/>
|
|
794
|
-
```
|
|
795
|
-
|
|
796
|
-
**Available page size options by mode:**
|
|
797
|
-
- **Client mode**: `[10, 25, 50]` or `[10, 25, 50, 100]` (depending on data size)
|
|
798
|
-
- **Hybrid mode**: `[50, 100, 250, 500]`
|
|
799
|
-
- **Server mode**: `[25, 50, 100, 250]`
|
|
800
|
-
|
|
801
405
|
### Search
|
|
802
406
|
|
|
803
407
|
```tsx
|
|
@@ -835,24 +439,6 @@ Row actions are handled through the `actions` prop, which provides full flexibil
|
|
|
835
439
|
icon: EyeIcon,
|
|
836
440
|
variant: 'default',
|
|
837
441
|
},
|
|
838
|
-
{
|
|
839
|
-
label: 'Edit',
|
|
840
|
-
onClick: (row) => editUser(row.original.id),
|
|
841
|
-
icon: EditIcon,
|
|
842
|
-
variant: 'outline',
|
|
843
|
-
},
|
|
844
|
-
{
|
|
845
|
-
label: 'Share',
|
|
846
|
-
onClick: (row) => shareUser(row.original.id),
|
|
847
|
-
icon: ShareIcon,
|
|
848
|
-
variant: 'secondary',
|
|
849
|
-
},
|
|
850
|
-
{
|
|
851
|
-
label: 'More Options',
|
|
852
|
-
onClick: (row) => showMoreOptions(row.original.id),
|
|
853
|
-
icon: MoreHorizontalIcon,
|
|
854
|
-
variant: 'ghost',
|
|
855
|
-
},
|
|
856
442
|
{
|
|
857
443
|
label: 'Archive',
|
|
858
444
|
onClick: (row) => archiveUser(row.original.id),
|
|
@@ -878,155 +464,6 @@ Each action supports the following properties:
|
|
|
878
464
|
- `showInEditMode?: boolean` - Show in edit mode (default: true)
|
|
879
465
|
- `hideInViewMode?: boolean` - Hide in view mode (default: false)
|
|
880
466
|
|
|
881
|
-
#### Action Variants Guide
|
|
882
|
-
|
|
883
|
-
The DataTable supports 5 action variants, each designed for specific use cases:
|
|
884
|
-
|
|
885
|
-
```tsx
|
|
886
|
-
const actions = [
|
|
887
|
-
// DEFAULT - Primary actions (most important)
|
|
888
|
-
{
|
|
889
|
-
label: 'View Details',
|
|
890
|
-
onClick: (row) => viewDetails(row.original.id),
|
|
891
|
-
icon: EyeIcon,
|
|
892
|
-
variant: 'default', // Solid background, primary color
|
|
893
|
-
},
|
|
894
|
-
|
|
895
|
-
// OUTLINE - Secondary actions (important but not primary)
|
|
896
|
-
{
|
|
897
|
-
label: 'Edit',
|
|
898
|
-
onClick: (row) => editItem(row.original.id),
|
|
899
|
-
icon: EditIcon,
|
|
900
|
-
variant: 'outline', // Bordered, transparent background
|
|
901
|
-
},
|
|
902
|
-
|
|
903
|
-
// SECONDARY - Supporting actions (less prominent)
|
|
904
|
-
{
|
|
905
|
-
label: 'Share',
|
|
906
|
-
onClick: (row) => shareItem(row.original.id),
|
|
907
|
-
icon: ShareIcon,
|
|
908
|
-
variant: 'secondary', // Muted background, subtle styling
|
|
909
|
-
},
|
|
910
|
-
|
|
911
|
-
// GHOST - Subtle actions (minimal visual impact)
|
|
912
|
-
{
|
|
913
|
-
label: 'More Options',
|
|
914
|
-
onClick: (row) => showMoreOptions(row.original.id),
|
|
915
|
-
icon: MoreHorizontalIcon,
|
|
916
|
-
variant: 'ghost', // No background, minimal styling
|
|
917
|
-
},
|
|
918
|
-
|
|
919
|
-
// DESTRUCTIVE - Dangerous actions (require caution)
|
|
920
|
-
{
|
|
921
|
-
label: 'Delete',
|
|
922
|
-
onClick: (row) => deleteItem(row.original.id),
|
|
923
|
-
icon: TrashIcon,
|
|
924
|
-
variant: 'destructive', // Red styling to indicate danger
|
|
925
|
-
disabled: (row) => row.original.status === 'locked',
|
|
926
|
-
},
|
|
927
|
-
];
|
|
928
|
-
```
|
|
929
|
-
|
|
930
|
-
**Variant Usage Guidelines:**
|
|
931
|
-
|
|
932
|
-
- **`default`**: Use for the most important action (e.g., "View Details", "Open")
|
|
933
|
-
- **`outline`**: Use for important secondary actions (e.g., "Edit", "Download")
|
|
934
|
-
- **`secondary`**: Use for supporting actions (e.g., "Share", "Copy", "Export")
|
|
935
|
-
- **`ghost`**: Use for subtle actions (e.g., "More Options", "Settings")
|
|
936
|
-
- **`destructive`**: Use for dangerous actions (e.g., "Delete", "Archive", "Remove")
|
|
937
|
-
|
|
938
|
-
#### Hierarchical Actions
|
|
939
|
-
|
|
940
|
-
When using hierarchical rows, you can define different action icons and labels for parent vs child rows:
|
|
941
|
-
|
|
942
|
-
```tsx
|
|
943
|
-
<DataTable
|
|
944
|
-
data={hierarchicalData}
|
|
945
|
-
columns={columns}
|
|
946
|
-
features={{
|
|
947
|
-
hierarchical: true,
|
|
948
|
-
editing: true,
|
|
949
|
-
deletion: true,
|
|
950
|
-
}}
|
|
951
|
-
hierarchical={{
|
|
952
|
-
enabled: true,
|
|
953
|
-
defaultExpanded: false,
|
|
954
|
-
}}
|
|
955
|
-
actions={[
|
|
956
|
-
{
|
|
957
|
-
label: 'View Details',
|
|
958
|
-
icon: EyeIcon,
|
|
959
|
-
// Different icons for parent vs child rows
|
|
960
|
-
parentIcon: EyeIcon,
|
|
961
|
-
childIcon: InfoIcon,
|
|
962
|
-
// Different labels for parent vs child rows
|
|
963
|
-
parentLabel: 'View Recipe',
|
|
964
|
-
childLabel: 'View Ingredient',
|
|
965
|
-
onClick: (row) => {
|
|
966
|
-
console.log('Viewing:', row.isParent ? 'Recipe' : 'Ingredient', row.name);
|
|
967
|
-
},
|
|
968
|
-
variant: 'default',
|
|
969
|
-
},
|
|
970
|
-
{
|
|
971
|
-
label: 'Edit',
|
|
972
|
-
icon: PencilIcon,
|
|
973
|
-
parentIcon: SettingsIcon,
|
|
974
|
-
childIcon: PencilIcon,
|
|
975
|
-
parentLabel: 'Edit Recipe',
|
|
976
|
-
childLabel: 'Edit Ingredient',
|
|
977
|
-
onClick: (row) => {
|
|
978
|
-
console.log('Editing:', row.isParent ? 'Recipe' : 'Ingredient', row.name);
|
|
979
|
-
},
|
|
980
|
-
variant: 'default',
|
|
981
|
-
},
|
|
982
|
-
{
|
|
983
|
-
label: 'Copy Recipe',
|
|
984
|
-
icon: CopyIcon,
|
|
985
|
-
parentIcon: CopyIcon,
|
|
986
|
-
parentLabel: 'Duplicate Recipe',
|
|
987
|
-
onClick: (row) => {
|
|
988
|
-
console.log('Copying recipe:', row.name);
|
|
989
|
-
},
|
|
990
|
-
variant: 'outline',
|
|
991
|
-
// Only show for parent rows
|
|
992
|
-
showForParent: true,
|
|
993
|
-
},
|
|
994
|
-
{
|
|
995
|
-
label: 'Export',
|
|
996
|
-
icon: DownloadIcon,
|
|
997
|
-
childIcon: DownloadIcon,
|
|
998
|
-
childLabel: 'Export Ingredient',
|
|
999
|
-
onClick: (row) => {
|
|
1000
|
-
console.log('Exporting ingredient:', row.item);
|
|
1001
|
-
},
|
|
1002
|
-
variant: 'ghost',
|
|
1003
|
-
// Only show for child rows
|
|
1004
|
-
showForChild: true,
|
|
1005
|
-
},
|
|
1006
|
-
]}
|
|
1007
|
-
/>
|
|
1008
|
-
```
|
|
1009
|
-
|
|
1010
|
-
##### Hierarchical Action Properties
|
|
1011
|
-
|
|
1012
|
-
When using hierarchical rows, actions support additional properties:
|
|
1013
|
-
|
|
1014
|
-
- `showForParent?: boolean` - Only show this action for parent rows
|
|
1015
|
-
- `showForChild?: boolean` - Only show this action for child rows
|
|
1016
|
-
- `parentIcon?: ComponentType` - Icon to use for parent rows (overrides `icon`)
|
|
1017
|
-
- `childIcon?: ComponentType` - Icon to use for child rows (overrides `icon`)
|
|
1018
|
-
- `parentLabel?: string` - Label to use for parent rows (overrides `label`)
|
|
1019
|
-
- `childLabel?: string` - Label to use for child rows (overrides `label`)
|
|
1020
|
-
|
|
1021
|
-
##### Action Visibility Logic
|
|
1022
|
-
|
|
1023
|
-
The action visibility is determined by the following logic:
|
|
1024
|
-
|
|
1025
|
-
1. **Hierarchical filtering**: If `showForParent` is true, action only shows for parent rows
|
|
1026
|
-
2. **Hierarchical filtering**: If `showForChild` is true, action only shows for child rows
|
|
1027
|
-
3. **Standard filtering**: Uses `visible`, `showInEditMode`, `hideInViewMode` properties
|
|
1028
|
-
4. **Disabled state**: Uses `disabled` function to determine if action is disabled
|
|
1029
|
-
|
|
1030
467
|
### Toolbar Actions
|
|
1031
468
|
|
|
1032
469
|
Toolbar actions are automatically generated based on the enabled features. Custom toolbar buttons are not directly supported in the current interface, but you can implement them outside the DataTable component:
|
|
@@ -1059,218 +496,11 @@ Toolbar actions are automatically generated based on the enabled features. Custo
|
|
|
1059
496
|
</div>
|
|
1060
497
|
```
|
|
1061
498
|
|
|
1062
|
-
### Hierarchical Parent/Child Rows
|
|
1063
|
-
|
|
1064
|
-
The DataTable supports hierarchical parent/child row relationships with built-in expand/collapse functionality, expand/collapse all controls, and proper column rendering for different row types.
|
|
1065
|
-
|
|
1066
|
-
#### Data Structure
|
|
1067
|
-
|
|
1068
|
-
Your data must conform to the `HierarchicalDataRow` interface:
|
|
1069
|
-
|
|
1070
|
-
```typescript
|
|
1071
|
-
interface HierarchicalDataRow extends DataRecord {
|
|
1072
|
-
/** Whether this row is a parent row */
|
|
1073
|
-
isParent: boolean;
|
|
1074
|
-
/** For child rows, references the parent row ID */
|
|
1075
|
-
parentId?: string;
|
|
1076
|
-
/** Unique identifier for this row */
|
|
1077
|
-
id: string;
|
|
1078
|
-
// ... your actual data properties
|
|
1079
|
-
}
|
|
1080
|
-
```
|
|
1081
|
-
|
|
1082
|
-
#### Configuration
|
|
1083
|
-
|
|
1084
|
-
Enable hierarchical functionality through the `features` prop and configure it with the `hierarchical` prop:
|
|
1085
|
-
|
|
1086
|
-
```tsx
|
|
1087
|
-
<DataTable
|
|
1088
|
-
data={hierarchicalData}
|
|
1089
|
-
columns={columns}
|
|
1090
|
-
features={{
|
|
1091
|
-
// ... other features
|
|
1092
|
-
hierarchical: true, // Enable hierarchical functionality
|
|
1093
|
-
}}
|
|
1094
|
-
hierarchical={{
|
|
1095
|
-
enabled: true,
|
|
1096
|
-
defaultExpanded: false, // true = all expanded, false = all collapsed, array = specific IDs
|
|
1097
|
-
onExpandedChange: (expandedIds) => console.log('Expanded:', expandedIds),
|
|
1098
|
-
expandButton: CustomExpandButton, // Optional custom expand button
|
|
1099
|
-
indentSize: 24, // Indentation for child rows in pixels
|
|
1100
|
-
parentRowClassName: 'bg-main-50 font-medium', // Custom styling for parent rows
|
|
1101
|
-
childRowClassName: 'bg-sec-25', // Custom styling for child rows
|
|
1102
|
-
}}
|
|
1103
|
-
```
|
|
1104
|
-
|
|
1105
|
-
**Default Collapsed State:**
|
|
1106
|
-
To make parent rows collapsed by default (recommended for better UX), set `defaultExpanded: false`. This ensures users see only parent rows initially and must click to expand and view child rows.
|
|
1107
|
-
|
|
1108
|
-
#### Column Configuration
|
|
1109
|
-
|
|
1110
|
-
Configure how columns render for different row types:
|
|
1111
|
-
|
|
1112
|
-
```tsx
|
|
1113
|
-
const columns: DataTableColumn<YourDataType>[] = [
|
|
1114
|
-
{
|
|
1115
|
-
accessorKey: 'code',
|
|
1116
|
-
header: 'Code',
|
|
1117
|
-
// Render differently for parent vs child rows
|
|
1118
|
-
renderForParent: (row) => (
|
|
1119
|
-
<div className="flex items-center gap-2">
|
|
1120
|
-
<strong>{row.code}</strong>
|
|
1121
|
-
</div>
|
|
1122
|
-
),
|
|
1123
|
-
renderForChild: () => '', // Blank for child rows
|
|
1124
|
-
hideForChild: true, // Hide this column for child rows
|
|
1125
|
-
},
|
|
1126
|
-
{
|
|
1127
|
-
accessorKey: 'name',
|
|
1128
|
-
header: 'Name',
|
|
1129
|
-
renderForParent: (row) => <strong>{row.name}</strong>,
|
|
1130
|
-
renderForChild: () => '', // Blank for child rows
|
|
1131
|
-
hideForChild: true,
|
|
1132
|
-
},
|
|
1133
|
-
{
|
|
1134
|
-
accessorKey: 'ingredient',
|
|
1135
|
-
header: 'Ingredient',
|
|
1136
|
-
renderForParent: () => '', // Blank for parent rows
|
|
1137
|
-
renderForChild: (row) => <span className="ml-4">{row.ingredient}</span>,
|
|
1138
|
-
hideForParent: true, // Hide this column for parent rows
|
|
1139
|
-
},
|
|
1140
|
-
];
|
|
1141
|
-
```
|
|
1142
|
-
|
|
1143
|
-
#### Column Properties
|
|
1144
|
-
|
|
1145
|
-
- `renderForParent?: (row: TData) => React.ReactNode` - Custom renderer for parent rows
|
|
1146
|
-
- `renderForChild?: (row: TData) => React.ReactNode` - Custom renderer for child rows
|
|
1147
|
-
- `hideForParent?: boolean` - Hide this column for parent rows
|
|
1148
|
-
- `hideForChild?: boolean` - Hide this column for child rows
|
|
1149
|
-
|
|
1150
|
-
#### Expand/Collapse All Controls
|
|
1151
|
-
|
|
1152
|
-
The DataTable automatically adds an expand/collapse all button in the header when hierarchical mode is enabled:
|
|
1153
|
-
|
|
1154
|
-
**Features:**
|
|
1155
|
-
- **Expand All Button (▶️)**: Expands all parent rows to show their children
|
|
1156
|
-
- **Collapse All Button (🔽)**: Collapses all parent rows to hide their children
|
|
1157
|
-
- **Smart State Detection**: Button automatically updates based on current expansion state
|
|
1158
|
-
- **Accessibility**: Proper ARIA labels and keyboard navigation support
|
|
1159
|
-
|
|
1160
|
-
**Usage:**
|
|
1161
|
-
```tsx
|
|
1162
|
-
<DataTable
|
|
1163
|
-
data={hierarchicalData}
|
|
1164
|
-
columns={columns}
|
|
1165
|
-
features={{ hierarchical: true }}
|
|
1166
|
-
hierarchical={{
|
|
1167
|
-
enabled: true,
|
|
1168
|
-
defaultExpanded: false, // Start with all collapsed
|
|
1169
|
-
onExpandedChange: (expandedIds) => {
|
|
1170
|
-
console.log('Expanded rows:', expandedIds);
|
|
1171
|
-
},
|
|
1172
|
-
}}
|
|
1173
|
-
/>
|
|
1174
|
-
```
|
|
1175
|
-
|
|
1176
|
-
**Button Behavior:**
|
|
1177
|
-
- Shows ▶️ when some or all parent rows are collapsed
|
|
1178
|
-
- Shows 🔽 when all parent rows are expanded
|
|
1179
|
-
- Only appears when there are parent rows with children
|
|
1180
|
-
- Positioned in the first column of the table header
|
|
1181
|
-
|
|
1182
|
-
#### Hierarchical Sorting
|
|
1183
|
-
|
|
1184
|
-
When hierarchical mode is enabled, sorting behavior is optimized to preserve the parent-child relationship structure:
|
|
1185
|
-
|
|
1186
|
-
**Parent Row Sorting:**
|
|
1187
|
-
- Parent rows maintain their original order and are not affected by sorting
|
|
1188
|
-
- Only child rows within each parent group are sorted
|
|
1189
|
-
- This prevents parent rows from being moved to unexpected positions
|
|
1190
|
-
|
|
1191
|
-
**Child Row Sorting:**
|
|
1192
|
-
- Child rows are sorted within their parent group only
|
|
1193
|
-
- Sorting by a child-specific column (e.g., "Diet", "Ingredient") will sort children within each parent
|
|
1194
|
-
- The parent row remains at the top of its group
|
|
1195
|
-
|
|
1196
|
-
**Example:**
|
|
1197
|
-
```tsx
|
|
1198
|
-
// When sorting by "Diet" column:
|
|
1199
|
-
// ✅ Correct behavior:
|
|
1200
|
-
// Parent: Caesar Salad
|
|
1201
|
-
// ├─ Child: Dairy Free (Sour cream)
|
|
1202
|
-
// ├─ Child: Egg Free (Mayonnaise)
|
|
1203
|
-
// └─ Child: GF & Vegan (Lettuce)
|
|
1204
|
-
// Parent: Beef Stir Fry
|
|
1205
|
-
// ├─ Child: GF & Vegan (Vegetables)
|
|
1206
|
-
// └─ Child: Halal (Beef)
|
|
1207
|
-
|
|
1208
|
-
// ❌ Incorrect behavior (what we prevent):
|
|
1209
|
-
// Child: Dairy Free (Sour cream)
|
|
1210
|
-
// Child: Egg Free (Mayonnaise)
|
|
1211
|
-
// Child: GF & Vegan (Lettuce)
|
|
1212
|
-
// Child: GF & Vegan (Vegetables)
|
|
1213
|
-
// Child: Halal (Beef)
|
|
1214
|
-
// Parent: Caesar Salad (moved to end)
|
|
1215
|
-
// Parent: Beef Stir Fry (moved to end)
|
|
1216
|
-
```
|
|
1217
|
-
|
|
1218
|
-
**Sorting Configuration:**
|
|
1219
|
-
- All existing sorting features work with hierarchical data
|
|
1220
|
-
- Multi-column sorting is supported
|
|
1221
|
-
- Server-side sorting is compatible
|
|
1222
|
-
- Column-specific sorting behavior is preserved
|
|
1223
|
-
|
|
1224
|
-
#### Example Use Case
|
|
1225
|
-
|
|
1226
|
-
```tsx
|
|
1227
|
-
// Dishes and ingredients example
|
|
1228
|
-
const dishData = [
|
|
1229
|
-
// Parent rows (dishes)
|
|
1230
|
-
{ id: 'dish-1', isParent: true, code: 'D001', name: 'Caesar Salad', type: 'Salad' },
|
|
1231
|
-
{ id: 'dish-2', isParent: true, code: 'D002', name: 'Beef Stir Fry', type: 'Main Course' },
|
|
1232
|
-
|
|
1233
|
-
// Child rows (ingredients) for Caesar Salad
|
|
1234
|
-
{ id: 'ing-1-1', isParent: false, parentId: 'dish-1', ingredient: 'Lettuce', quantity: '200g' },
|
|
1235
|
-
{ id: 'ing-1-2', isParent: false, parentId: 'dish-1', ingredient: 'Chicken', quantity: '150g' },
|
|
1236
|
-
|
|
1237
|
-
// Child rows (ingredients) for Beef Stir Fry
|
|
1238
|
-
{ id: 'ing-2-1', isParent: false, parentId: 'dish-2', ingredient: 'Beef Strips', quantity: '250g' },
|
|
1239
|
-
{ id: 'ing-2-2', isParent: false, parentId: 'dish-2', ingredient: 'Mixed Vegetables', quantity: '200g' },
|
|
1240
|
-
];
|
|
1241
|
-
```
|
|
1242
|
-
|
|
1243
499
|
### Row Selection and Bulk Operations
|
|
1244
500
|
|
|
1245
501
|
```tsx
|
|
1246
502
|
function SelectableUserTable() {
|
|
1247
|
-
const [selectedRows, setSelectedRows] = useState<
|
|
1248
|
-
const [data, setData] = useState<User[]>(initialData);
|
|
1249
|
-
|
|
1250
|
-
const handleBulkDelete = (selectedRows: Record<string, boolean>) => {
|
|
1251
|
-
// Get the selected row IDs
|
|
1252
|
-
const selectedRowIds = Object.keys(selectedRows).filter(id => selectedRows[id]);
|
|
1253
|
-
|
|
1254
|
-
// Get the actual data for selected rows
|
|
1255
|
-
const selectedData = data.filter(row => {
|
|
1256
|
-
const rowId = getRowId ? getRowId(row, data.indexOf(row)) : row.id;
|
|
1257
|
-
return selectedRowIds.includes(rowId);
|
|
1258
|
-
});
|
|
1259
|
-
|
|
1260
|
-
// Perform your deletion logic
|
|
1261
|
-
console.log('Deleting selected rows:', selectedData);
|
|
1262
|
-
|
|
1263
|
-
// Update your data state
|
|
1264
|
-
setData(prevData =>
|
|
1265
|
-
prevData.filter(row => {
|
|
1266
|
-
const rowId = getRowId ? getRowId(row, prevData.indexOf(row)) : row.id;
|
|
1267
|
-
return !selectedRowIds.includes(rowId);
|
|
1268
|
-
})
|
|
1269
|
-
);
|
|
1270
|
-
|
|
1271
|
-
// Clear selection after deletion
|
|
1272
|
-
setSelectedRows({});
|
|
1273
|
-
};
|
|
503
|
+
const [selectedRows, setSelectedRows] = useState<RowSelectionState>({});
|
|
1274
504
|
|
|
1275
505
|
return (
|
|
1276
506
|
<DataTable
|
|
@@ -1278,44 +508,23 @@ function SelectableUserTable() {
|
|
|
1278
508
|
columns={columns}
|
|
1279
509
|
features={{
|
|
1280
510
|
selection: true,
|
|
1281
|
-
deletion: true, // Required for delete functionality
|
|
1282
|
-
deleteSelected: true, // Enables the delete selected button
|
|
1283
511
|
bulkOperations: true,
|
|
512
|
+
deleteSelected: true,
|
|
1284
513
|
}}
|
|
514
|
+
rowSelection={selectedRows}
|
|
1285
515
|
onRowSelectionChange={setSelectedRows}
|
|
1286
516
|
onDeleteSelected={handleBulkDelete}
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
```tsx
|
|
1298
|
-
function SelectableUserTable() {
|
|
1299
|
-
const [data, setData] = useState<User[]>(initialData);
|
|
1300
|
-
|
|
1301
|
-
const handleDeleteRow = (row: User) => {
|
|
1302
|
-
console.log('Deleting row:', row);
|
|
1303
|
-
|
|
1304
|
-
// Update your data state
|
|
1305
|
-
setData(prevData => prevData.filter(item => item.id !== row.id));
|
|
1306
|
-
};
|
|
1307
|
-
|
|
1308
|
-
return (
|
|
1309
|
-
<DataTable
|
|
1310
|
-
data={data}
|
|
1311
|
-
columns={columns}
|
|
1312
|
-
features={{
|
|
1313
|
-
selection: true,
|
|
1314
|
-
deletion: true,
|
|
1315
|
-
deleteSelected: true,
|
|
517
|
+
bulkOperationsConfig={{
|
|
518
|
+
enabled: true,
|
|
519
|
+
operations: [
|
|
520
|
+
{
|
|
521
|
+
label: 'Delete Selected',
|
|
522
|
+
action: 'delete',
|
|
523
|
+
variant: 'destructive',
|
|
524
|
+
requiresConfirmation: true,
|
|
525
|
+
},
|
|
526
|
+
],
|
|
1316
527
|
}}
|
|
1317
|
-
onDeleteRow={handleDeleteRow} // This will be called for each selected row
|
|
1318
|
-
getRowId={(row) => row.id}
|
|
1319
528
|
/>
|
|
1320
529
|
);
|
|
1321
530
|
}
|
|
@@ -1471,191 +680,8 @@ function SecureUserTable() {
|
|
|
1471
680
|
}
|
|
1472
681
|
```
|
|
1473
682
|
|
|
1474
|
-
## Practical Examples
|
|
1475
|
-
|
|
1476
|
-
### Custom Page Size Configuration
|
|
1477
|
-
|
|
1478
|
-
Here's a complete example showing how to configure a DataTable with custom initial page size:
|
|
1479
|
-
|
|
1480
|
-
```tsx
|
|
1481
|
-
import { DataTable, type DataTableColumn } from '@jmruthers/pace-core';
|
|
1482
|
-
|
|
1483
|
-
interface User {
|
|
1484
|
-
id: string;
|
|
1485
|
-
name: string;
|
|
1486
|
-
email: string;
|
|
1487
|
-
role: string;
|
|
1488
|
-
status: 'active' | 'inactive';
|
|
1489
|
-
}
|
|
1490
|
-
|
|
1491
|
-
const columns: DataTableColumn<User>[] = [
|
|
1492
|
-
{
|
|
1493
|
-
accessorKey: 'name',
|
|
1494
|
-
header: 'Name',
|
|
1495
|
-
sortable: true,
|
|
1496
|
-
searchable: true,
|
|
1497
|
-
},
|
|
1498
|
-
{
|
|
1499
|
-
accessorKey: 'email',
|
|
1500
|
-
header: 'Email',
|
|
1501
|
-
sortable: true,
|
|
1502
|
-
searchable: true,
|
|
1503
|
-
},
|
|
1504
|
-
{
|
|
1505
|
-
accessorKey: 'role',
|
|
1506
|
-
header: 'Role',
|
|
1507
|
-
sortable: true,
|
|
1508
|
-
enableGrouping: true,
|
|
1509
|
-
},
|
|
1510
|
-
{
|
|
1511
|
-
accessorKey: 'status',
|
|
1512
|
-
header: 'Status',
|
|
1513
|
-
sortable: true,
|
|
1514
|
-
cell: ({ row }) => (
|
|
1515
|
-
<span className={`px-2 py-1 rounded text-xs ${
|
|
1516
|
-
row.original.status === 'active'
|
|
1517
|
-
? 'bg-main-100 text-main-800'
|
|
1518
|
-
: 'bg-acc-100 text-acc-800'
|
|
1519
|
-
}`}>
|
|
1520
|
-
{row.original.status}
|
|
1521
|
-
</span>
|
|
1522
|
-
),
|
|
1523
|
-
},
|
|
1524
|
-
];
|
|
1525
|
-
|
|
1526
|
-
function UserManagementTable() {
|
|
1527
|
-
const [users, setUsers] = useState<User[]>([]);
|
|
1528
|
-
const [loading, setLoading] = useState(true);
|
|
1529
|
-
|
|
1530
|
-
useEffect(() => {
|
|
1531
|
-
// Load users data
|
|
1532
|
-
loadUsers().then(setUsers).finally(() => setLoading(false));
|
|
1533
|
-
}, []);
|
|
1534
|
-
|
|
1535
|
-
return (
|
|
1536
|
-
<DataTable
|
|
1537
|
-
data={users}
|
|
1538
|
-
columns={columns}
|
|
1539
|
-
title="User Management"
|
|
1540
|
-
description="Manage system users with custom page size"
|
|
1541
|
-
features={{
|
|
1542
|
-
search: true,
|
|
1543
|
-
pagination: true,
|
|
1544
|
-
sorting: true,
|
|
1545
|
-
filtering: true,
|
|
1546
|
-
selection: true,
|
|
1547
|
-
creation: true,
|
|
1548
|
-
editing: true,
|
|
1549
|
-
deletion: true,
|
|
1550
|
-
deleteSelected: true,
|
|
1551
|
-
export: true,
|
|
1552
|
-
import: true,
|
|
1553
|
-
grouping: true,
|
|
1554
|
-
columnVisibility: true,
|
|
1555
|
-
columnReordering: true,
|
|
1556
|
-
autoColumnSizing: true,
|
|
1557
|
-
}}
|
|
1558
|
-
initialPageSize={25} // Start with 25 users per page
|
|
1559
|
-
isLoading={loading}
|
|
1560
|
-
onEditRow={(row, data) => {
|
|
1561
|
-
console.log('Editing user:', row.id, data);
|
|
1562
|
-
// Handle user edit
|
|
1563
|
-
}}
|
|
1564
|
-
onDeleteRow={(row) => {
|
|
1565
|
-
console.log('Deleting user:', row.id);
|
|
1566
|
-
// Handle user deletion
|
|
1567
|
-
}}
|
|
1568
|
-
onCreateRow={(data) => {
|
|
1569
|
-
console.log('Creating user:', data);
|
|
1570
|
-
// Handle user creation
|
|
1571
|
-
}}
|
|
1572
|
-
onImport={(data) => {
|
|
1573
|
-
console.log('Importing users:', data);
|
|
1574
|
-
// Handle user import
|
|
1575
|
-
}}
|
|
1576
|
-
onRowSelectionChange={(selection) => {
|
|
1577
|
-
console.log('Selection changed:', selection);
|
|
1578
|
-
// Handle selection changes
|
|
1579
|
-
}}
|
|
1580
|
-
onDeleteSelected={(selectedRows) => {
|
|
1581
|
-
console.log('Bulk deleting users:', selectedRows);
|
|
1582
|
-
// Handle bulk deletion
|
|
1583
|
-
}}
|
|
1584
|
-
/>
|
|
1585
|
-
);
|
|
1586
|
-
}
|
|
1587
|
-
```
|
|
1588
|
-
|
|
1589
|
-
### Page Size Validation Example
|
|
1590
|
-
|
|
1591
|
-
```tsx
|
|
1592
|
-
// This will show a console warning and use the closest valid option
|
|
1593
|
-
<DataTable
|
|
1594
|
-
data={largeDataset}
|
|
1595
|
-
columns={columns}
|
|
1596
|
-
features={{ pagination: true }}
|
|
1597
|
-
initialPageSize={15} // Invalid - will fallback to 10 with warning
|
|
1598
|
-
paginationMode="client" // Uses [10, 25, 50] options
|
|
1599
|
-
/>
|
|
1600
|
-
|
|
1601
|
-
// This will work correctly
|
|
1602
|
-
<DataTable
|
|
1603
|
-
data={largeDataset}
|
|
1604
|
-
columns={columns}
|
|
1605
|
-
features={{ pagination: true }}
|
|
1606
|
-
initialPageSize={25} // Valid option
|
|
1607
|
-
paginationMode="client"
|
|
1608
|
-
/>
|
|
1609
|
-
```
|
|
1610
|
-
|
|
1611
683
|
## Best Practices
|
|
1612
684
|
|
|
1613
|
-
### Data Processing Best Practices
|
|
1614
|
-
- **Stable Data References**: Ensure your data processing doesn't create new object references on every render
|
|
1615
|
-
- **Memoization**: Use `useMemo` with proper dependency arrays to prevent unnecessary re-computations
|
|
1616
|
-
- **Avoid Complex Transformations in useMemo**: Move complex data transformations to the backend or data fetching layer when possible
|
|
1617
|
-
- **Data Comparison**: Use shallow comparison to detect actual data changes before updating state
|
|
1618
|
-
|
|
1619
|
-
#### ✅ Good Data Processing Patterns
|
|
1620
|
-
```tsx
|
|
1621
|
-
// Simple, stable data processing
|
|
1622
|
-
const processedData = useMemo(() => {
|
|
1623
|
-
if (!data || data.length === 0) return [];
|
|
1624
|
-
return data; // Direct usage, no transformations
|
|
1625
|
-
}, [data]);
|
|
1626
|
-
|
|
1627
|
-
// Complex processing with stable references
|
|
1628
|
-
const processedData = useMemo(() => {
|
|
1629
|
-
if (!data || data.length === 0) return [];
|
|
1630
|
-
|
|
1631
|
-
// Use stable references and avoid creating new objects unnecessarily
|
|
1632
|
-
return data.map(item => ({
|
|
1633
|
-
...item,
|
|
1634
|
-
// Simple transformations only
|
|
1635
|
-
displayName: item.firstName + ' ' + item.lastName,
|
|
1636
|
-
}));
|
|
1637
|
-
}, [data]); // Single dependency
|
|
1638
|
-
```
|
|
1639
|
-
|
|
1640
|
-
#### ❌ Avoid These Patterns
|
|
1641
|
-
```tsx
|
|
1642
|
-
// This can cause infinite loops
|
|
1643
|
-
const processedData = useMemo(() => {
|
|
1644
|
-
return data.map(item => ({
|
|
1645
|
-
...item,
|
|
1646
|
-
// Complex transformations that create new objects
|
|
1647
|
-
computed_field: relatedData?.find(rel => rel.id === item.relation_id)?.name || 'Unknown',
|
|
1648
|
-
formatted_date: item.date ? format(new Date(item.date), 'MMM dd, yyyy') : 'No date',
|
|
1649
|
-
}));
|
|
1650
|
-
}, [data, relatedData]); // Multiple dependencies with complex processing
|
|
1651
|
-
```
|
|
1652
|
-
|
|
1653
|
-
#### 🔧 Recommended Solutions for Complex Data
|
|
1654
|
-
1. **Backend Processing**: Move complex transformations to your API layer
|
|
1655
|
-
2. **Supabase Relations**: Use database relations instead of client-side lookups
|
|
1656
|
-
3. **Separate Hooks**: Create dedicated hooks for data processing
|
|
1657
|
-
4. **Stable References**: Use `useCallback` and `useMemo` with proper dependencies
|
|
1658
|
-
|
|
1659
685
|
### 1. Use the Features Configuration Properly
|
|
1660
686
|
|
|
1661
687
|
```tsx
|
|
@@ -1871,14 +897,6 @@ const columns: DataTableColumn<User>[] = [
|
|
|
1871
897
|
- Check that required event handlers are provided (e.g., `onEditRow` for editing)
|
|
1872
898
|
- Verify that the feature configuration matches your use case
|
|
1873
899
|
|
|
1874
|
-
#### 7. Delete selected rows not working
|
|
1875
|
-
- **Check feature configuration**: Ensure `features={{ selection: true, deletion: true, deleteSelected: true }}`
|
|
1876
|
-
- **Provide onDeleteSelected callback**: Implement the callback to handle bulk deletion
|
|
1877
|
-
- **Verify getRowId function**: Ensure you provide a `getRowId` function that returns unique IDs
|
|
1878
|
-
- **Check button visibility**: The delete button only appears when all three features are enabled and rows are selected
|
|
1879
|
-
- **Debug selection state**: Add console logs to verify `onRowSelectionChange` is being called with correct data
|
|
1880
|
-
- **Fallback option**: If you don't provide `onDeleteSelected`, the table will fall back to calling `onDeleteRow` for each selected row
|
|
1881
|
-
|
|
1882
900
|
### Debug Mode
|
|
1883
901
|
|
|
1884
902
|
Enable debug logging for DataTable issues:
|