@jmruthers/pace-core 0.5.135 → 0.5.136
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{DataTable-C7GaRZye.d.ts → DataTable-CWAZZcXC.d.ts} +1 -1
- package/dist/{DataTable-A36PJG6N.js → DataTable-CYOHOX3O.js} +25 -13
- package/dist/{PublicLoadingSpinner-CUAnTvcg.d.ts → EventLogo-801uofbR.d.ts} +51 -135
- package/dist/UnifiedAuthProvider-5E5TUNMS.js +17 -0
- package/dist/{UnifiedAuthProvider-BVKmQd9u.d.ts → UnifiedAuthProvider-DJxGTftH.d.ts} +1 -1
- package/dist/{api-TNIBJWLM.js → api-45XYYO2A.js} +4 -3
- package/dist/{audit-T36HM7IM.js → audit-64X3VJXB.js} +3 -2
- package/dist/{chunk-CTJRBUX2.js → chunk-2TWNJ46Y.js} +2 -2
- package/dist/{chunk-UJI6WSMD.js → chunk-444EZN6N.js} +3 -3
- package/dist/chunk-444EZN6N.js.map +1 -0
- package/dist/{chunk-3CG5L6RN.js → chunk-4MT5BGGL.js} +90 -73
- package/dist/chunk-4MT5BGGL.js.map +1 -0
- package/dist/{chunk-PYUXFQJ3.js → chunk-56XJ3TU6.js} +2 -2
- package/dist/chunk-56XJ3TU6.js.map +1 -0
- package/dist/chunk-5DPZ5EAT.js +60 -0
- package/dist/chunk-5DPZ5EAT.js.map +1 -0
- package/dist/{chunk-66C4BSAY.js → chunk-ANBQRTPX.js} +9 -2
- package/dist/chunk-ANBQRTPX.js.map +1 -0
- package/dist/chunk-APIBCTL2.js +670 -0
- package/dist/chunk-APIBCTL2.js.map +1 -0
- package/dist/{chunk-GKHF54DI.js → chunk-BESYRHQM.js} +10 -4
- package/dist/chunk-BESYRHQM.js.map +1 -0
- package/dist/{chunk-WP5I5GLN.js → chunk-BVYWGZVV.js} +112 -97
- package/dist/chunk-BVYWGZVV.js.map +1 -0
- package/dist/{chunk-GEVIB2UB.js → chunk-ERISIBYU.js} +14 -5
- package/dist/chunk-ERISIBYU.js.map +1 -0
- package/dist/{chunk-CQZU6TFE.js → chunk-FHWWBIHA.js} +100 -62
- package/dist/chunk-FHWWBIHA.js.map +1 -0
- package/dist/{chunk-O3NWNXDY.js → chunk-FMUCXFII.js} +2 -2
- package/dist/chunk-FMUCXFII.js.map +1 -0
- package/dist/{chunk-GVDR7WNV.js → chunk-HJGGOMQ6.js} +194 -518
- package/dist/chunk-HJGGOMQ6.js.map +1 -0
- package/dist/{chunk-BDZUMRBD.js → chunk-K2WWTH7O.js} +13 -6
- package/dist/chunk-K2WWTH7O.js.map +1 -0
- package/dist/{chunk-BYXRHAIF.js → chunk-L6PGMCMD.js} +23 -14
- package/dist/chunk-L6PGMCMD.js.map +1 -0
- package/dist/chunk-LMC26NLJ.js +84 -0
- package/dist/chunk-LMC26NLJ.js.map +1 -0
- package/dist/{chunk-M6DDYFUD.js → chunk-LS353YLY.js} +19 -16
- package/dist/chunk-LS353YLY.js.map +1 -0
- package/dist/{chunk-ZYZCRSBD.js → chunk-LTV3XIJJ.js} +16 -11
- package/dist/chunk-LTV3XIJJ.js.map +1 -0
- package/dist/{chunk-HMNOSGVA.js → chunk-NOHEVYVX.js} +377 -666
- package/dist/chunk-NOHEVYVX.js.map +1 -0
- package/dist/{chunk-JCQZ6LA7.js → chunk-Q5QRDWKI.js} +9 -3
- package/dist/chunk-Q5QRDWKI.js.map +1 -0
- package/dist/chunk-S5OFRT4M.js +94 -0
- package/dist/chunk-S5OFRT4M.js.map +1 -0
- package/dist/{chunk-3DBFLLLU.js → chunk-SBVILCCA.js} +14 -9
- package/dist/chunk-SBVILCCA.js.map +1 -0
- package/dist/{chunk-TGIY2AR2.js → chunk-SL2YQDR6.js} +4 -3
- package/dist/{chunk-TGIY2AR2.js.map → chunk-SL2YQDR6.js.map} +1 -1
- package/dist/{chunk-VZ5OR6HD.js → chunk-TVYPTYOY.js} +55 -179
- package/dist/chunk-TVYPTYOY.js.map +1 -0
- package/dist/{chunk-ZV77RZMU.js → chunk-XARJS7CD.js} +2 -2
- package/dist/chunk-XDNLUEXI.js +138 -0
- package/dist/chunk-XDNLUEXI.js.map +1 -0
- package/dist/{chunk-F64FFPOZ.js → chunk-YLKIDTUK.js} +26 -20
- package/dist/chunk-YLKIDTUK.js.map +1 -0
- package/dist/{chunk-5F3NDPJV.js → chunk-ZZ2SS7NI.js} +10 -5
- package/dist/chunk-ZZ2SS7NI.js.map +1 -0
- package/dist/components.d.ts +7 -287
- package/dist/components.js +26 -157
- package/dist/components.js.map +1 -1
- package/dist/{file-reference-C9isKNPn.d.ts → file-reference-C6Gkn77H.d.ts} +1 -1
- package/dist/{formatting-DFcCxUEk.d.ts → formatting-CvUXy2mF.d.ts} +1 -1
- package/dist/hooks.d.ts +3 -3
- package/dist/hooks.js +22 -16
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +101 -9
- package/dist/index.js +43 -31
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +1 -1
- package/dist/providers.js +5 -4
- package/dist/rbac/index.js +13 -12
- package/dist/styles/index.js +2 -1
- package/dist/theming/runtime.d.ts +2 -19
- package/dist/theming/runtime.js +2 -1
- package/dist/{types-D5rqZQXk.d.ts → types-Dfz9dmVH.d.ts} +12 -1
- package/dist/types.d.ts +2 -2
- package/dist/types.js +1 -1
- package/dist/{useInactivityTracker-MRUU55XI.js → useInactivityTracker-TO6ZOF35.js} +3 -2
- package/dist/{usePublicRouteParams-Dyt1tzI9.d.ts → usePublicRouteParams-B7PabvuH.d.ts} +1 -1
- package/dist/utils.d.ts +195 -232
- package/dist/utils.js +173 -331
- package/dist/utils.js.map +1 -1
- package/dist/{validation-DnhrNMju.d.ts → validation-8npbysjg.d.ts} +26 -8
- package/dist/validation.d.ts +261 -10
- package/dist/validation.js +82 -440
- package/dist/validation.js.map +1 -1
- package/docs/api/classes/ColumnFactory.md +1 -1
- package/docs/api/classes/ErrorBoundary.md +6 -6
- package/docs/api/classes/InvalidScopeError.md +1 -1
- package/docs/api/classes/MissingUserContextError.md +1 -1
- package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
- package/docs/api/classes/PermissionDeniedError.md +1 -1
- package/docs/api/classes/PublicErrorBoundary.md +1 -1
- package/docs/api/classes/RBACAuditManager.md +6 -6
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +7 -7
- package/docs/api/classes/RBACError.md +1 -1
- package/docs/api/classes/RBACNotInitializedError.md +1 -1
- package/docs/api/classes/SecureSupabaseClient.md +1 -1
- package/docs/api/classes/StorageUtils.md +1 -1
- package/docs/api/enums/FileCategory.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +4 -4
- package/docs/api/interfaces/ButtonProps.md +1 -1
- package/docs/api/interfaces/CardProps.md +1 -1
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +29 -4
- package/docs/api/interfaces/DataAccessRecord.md +9 -9
- package/docs/api/interfaces/DataRecord.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +18 -18
- package/docs/api/interfaces/DataTableColumn.md +61 -1
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
- package/docs/api/interfaces/EmptyStateConfig.md +5 -5
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +14 -14
- package/docs/api/interfaces/EventAppRoleData.md +1 -1
- package/docs/api/interfaces/EventLogoProps.md +152 -0
- package/docs/api/interfaces/ExportColumn.md +1 -1
- package/docs/api/interfaces/ExportOptions.md +8 -8
- package/docs/api/interfaces/FileDisplayProps.md +15 -15
- package/docs/api/interfaces/FileMetadata.md +1 -1
- package/docs/api/interfaces/FileReference.md +1 -1
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadOptions.md +1 -1
- package/docs/api/interfaces/FileUploadProps.md +1 -1
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
- package/docs/api/interfaces/InputProps.md +1 -1
- package/docs/api/interfaces/LabelProps.md +1 -1
- package/docs/api/interfaces/LoginFormProps.md +1 -1
- package/docs/api/interfaces/NavigationAccessRecord.md +10 -10
- package/docs/api/interfaces/NavigationContextType.md +9 -9
- package/docs/api/interfaces/NavigationGuardProps.md +10 -10
- package/docs/api/interfaces/NavigationItem.md +1 -1
- package/docs/api/interfaces/NavigationMenuProps.md +1 -1
- package/docs/api/interfaces/NavigationProviderProps.md +7 -7
- 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 +27 -27
- package/docs/api/interfaces/PaceLoginPageProps.md +4 -4
- package/docs/api/interfaces/PageAccessRecord.md +8 -8
- package/docs/api/interfaces/PagePermissionContextType.md +8 -8
- package/docs/api/interfaces/PagePermissionGuardProps.md +11 -11
- package/docs/api/interfaces/PagePermissionProviderProps.md +7 -7
- package/docs/api/interfaces/PaletteData.md +4 -4
- package/docs/api/interfaces/PermissionEnforcerProps.md +11 -11
- package/docs/api/interfaces/ProtectedRouteProps.md +6 -6
- package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
- package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
- package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
- package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
- package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
- package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
- package/docs/api/interfaces/RBACConfig.md +1 -1
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterContextType.md +8 -8
- package/docs/api/interfaces/RoleBasedRouterProps.md +10 -10
- package/docs/api/interfaces/RoleManagementResult.md +1 -1
- package/docs/api/interfaces/RouteAccessRecord.md +10 -10
- package/docs/api/interfaces/RouteConfig.md +10 -10
- package/docs/api/interfaces/SecureDataContextType.md +9 -9
- package/docs/api/interfaces/SecureDataProviderProps.md +8 -8
- package/docs/api/interfaces/SessionRestorationLoaderProps.md +21 -0
- package/docs/api/interfaces/StorageConfig.md +1 -1
- package/docs/api/interfaces/StorageFileInfo.md +1 -1
- package/docs/api/interfaces/StorageFileMetadata.md +1 -1
- package/docs/api/interfaces/StorageListOptions.md +1 -1
- package/docs/api/interfaces/StorageListResult.md +1 -1
- package/docs/api/interfaces/StorageUploadOptions.md +1 -1
- package/docs/api/interfaces/StorageUploadResult.md +1 -1
- package/docs/api/interfaces/StorageUrlOptions.md +1 -1
- package/docs/api/interfaces/StyleImport.md +1 -1
- package/docs/api/interfaces/SwitchProps.md +1 -1
- package/docs/api/interfaces/ToastActionElement.md +1 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +53 -53
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +9 -9
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +8 -8
- package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
- package/docs/api/interfaces/UsePublicEventReturn.md +5 -5
- package/docs/api/interfaces/UsePublicFileDisplayOptions.md +4 -4
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +9 -9
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeOptions.md +4 -4
- package/docs/api/interfaces/UseResolvedScopeReturn.md +4 -4
- package/docs/api/interfaces/UserEventAccess.md +11 -11
- package/docs/api/interfaces/UserMenuProps.md +1 -1
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +514 -212
- package/docs/api-reference/components.md +106 -26
- package/docs/architecture/README.md +0 -2
- package/docs/implementation-guides/data-tables.md +277 -13
- package/docs/implementation-guides/forms.md +1 -16
- package/docs/implementation-guides/permission-enforcement.md +8 -2
- package/examples/README.md +30 -14
- package/examples/STRUCTURE.md +125 -0
- package/examples/components/DataTable/HierarchicalActionsExample.tsx +421 -0
- package/examples/components/DataTable/HierarchicalExample.tsx +475 -0
- package/examples/components/DataTable/InitialPageSizeExample.tsx +177 -0
- package/examples/components/DataTable/PerformanceExample.tsx +506 -0
- package/examples/components/DataTable/index.ts +13 -0
- package/examples/components/Dialog/BasicHtmlTest.tsx +55 -0
- package/examples/components/Dialog/DebugHtmlExample.tsx +68 -0
- package/examples/components/Dialog/HtmlDialogExample.tsx +202 -0
- package/examples/components/Dialog/ScrollableDialogExample.tsx +290 -0
- package/examples/components/Dialog/SimpleHtmlTest.tsx +61 -0
- package/examples/components/Dialog/SmartDialogExample.tsx +322 -0
- package/examples/components/Dialog/index.ts +15 -0
- package/examples/components/index.ts +11 -0
- package/examples/features/index.ts +12 -0
- package/examples/{public-pages → features/public-pages}/CorrectPublicPageImplementation.tsx +1 -1
- package/examples/{public-pages → features/public-pages}/PublicEventPage.tsx +1 -1
- package/examples/{public-pages → features/public-pages}/PublicPageApp.tsx +1 -1
- package/examples/{public-pages → features/public-pages}/PublicPageUsageExample.tsx +1 -1
- package/examples/index.ts +11 -3
- package/package.json +30 -10
- package/src/components/Alert/Alert.tsx +1 -1
- package/src/components/Avatar/Avatar.tsx +1 -1
- package/src/components/Button/Button.tsx +1 -1
- package/src/components/Card/Card.tsx +1 -1
- package/src/components/Checkbox/Checkbox.tsx +1 -1
- package/src/components/DataTable/DataTable.test.tsx +1 -1
- package/src/components/DataTable/DataTable.tsx +1 -30
- package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +562 -0
- package/src/components/DataTable/__tests__/styles.test.ts +2 -2
- package/src/components/DataTable/components/ActionButtons.tsx +0 -15
- package/src/components/DataTable/components/DataTableCore.tsx +4 -185
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +1 -1
- package/src/components/DataTable/components/DataTableModals.tsx +1 -27
- package/src/components/DataTable/components/EditableRow.tsx +1 -1
- package/src/components/DataTable/components/ImportModal.tsx +2 -14
- package/src/components/DataTable/components/PaginationControls.tsx +1 -1
- package/src/components/DataTable/components/UnifiedTableBody.tsx +109 -82
- package/src/components/DataTable/components/__tests__/ActionButtons.test.tsx +1 -1
- package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +1 -1
- package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +1 -1
- package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +1 -1
- package/src/components/DataTable/examples/GroupingAggregationExample.tsx +273 -0
- package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +1 -1
- package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +1 -1
- package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +1 -1
- package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +1 -1
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +2 -23
- package/src/components/DataTable/index.ts +4 -0
- package/src/components/DataTable/styles.ts +1 -1
- package/src/components/DataTable/types.ts +13 -0
- package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +1 -1
- package/src/components/DataTable/utils/aggregationUtils.ts +161 -0
- package/src/components/DataTable/utils/exportUtils.ts +1 -1
- package/src/components/DataTable/utils/flexibleImport.ts +1 -11
- package/src/components/DataTable/utils/index.ts +1 -0
- package/src/components/DataTable/utils/paginationUtils.ts +1 -1
- package/src/components/Dialog/Dialog.tsx +2 -2
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +35 -7
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +5 -4
- package/src/components/EventSelector/EventSelector.tsx +3 -2
- package/src/components/FileDisplay/FileDisplay.tsx +2 -36
- package/src/components/FileUpload/FileUpload.test.tsx +2 -2
- package/src/components/FileUpload/FileUpload.tsx +2 -2
- package/src/components/Footer/Footer.tsx +1 -1
- package/src/components/Form/Form.test.tsx +4 -509
- package/src/components/Form/Form.tsx +1 -1
- package/src/components/Form/FormField.tsx +1 -1
- package/src/components/Form/index.ts +0 -12
- package/src/components/Header/Header.tsx +1 -1
- package/src/components/Input/Input.tsx +1 -1
- package/src/components/Label/Label.tsx +1 -1
- package/src/components/LoginForm/LoginForm.tsx +1 -1
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +19 -3
- package/src/components/NavigationMenu/NavigationMenu.tsx +9 -8
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +4 -3
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +14 -12
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +0 -16
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +0 -1
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -9
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +35 -3
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +13 -12
- package/src/components/PasswordReset/PasswordChangeForm.tsx +1 -1
- package/src/components/PasswordReset/index.ts +0 -2
- package/src/components/Progress/Progress.tsx +1 -1
- package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +35 -8
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -2
- package/src/components/PublicLayout/PublicErrorBoundary.tsx +1 -1
- package/src/components/PublicLayout/PublicLoadingSpinner.tsx +1 -1
- package/src/components/PublicLayout/PublicPageContextChecker.tsx +44 -43
- package/src/components/PublicLayout/PublicPageFooter.tsx +1 -1
- package/src/components/PublicLayout/PublicPageHeader.tsx +1 -15
- package/src/components/PublicLayout/PublicPageProvider.tsx +3 -2
- package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +2 -0
- package/src/components/PublicLayout/index.ts +4 -2
- package/src/components/Select/Select.tsx +1 -1
- package/src/components/{SessionRestorationLoader.tsx → SessionRestorationLoader/SessionRestorationLoader.tsx} +3 -2
- package/src/components/SessionRestorationLoader/index.ts +3 -0
- package/src/components/Switch/Switch.tsx +1 -1
- package/src/components/Table/Table.tsx +1 -1
- package/src/components/Toast/Toast.tsx +1 -1
- package/src/components/Tooltip/Tooltip.tsx +1 -1
- package/src/components/index.ts +4 -10
- package/src/hooks/__tests__/hooks.integration.test.tsx +37 -22
- package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +33 -17
- package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +28 -3
- package/src/hooks/__tests__/useFileDisplay.unit.test.ts +36 -9
- package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +26 -2
- package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +19 -6
- package/src/hooks/__tests__/usePermissionCache.simple.test.ts +17 -4
- package/src/hooks/__tests__/usePermissionCache.unit.test.ts +17 -4
- package/src/hooks/__tests__/usePublicEvent.simple.test.ts +26 -6
- package/src/hooks/__tests__/usePublicFileDisplay.test.ts +16 -6
- package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +3 -3
- package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +17 -3
- package/src/hooks/public/usePublicEvent.ts +7 -6
- package/src/hooks/public/usePublicEventLogo.ts +7 -4
- package/src/hooks/public/usePublicFileDisplay.ts +6 -150
- package/src/hooks/useComponentPerformance.ts +4 -1
- package/src/hooks/useDataTablePerformance.ts +4 -3
- package/src/hooks/useEventTheme.test.ts +18 -5
- package/src/hooks/useEventTheme.ts +4 -1
- package/src/hooks/useEvents.ts +2 -0
- package/src/hooks/useFileDisplay.ts +9 -8
- package/src/hooks/useFileReference.ts +4 -1
- package/src/hooks/useFileUrl.ts +4 -1
- package/src/hooks/useInactivityTracker.ts +5 -4
- package/src/hooks/useOrganisationSecurity.test.ts +33 -12
- package/src/hooks/useOrganisationSecurity.ts +8 -7
- package/src/hooks/usePerformanceMonitor.ts +6 -3
- package/src/hooks/usePermissionCache.ts +13 -6
- package/src/hooks/useSecureDataAccess.test.ts +2 -2
- package/src/hooks/useSecureDataAccess.ts +9 -8
- package/src/hooks/useSessionRestoration.ts +4 -1
- package/src/hooks/useStorage.ts +4 -1
- package/src/index.ts +16 -7
- package/src/providers/services/AuthServiceProvider.tsx +3 -2
- package/src/providers/services/EventServiceProvider.tsx +2 -1
- package/src/providers/services/InactivityServiceProvider.tsx +2 -1
- package/src/providers/services/OrganisationServiceProvider.tsx +2 -1
- package/src/providers/services/UnifiedAuthProvider.tsx +4 -3
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +22 -2
- package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +24 -2
- package/src/rbac/__tests__/cache-invalidation.test.ts +20 -6
- package/src/rbac/api.ts +5 -2
- package/src/rbac/audit-enhanced.ts +6 -6
- package/src/rbac/audit.test.ts +60 -38
- package/src/rbac/audit.ts +8 -8
- package/src/rbac/cache-invalidation.ts +7 -4
- package/src/rbac/components/EnhancedNavigationMenu.tsx +11 -5
- package/src/rbac/components/NavigationGuard.tsx +7 -3
- package/src/rbac/components/NavigationProvider.tsx +6 -3
- package/src/rbac/components/PagePermissionGuard.tsx +28 -16
- package/src/rbac/components/PagePermissionProvider.tsx +4 -1
- package/src/rbac/components/PermissionEnforcer.tsx +9 -3
- package/src/rbac/components/RoleBasedRouter.tsx +3 -1
- package/src/rbac/components/SecureDataProvider.tsx +7 -3
- package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +87 -61
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +83 -33
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +36 -13
- package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +2 -2
- package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +22 -8
- package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +19 -6
- package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +43 -17
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +42 -17
- package/src/rbac/engine.ts +15 -7
- package/src/rbac/hooks/usePermissions.ts +7 -3
- package/src/rbac/hooks/useResolvedScope.test.ts +2 -2
- package/src/rbac/hooks/useResolvedScope.ts +10 -7
- package/src/rbac/permissions.ts +5 -2
- package/src/rbac/security.test.ts +27 -16
- package/src/rbac/security.ts +5 -4
- package/src/services/AuthService.ts +22 -21
- package/src/services/EventService.ts +12 -12
- package/src/services/InactivityService.ts +5 -4
- package/src/services/OrganisationService.ts +26 -25
- package/src/services/__tests__/AuthService.test.ts +51 -19
- package/src/services/__tests__/EventService.test.ts +37 -5
- package/src/services/__tests__/InactivityService.test.ts +38 -4
- package/src/services/__tests__/OrganisationService.test.ts +3 -8
- package/src/services/base/BaseService.ts +3 -1
- package/src/theming/__tests__/runtime.test.ts +21 -12
- package/src/theming/parseEventColours.ts +5 -19
- package/src/theming/runtime.ts +8 -4
- package/src/types/validation.ts +2 -29
- package/src/utils/__tests__/appConfig.unit.test.ts +1 -1
- package/src/utils/__tests__/audit.unit.test.ts +1 -1
- package/src/utils/__tests__/auth-utils.unit.test.ts +1 -1
- package/src/utils/__tests__/bundleAnalysis.unit.test.ts +19 -19
- package/src/utils/__tests__/cn.unit.test.ts +1 -1
- package/src/utils/__tests__/debugLogger.test.ts +1 -1
- package/src/utils/__tests__/deviceFingerprint.unit.test.ts +1 -1
- package/src/utils/__tests__/dynamicUtils.unit.test.ts +1 -1
- package/src/utils/__tests__/formatting.unit.test.ts +1 -1
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +1 -1
- package/src/utils/__tests__/logger.unit.test.ts +1 -1
- package/src/utils/__tests__/organisationContext.unit.test.ts +1 -1
- package/src/utils/__tests__/performanceBenchmark.test.ts +1 -1
- package/src/utils/__tests__/performanceBudgets.unit.test.ts +1 -1
- package/src/utils/__tests__/permissionTypes.unit.test.ts +1 -1
- package/src/utils/__tests__/permissionUtils.unit.test.ts +1 -1
- package/src/utils/__tests__/sanitization.unit.test.ts +1 -1
- package/src/utils/__tests__/schemaUtils.unit.test.ts +1 -1
- package/src/utils/__tests__/secureDataAccess.unit.test.ts +1 -1
- package/src/utils/__tests__/secureErrors.unit.test.ts +33 -15
- package/src/utils/__tests__/secureStorage.unit.test.ts +1 -1
- package/src/utils/__tests__/security.unit.test.ts +40 -18
- package/src/utils/__tests__/securityMonitor.unit.test.ts +1 -1
- package/src/utils/__tests__/sessionTracking.unit.test.ts +40 -29
- package/src/utils/__tests__/validationUtils.unit.test.ts +19 -6
- package/src/utils/{appIdResolver.test.ts → app/appIdResolver.test.ts} +28 -30
- package/src/utils/{appIdResolver.ts → app/appIdResolver.ts} +8 -5
- package/src/utils/{appNameResolver.test.ts → app/appNameResolver.test.ts} +1 -1
- package/src/utils/{appNameResolver.ts → app/appNameResolver.ts} +5 -1
- package/src/utils/{organisationContext.ts → context/organisationContext.ts} +6 -3
- package/src/utils/{sessionTracking.ts → context/sessionTracking.ts} +11 -12
- package/src/utils/{logger.ts → core/logger.ts} +4 -2
- package/src/utils/{deviceFingerprint.ts → device/deviceFingerprint.ts} +1 -1
- package/src/utils/{lazyLoad.tsx → dynamic/lazyLoad.tsx} +2 -2
- package/src/utils/{file-reference.test.ts → file-reference/__tests__/file-reference.test.ts} +5 -5
- package/src/utils/{file-reference.ts → file-reference/index.ts} +20 -38
- package/src/utils/index.ts +32 -54
- package/src/utils/{secureErrors.ts → security/secureErrors.ts} +6 -3
- package/src/utils/{security.ts → security/security.ts} +5 -2
- package/src/utils/storage/__tests__/helpers.unit.test.ts +1 -4
- package/src/utils/storage/helpers.ts +15 -8
- package/src/{components/Dialog/utils/__tests__/safeHtml.unit.test.ts → utils/validation/__tests__/htmlSanitization.unit.test.ts} +9 -15
- package/src/{validation → utils/validation}/csrf.ts +1 -1
- package/src/{components/Dialog/utils/safeHtml.ts → utils/validation/htmlSanitization.ts} +9 -10
- package/src/utils/validation/index.ts +79 -0
- package/src/utils/{sanitization.ts → validation/sanitization.ts} +71 -2
- package/src/{validation/schemaUtils.ts → utils/validation/schema.ts} +11 -6
- package/src/{validation → utils/validation}/sqlInjectionProtection.ts +2 -0
- package/src/utils/{validationUtils.ts → validation/validationUtils.ts} +4 -1
- package/src/validation/index.ts +3 -34
- package/dist/UnifiedAuthProvider-CQDZRJIS.js +0 -16
- package/dist/chunk-24MKLB7U.js +0 -81
- package/dist/chunk-24MKLB7U.js.map +0 -1
- package/dist/chunk-3CG5L6RN.js.map +0 -1
- package/dist/chunk-3DBFLLLU.js.map +0 -1
- package/dist/chunk-5F3NDPJV.js.map +0 -1
- package/dist/chunk-66C4BSAY.js.map +0 -1
- package/dist/chunk-BDZUMRBD.js.map +0 -1
- package/dist/chunk-BYXRHAIF.js.map +0 -1
- package/dist/chunk-CDQ3PX7L.js +0 -18
- package/dist/chunk-CDQ3PX7L.js.map +0 -1
- package/dist/chunk-CQZU6TFE.js.map +0 -1
- package/dist/chunk-F64FFPOZ.js.map +0 -1
- package/dist/chunk-GEVIB2UB.js.map +0 -1
- package/dist/chunk-GKHF54DI.js.map +0 -1
- package/dist/chunk-GVDR7WNV.js.map +0 -1
- package/dist/chunk-HMNOSGVA.js.map +0 -1
- package/dist/chunk-JCQZ6LA7.js.map +0 -1
- package/dist/chunk-M6DDYFUD.js.map +0 -1
- package/dist/chunk-O3NWNXDY.js.map +0 -1
- package/dist/chunk-PYUXFQJ3.js.map +0 -1
- package/dist/chunk-UJI6WSMD.js.map +0 -1
- package/dist/chunk-VZ5OR6HD.js.map +0 -1
- package/dist/chunk-WP5I5GLN.js.map +0 -1
- package/dist/chunk-ZYZCRSBD.js.map +0 -1
- package/src/components/Dialog/README.md +0 -804
- package/src/components/Form/FormErrorSummary.tsx +0 -113
- package/src/components/Form/FormFieldset.tsx +0 -127
- package/src/components/Form/FormLiveRegion.tsx +0 -198
- package/src/components/PasswordReset/PasswordResetForm.test.tsx +0 -597
- package/src/components/PasswordReset/PasswordResetForm.tsx +0 -201
- package/src/components/PublicLayout/PublicPageDebugger.tsx +0 -104
- package/src/components/PublicLayout/PublicPageDiagnostic.tsx +0 -162
- package/src/components/PublicLayout/__tests__/PublicPageDebugger.test.tsx +0 -185
- package/src/examples/CorrectPublicPageImplementation.tsx +0 -304
- package/src/examples/PublicEventPage.tsx +0 -287
- package/src/examples/PublicPageApp.tsx +0 -321
- package/src/examples/PublicPageUsageExample.tsx +0 -218
- package/src/utils/schemaUtils.ts +0 -37
- package/src/validation/__tests__/common.unit.test.ts +0 -101
- package/src/validation/__tests__/csrf.unit.test.ts +0 -365
- package/src/validation/__tests__/passwordSchema.unit.test.ts +0 -203
- package/src/validation/__tests__/sanitization.unit.test.ts +0 -250
- package/src/validation/__tests__/schemaUtils.unit.test.ts +0 -451
- package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +0 -462
- package/src/validation/__tests__/user.unit.test.ts +0 -440
- package/src/validation/sanitization.ts +0 -96
- /package/dist/{DataTable-A36PJG6N.js.map → DataTable-CYOHOX3O.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-CQDZRJIS.js.map → UnifiedAuthProvider-5E5TUNMS.js.map} +0 -0
- /package/dist/{api-TNIBJWLM.js.map → api-45XYYO2A.js.map} +0 -0
- /package/dist/{audit-T36HM7IM.js.map → audit-64X3VJXB.js.map} +0 -0
- /package/dist/{chunk-CTJRBUX2.js.map → chunk-2TWNJ46Y.js.map} +0 -0
- /package/dist/{chunk-ZV77RZMU.js.map → chunk-XARJS7CD.js.map} +0 -0
- /package/dist/{useInactivityTracker-MRUU55XI.js.map → useInactivityTracker-TO6ZOF35.js.map} +0 -0
- /package/examples/{public-pages → features/public-pages}/index.ts +0 -0
- /package/examples/{RBAC → features/rbac}/CompleteRBACExample.tsx +0 -0
- /package/examples/{RBAC → features/rbac}/EventBasedApp.tsx +0 -0
- /package/examples/{RBAC → features/rbac}/PermissionExample.tsx +0 -0
- /package/examples/{RBAC → features/rbac}/index.ts +0 -0
- /package/src/utils/{appConfig.ts → app/appConfig.ts} +0 -0
- /package/src/utils/{appNameResolver.simple.test.ts → app/appNameResolver.simple.test.ts} +0 -0
- /package/src/utils/{audit.ts → audit/audit.ts} +0 -0
- /package/src/utils/{organisationContext.test.ts → context/organisationContext.test.ts} +0 -0
- /package/src/utils/{cn.ts → core/cn.ts} +0 -0
- /package/src/utils/{debugLogger.ts → core/debugLogger.ts} +0 -0
- /package/src/utils/{dynamicUtils.ts → dynamic/dynamicUtils.ts} +0 -0
- /package/src/utils/{formatDate.test.ts → formatting/formatDate.test.ts} +0 -0
- /package/src/utils/{formatting.ts → formatting/formatting.ts} +0 -0
- /package/src/utils/{bundleAnalysis.ts → performance/bundleAnalysis.ts} +0 -0
- /package/src/utils/{performanceBenchmark.ts → performance/performanceBenchmark.ts} +0 -0
- /package/src/utils/{performanceBudgets.ts → performance/performanceBudgets.ts} +0 -0
- /package/src/utils/{permissionTypes.ts → permissions/permissionTypes.ts} +0 -0
- /package/src/utils/{permissionUtils.test.ts → permissions/permissionUtils.test.ts} +0 -0
- /package/src/utils/{permissionUtils.ts → permissions/permissionUtils.ts} +0 -0
- /package/src/utils/{auth-utils.ts → security/auth-utils.ts} +0 -0
- /package/src/utils/{secureDataAccess.test.ts → security/secureDataAccess.test.ts} +0 -0
- /package/src/utils/{secureDataAccess.ts → security/secureDataAccess.ts} +0 -0
- /package/src/utils/{secureStorage.ts → security/secureStorage.ts} +0 -0
- /package/src/utils/{securityMonitor.ts → security/securityMonitor.ts} +0 -0
- /package/src/{validation → utils/validation}/common.ts +0 -0
- /package/src/{validation → utils/validation}/passwordSchema.ts +0 -0
- /package/src/{validation → utils/validation}/user.ts +0 -0
- /package/src/utils/{validation.ts → validation/validation.ts} +0 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Aggregation Utility Functions
|
|
3
|
+
* @package @jmruthers/pace-core
|
|
4
|
+
* @module Components/DataTable/Utils
|
|
5
|
+
* @since 0.6.0
|
|
6
|
+
*
|
|
7
|
+
* Utility functions for common aggregation operations in grouped DataTable rows.
|
|
8
|
+
* These functions can be used as the `aggregateFn` property in column definitions.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { DataTableColumn, DataRecord } from '../types';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Creates a sum aggregation function for a specific field.
|
|
15
|
+
*
|
|
16
|
+
* @param accessorKey - The field key to sum (e.g., 'cost', 'quantity')
|
|
17
|
+
* @returns An aggregation function that sums the specified field across all rows
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```tsx
|
|
21
|
+
* {
|
|
22
|
+
* accessorKey: 'cost',
|
|
23
|
+
* header: 'Total Cost',
|
|
24
|
+
* aggregateFn: sum('cost'),
|
|
25
|
+
* }
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export function sum<TData extends DataRecord = DataRecord>(accessorKey: keyof TData | string) {
|
|
29
|
+
return <TRow extends DataRecord = TData>(rows: TRow[], column: DataTableColumn<TRow>): number => {
|
|
30
|
+
return rows.reduce((total, row) => {
|
|
31
|
+
const value = (row as any)[accessorKey];
|
|
32
|
+
const numValue = typeof value === 'number' ? value : parseFloat(String(value || 0));
|
|
33
|
+
return total + (isNaN(numValue) ? 0 : numValue);
|
|
34
|
+
}, 0);
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Creates an average aggregation function for a specific field.
|
|
40
|
+
*
|
|
41
|
+
* @param accessorKey - The field key to average (e.g., 'price', 'rating')
|
|
42
|
+
* @returns An aggregation function that calculates the average of the specified field across all rows
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```tsx
|
|
46
|
+
* {
|
|
47
|
+
* accessorKey: 'price',
|
|
48
|
+
* header: 'Avg Price',
|
|
49
|
+
* aggregateFn: average('price'),
|
|
50
|
+
* }
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export function average<TData extends DataRecord = DataRecord>(accessorKey: keyof TData | string) {
|
|
54
|
+
return <TRow extends DataRecord = TData>(rows: TRow[], column: DataTableColumn<TRow>): number => {
|
|
55
|
+
if (rows.length === 0) return 0;
|
|
56
|
+
|
|
57
|
+
const validValues = rows
|
|
58
|
+
.map(row => (row as any)[accessorKey])
|
|
59
|
+
.filter(value => value != null && value !== '')
|
|
60
|
+
.map(value => {
|
|
61
|
+
const numValue = typeof value === 'number' ? value : parseFloat(String(value));
|
|
62
|
+
return isNaN(numValue) ? null : numValue;
|
|
63
|
+
})
|
|
64
|
+
.filter((value): value is number => value !== null);
|
|
65
|
+
|
|
66
|
+
if (validValues.length === 0) return 0;
|
|
67
|
+
|
|
68
|
+
const sum = validValues.reduce((total, value) => total + value, 0);
|
|
69
|
+
return sum / validValues.length;
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Creates a count aggregation function.
|
|
75
|
+
* Returns the number of rows in the group.
|
|
76
|
+
*
|
|
77
|
+
* @returns An aggregation function that counts the number of rows
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```tsx
|
|
81
|
+
* {
|
|
82
|
+
* accessorKey: 'id',
|
|
83
|
+
* header: 'Count',
|
|
84
|
+
* aggregateFn: count(),
|
|
85
|
+
* }
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export function count<TData extends DataRecord = DataRecord>() {
|
|
89
|
+
return <TRow extends DataRecord = TData>(rows: TRow[], column: DataTableColumn<TRow>): number => {
|
|
90
|
+
return rows.length;
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Creates a minimum aggregation function for a specific field.
|
|
96
|
+
*
|
|
97
|
+
* @param accessorKey - The field key to find the minimum of (e.g., 'price', 'date')
|
|
98
|
+
* @returns An aggregation function that returns the minimum value of the specified field
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* ```tsx
|
|
102
|
+
* {
|
|
103
|
+
* accessorKey: 'price',
|
|
104
|
+
* header: 'Min Price',
|
|
105
|
+
* aggregateFn: min('price'),
|
|
106
|
+
* }
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
export function min<TData extends DataRecord = DataRecord>(accessorKey: keyof TData | string) {
|
|
110
|
+
return <TRow extends DataRecord = TData>(rows: TRow[], column: DataTableColumn<TRow>): number | null => {
|
|
111
|
+
if (rows.length === 0) return null;
|
|
112
|
+
|
|
113
|
+
const validValues = rows
|
|
114
|
+
.map(row => (row as any)[accessorKey])
|
|
115
|
+
.filter(value => value != null && value !== '')
|
|
116
|
+
.map(value => {
|
|
117
|
+
const numValue = typeof value === 'number' ? value : parseFloat(String(value));
|
|
118
|
+
return isNaN(numValue) ? null : numValue;
|
|
119
|
+
})
|
|
120
|
+
.filter((value): value is number => value !== null);
|
|
121
|
+
|
|
122
|
+
if (validValues.length === 0) return null;
|
|
123
|
+
|
|
124
|
+
return Math.min(...validValues);
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Creates a maximum aggregation function for a specific field.
|
|
130
|
+
*
|
|
131
|
+
* @param accessorKey - The field key to find the maximum of (e.g., 'price', 'date')
|
|
132
|
+
* @returns An aggregation function that returns the maximum value of the specified field
|
|
133
|
+
*
|
|
134
|
+
* @example
|
|
135
|
+
* ```tsx
|
|
136
|
+
* {
|
|
137
|
+
* accessorKey: 'price',
|
|
138
|
+
* header: 'Max Price',
|
|
139
|
+
* aggregateFn: max('price'),
|
|
140
|
+
* }
|
|
141
|
+
* ```
|
|
142
|
+
*/
|
|
143
|
+
export function max<TData extends DataRecord = DataRecord>(accessorKey: keyof TData | string) {
|
|
144
|
+
return <TRow extends DataRecord = TData>(rows: TRow[], column: DataTableColumn<TRow>): number | null => {
|
|
145
|
+
if (rows.length === 0) return null;
|
|
146
|
+
|
|
147
|
+
const validValues = rows
|
|
148
|
+
.map(row => (row as any)[accessorKey])
|
|
149
|
+
.filter(value => value != null && value !== '')
|
|
150
|
+
.map(value => {
|
|
151
|
+
const numValue = typeof value === 'number' ? value : parseFloat(String(value));
|
|
152
|
+
return isNaN(numValue) ? null : numValue;
|
|
153
|
+
})
|
|
154
|
+
.filter((value): value is number => value !== null);
|
|
155
|
+
|
|
156
|
+
if (validValues.length === 0) return null;
|
|
157
|
+
|
|
158
|
+
return Math.max(...validValues);
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* This utility can be used across different data tables with different column structures.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import { createLogger } from '../../../utils/logger';
|
|
11
|
+
import { createLogger } from '../../../utils/core/logger';
|
|
12
12
|
import type { CellValue } from '../types';
|
|
13
13
|
|
|
14
14
|
export interface ColumnMapping {
|
|
@@ -273,10 +273,6 @@ export function flexibleImport<T extends Record<string, unknown>>(
|
|
|
273
273
|
};
|
|
274
274
|
} {
|
|
275
275
|
const logger = createLogger('FlexibleImport');
|
|
276
|
-
logger.info('Starting flexible import...');
|
|
277
|
-
logger.debug('Available CSV columns:', Object.keys(csvData[0] || {}));
|
|
278
|
-
logger.debug('Target fields:', targetFields);
|
|
279
|
-
|
|
280
276
|
const maxRows = options.maxRows || 10000;
|
|
281
277
|
|
|
282
278
|
// Check row limit
|
|
@@ -354,7 +350,6 @@ export function flexibleImport<T extends Record<string, unknown>>(
|
|
|
354
350
|
normalizedPossible.includes(normalizedCol);
|
|
355
351
|
});
|
|
356
352
|
if (found) {
|
|
357
|
-
logger.debug(`Mapped ${targetField} -> ${found}`);
|
|
358
353
|
return found;
|
|
359
354
|
}
|
|
360
355
|
}
|
|
@@ -368,8 +363,6 @@ export function flexibleImport<T extends Record<string, unknown>>(
|
|
|
368
363
|
mappings[field] = findColumn(field);
|
|
369
364
|
});
|
|
370
365
|
|
|
371
|
-
logger.debug('Column mappings:', mappings);
|
|
372
|
-
|
|
373
366
|
// Enhanced date parsing with multiple format support
|
|
374
367
|
const parseDate = (dateStr: string, fieldName?: string): Date | null => {
|
|
375
368
|
if (!dateStr || typeof dateStr !== 'string') return null;
|
|
@@ -530,7 +523,6 @@ export function flexibleImport<T extends Record<string, unknown>>(
|
|
|
530
523
|
|
|
531
524
|
for (let index = 0; index < csvData.length; index++) {
|
|
532
525
|
const row = csvData[index];
|
|
533
|
-
logger.debug(`Processing row ${index + 1}:`, row);
|
|
534
526
|
|
|
535
527
|
const transformedRow: Record<string, unknown> = {};
|
|
536
528
|
let hasErrors = false;
|
|
@@ -563,8 +555,6 @@ export function flexibleImport<T extends Record<string, unknown>>(
|
|
|
563
555
|
if (!options.schemaValidation || !hasErrors) {
|
|
564
556
|
mappedData.push(transformedRow as T);
|
|
565
557
|
}
|
|
566
|
-
|
|
567
|
-
logger.debug(`Transformed row ${index + 1}:`, transformedRow);
|
|
568
558
|
}
|
|
569
559
|
|
|
570
560
|
// Calculate unique error rows (multiple errors per row still count as 1 error row)
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
import { Table } from '@tanstack/react-table';
|
|
11
11
|
import type { PaginationMode, ServerSideResponse, DataRecord } from '../types';
|
|
12
|
-
import { createLogger } from '../../../utils/logger';
|
|
12
|
+
import { createLogger } from '../../../utils/core/logger';
|
|
13
13
|
|
|
14
14
|
// ============================================================================
|
|
15
15
|
// TYPES
|
|
@@ -156,8 +156,8 @@
|
|
|
156
156
|
import * as React from 'react';
|
|
157
157
|
import * as DialogPrimitive from '@radix-ui/react-dialog';
|
|
158
158
|
import { X } from 'lucide-react';
|
|
159
|
-
import { cn } from '../../utils/cn';
|
|
160
|
-
import { renderSafeHtml } from '
|
|
159
|
+
import { cn } from '../../utils/core/cn';
|
|
160
|
+
import { renderSafeHtml } from '../../utils/validation/htmlSanitization';
|
|
161
161
|
import { useState, useEffect } from 'react';
|
|
162
162
|
import { debounce } from 'lodash';
|
|
163
163
|
|
|
@@ -12,7 +12,7 @@ import { ErrorBoundary } from './ErrorBoundary';
|
|
|
12
12
|
import { renderWithProviders } from '../../__tests__/helpers/test-utils';
|
|
13
13
|
|
|
14
14
|
// Mock the performance budget monitor
|
|
15
|
-
vi.mock('../../utils/performanceBudgets', () => ({
|
|
15
|
+
vi.mock('../../utils/performance/performanceBudgets', () => ({
|
|
16
16
|
performanceBudgetMonitor: {
|
|
17
17
|
measure: vi.fn()
|
|
18
18
|
}
|
|
@@ -76,7 +76,21 @@ const RecoverableComponent = ({ shouldThrow = true }: { shouldThrow?: boolean })
|
|
|
76
76
|
};
|
|
77
77
|
|
|
78
78
|
describe('ErrorBoundary Component', () => {
|
|
79
|
+
let originalMode: string | undefined;
|
|
80
|
+
|
|
79
81
|
beforeEach(() => {
|
|
82
|
+
// Ensure logger is enabled by setting MODE to development
|
|
83
|
+
originalMode = import.meta.env.MODE;
|
|
84
|
+
(import.meta.env as any).MODE = 'development';
|
|
85
|
+
|
|
86
|
+
import('../../utils/core/logger').then(({ Logger, LogLevel }) => {
|
|
87
|
+
Logger.configure({
|
|
88
|
+
level: LogLevel.DEBUG,
|
|
89
|
+
includeTimestamp: false,
|
|
90
|
+
includeComponent: true,
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
|
|
80
94
|
vi.clearAllMocks();
|
|
81
95
|
// Mock console methods to avoid noise in tests
|
|
82
96
|
vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
@@ -354,7 +368,7 @@ describe('ErrorBoundary Component', () => {
|
|
|
354
368
|
|
|
355
369
|
it('calls performance monitor when error occurs', async () => {
|
|
356
370
|
const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
357
|
-
const { performanceBudgetMonitor } = await import('../../utils/performanceBudgets');
|
|
371
|
+
const { performanceBudgetMonitor } = await import('../../utils/performance/performanceBudgets');
|
|
358
372
|
|
|
359
373
|
renderWithProviders(
|
|
360
374
|
<ErrorBoundary componentName="TestComponent">
|
|
@@ -387,12 +401,18 @@ describe('ErrorBoundary Component', () => {
|
|
|
387
401
|
);
|
|
388
402
|
|
|
389
403
|
await waitFor(() => {
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
404
|
+
// React logs its own error message first, then our logger logs
|
|
405
|
+
// Check that our logger was called with the correct format
|
|
406
|
+
const calls = consoleSpy.mock.calls;
|
|
407
|
+
const ourLogCall = calls.find(call =>
|
|
408
|
+
call[0] && typeof call[0] === 'string' &&
|
|
409
|
+
call[0].includes('[ERROR] [ErrorBoundary]') &&
|
|
410
|
+
call[0].includes('[TestComponent] Caught error')
|
|
394
411
|
);
|
|
395
|
-
|
|
412
|
+
expect(ourLogCall).toBeDefined();
|
|
413
|
+
expect(ourLogCall![1]).toBeInstanceOf(Error);
|
|
414
|
+
expect(ourLogCall![2]).toBeDefined();
|
|
415
|
+
}, { timeout: 2000 });
|
|
396
416
|
|
|
397
417
|
consoleSpy.mockRestore();
|
|
398
418
|
});
|
|
@@ -745,4 +765,12 @@ describe('ErrorBoundary Component', () => {
|
|
|
745
765
|
consoleSpy.mockRestore();
|
|
746
766
|
});
|
|
747
767
|
});
|
|
768
|
+
|
|
769
|
+
afterEach(() => {
|
|
770
|
+
// Restore original mode
|
|
771
|
+
if (originalMode !== undefined) {
|
|
772
|
+
(import.meta.env as any).MODE = originalMode;
|
|
773
|
+
}
|
|
774
|
+
vi.clearAllMocks();
|
|
775
|
+
});
|
|
748
776
|
});
|
|
@@ -81,7 +81,8 @@
|
|
|
81
81
|
*/
|
|
82
82
|
|
|
83
83
|
import React, { Component, ReactNode } from 'react';
|
|
84
|
-
import { performanceBudgetMonitor } from '../../utils/performanceBudgets';
|
|
84
|
+
import { performanceBudgetMonitor } from '../../utils/performance/performanceBudgets';
|
|
85
|
+
import { logger } from '../../utils/core/logger';
|
|
85
86
|
|
|
86
87
|
/**
|
|
87
88
|
* State interface for the ErrorBoundary component
|
|
@@ -165,7 +166,7 @@ export class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundarySt
|
|
|
165
166
|
this.setState({ errorInfo });
|
|
166
167
|
|
|
167
168
|
// Enhanced logging with component name and error ID
|
|
168
|
-
|
|
169
|
+
logger.error('ErrorBoundary', `[${componentName}] Caught error ${errorId}:`, error, errorInfo);
|
|
169
170
|
|
|
170
171
|
// Performance monitoring - track error occurrence
|
|
171
172
|
performanceBudgetMonitor.measure('ERROR_BOUNDARY_TRIGGER', 1, {
|
|
@@ -191,7 +192,7 @@ export class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundarySt
|
|
|
191
192
|
if (import.meta.env.MODE === 'production') {
|
|
192
193
|
// Example: Send to error reporting service
|
|
193
194
|
// errorReportingService.report({ error, errorInfo, errorId, componentName });
|
|
194
|
-
|
|
195
|
+
logger.warn('ErrorBoundary', 'Error reporting would be triggered in production:', { errorId, componentName });
|
|
195
196
|
}
|
|
196
197
|
};
|
|
197
198
|
|
|
@@ -200,7 +201,7 @@ export class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundarySt
|
|
|
200
201
|
const { retryCount } = this.state;
|
|
201
202
|
|
|
202
203
|
if (retryCount < maxRetries) {
|
|
203
|
-
|
|
204
|
+
logger.debug('ErrorBoundary', `Retrying component render (attempt ${retryCount + 1}/${maxRetries})`);
|
|
204
205
|
|
|
205
206
|
this.setState(prevState => ({
|
|
206
207
|
hasError: false,
|
|
@@ -92,7 +92,8 @@ import { RefreshCw, AlertCircle, Lock, Calendar, Star } from 'lucide-react';
|
|
|
92
92
|
import { useEvents } from '../../hooks/useEvents';
|
|
93
93
|
import { Event } from '../../types';
|
|
94
94
|
import { useEffect, useMemo } from 'react';
|
|
95
|
-
import { cn } from '../../utils/cn';
|
|
95
|
+
import { cn } from '../../utils/core/cn';
|
|
96
|
+
import { logger } from '../../utils/core/logger';
|
|
96
97
|
|
|
97
98
|
export interface EventSelectorProps {
|
|
98
99
|
/** Placeholder text for the dropdown */
|
|
@@ -145,7 +146,7 @@ export function EventSelector({
|
|
|
145
146
|
refreshEvents,
|
|
146
147
|
} = useEvents();
|
|
147
148
|
|
|
148
|
-
|
|
149
|
+
logger.debug('EventSelector', 'Component render:', {
|
|
149
150
|
eventsCount: events.length,
|
|
150
151
|
events: events.map(e => ({ id: e.event_id, name: e.event_name })),
|
|
151
152
|
selectedEvent: selectedEvent ? { id: selectedEvent.event_id, name: selectedEvent.event_name } : null,
|
|
@@ -7,6 +7,7 @@ import { PublicPageContext, useIsPublicPage } from '../PublicLayout/PublicPagePr
|
|
|
7
7
|
import { useUnifiedAuth } from '../../providers/services/UnifiedAuthProvider';
|
|
8
8
|
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogBody, DialogFooter } from '../Dialog/Dialog';
|
|
9
9
|
import { Button } from '../Button/Button';
|
|
10
|
+
import { logger } from '../../utils/core/logger';
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
13
|
* Size classes for fallback display
|
|
@@ -502,21 +503,6 @@ function FileDisplayPublic({
|
|
|
502
503
|
const publicPageContext = useContext(PublicPageContext);
|
|
503
504
|
const supabase = publicPageContext?.supabase ?? null;
|
|
504
505
|
|
|
505
|
-
// Step 4: Log Supabase client context
|
|
506
|
-
console.log('[FileDisplayPublic] Supabase Client Context:', {
|
|
507
|
-
hasPublicPageContext: !!publicPageContext,
|
|
508
|
-
hasSupabaseClient: !!supabase,
|
|
509
|
-
supabaseUrl: publicPageContext?.environment?.supabaseUrl || 'not available',
|
|
510
|
-
hasAnonKey: !!publicPageContext?.environment?.supabaseKey,
|
|
511
|
-
hasAuth: !!supabase?.auth,
|
|
512
|
-
organisation_id,
|
|
513
|
-
table_name,
|
|
514
|
-
record_id,
|
|
515
|
-
category,
|
|
516
|
-
context: 'public_page_anonymous_user',
|
|
517
|
-
note: 'Public pages use anonymous Supabase client (no user session)'
|
|
518
|
-
});
|
|
519
|
-
|
|
520
506
|
if (!supabase) {
|
|
521
507
|
// If fallback is enabled, show fallback UI instead of error
|
|
522
508
|
if (showFallback) {
|
|
@@ -573,7 +559,7 @@ function FileDisplayPublic({
|
|
|
573
559
|
|
|
574
560
|
// Log errors for debugging public file display issues
|
|
575
561
|
if (error) {
|
|
576
|
-
|
|
562
|
+
logger.error('FileDisplayPublic', 'Error fetching file', {
|
|
577
563
|
table_name,
|
|
578
564
|
record_id,
|
|
579
565
|
organisation_id,
|
|
@@ -583,26 +569,6 @@ function FileDisplayPublic({
|
|
|
583
569
|
});
|
|
584
570
|
}
|
|
585
571
|
|
|
586
|
-
// Log when file is successfully loaded
|
|
587
|
-
if (fileUrl && !isLoading && !error) {
|
|
588
|
-
console.log('[FileDisplayPublic] File loaded successfully:', {
|
|
589
|
-
table_name,
|
|
590
|
-
record_id,
|
|
591
|
-
category,
|
|
592
|
-
fileUrl: fileUrl.substring(0, 50) + '...' // Truncate URL for logging
|
|
593
|
-
});
|
|
594
|
-
}
|
|
595
|
-
|
|
596
|
-
// Log when no file is found (but not an error - might be expected)
|
|
597
|
-
if (!isLoading && !error && !fileUrl && !fileReference) {
|
|
598
|
-
console.log('[FileDisplayPublic] No file found (will show fallback if enabled):', {
|
|
599
|
-
table_name,
|
|
600
|
-
record_id,
|
|
601
|
-
category,
|
|
602
|
-
showFallback
|
|
603
|
-
});
|
|
604
|
-
}
|
|
605
|
-
|
|
606
572
|
// Public context doesn't support delete operations
|
|
607
573
|
const handleDelete = async () => {
|
|
608
574
|
// Delete operations are not available in public context for security reasons
|
|
@@ -161,8 +161,8 @@ import { renderWithProviders, createMockSupabaseClient } from '../../__tests__/h
|
|
|
161
161
|
|
|
162
162
|
// Mock dependencies
|
|
163
163
|
import * as useFileReferenceModule from '../../hooks/useFileReference';
|
|
164
|
-
import * as appNameResolver from '../../utils/appNameResolver';
|
|
165
|
-
import * as appIdResolver from '../../utils/appIdResolver';
|
|
164
|
+
import * as appNameResolver from '../../utils/app/appNameResolver';
|
|
165
|
+
import * as appIdResolver from '../../utils/app/appIdResolver';
|
|
166
166
|
|
|
167
167
|
const mockUseFileReference = vi.fn();
|
|
168
168
|
const mockGetCurrentAppName = vi.fn();
|
|
@@ -5,8 +5,8 @@ import React, { useState, useCallback, useRef, useEffect, useMemo } from 'react'
|
|
|
5
5
|
import { SupabaseClient } from '@supabase/supabase-js';
|
|
6
6
|
import { FileCategory, FileUploadResult, UploadProgress } from '../../types/file-reference';
|
|
7
7
|
import { useFileReference } from '../../hooks/useFileReference';
|
|
8
|
-
import { getCurrentAppName } from '../../utils/appNameResolver';
|
|
9
|
-
import { getAppId } from '../../utils/appIdResolver';
|
|
8
|
+
import { getCurrentAppName } from '../../utils/app/appNameResolver';
|
|
9
|
+
import { getAppId } from '../../utils/app/appIdResolver';
|
|
10
10
|
|
|
11
11
|
export interface FileUploadProps {
|
|
12
12
|
supabase: SupabaseClient;
|