@jmruthers/pace-core 0.5.135 → 0.5.137
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-A36PJG6N.js → DataTable-6M4L6BI2.js} +26 -13
- package/dist/{DataTable-C7GaRZye.d.ts → DataTable-CWAZZcXC.d.ts} +1 -1
- package/dist/{PublicLoadingSpinner-CUAnTvcg.d.ts → EventLogo-rFL_kRjk.d.ts} +123 -135
- package/dist/{UnifiedAuthProvider-BVKmQd9u.d.ts → UnifiedAuthProvider-DJxGTftH.d.ts} +1 -1
- package/dist/{UnifiedAuthProvider-CQDZRJIS.js → UnifiedAuthProvider-XIQQ7LVU.js} +5 -5
- package/dist/{api-TNIBJWLM.js → api-45XYYO2A.js} +4 -3
- package/dist/{audit-T36HM7IM.js → audit-64X3VJXB.js} +3 -2
- package/dist/{chunk-F64FFPOZ.js → chunk-22WKWKRX.js} +26 -20
- package/dist/chunk-22WKWKRX.js.map +1 -0
- package/dist/{chunk-VZ5OR6HD.js → chunk-4C7EXCAR.js} +62 -150
- package/dist/chunk-4C7EXCAR.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-CTJRBUX2.js → chunk-6LAAY47Q.js} +2 -2
- package/dist/{chunk-UJI6WSMD.js → chunk-7QCC6MCP.js} +90 -3
- package/dist/chunk-7QCC6MCP.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-CQZU6TFE.js → chunk-BCIBECNB.js} +100 -62
- package/dist/chunk-BCIBECNB.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-BJPBT3CU.js +21 -0
- package/dist/chunk-BJPBT3CU.js.map +1 -0
- package/dist/{chunk-BYXRHAIF.js → chunk-BLCXZEYF.js} +23 -14
- package/dist/chunk-BLCXZEYF.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-O3NWNXDY.js → chunk-FMUCXFII.js} +2 -2
- package/dist/chunk-FMUCXFII.js.map +1 -0
- package/dist/{chunk-GVDR7WNV.js → chunk-HAWZXGR2.js} +334 -614
- package/dist/chunk-HAWZXGR2.js.map +1 -0
- package/dist/{chunk-ZV77RZMU.js → chunk-INQLMHPF.js} +2 -2
- package/dist/chunk-JISYG63F.js +70 -0
- package/dist/chunk-JISYG63F.js.map +1 -0
- package/dist/{chunk-HMNOSGVA.js → chunk-KYRHUBIU.js} +576 -767
- package/dist/chunk-KYRHUBIU.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-TGIY2AR2.js → chunk-MA6EPSGZ.js} +4 -3
- package/dist/{chunk-TGIY2AR2.js.map → chunk-MA6EPSGZ.js.map} +1 -1
- package/dist/chunk-OWAG3GSU.js +58 -0
- package/dist/chunk-OWAG3GSU.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-ZYZCRSBD.js → chunk-T6JN6LH6.js} +16 -11
- package/dist/chunk-T6JN6LH6.js.map +1 -0
- package/dist/chunk-XDNLUEXI.js +138 -0
- package/dist/chunk-XDNLUEXI.js.map +1 -0
- package/dist/{chunk-3CG5L6RN.js → chunk-YCWDTTUK.js} +90 -75
- package/dist/chunk-YCWDTTUK.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 +27 -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 +21 -16
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +101 -9
- package/dist/index.js +44 -31
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +1 -1
- package/dist/providers.js +4 -4
- package/dist/rbac/index.js +12 -12
- package/dist/schema-DTDZQe2u.d.ts +28 -0
- 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 +153 -4
- package/dist/types.js +51 -16
- package/dist/types.js.map +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 +221 -173
- package/dist/utils.js +185 -225
- package/dist/utils.js.map +1 -1
- package/dist/validation.d.ts +24 -115
- package/dist/validation.js +19 -474
- 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/BadgeProps.md +27 -0
- 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 +591 -220
- package/docs/api-reference/components.md +106 -26
- package/docs/architecture/README.md +0 -3
- 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/docs/styles/README.md +0 -2
- package/examples/README.md +30 -14
- package/examples/STRUCTURE.md +125 -0
- package/examples/components 2/DataTable/HierarchicalActionsExample.tsx +421 -0
- package/examples/components 2/DataTable/HierarchicalExample.tsx +475 -0
- package/examples/components 2/DataTable/InitialPageSizeExample.tsx +177 -0
- package/examples/components 2/DataTable/PerformanceExample.tsx +506 -0
- package/examples/components 2/DataTable/index.ts +13 -0
- package/examples/components 2/Dialog/BasicHtmlTest.tsx +55 -0
- package/examples/components 2/Dialog/DebugHtmlExample.tsx +68 -0
- package/examples/components 2/Dialog/HtmlDialogExample.tsx +202 -0
- package/examples/components 2/Dialog/ScrollableDialogExample.tsx +290 -0
- package/examples/components 2/Dialog/SimpleHtmlTest.tsx +61 -0
- package/examples/components 2/Dialog/SmartDialogExample.tsx +322 -0
- package/examples/components 2/Dialog/index.ts +15 -0
- package/examples/components 2/index.ts +11 -0
- package/examples/features/index.ts +12 -0
- package/{src/examples → examples/features/public-pages}/CorrectPublicPageImplementation.tsx +14 -17
- package/{src/examples → examples/features/public-pages}/PublicEventPage.tsx +14 -27
- package/{src/examples → examples/features/public-pages}/PublicPageApp.tsx +15 -28
- package/{src/examples → examples/features/public-pages}/PublicPageUsageExample.tsx +8 -10
- package/examples/features/public-pages/index.ts +14 -0
- package/examples/features/rbac/CompleteRBACExample.tsx +324 -0
- package/examples/features/rbac/EventBasedApp.tsx +239 -0
- package/examples/features/rbac/PermissionExample.tsx +151 -0
- package/examples/features/rbac/index.ts +13 -0
- package/examples/index.ts +11 -3
- package/package.json +30 -19
- package/src/__tests__/TEST_STANDARD.md +92 -0
- package/src/components/Alert/Alert.tsx +1 -1
- package/src/components/Avatar/Avatar.tsx +1 -1
- package/src/components/Badge/Badge.test.tsx +314 -0
- package/src/components/Badge/Badge.tsx +304 -0
- package/src/components/Badge/index.ts +3 -0
- 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__/DataTableCore.test-setup.ts +217 -0
- package/src/components/DataTable/__tests__/styles.test.ts +3 -3
- package/src/components/DataTable/components/ActionButtons.tsx +0 -15
- package/src/components/DataTable/components/ColumnFilter.tsx +8 -4
- package/src/components/DataTable/components/DataTableBody.tsx +461 -0
- 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/DraggableColumnHeader.tsx +144 -0
- package/src/components/DataTable/components/EditableRow.tsx +1 -1
- package/src/components/DataTable/components/FilterRow.tsx +9 -3
- package/src/components/DataTable/components/ImportModal.tsx +2 -14
- package/src/components/DataTable/components/PaginationControls.tsx +2 -1
- package/src/components/DataTable/components/UnifiedTableBody.tsx +109 -82
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +513 -0
- package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +14 -68
- package/src/components/DataTable/components/__tests__/ActionButtons.test.tsx +1 -1
- package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +62 -0
- 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__/FilterRow.test.tsx +43 -0
- package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +1 -1
- package/src/components/DataTable/core/ActionManager.ts +235 -0
- package/src/components/DataTable/core/ColumnManager.ts +205 -0
- package/src/components/DataTable/core/DataManager.ts +188 -0
- package/src/components/DataTable/core/DataTableContext.tsx +181 -0
- package/src/components/DataTable/core/LocalDataAdapter.ts +273 -0
- package/src/components/DataTable/core/PluginRegistry.ts +229 -0
- package/src/components/DataTable/core/StateManager.ts +311 -0
- package/src/components/DataTable/core/interfaces.ts +338 -0
- 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 +28 -7
- package/src/components/DataTable/types.ts +13 -0
- package/src/components/DataTable/utils/__tests__/columnUtils.test.ts +94 -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/columnUtils.ts +40 -0
- package/src/components/DataTable/utils/debugTools.ts +609 -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 +2 -0
- package/src/components/DataTable/utils/paginationUtils.ts +1 -1
- package/src/components/Dialog/Dialog.tsx +2 -2
- package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +8 -1
- 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.test.tsx +1 -1
- package/src/components/Footer/Footer.tsx +1 -1
- package/src/components/Form/Form.test.tsx +5 -510
- 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.test.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.performance.test.tsx +76 -10
- 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 +14 -13
- 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/__tests__/PublicPageFooter.test.tsx +1 -1
- package/src/components/PublicLayout/index.ts +4 -2
- package/src/components/Select/Select.test.tsx +1 -1
- package/src/components/Select/Select.tsx +21 -9
- 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/Table/__tests__/Table.test.tsx +1 -1
- package/src/components/Toast/Toast.tsx +1 -1
- package/src/components/Tooltip/Tooltip.tsx +1 -1
- package/src/components/index.ts +7 -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__/useFileUrl.unit.test.ts +83 -85
- 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 +20 -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/styles/core.css +3 -0
- 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/app/appConfig.ts +47 -0
- package/src/utils/app/appIdResolver.test.ts +497 -0
- package/src/utils/app/appIdResolver.ts +133 -0
- package/src/utils/app/appNameResolver.simple.test.ts +212 -0
- package/src/utils/app/appNameResolver.test.ts +121 -0
- package/src/utils/app/appNameResolver.ts +195 -0
- package/src/utils/audit/audit.ts +127 -0
- package/src/utils/context/organisationContext.test.ts +322 -0
- package/src/utils/context/organisationContext.ts +156 -0
- package/src/utils/context/sessionTracking.ts +125 -0
- package/src/utils/core/cn.ts +7 -0
- package/src/utils/core/debugLogger.ts +67 -0
- package/src/utils/core/logger.ts +181 -0
- package/src/utils/device/deviceFingerprint.ts +215 -0
- package/src/utils/dynamic/dynamicUtils.ts +105 -0
- package/src/utils/dynamic/lazyLoad.tsx +44 -0
- package/src/utils/file-reference/__tests__/file-reference.test.ts +788 -0
- package/src/utils/file-reference/index.ts +501 -0
- package/src/utils/formatting/formatDate.test.ts +237 -0
- package/src/utils/formatting/formatting.ts +133 -0
- package/src/utils/index.ts +39 -54
- package/src/utils/performance/bundleAnalysis.ts +129 -0
- package/src/utils/performance/performanceBenchmark.ts +64 -0
- package/src/utils/performance/performanceBudgets.ts +110 -0
- package/src/utils/permissions/permissionTypes.ts +37 -0
- package/src/utils/permissions/permissionUtils.test.ts +393 -0
- package/src/utils/permissions/permissionUtils.ts +34 -0
- package/src/utils/security/auth-utils.ts +96 -0
- package/src/utils/security/secureDataAccess.test.ts +711 -0
- package/src/utils/security/secureDataAccess.ts +377 -0
- package/src/utils/security/secureErrors.ts +82 -0
- package/src/utils/security/secureStorage.ts +244 -0
- package/src/utils/security/security.ts +159 -0
- package/src/utils/security/securityMonitor.ts +45 -0
- package/src/utils/storage/__tests__/helpers.unit.test.ts +1 -4
- package/src/utils/storage/helpers.ts +15 -8
- package/src/utils/validation/__tests__/htmlSanitization.unit.test.ts +598 -0
- package/src/{validation → utils/validation}/csrf.ts +1 -1
- package/src/utils/validation/htmlSanitization.ts +184 -0
- package/src/utils/validation/index.ts +79 -0
- package/src/utils/validation/sanitization.ts +333 -0
- package/src/{validation/schemaUtils.ts → utils/validation/schema.ts} +11 -6
- package/src/{validation → utils/validation}/sqlInjectionProtection.ts +2 -0
- package/src/utils/validation/validation.ts +111 -0
- package/src/utils/validation/validationUtils.ts +123 -0
- package/src/validation/index.ts +3 -34
- 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 +0 -87
- 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/dist/validation-DnhrNMju.d.ts +0 -159
- package/src/components/PublicLayout/__tests__/PublicPageDebugger.test.tsx +0 -185
- 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-6M4L6BI2.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-CQDZRJIS.js.map → UnifiedAuthProvider-XIQQ7LVU.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-6LAAY47Q.js.map} +0 -0
- /package/dist/{chunk-ZV77RZMU.js.map → chunk-INQLMHPF.js.map} +0 -0
- /package/dist/{useInactivityTracker-MRUU55XI.js.map → useInactivityTracker-TO6ZOF35.js.map} +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
|
@@ -2,29 +2,30 @@ import {
|
|
|
2
2
|
init_useOrganisations,
|
|
3
3
|
useEvents,
|
|
4
4
|
useOrganisations
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-MA6EPSGZ.js";
|
|
6
6
|
import {
|
|
7
7
|
init_UnifiedAuthProvider
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-6LAAY47Q.js";
|
|
9
9
|
import {
|
|
10
10
|
OrganisationServiceContext,
|
|
11
11
|
OrganisationServiceProvider,
|
|
12
12
|
init_OrganisationServiceProvider,
|
|
13
13
|
useOrganisationService,
|
|
14
14
|
useUnifiedAuth
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-YCWDTTUK.js";
|
|
16
16
|
import {
|
|
17
17
|
cn
|
|
18
|
-
} from "./chunk-
|
|
19
|
-
import {
|
|
20
|
-
init_organisationContext,
|
|
21
|
-
setOrganisationContext
|
|
22
|
-
} from "./chunk-BDZUMRBD.js";
|
|
18
|
+
} from "./chunk-56XJ3TU6.js";
|
|
23
19
|
import {
|
|
24
20
|
applyPalette,
|
|
25
21
|
clearPalette,
|
|
26
22
|
parseAndNormalizeEventColours
|
|
27
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-ERISIBYU.js";
|
|
24
|
+
import {
|
|
25
|
+
createLogger,
|
|
26
|
+
init_logger,
|
|
27
|
+
logger
|
|
28
|
+
} from "./chunk-XDNLUEXI.js";
|
|
28
29
|
import {
|
|
29
30
|
__esm,
|
|
30
31
|
__export
|
|
@@ -50,6 +51,8 @@ var init_OrganisationProvider = __esm({
|
|
|
50
51
|
// src/hooks/useEventTheme.ts
|
|
51
52
|
import { useEffect } from "react";
|
|
52
53
|
import { useLocation } from "react-router-dom";
|
|
54
|
+
init_logger();
|
|
55
|
+
var log = createLogger("useEventTheme");
|
|
53
56
|
function useEventTheme(event) {
|
|
54
57
|
const location = useLocation();
|
|
55
58
|
let selectedEvent;
|
|
@@ -86,7 +89,7 @@ function useEventTheme(event) {
|
|
|
86
89
|
try {
|
|
87
90
|
applyPalette(normalized);
|
|
88
91
|
} catch (error) {
|
|
89
|
-
|
|
92
|
+
log.error("Failed to apply event palette:", error);
|
|
90
93
|
}
|
|
91
94
|
return () => {
|
|
92
95
|
};
|
|
@@ -252,6 +255,7 @@ function DefaultPublicErrorFallback({
|
|
|
252
255
|
// src/components/PublicLayout/PublicPageProvider.tsx
|
|
253
256
|
import { createContext, useContext, useMemo } from "react";
|
|
254
257
|
import { createClient } from "@supabase/supabase-js";
|
|
258
|
+
init_logger();
|
|
255
259
|
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
256
260
|
var PublicPageContext = createContext(void 0);
|
|
257
261
|
function PublicPageProvider({ children, appName }) {
|
|
@@ -268,11 +272,11 @@ function PublicPageProvider({ children, appName }) {
|
|
|
268
272
|
const supabaseKey = getEnvVar("VITE_SUPABASE_ANON_KEY") || getEnvVar("NEXT_PUBLIC_SUPABASE_ANON_KEY") || null;
|
|
269
273
|
const supabase = useMemo(() => {
|
|
270
274
|
if (!supabaseUrl || !supabaseKey) {
|
|
271
|
-
|
|
275
|
+
logger.warn("PublicPageProvider", "Missing Supabase environment variables. Please ensure VITE_SUPABASE_URL and VITE_SUPABASE_ANON_KEY are set in your environment.");
|
|
272
276
|
return null;
|
|
273
277
|
}
|
|
274
278
|
const client = createClient(supabaseUrl, supabaseKey);
|
|
275
|
-
|
|
279
|
+
logger.info("PublicPageProvider", "Supabase client created successfully for public pages");
|
|
276
280
|
return client;
|
|
277
281
|
}, [supabaseUrl, supabaseKey]);
|
|
278
282
|
const contextValue = {
|
|
@@ -415,6 +419,8 @@ function validateFileSize(file) {
|
|
|
415
419
|
}
|
|
416
420
|
|
|
417
421
|
// src/utils/storage/helpers.ts
|
|
422
|
+
init_logger();
|
|
423
|
+
var log2 = createLogger("StorageHelpers");
|
|
418
424
|
function generateFilePath(options, fileName) {
|
|
419
425
|
const { orgId, isPublic = false, customPath } = options;
|
|
420
426
|
if (!orgId) {
|
|
@@ -461,13 +467,11 @@ async function extractFileMetadata(file, options, uploadedBy) {
|
|
|
461
467
|
metadata.width = dimensions.width;
|
|
462
468
|
metadata.height = dimensions.height;
|
|
463
469
|
} catch (error) {
|
|
464
|
-
console.warn("Could not extract image dimensions:", error);
|
|
465
470
|
}
|
|
466
471
|
}
|
|
467
472
|
try {
|
|
468
473
|
metadata.hash = await generateFileHash(file);
|
|
469
474
|
} catch (error) {
|
|
470
|
-
console.warn("Could not generate file hash:", error);
|
|
471
475
|
}
|
|
472
476
|
return metadata;
|
|
473
477
|
}
|
|
@@ -594,7 +598,7 @@ async function getSignedUrl(supabase, path, options) {
|
|
|
594
598
|
const bucketName = getBucketName(false);
|
|
595
599
|
const { data, error } = await supabase.storage.from(bucketName).createSignedUrl(path, options.expiresIn || 3600);
|
|
596
600
|
if (error) {
|
|
597
|
-
|
|
601
|
+
log2.error("Failed to create signed URL:", error);
|
|
598
602
|
return null;
|
|
599
603
|
}
|
|
600
604
|
return {
|
|
@@ -602,7 +606,7 @@ async function getSignedUrl(supabase, path, options) {
|
|
|
602
606
|
expiresAt: new Date(Date.now() + (options.expiresIn || 3600) * 1e3).toISOString()
|
|
603
607
|
};
|
|
604
608
|
} catch (error) {
|
|
605
|
-
|
|
609
|
+
log2.error("Failed to create signed URL:", error);
|
|
606
610
|
return null;
|
|
607
611
|
}
|
|
608
612
|
}
|
|
@@ -635,7 +639,7 @@ async function listFiles(supabase, options) {
|
|
|
635
639
|
sortBy: { column: "created_at", order: "desc" }
|
|
636
640
|
});
|
|
637
641
|
if (error) {
|
|
638
|
-
|
|
642
|
+
log2.error("Failed to list files:", error);
|
|
639
643
|
return { files: [], totalCount: 0, hasMore: false };
|
|
640
644
|
}
|
|
641
645
|
const files = (data || []).map((item) => ({
|
|
@@ -660,7 +664,7 @@ async function listFiles(supabase, options) {
|
|
|
660
664
|
hasMore: files.length >= (options.limit || 100)
|
|
661
665
|
};
|
|
662
666
|
} catch (error) {
|
|
663
|
-
|
|
667
|
+
log2.error("Failed to list files:", error);
|
|
664
668
|
return { files: [], totalCount: 0, hasMore: false };
|
|
665
669
|
}
|
|
666
670
|
}
|
|
@@ -669,7 +673,7 @@ async function downloadFile(supabase, path, isPublic = false) {
|
|
|
669
673
|
const bucketName = getBucketName(isPublic);
|
|
670
674
|
const { data, error } = await supabase.storage.from(bucketName).download(path);
|
|
671
675
|
if (error) {
|
|
672
|
-
|
|
676
|
+
log2.error("Failed to download file:", error);
|
|
673
677
|
return null;
|
|
674
678
|
}
|
|
675
679
|
if (!data) {
|
|
@@ -689,7 +693,7 @@ async function downloadFile(supabase, path, isPublic = false) {
|
|
|
689
693
|
}
|
|
690
694
|
};
|
|
691
695
|
} catch (error) {
|
|
692
|
-
|
|
696
|
+
log2.error("Failed to download file:", error);
|
|
693
697
|
return null;
|
|
694
698
|
}
|
|
695
699
|
}
|
|
@@ -720,8 +724,30 @@ async function archiveFile(supabase, path, options) {
|
|
|
720
724
|
// src/hooks/useFileDisplay.ts
|
|
721
725
|
import { useState, useEffect as useEffect2, useCallback } from "react";
|
|
722
726
|
|
|
727
|
+
// src/utils/organisationContext.ts
|
|
728
|
+
async function setOrganisationContext(supabase, organisationId) {
|
|
729
|
+
if (!supabase || !organisationId) {
|
|
730
|
+
return;
|
|
731
|
+
}
|
|
732
|
+
try {
|
|
733
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
734
|
+
setTimeout(() => reject(new Error("RPC timeout after 3 seconds")), 3e3);
|
|
735
|
+
});
|
|
736
|
+
const rpcPromise = supabase.rpc("set_organisation_context", {
|
|
737
|
+
org_id: organisationId
|
|
738
|
+
});
|
|
739
|
+
const { error } = await Promise.race([rpcPromise, timeoutPromise]);
|
|
740
|
+
if (error) {
|
|
741
|
+
console.log("[organisationContext] RPC function not available or failed, continuing without database context");
|
|
742
|
+
} else {
|
|
743
|
+
console.log("[organisationContext] Organisation context set in database successfully");
|
|
744
|
+
}
|
|
745
|
+
} catch (error) {
|
|
746
|
+
console.log("[organisationContext] Failed to set database context, continuing without it:", error);
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
|
|
723
750
|
// src/utils/file-reference.ts
|
|
724
|
-
init_organisationContext();
|
|
725
751
|
var FileReferenceServiceImpl = class {
|
|
726
752
|
constructor(supabase) {
|
|
727
753
|
this.supabase = supabase;
|
|
@@ -1092,6 +1118,7 @@ async function uploadFileWithReference(supabase, options, file) {
|
|
|
1092
1118
|
}
|
|
1093
1119
|
|
|
1094
1120
|
// src/hooks/useFileDisplay.ts
|
|
1121
|
+
init_logger();
|
|
1095
1122
|
var authenticatedFileCache = /* @__PURE__ */ new Map();
|
|
1096
1123
|
var MAX_CACHE_SIZE = 100;
|
|
1097
1124
|
function cleanupCache() {
|
|
@@ -1136,7 +1163,7 @@ function useFileDisplay(table_name, record_id, organisation_id, category, option
|
|
|
1136
1163
|
}
|
|
1137
1164
|
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
1138
1165
|
if (!uuidRegex.test(organisation_id)) {
|
|
1139
|
-
|
|
1166
|
+
logger.warn("useFileDisplay", "Invalid organisationId format (not a valid UUID):", organisation_id);
|
|
1140
1167
|
}
|
|
1141
1168
|
const cacheKey = `file_${table_name}_${record_id}_${organisation_id}_${category || "all"}`;
|
|
1142
1169
|
if (enableCache) {
|
|
@@ -1160,7 +1187,7 @@ function useFileDisplay(table_name, record_id, organisation_id, category, option
|
|
|
1160
1187
|
setError(null);
|
|
1161
1188
|
return;
|
|
1162
1189
|
} catch (err) {
|
|
1163
|
-
|
|
1190
|
+
logger.warn("useFileDisplay", "Failed to regenerate signed URL from cache, falling back to fetch:", err);
|
|
1164
1191
|
}
|
|
1165
1192
|
}
|
|
1166
1193
|
setFileUrl(cachedData.fileUrl || null);
|
|
@@ -1179,7 +1206,7 @@ function useFileDisplay(table_name, record_id, organisation_id, category, option
|
|
|
1179
1206
|
const service = createFileReferenceService(supabase);
|
|
1180
1207
|
let files = [];
|
|
1181
1208
|
if (category) {
|
|
1182
|
-
|
|
1209
|
+
logger.debug("useFileDisplay", "Using RPC function for category filtering:", {
|
|
1183
1210
|
table_name,
|
|
1184
1211
|
record_id,
|
|
1185
1212
|
category,
|
|
@@ -1218,7 +1245,7 @@ function useFileDisplay(table_name, record_id, organisation_id, category, option
|
|
|
1218
1245
|
setFileCount(files.length);
|
|
1219
1246
|
if (category && files.length > 0) {
|
|
1220
1247
|
const firstFile = files[0];
|
|
1221
|
-
|
|
1248
|
+
logger.debug("useFileDisplay", "Processing category files, first file:", {
|
|
1222
1249
|
id: firstFile.id,
|
|
1223
1250
|
file_path: firstFile.file_path,
|
|
1224
1251
|
is_public: firstFile.is_public,
|
|
@@ -1229,7 +1256,7 @@ function useFileDisplay(table_name, record_id, organisation_id, category, option
|
|
|
1229
1256
|
let url = null;
|
|
1230
1257
|
if (firstFile.is_public) {
|
|
1231
1258
|
url = getPublicUrl(supabase, firstFile.file_path, true);
|
|
1232
|
-
|
|
1259
|
+
logger.debug("useFileDisplay", "Generated public URL:", url);
|
|
1233
1260
|
} else {
|
|
1234
1261
|
const signedUrlResult = await getSignedUrl(supabase, firstFile.file_path, {
|
|
1235
1262
|
appName: "pace-core",
|
|
@@ -1237,9 +1264,9 @@ function useFileDisplay(table_name, record_id, organisation_id, category, option
|
|
|
1237
1264
|
expiresIn: 3600
|
|
1238
1265
|
});
|
|
1239
1266
|
url = signedUrlResult?.url || null;
|
|
1240
|
-
|
|
1267
|
+
logger.debug("useFileDisplay", "Generated signed URL:", url ? "URL generated" : "URL generation failed");
|
|
1241
1268
|
}
|
|
1242
|
-
|
|
1269
|
+
logger.debug("useFileDisplay", "Setting file URL:", url ? "URL set" : "URL is null");
|
|
1243
1270
|
setFileUrl(url);
|
|
1244
1271
|
} else {
|
|
1245
1272
|
const urlMap = /* @__PURE__ */ new Map();
|
|
@@ -1297,7 +1324,7 @@ function useFileDisplay(table_name, record_id, organisation_id, category, option
|
|
|
1297
1324
|
cleanupCache();
|
|
1298
1325
|
}
|
|
1299
1326
|
} catch (err) {
|
|
1300
|
-
|
|
1327
|
+
logger.error("useFileDisplay", "Error fetching files:", err);
|
|
1301
1328
|
const error2 = err instanceof Error ? err : new Error("Unknown error occurred");
|
|
1302
1329
|
setError(error2);
|
|
1303
1330
|
setFileUrl(null);
|
|
@@ -1366,6 +1393,7 @@ function invalidateFileDisplayCache(table_name, record_id, organisation_id, cate
|
|
|
1366
1393
|
|
|
1367
1394
|
// src/hooks/public/usePublicFileDisplay.ts
|
|
1368
1395
|
import { useState as useState2, useEffect as useEffect3, useCallback as useCallback2 } from "react";
|
|
1396
|
+
init_logger();
|
|
1369
1397
|
var publicFileCache = /* @__PURE__ */ new Map();
|
|
1370
1398
|
function usePublicFileDisplay(table_name, record_id, organisation_id, category, options) {
|
|
1371
1399
|
const {
|
|
@@ -1393,7 +1421,7 @@ function usePublicFileDisplay(table_name, record_id, organisation_id, category,
|
|
|
1393
1421
|
}
|
|
1394
1422
|
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
1395
1423
|
if (!uuidRegex.test(organisation_id)) {
|
|
1396
|
-
|
|
1424
|
+
logger.warn("usePublicFileDisplay", "Invalid organisationId format (not a valid UUID)", { organisation_id });
|
|
1397
1425
|
}
|
|
1398
1426
|
const cacheKey = `public_file_${table_name}_${record_id}_${organisation_id}_${category || "all"}`;
|
|
1399
1427
|
if (enableCache) {
|
|
@@ -1421,46 +1449,9 @@ function usePublicFileDisplay(table_name, record_id, organisation_id, category,
|
|
|
1421
1449
|
p_category: category,
|
|
1422
1450
|
p_organisation_id: organisation_id
|
|
1423
1451
|
};
|
|
1424
|
-
console.log("[usePublicFileDisplay] RPC Call Parameters:", {
|
|
1425
|
-
function: "data_file_reference_by_category_list",
|
|
1426
|
-
parameters: rpcParams,
|
|
1427
|
-
supabaseClient: {
|
|
1428
|
-
available: !!supabase,
|
|
1429
|
-
hasAuth: !!supabase?.auth
|
|
1430
|
-
},
|
|
1431
|
-
context: "public_page_anonymous_user",
|
|
1432
|
-
note: "Public pages use anonymous Supabase client (no user session)"
|
|
1433
|
-
});
|
|
1434
|
-
console.log("[usePublicFileDisplay] Using RPC function for category filtering:", {
|
|
1435
|
-
table_name,
|
|
1436
|
-
record_id,
|
|
1437
|
-
category,
|
|
1438
|
-
organisation_id
|
|
1439
|
-
});
|
|
1440
1452
|
const { data, error: rpcError } = await supabase.rpc("data_file_reference_by_category_list", rpcParams);
|
|
1441
|
-
console.log("[usePublicFileDisplay] RPC Response:", {
|
|
1442
|
-
function: "data_file_reference_by_category_list",
|
|
1443
|
-
dataType: Array.isArray(data) ? "array" : typeof data,
|
|
1444
|
-
dataLength: Array.isArray(data) ? data.length : data ? 1 : 0,
|
|
1445
|
-
dataIsNull: data === null,
|
|
1446
|
-
dataIsUndefined: data === void 0,
|
|
1447
|
-
dataIsEmpty: Array.isArray(data) ? data.length === 0 : !data,
|
|
1448
|
-
firstItem: Array.isArray(data) && data.length > 0 ? {
|
|
1449
|
-
id: data[0].id,
|
|
1450
|
-
file_path: data[0].file_path,
|
|
1451
|
-
is_public: data[0].is_public,
|
|
1452
|
-
has_metadata: !!data[0].file_metadata,
|
|
1453
|
-
category_in_metadata: data[0].file_metadata?.category
|
|
1454
|
-
} : null,
|
|
1455
|
-
error: rpcError ? {
|
|
1456
|
-
message: rpcError.message,
|
|
1457
|
-
code: rpcError.code,
|
|
1458
|
-
details: rpcError.details,
|
|
1459
|
-
hint: rpcError.hint
|
|
1460
|
-
} : null
|
|
1461
|
-
});
|
|
1462
1453
|
if (rpcError) {
|
|
1463
|
-
|
|
1454
|
+
logger.error("usePublicFileDisplay", "RPC function error", {
|
|
1464
1455
|
function: "data_file_reference_by_category_list",
|
|
1465
1456
|
table_name,
|
|
1466
1457
|
record_id,
|
|
@@ -1476,25 +1467,6 @@ function usePublicFileDisplay(table_name, record_id, organisation_id, category,
|
|
|
1476
1467
|
if (!data || data.length === 0) {
|
|
1477
1468
|
files = [];
|
|
1478
1469
|
} else {
|
|
1479
|
-
const totalFilesFromRPC = data.length;
|
|
1480
|
-
const filesWithIsPublic = data.filter((item) => item.is_public === true).length;
|
|
1481
|
-
const filesWithIsPublicFalse = data.filter((item) => item.is_public === false).length;
|
|
1482
|
-
const filesWithIsPublicNull = data.filter((item) => item.is_public === null || item.is_public === void 0).length;
|
|
1483
|
-
const filesWithValidStructure = data.filter((item) => item.id && item.file_path && item.file_metadata).length;
|
|
1484
|
-
console.log("[usePublicFileDisplay] RPC Data Analysis (before filtering):", {
|
|
1485
|
-
totalFilesFromRPC,
|
|
1486
|
-
filesWithIsPublicTrue: filesWithIsPublic,
|
|
1487
|
-
filesWithIsPublicFalse,
|
|
1488
|
-
filesWithIsPublicNull,
|
|
1489
|
-
filesWithValidStructure,
|
|
1490
|
-
sampleItems: data.slice(0, 2).map((item) => ({
|
|
1491
|
-
id: item.id,
|
|
1492
|
-
is_public: item.is_public,
|
|
1493
|
-
has_id: !!item.id,
|
|
1494
|
-
has_file_path: !!item.file_path,
|
|
1495
|
-
has_metadata: !!item.file_metadata
|
|
1496
|
-
}))
|
|
1497
|
-
});
|
|
1498
1470
|
files = data.filter((item) => {
|
|
1499
1471
|
return item.is_public === true && item.id && item.file_path && item.file_metadata;
|
|
1500
1472
|
}).map((item) => {
|
|
@@ -1512,16 +1484,6 @@ function usePublicFileDisplay(table_name, record_id, organisation_id, category,
|
|
|
1512
1484
|
updated_at: item.created_at || (/* @__PURE__ */ new Date()).toISOString()
|
|
1513
1485
|
};
|
|
1514
1486
|
});
|
|
1515
|
-
console.log("[usePublicFileDisplay] Data Transformation (after filtering):", {
|
|
1516
|
-
filesBeforeFilter: totalFilesFromRPC,
|
|
1517
|
-
filesAfterFilter: files.length,
|
|
1518
|
-
constructedFileReferences: files.map((f) => ({
|
|
1519
|
-
id: f.id,
|
|
1520
|
-
file_path: f.file_path,
|
|
1521
|
-
organisation_id: f.organisation_id,
|
|
1522
|
-
is_public: f.is_public
|
|
1523
|
-
}))
|
|
1524
|
-
});
|
|
1525
1487
|
}
|
|
1526
1488
|
} else {
|
|
1527
1489
|
const { data: fileIds, error: rpcError } = await supabase.rpc("data_file_reference_list", {
|
|
@@ -1530,7 +1492,7 @@ function usePublicFileDisplay(table_name, record_id, organisation_id, category,
|
|
|
1530
1492
|
p_organisation_id: organisation_id
|
|
1531
1493
|
});
|
|
1532
1494
|
if (rpcError) {
|
|
1533
|
-
|
|
1495
|
+
logger.error("usePublicFileDisplay", "RPC function error", {
|
|
1534
1496
|
function: "data_file_reference_list",
|
|
1535
1497
|
table_name,
|
|
1536
1498
|
record_id,
|
|
@@ -1555,56 +1517,6 @@ function usePublicFileDisplay(table_name, record_id, organisation_id, category,
|
|
|
1555
1517
|
}
|
|
1556
1518
|
const publicFiles = files.filter((f) => f.is_public === true);
|
|
1557
1519
|
if (publicFiles.length === 0) {
|
|
1558
|
-
console.log("[usePublicFileDisplay] No public files found:", {
|
|
1559
|
-
table_name,
|
|
1560
|
-
record_id,
|
|
1561
|
-
category,
|
|
1562
|
-
organisation_id,
|
|
1563
|
-
totalFilesFound: files.length,
|
|
1564
|
-
note: "This is expected if no public files exist. Fallback UI will be shown if showFallback is enabled."
|
|
1565
|
-
});
|
|
1566
|
-
try {
|
|
1567
|
-
console.log("[usePublicFileDisplay] Database Query Verification (debugging):", {
|
|
1568
|
-
note: "Performing direct query to verify if files exist in database",
|
|
1569
|
-
table_name,
|
|
1570
|
-
record_id,
|
|
1571
|
-
organisation_id,
|
|
1572
|
-
category
|
|
1573
|
-
});
|
|
1574
|
-
const { data: directQueryData, error: directQueryError } = await supabase.from("file_references").select("id, file_path, file_metadata, is_public, organisation_id").eq("table_name", table_name).eq("record_id", record_id).eq("organisation_id", organisation_id);
|
|
1575
|
-
if (directQueryError) {
|
|
1576
|
-
console.warn("[usePublicFileDisplay] Direct query error (RLS may be blocking):", {
|
|
1577
|
-
error: directQueryError.message,
|
|
1578
|
-
code: directQueryError.code,
|
|
1579
|
-
hint: "This is expected if RLS policies block anonymous access to file_references table"
|
|
1580
|
-
});
|
|
1581
|
-
} else {
|
|
1582
|
-
const totalFilesInDB = directQueryData?.length || 0;
|
|
1583
|
-
const publicFilesInDB = directQueryData?.filter((f) => f.is_public === true).length || 0;
|
|
1584
|
-
const privateFilesInDB = directQueryData?.filter((f) => f.is_public === false).length || 0;
|
|
1585
|
-
const filesWithCategory = category ? directQueryData?.filter(
|
|
1586
|
-
(f) => f.file_metadata?.category === category
|
|
1587
|
-
).length || 0 : totalFilesInDB;
|
|
1588
|
-
console.log("[usePublicFileDisplay] Database Query Results:", {
|
|
1589
|
-
totalFilesInDB,
|
|
1590
|
-
publicFilesInDB,
|
|
1591
|
-
privateFilesInDB,
|
|
1592
|
-
filesWithCategory: category ? filesWithCategory : "N/A (no category filter)",
|
|
1593
|
-
filesWithMatchingCategoryAndPublic: category ? directQueryData?.filter(
|
|
1594
|
-
(f) => f.is_public === true && f.file_metadata?.category === category
|
|
1595
|
-
).length || 0 : "N/A",
|
|
1596
|
-
sampleFiles: directQueryData?.slice(0, 2).map((f) => ({
|
|
1597
|
-
id: f.id,
|
|
1598
|
-
is_public: f.is_public,
|
|
1599
|
-
category: f.file_metadata?.category,
|
|
1600
|
-
organisation_id: f.organisation_id
|
|
1601
|
-
})) || [],
|
|
1602
|
-
conclusion: totalFilesInDB === 0 ? "No files exist in database for this record" : publicFilesInDB === 0 ? "Files exist but none are marked as public (is_public = true)" : filesWithCategory === 0 && category ? `Files exist but none match category "${category}"` : "Files exist and should be accessible - RPC function may be filtering them out"
|
|
1603
|
-
});
|
|
1604
|
-
}
|
|
1605
|
-
} catch (debugError) {
|
|
1606
|
-
console.warn("[usePublicFileDisplay] Database verification query failed:", debugError);
|
|
1607
|
-
}
|
|
1608
1520
|
setFileUrl(null);
|
|
1609
1521
|
setFileReference(null);
|
|
1610
1522
|
setFileReferences([]);
|
|
@@ -1673,7 +1585,7 @@ function usePublicFileDisplay(table_name, record_id, organisation_id, category,
|
|
|
1673
1585
|
});
|
|
1674
1586
|
}
|
|
1675
1587
|
} catch (err) {
|
|
1676
|
-
|
|
1588
|
+
logger.error("usePublicFileDisplay", "Error fetching files", {
|
|
1677
1589
|
table_name,
|
|
1678
1590
|
record_id,
|
|
1679
1591
|
organisation_id,
|
|
@@ -1778,4 +1690,4 @@ export {
|
|
|
1778
1690
|
clearPublicFileDisplayCache,
|
|
1779
1691
|
getPublicFileDisplayCacheStats
|
|
1780
1692
|
};
|
|
1781
|
-
//# sourceMappingURL=chunk-
|
|
1693
|
+
//# sourceMappingURL=chunk-4C7EXCAR.js.map
|