@jmruthers/pace-core 0.5.189 → 0.5.190
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/core-usage-manifest.json +0 -4
- package/dist/{AuthService-B-cd2MA4.d.ts → AuthService-CbP_utw2.d.ts} +7 -3
- package/dist/{DataTable-GUFUNZ3N.js → DataTable-ON3IXISJ.js} +8 -8
- package/dist/{PublicPageProvider-B8HaLe69.d.ts → PublicPageProvider-C4uxosp6.d.ts} +83 -24
- package/dist/{UnifiedAuthProvider-BG0AL5eE.d.ts → UnifiedAuthProvider-BYA9qB-o.d.ts} +4 -3
- package/dist/{UnifiedAuthProvider-643PUAIM.js → UnifiedAuthProvider-X5NXANVI.js} +4 -2
- package/dist/{api-YP7XD5L6.js → api-I6UCQ5S6.js} +4 -2
- package/dist/{chunk-DDM4CCYT.js → chunk-4QYC5L4K.js} +60 -35
- package/dist/chunk-4QYC5L4K.js.map +1 -0
- package/dist/{chunk-IM4QE42D.js → chunk-73HSNNOQ.js} +141 -326
- package/dist/chunk-73HSNNOQ.js.map +1 -0
- package/dist/{chunk-YHCN776L.js → chunk-DZWK57KZ.js} +2 -75
- package/dist/chunk-DZWK57KZ.js.map +1 -0
- package/dist/{chunk-3GOZZZYH.js → chunk-HQVPB5MZ.js} +238 -301
- package/dist/chunk-HQVPB5MZ.js.map +1 -0
- package/dist/{chunk-THRPYOFK.js → chunk-HW3OVDUF.js} +5 -5
- package/dist/chunk-HW3OVDUF.js.map +1 -0
- package/dist/{chunk-F2IMUDXZ.js → chunk-I7PSE6JW.js} +75 -2
- package/dist/chunk-I7PSE6JW.js.map +1 -0
- package/dist/{chunk-VGZZXKBR.js → chunk-J2XXC7R5.js} +280 -52
- package/dist/chunk-J2XXC7R5.js.map +1 -0
- package/dist/{chunk-UCQSRW7Z.js → chunk-NIU6J6OX.js} +425 -378
- package/dist/chunk-NIU6J6OX.js.map +1 -0
- package/dist/{chunk-HESYZWZW.js → chunk-QWWZ5CAQ.js} +2 -2
- package/dist/{chunk-HEHYGYOX.js → chunk-RUYZKXOD.js} +401 -46
- package/dist/chunk-RUYZKXOD.js.map +1 -0
- package/dist/{chunk-2UUZZJFT.js → chunk-SDMHPX3X.js} +176 -160
- package/dist/{chunk-2UUZZJFT.js.map → chunk-SDMHPX3X.js.map} +1 -1
- package/dist/{chunk-MX64ZF6I.js → chunk-STYK4OH2.js} +11 -11
- package/dist/chunk-STYK4OH2.js.map +1 -0
- package/dist/{chunk-YGPFYGA6.js → chunk-VVBAW5A5.js} +822 -498
- package/dist/chunk-VVBAW5A5.js.map +1 -0
- package/dist/chunk-Y4BUBBHD.js +614 -0
- package/dist/chunk-Y4BUBBHD.js.map +1 -0
- package/dist/{chunk-SAUPYVLF.js → chunk-ZSAAAMVR.js} +1 -1
- package/dist/chunk-ZSAAAMVR.js.map +1 -0
- package/dist/components.d.ts +3 -4
- package/dist/components.js +19 -19
- package/dist/components.js.map +1 -1
- package/dist/eslint-rules/pace-core-compliance.cjs +0 -2
- package/dist/{file-reference-D037xOFK.d.ts → file-reference-BavO2eQj.d.ts} +13 -10
- package/dist/hooks.d.ts +10 -5
- package/dist/hooks.js +14 -8
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +13 -11
- package/dist/index.js +79 -69
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +3 -3
- package/dist/providers.js +3 -1
- package/dist/rbac/index.d.ts +76 -12
- package/dist/rbac/index.js +12 -9
- package/dist/types.d.ts +1 -1
- package/dist/types.js +1 -1
- package/dist/{usePublicRouteParams-CTDELQ7H.d.ts → usePublicRouteParams-DxIDS4bC.d.ts} +16 -9
- package/dist/utils.js +16 -16
- package/docs/README.md +2 -2
- package/docs/api/classes/ColumnFactory.md +1 -1
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/InvalidScopeError.md +2 -2
- package/docs/api/classes/Logger.md +1 -1
- package/docs/api/classes/MissingUserContextError.md +2 -2
- package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
- package/docs/api/classes/PermissionDeniedError.md +1 -1
- package/docs/api/classes/RBACAuditManager.md +1 -1
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +4 -4
- package/docs/api/classes/RBACError.md +1 -1
- package/docs/api/classes/RBACNotInitializedError.md +2 -2
- package/docs/api/classes/SecureSupabaseClient.md +21 -16
- package/docs/api/classes/StorageUtils.md +7 -4
- package/docs/api/enums/FileCategory.md +1 -1
- package/docs/api/enums/LogLevel.md +1 -1
- package/docs/api/enums/RBACErrorCode.md +1 -1
- package/docs/api/enums/RPCFunction.md +1 -1
- package/docs/api/interfaces/AddressFieldProps.md +1 -1
- package/docs/api/interfaces/AddressFieldRef.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +1 -1
- package/docs/api/interfaces/AutocompleteOptions.md +1 -1
- package/docs/api/interfaces/AvatarProps.md +1 -1
- package/docs/api/interfaces/BadgeProps.md +1 -1
- package/docs/api/interfaces/ButtonProps.md +1 -1
- package/docs/api/interfaces/CalendarProps.md +20 -6
- package/docs/api/interfaces/CardProps.md +1 -1
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +1 -1
- package/docs/api/interfaces/ComplianceResult.md +1 -1
- package/docs/api/interfaces/DataAccessRecord.md +9 -9
- package/docs/api/interfaces/DataRecord.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +1 -1
- package/docs/api/interfaces/DataTableColumn.md +1 -1
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
- package/docs/api/interfaces/DatabaseComplianceResult.md +1 -1
- package/docs/api/interfaces/DatabaseIssue.md +1 -1
- package/docs/api/interfaces/EmptyStateConfig.md +1 -1
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
- package/docs/api/interfaces/EventAppRoleData.md +1 -1
- package/docs/api/interfaces/ExportColumn.md +1 -1
- package/docs/api/interfaces/ExportOptions.md +1 -1
- package/docs/api/interfaces/FileDisplayProps.md +62 -16
- package/docs/api/interfaces/FileMetadata.md +1 -1
- package/docs/api/interfaces/FileReference.md +2 -2
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadOptions.md +26 -12
- package/docs/api/interfaces/FileUploadProps.md +30 -19
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/FormFieldProps.md +1 -1
- package/docs/api/interfaces/FormProps.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/LoggerConfig.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 +1 -1
- 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 +1 -1
- package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
- package/docs/api/interfaces/PageAccessRecord.md +8 -8
- package/docs/api/interfaces/PagePermissionContextType.md +8 -8
- package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
- package/docs/api/interfaces/PagePermissionProviderProps.md +7 -7
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/ParsedAddress.md +1 -1
- package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
- package/docs/api/interfaces/ProgressProps.md +3 -11
- package/docs/api/interfaces/ProtectedRouteProps.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/QuickFix.md +1 -1
- package/docs/api/interfaces/RBACAccessValidateParams.md +1 -1
- package/docs/api/interfaces/RBACAccessValidateResult.md +1 -1
- package/docs/api/interfaces/RBACAuditLogParams.md +1 -1
- package/docs/api/interfaces/RBACAuditLogResult.md +1 -1
- package/docs/api/interfaces/RBACConfig.md +1 -1
- package/docs/api/interfaces/RBACContext.md +1 -1
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RBACPageAccessCheckParams.md +1 -1
- package/docs/api/interfaces/RBACPerformanceMetrics.md +1 -1
- package/docs/api/interfaces/RBACPermissionCheckParams.md +1 -1
- package/docs/api/interfaces/RBACPermissionCheckResult.md +1 -1
- package/docs/api/interfaces/RBACPermissionsGetParams.md +1 -1
- package/docs/api/interfaces/RBACPermissionsGetResult.md +1 -1
- package/docs/api/interfaces/RBACResult.md +1 -1
- package/docs/api/interfaces/RBACRoleGrantParams.md +1 -1
- package/docs/api/interfaces/RBACRoleGrantResult.md +1 -1
- package/docs/api/interfaces/RBACRoleRevokeParams.md +1 -1
- package/docs/api/interfaces/RBACRoleRevokeResult.md +1 -1
- package/docs/api/interfaces/RBACRoleValidateParams.md +1 -1
- package/docs/api/interfaces/RBACRoleValidateResult.md +1 -1
- package/docs/api/interfaces/RBACRolesListParams.md +1 -1
- package/docs/api/interfaces/RBACRolesListResult.md +1 -1
- package/docs/api/interfaces/RBACSessionTrackParams.md +1 -1
- package/docs/api/interfaces/RBACSessionTrackResult.md +1 -1
- package/docs/api/interfaces/ResourcePermissions.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/RuntimeComplianceResult.md +1 -1
- package/docs/api/interfaces/SecureDataContextType.md +9 -9
- package/docs/api/interfaces/SecureDataProviderProps.md +8 -8
- package/docs/api/interfaces/SessionRestorationLoaderProps.md +1 -1
- package/docs/api/interfaces/SetupIssue.md +1 -1
- package/docs/api/interfaces/StorageConfig.md +4 -4
- package/docs/api/interfaces/StorageFileInfo.md +7 -7
- package/docs/api/interfaces/StorageFileMetadata.md +25 -14
- package/docs/api/interfaces/StorageListOptions.md +22 -9
- package/docs/api/interfaces/StorageListResult.md +4 -4
- package/docs/api/interfaces/StorageUploadOptions.md +21 -8
- package/docs/api/interfaces/StorageUploadResult.md +6 -6
- package/docs/api/interfaces/StorageUrlOptions.md +19 -6
- package/docs/api/interfaces/StyleImport.md +1 -1
- package/docs/api/interfaces/SwitchProps.md +1 -1
- package/docs/api/interfaces/TabsContentProps.md +1 -1
- package/docs/api/interfaces/TabsListProps.md +1 -1
- package/docs/api/interfaces/TabsProps.md +1 -1
- package/docs/api/interfaces/TabsTriggerProps.md +1 -1
- package/docs/api/interfaces/TextareaProps.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/UseFormDialogOptions.md +1 -1
- package/docs/api/interfaces/UseFormDialogReturn.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
- package/docs/api/interfaces/UsePublicFileDisplayOptions.md +1 -1
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
- 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/UseResourcePermissionsOptions.md +1 -1
- 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 +151 -92
- package/docs/api-reference/components.md +15 -7
- package/docs/api-reference/providers.md +2 -2
- package/docs/api-reference/rpc-functions.md +1 -0
- package/docs/best-practices/README.md +1 -1
- package/docs/best-practices/deployment.md +8 -8
- package/docs/getting-started/examples/README.md +2 -2
- package/docs/getting-started/installation-guide.md +4 -4
- package/docs/getting-started/quick-start.md +3 -3
- package/docs/migration/MIGRATION_GUIDE.md +3 -3
- package/docs/rbac/compliance/compliance-guide.md +2 -2
- package/docs/rbac/event-based-apps.md +2 -2
- package/docs/rbac/getting-started.md +2 -2
- package/docs/rbac/quick-start.md +2 -2
- package/docs/security/README.md +4 -4
- package/docs/standards/07-rbac-and-rls-standard.md +430 -7
- package/docs/troubleshooting/README.md +2 -2
- package/docs/troubleshooting/migration.md +3 -3
- package/package.json +1 -3
- package/scripts/check-pace-core-compliance.cjs +1 -1
- package/scripts/check-pace-core-compliance.js +1 -1
- package/src/__tests__/fixtures/supabase.ts +301 -0
- package/src/__tests__/public-recipe-view.test.ts +9 -9
- package/src/__tests__/rls-policies.test.ts +197 -61
- package/src/components/AddressField/AddressField.test.tsx +42 -0
- package/src/components/AddressField/AddressField.tsx +71 -60
- package/src/components/AddressField/README.md +1 -0
- package/src/components/Alert/Alert.test.tsx +50 -10
- package/src/components/Alert/Alert.tsx +5 -3
- package/src/components/Avatar/Avatar.test.tsx +95 -43
- package/src/components/Avatar/Avatar.tsx +16 -16
- package/src/components/Button/Button.test.tsx +2 -1
- package/src/components/Button/Button.tsx +3 -3
- package/src/components/Calendar/Calendar.test.tsx +53 -37
- package/src/components/Calendar/Calendar.tsx +409 -82
- package/src/components/Card/Card.test.tsx +7 -4
- package/src/components/Card/Card.tsx +3 -6
- package/src/components/Checkbox/Checkbox.tsx +2 -2
- package/src/components/DataTable/components/ActionButtons.tsx +5 -5
- package/src/components/DataTable/components/BulkOperationsDropdown.tsx +2 -2
- package/src/components/DataTable/components/ColumnFilter.tsx +1 -1
- package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +3 -3
- package/src/components/DataTable/components/DataTableBody.tsx +12 -12
- package/src/components/DataTable/components/DataTableCore.tsx +3 -3
- package/src/components/DataTable/components/DataTableToolbar.tsx +5 -5
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +3 -3
- package/src/components/DataTable/components/EditableRow.tsx +2 -2
- package/src/components/DataTable/components/EmptyState.tsx +3 -3
- package/src/components/DataTable/components/GroupHeader.tsx +2 -2
- package/src/components/DataTable/components/GroupingDropdown.tsx +1 -1
- package/src/components/DataTable/components/ImportModal.tsx +4 -4
- package/src/components/DataTable/components/LoadingState.tsx +1 -1
- package/src/components/DataTable/components/PaginationControls.tsx +11 -11
- package/src/components/DataTable/components/UnifiedTableBody.tsx +9 -9
- package/src/components/DataTable/components/ViewRowModal.tsx +2 -2
- package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +11 -37
- package/src/components/DataTable/components/__tests__/DataTableToolbar.test.tsx +157 -0
- package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +2 -1
- package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +128 -0
- package/src/components/DataTable/core/__tests__/ActionManager.test.ts +19 -0
- package/src/components/DataTable/core/__tests__/ColumnFactory.test.ts +51 -0
- package/src/components/DataTable/core/__tests__/ColumnManager.test.ts +84 -0
- package/src/components/DataTable/core/__tests__/DataManager.test.ts +14 -0
- package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +136 -0
- package/src/components/DataTable/core/__tests__/LocalDataAdapter.test.ts +16 -0
- package/src/components/DataTable/core/__tests__/PluginRegistry.test.ts +18 -0
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +28 -7
- package/src/components/DataTable/utils/__tests__/hierarchicalUtils.test.ts +30 -1
- package/src/components/DataTable/utils/hierarchicalUtils.ts +38 -10
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +8 -3
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +4 -4
- package/src/components/Dialog/Dialog.tsx +2 -2
- package/src/components/EventSelector/EventSelector.tsx +7 -7
- package/src/components/FileDisplay/FileDisplay.tsx +291 -179
- package/src/components/FileUpload/FileUpload.tsx +7 -4
- package/src/components/Header/Header.test.tsx +28 -0
- package/src/components/Header/Header.tsx +22 -9
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +2 -2
- package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +19 -14
- package/src/components/LoadingSpinner/LoadingSpinner.tsx +5 -5
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +127 -1
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +8 -8
- package/src/components/PaceAppLayout/PaceAppLayout.integration.test.tsx +4 -0
- package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +3 -0
- package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +3 -0
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +16 -6
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +37 -3
- package/src/components/PaceAppLayout/test-setup.tsx +1 -0
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +66 -45
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +6 -4
- package/src/components/Progress/Progress.test.tsx +18 -19
- package/src/components/Progress/Progress.tsx +31 -32
- package/src/components/PublicLayout/PublicLayout.test.tsx +6 -6
- package/src/components/PublicLayout/PublicPageProvider.tsx +5 -3
- package/src/components/Select/Select.tsx +5 -5
- package/src/components/Switch/Switch.test.tsx +2 -1
- package/src/components/Switch/Switch.tsx +1 -1
- package/src/components/Toast/Toast.tsx +1 -1
- package/src/components/Tooltip/Tooltip.test.tsx +8 -2
- package/src/components/UserMenu/UserMenu.tsx +3 -3
- package/src/eslint-rules/pace-core-compliance.cjs +0 -2
- package/src/eslint-rules/pace-core-compliance.js +0 -2
- package/src/hooks/__tests__/hooks.integration.test.tsx +4 -1
- package/src/hooks/__tests__/useAppConfig.unit.test.ts +76 -5
- package/src/hooks/__tests__/useDataTableState.test.ts +76 -0
- package/src/hooks/__tests__/useFileUrl.unit.test.ts +25 -69
- package/src/hooks/__tests__/useFileUrlCache.test.ts +129 -0
- package/src/hooks/__tests__/usePreventTabReload.test.ts +88 -0
- package/src/hooks/__tests__/{usePublicEvent.unit.test.ts → usePublicEvent.test.ts} +28 -1
- package/src/hooks/__tests__/useQueryCache.test.ts +144 -0
- package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +58 -16
- package/src/hooks/index.ts +1 -1
- package/src/hooks/public/usePublicEvent.ts +2 -2
- package/src/hooks/public/usePublicFileDisplay.ts +173 -87
- package/src/hooks/useAppConfig.ts +24 -5
- package/src/hooks/useFileDisplay.ts +297 -34
- package/src/hooks/useFileReference.ts +56 -11
- package/src/hooks/useFileUrl.ts +1 -1
- package/src/hooks/useInactivityTracker.ts +16 -7
- package/src/hooks/usePermissionCache.test.ts +85 -8
- package/src/hooks/useQueryCache.ts +21 -0
- package/src/hooks/useSecureDataAccess.test.ts +80 -35
- package/src/hooks/useSecureDataAccess.ts +80 -37
- package/src/providers/services/EventServiceProvider.tsx +37 -17
- package/src/providers/services/InactivityServiceProvider.tsx +4 -4
- package/src/providers/services/OrganisationServiceProvider.tsx +8 -1
- package/src/providers/services/UnifiedAuthProvider.tsx +115 -29
- package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +451 -0
- package/src/rbac/__tests__/engine.comprehensive.test.ts +12 -0
- package/src/rbac/__tests__/rbac-engine-core-logic.test.ts +8 -0
- package/src/rbac/__tests__/rbac-engine-simplified.test.ts +4 -0
- package/src/rbac/api.ts +240 -36
- package/src/rbac/cache-invalidation.ts +21 -7
- package/src/rbac/compliance/quick-fix-suggestions.ts +1 -1
- package/src/rbac/components/NavigationGuard.tsx +23 -63
- package/src/rbac/components/NavigationProvider.test.tsx +52 -23
- package/src/rbac/components/NavigationProvider.tsx +13 -11
- package/src/rbac/components/PagePermissionGuard.tsx +77 -203
- package/src/rbac/components/PagePermissionProvider.tsx +13 -11
- package/src/rbac/components/PermissionEnforcer.tsx +24 -62
- package/src/rbac/components/RoleBasedRouter.tsx +14 -12
- package/src/rbac/components/SecureDataProvider.tsx +13 -11
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +104 -41
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +49 -12
- package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +22 -1
- package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +161 -82
- package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +22 -1
- package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +77 -30
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +39 -5
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +47 -4
- package/src/rbac/engine.ts +4 -2
- package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +144 -52
- package/src/rbac/hooks/index.ts +3 -0
- package/src/rbac/hooks/useCan.test.ts +101 -53
- package/src/rbac/hooks/usePermissions.ts +108 -41
- package/src/rbac/hooks/useRBAC.test.ts +11 -3
- package/src/rbac/hooks/useRBAC.ts +83 -40
- package/src/rbac/hooks/useResolvedScope.test.ts +189 -63
- package/src/rbac/hooks/useResolvedScope.ts +128 -70
- package/src/rbac/hooks/useSecureSupabase.ts +36 -19
- package/src/rbac/hooks/useSuperAdminBypass.ts +126 -0
- package/src/rbac/request-deduplication.ts +1 -1
- package/src/rbac/secureClient.ts +72 -12
- package/src/rbac/security.ts +29 -23
- package/src/rbac/types.ts +10 -0
- package/src/rbac/utils/__tests__/contextValidator.test.ts +150 -0
- package/src/rbac/utils/__tests__/deep-equal.test.ts +53 -0
- package/src/rbac/utils/__tests__/eventContext.test.ts +6 -1
- package/src/rbac/utils/contextValidator.ts +288 -0
- package/src/rbac/utils/eventContext.ts +48 -2
- package/src/services/EventService.ts +165 -21
- package/src/services/OrganisationService.ts +37 -2
- package/src/services/__tests__/EventService.test.ts +26 -21
- package/src/types/file-reference.ts +13 -10
- package/src/utils/app/appNameResolver.test.ts +346 -73
- package/src/utils/context/superAdminOverride.ts +58 -0
- package/src/utils/file-reference/index.ts +61 -33
- package/src/utils/google-places/googlePlacesUtils.test.ts +98 -0
- package/src/utils/google-places/loadGoogleMapsScript.test.ts +83 -0
- package/src/utils/storage/helpers.test.ts +1 -1
- package/src/utils/storage/helpers.ts +38 -19
- package/src/utils/storage/types.ts +15 -8
- package/src/utils/validation/__tests__/csrf.test.ts +105 -0
- package/src/utils/validation/__tests__/sqlInjectionProtection.test.ts +92 -0
- package/src/vite-env.d.ts +2 -2
- package/dist/chunk-3GOZZZYH.js.map +0 -1
- package/dist/chunk-DDM4CCYT.js.map +0 -1
- package/dist/chunk-E7UAOUMY.js +0 -75
- package/dist/chunk-E7UAOUMY.js.map +0 -1
- package/dist/chunk-F2IMUDXZ.js.map +0 -1
- package/dist/chunk-HEHYGYOX.js.map +0 -1
- package/dist/chunk-IM4QE42D.js.map +0 -1
- package/dist/chunk-MX64ZF6I.js.map +0 -1
- package/dist/chunk-SAUPYVLF.js.map +0 -1
- package/dist/chunk-THRPYOFK.js.map +0 -1
- package/dist/chunk-UCQSRW7Z.js.map +0 -1
- package/dist/chunk-VGZZXKBR.js.map +0 -1
- package/dist/chunk-YGPFYGA6.js.map +0 -1
- package/dist/chunk-YHCN776L.js.map +0 -1
- package/src/hooks/__tests__/usePermissionCache.simple.test.ts +0 -192
- package/src/hooks/__tests__/usePermissionCache.unit.test.ts +0 -741
- package/src/hooks/__tests__/usePublicEvent.simple.test.ts +0 -703
- package/src/rbac/hooks/useRBAC.simple.test.ts +0 -95
- package/src/rbac/utils/__tests__/eventContext.unit.test.ts +0 -428
- /package/dist/{DataTable-GUFUNZ3N.js.map → DataTable-ON3IXISJ.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-643PUAIM.js.map → UnifiedAuthProvider-X5NXANVI.js.map} +0 -0
- /package/dist/{api-YP7XD5L6.js.map → api-I6UCQ5S6.js.map} +0 -0
- /package/dist/{chunk-HESYZWZW.js.map → chunk-QWWZ5CAQ.js.map} +0 -0
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
|
-
useCan
|
|
3
|
-
|
|
4
|
-
} from "./chunk-3GOZZZYH.js";
|
|
2
|
+
useCan
|
|
3
|
+
} from "./chunk-HQVPB5MZ.js";
|
|
5
4
|
import {
|
|
6
5
|
toast,
|
|
7
6
|
useDataTablePerformance
|
|
8
7
|
} from "./chunk-6C4YBBJM.js";
|
|
8
|
+
import {
|
|
9
|
+
useResolvedScope
|
|
10
|
+
} from "./chunk-Y4BUBBHD.js";
|
|
9
11
|
import {
|
|
10
12
|
useUnifiedAuth
|
|
11
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-J2XXC7R5.js";
|
|
12
14
|
import {
|
|
13
15
|
cn,
|
|
14
16
|
renderSafeHtml
|
|
@@ -5556,7 +5558,7 @@ function getButtonClasses(variant = "default", size = "default") {
|
|
|
5556
5558
|
default: "h-9 px-4 py-2",
|
|
5557
5559
|
sm: "h-8 rounded-md px-3 text-xs",
|
|
5558
5560
|
lg: "h-10 rounded-md px-8",
|
|
5559
|
-
icon: "
|
|
5561
|
+
icon: "size-8"
|
|
5560
5562
|
};
|
|
5561
5563
|
return `${baseClasses} ${variantClasses[variant]} ${sizeClasses2[size]}`;
|
|
5562
5564
|
}
|
|
@@ -6100,7 +6102,7 @@ var SelectTrigger = React4.forwardRef(
|
|
|
6100
6102
|
ChevronDown,
|
|
6101
6103
|
{
|
|
6102
6104
|
className: cn(
|
|
6103
|
-
"
|
|
6105
|
+
"size-4 opacity-50 transition-transform pointer-events-none float-right",
|
|
6104
6106
|
open && "rotate-180"
|
|
6105
6107
|
)
|
|
6106
6108
|
},
|
|
@@ -6144,7 +6146,7 @@ var SelectTrigger = React4.forwardRef(
|
|
|
6144
6146
|
ChevronDown,
|
|
6145
6147
|
{
|
|
6146
6148
|
className: cn(
|
|
6147
|
-
"
|
|
6149
|
+
"size-4 opacity-50 transition-transform pointer-events-none float-right",
|
|
6148
6150
|
open && "rotate-180"
|
|
6149
6151
|
)
|
|
6150
6152
|
}
|
|
@@ -6217,7 +6219,7 @@ var SelectContent = React4.forwardRef(
|
|
|
6217
6219
|
role: "listbox",
|
|
6218
6220
|
children: [
|
|
6219
6221
|
searchable && /* @__PURE__ */ jsx4("div", { className: "p-2 border-b border-main-200", children: /* @__PURE__ */ jsxs2("div", { className: "relative", children: [
|
|
6220
|
-
/* @__PURE__ */ jsx4(Search, { className: "absolute left-2 top-1/2 transform -translate-y-1/2
|
|
6222
|
+
/* @__PURE__ */ jsx4(Search, { className: "absolute left-2 top-1/2 transform -translate-y-1/2 size-4 text-main-400" }),
|
|
6221
6223
|
/* @__PURE__ */ jsx4(
|
|
6222
6224
|
"input",
|
|
6223
6225
|
{
|
|
@@ -6245,7 +6247,7 @@ var SelectContent = React4.forwardRef(
|
|
|
6245
6247
|
className: "absolute right-2 top-1/2 transform -translate-y-1/2 text-main-400 hover:text-main-600",
|
|
6246
6248
|
"data-testid": "select-clear-search",
|
|
6247
6249
|
"aria-label": "Clear search",
|
|
6248
|
-
children: /* @__PURE__ */ jsx4(X, { className: "
|
|
6250
|
+
children: /* @__PURE__ */ jsx4(X, { className: "size-4" })
|
|
6249
6251
|
}
|
|
6250
6252
|
)
|
|
6251
6253
|
] }) }),
|
|
@@ -6338,7 +6340,7 @@ var SelectItem = React4.forwardRef(
|
|
|
6338
6340
|
tabIndex: disabled ? -1 : 0,
|
|
6339
6341
|
children: [
|
|
6340
6342
|
children,
|
|
6341
|
-
isSelected && /* @__PURE__ */ jsx4(Check, { className: "absolute right-2
|
|
6343
|
+
isSelected && /* @__PURE__ */ jsx4(Check, { className: "absolute right-2 size-4 flex-shrink-0 mt-0.5" })
|
|
6342
6344
|
]
|
|
6343
6345
|
}
|
|
6344
6346
|
);
|
|
@@ -6413,7 +6415,7 @@ function GroupingDropdown({
|
|
|
6413
6415
|
variant: "outline",
|
|
6414
6416
|
className: className || "",
|
|
6415
6417
|
children: [
|
|
6416
|
-
/* @__PURE__ */ jsx5(Group, { className: "
|
|
6418
|
+
/* @__PURE__ */ jsx5(Group, { className: "size-4 mr-2 flex-shrink-0" }),
|
|
6417
6419
|
/* @__PURE__ */ jsx5("span", { className: "truncate", children: "Grouping" })
|
|
6418
6420
|
]
|
|
6419
6421
|
}
|
|
@@ -6457,7 +6459,7 @@ var Checkbox = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__
|
|
|
6457
6459
|
{
|
|
6458
6460
|
ref,
|
|
6459
6461
|
className: cn(
|
|
6460
|
-
"peer
|
|
6462
|
+
"peer size-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",
|
|
6461
6463
|
className
|
|
6462
6464
|
),
|
|
6463
6465
|
...props,
|
|
@@ -6465,7 +6467,7 @@ var Checkbox = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__
|
|
|
6465
6467
|
CheckboxPrimitive.Indicator,
|
|
6466
6468
|
{
|
|
6467
6469
|
className: cn("flex items-center justify-center text-current"),
|
|
6468
|
-
children: /* @__PURE__ */ jsx6(Check2, { className: "
|
|
6470
|
+
children: /* @__PURE__ */ jsx6(Check2, { className: "size-4" })
|
|
6469
6471
|
}
|
|
6470
6472
|
)
|
|
6471
6473
|
}
|
|
@@ -6488,7 +6490,7 @@ function ColumnVisibilityDropdown({
|
|
|
6488
6490
|
{
|
|
6489
6491
|
variant: "outline",
|
|
6490
6492
|
children: [
|
|
6491
|
-
/* @__PURE__ */ jsx7(Settings2, { className: "
|
|
6493
|
+
/* @__PURE__ */ jsx7(Settings2, { className: "size-4 mr-2 flex-shrink-0" }),
|
|
6492
6494
|
/* @__PURE__ */ jsx7("span", { className: "truncate", children: "Columns" })
|
|
6493
6495
|
]
|
|
6494
6496
|
}
|
|
@@ -6509,7 +6511,7 @@ function ColumnVisibilityDropdown({
|
|
|
6509
6511
|
});
|
|
6510
6512
|
},
|
|
6511
6513
|
children: [
|
|
6512
|
-
/* @__PURE__ */ jsx7(Eye, { className: "
|
|
6514
|
+
/* @__PURE__ */ jsx7(Eye, { className: "size-3 mr-1" }),
|
|
6513
6515
|
"Show All"
|
|
6514
6516
|
]
|
|
6515
6517
|
}
|
|
@@ -6528,7 +6530,7 @@ function ColumnVisibilityDropdown({
|
|
|
6528
6530
|
});
|
|
6529
6531
|
},
|
|
6530
6532
|
children: [
|
|
6531
|
-
/* @__PURE__ */ jsx7(EyeOff, { className: "
|
|
6533
|
+
/* @__PURE__ */ jsx7(EyeOff, { className: "size-3 mr-1" }),
|
|
6532
6534
|
"Hide All"
|
|
6533
6535
|
]
|
|
6534
6536
|
}
|
|
@@ -6622,7 +6624,7 @@ function DataTableToolbar({
|
|
|
6622
6624
|
variant: "outline",
|
|
6623
6625
|
onClick: onToggleFilterRow,
|
|
6624
6626
|
children: [
|
|
6625
|
-
/* @__PURE__ */ jsx8(Filter, { className: "
|
|
6627
|
+
/* @__PURE__ */ jsx8(Filter, { className: "size-4 mr-2 flex-shrink-0" }),
|
|
6626
6628
|
/* @__PURE__ */ jsx8("span", { className: "truncate", children: showFilterRow ? "Hide Filters" : "Show Filters" })
|
|
6627
6629
|
]
|
|
6628
6630
|
}
|
|
@@ -6633,7 +6635,7 @@ function DataTableToolbar({
|
|
|
6633
6635
|
variant: "outline",
|
|
6634
6636
|
onClick: onCreateRow,
|
|
6635
6637
|
children: [
|
|
6636
|
-
/* @__PURE__ */ jsx8(Plus, { className: "
|
|
6638
|
+
/* @__PURE__ */ jsx8(Plus, { className: "size-4 mr-2 flex-shrink-0" }),
|
|
6637
6639
|
/* @__PURE__ */ jsx8("span", { className: "truncate", children: "Add Row" })
|
|
6638
6640
|
]
|
|
6639
6641
|
}
|
|
@@ -6645,7 +6647,7 @@ function DataTableToolbar({
|
|
|
6645
6647
|
onClick: onImportClick,
|
|
6646
6648
|
"data-restore-target": "datatable-import-button",
|
|
6647
6649
|
children: [
|
|
6648
|
-
/* @__PURE__ */ jsx8(Upload, { className: "
|
|
6650
|
+
/* @__PURE__ */ jsx8(Upload, { className: "size-4 mr-2 flex-shrink-0" }),
|
|
6649
6651
|
/* @__PURE__ */ jsx8("span", { className: "truncate", children: "Import" })
|
|
6650
6652
|
]
|
|
6651
6653
|
}
|
|
@@ -6656,7 +6658,7 @@ function DataTableToolbar({
|
|
|
6656
6658
|
variant: "outline",
|
|
6657
6659
|
onClick: onExport,
|
|
6658
6660
|
children: [
|
|
6659
|
-
/* @__PURE__ */ jsx8(Download, { className: "
|
|
6661
|
+
/* @__PURE__ */ jsx8(Download, { className: "size-4 mr-2 flex-shrink-0" }),
|
|
6660
6662
|
/* @__PURE__ */ jsx8("span", { className: "truncate", children: "Export" })
|
|
6661
6663
|
]
|
|
6662
6664
|
}
|
|
@@ -6668,7 +6670,7 @@ function DataTableToolbar({
|
|
|
6668
6670
|
onClick: () => onDeleteSelected?.(rowSelection),
|
|
6669
6671
|
disabled: Object.values(rowSelection).filter(Boolean).length === 0,
|
|
6670
6672
|
children: [
|
|
6671
|
-
/* @__PURE__ */ jsx8(Trash2, { className: "
|
|
6673
|
+
/* @__PURE__ */ jsx8(Trash2, { className: "size-4 mr-2 flex-shrink-0" }),
|
|
6672
6674
|
/* @__PURE__ */ jsx8("span", { className: "truncate", children: "Delete" })
|
|
6673
6675
|
]
|
|
6674
6676
|
}
|
|
@@ -6707,7 +6709,7 @@ function EmptyState({
|
|
|
6707
6709
|
{
|
|
6708
6710
|
role: "img",
|
|
6709
6711
|
"aria-hidden": "true",
|
|
6710
|
-
className: "
|
|
6712
|
+
className: "size-12 text-muted-foreground mb-4",
|
|
6711
6713
|
"data-testid": Icon === Database ? "lucide-database" : Icon === User ? "lucide-user" : "custom-icon"
|
|
6712
6714
|
}
|
|
6713
6715
|
),
|
|
@@ -6715,11 +6717,11 @@ function EmptyState({
|
|
|
6715
6717
|
/* @__PURE__ */ jsx9("p", { className: "text-sm text-muted-foreground mb-4 max-w-sm", children: description || defaultDescription }),
|
|
6716
6718
|
isFiltered && onClearFilters || action ? /* @__PURE__ */ jsxs6("div", { className: "flex gap-2", children: [
|
|
6717
6719
|
isFiltered && onClearFilters && /* @__PURE__ */ jsxs6(Button, { variant: "outline", onClick: onClearFilters, children: [
|
|
6718
|
-
/* @__PURE__ */ jsx9(Search3, { className: "
|
|
6720
|
+
/* @__PURE__ */ jsx9(Search3, { className: "size-4 mr-2" }),
|
|
6719
6721
|
"Clear filters"
|
|
6720
6722
|
] }),
|
|
6721
6723
|
action && /* @__PURE__ */ jsxs6(Button, { onClick: action.onClick, children: [
|
|
6722
|
-
/* @__PURE__ */ jsx9(Plus2, { className: "
|
|
6724
|
+
/* @__PURE__ */ jsx9(Plus2, { className: "size-4 mr-2" }),
|
|
6723
6725
|
action.label
|
|
6724
6726
|
] })
|
|
6725
6727
|
] }) : null
|
|
@@ -6837,7 +6839,7 @@ function ColumnFilter({
|
|
|
6837
6839
|
{
|
|
6838
6840
|
variant: "ghost",
|
|
6839
6841
|
onClick: clearFilter,
|
|
6840
|
-
children: /* @__PURE__ */ jsx10(X2, { className: "
|
|
6842
|
+
children: /* @__PURE__ */ jsx10(X2, { className: "size-3" })
|
|
6841
6843
|
}
|
|
6842
6844
|
),
|
|
6843
6845
|
hasFilter && /* @__PURE__ */ jsx10("div", { className: "absolute -top-1 -right-1 h-2 w-2 bg-main-500 rounded-full" })
|
|
@@ -6997,17 +6999,17 @@ function ActionButtonsComponent({
|
|
|
6997
6999
|
"aria-disabled": isDisabled,
|
|
6998
7000
|
"data-testid": action.testId,
|
|
6999
7001
|
"aria-label": label,
|
|
7000
|
-
className: "
|
|
7001
|
-
children: Icon && /* @__PURE__ */ jsx12(Icon, { className: "
|
|
7002
|
+
className: "size-8 p-0",
|
|
7003
|
+
children: Icon && /* @__PURE__ */ jsx12(Icon, { className: "size-4" })
|
|
7002
7004
|
},
|
|
7003
7005
|
actionIndex
|
|
7004
7006
|
);
|
|
7005
7007
|
}) });
|
|
7006
7008
|
}
|
|
7007
7009
|
return /* @__PURE__ */ jsxs8(Select, { children: [
|
|
7008
|
-
/* @__PURE__ */ jsx12(SelectTrigger, { asChild: true, children: /* @__PURE__ */ jsxs8(Button, { variant: "ghost", className: "
|
|
7010
|
+
/* @__PURE__ */ jsx12(SelectTrigger, { asChild: true, children: /* @__PURE__ */ jsxs8(Button, { variant: "ghost", className: "size-8 p-0", children: [
|
|
7009
7011
|
/* @__PURE__ */ jsx12("span", { className: "sr-only", children: "Open menu" }),
|
|
7010
|
-
/* @__PURE__ */ jsx12(MoreHorizontal, { className: "
|
|
7012
|
+
/* @__PURE__ */ jsx12(MoreHorizontal, { className: "size-4" })
|
|
7011
7013
|
] }) }),
|
|
7012
7014
|
/* @__PURE__ */ jsx12(SelectContent, { className: "!bg-main-50 border border-sec-200 shadow-lg z-[9999]", style: { backgroundColor: "white" }, children: visibleActions.map((action, actionIndex) => {
|
|
7013
7015
|
const { Icon, label } = renderAction(action, actionIndex);
|
|
@@ -7025,7 +7027,7 @@ function ActionButtonsComponent({
|
|
|
7025
7027
|
className: "flex items-center gap-2",
|
|
7026
7028
|
"aria-disabled": isDisabled,
|
|
7027
7029
|
children: [
|
|
7028
|
-
Icon && /* @__PURE__ */ jsx12(Icon, { className: "
|
|
7030
|
+
Icon && /* @__PURE__ */ jsx12(Icon, { className: "size-4" }),
|
|
7029
7031
|
/* @__PURE__ */ jsx12("span", { children: label })
|
|
7030
7032
|
]
|
|
7031
7033
|
},
|
|
@@ -7049,7 +7051,7 @@ function SelectEditField({
|
|
|
7049
7051
|
onChange,
|
|
7050
7052
|
className
|
|
7051
7053
|
}) {
|
|
7052
|
-
const
|
|
7054
|
+
const logger2 = React9.useMemo(() => createLogger("SelectEditField"), []);
|
|
7053
7055
|
const isSearchable = columnDef.selectSearchable !== false;
|
|
7054
7056
|
const isCreatable = columnDef.creatable === true;
|
|
7055
7057
|
const selectRef = React9.useRef(null);
|
|
@@ -7142,9 +7144,9 @@ function SelectEditField({
|
|
|
7142
7144
|
setSearchTerm("");
|
|
7143
7145
|
setShowCreateOption(false);
|
|
7144
7146
|
} catch (error) {
|
|
7145
|
-
|
|
7147
|
+
logger2.error("Error creating new item:", error);
|
|
7146
7148
|
}
|
|
7147
|
-
}, [isCreatable, columnDef.onCreateNew, searchTerm, onChange,
|
|
7149
|
+
}, [isCreatable, columnDef.onCreateNew, searchTerm, onChange, logger2]);
|
|
7148
7150
|
return /* @__PURE__ */ jsxs9(
|
|
7149
7151
|
Select,
|
|
7150
7152
|
{
|
|
@@ -7299,8 +7301,8 @@ function EditableRow({
|
|
|
7299
7301
|
return /* @__PURE__ */ jsx13("td", { role: "cell", children: /* @__PURE__ */ jsx13("div", { className: cell.column.columnDef.meta?.align === "right" ? "text-right" : "", children: isSystemColumn ? (
|
|
7300
7302
|
// System columns: render their normal cell content (checkbox for select, buttons for actions)
|
|
7301
7303
|
cell.column.id === "actions" ? /* @__PURE__ */ jsxs9("div", { className: "flex gap-1", children: [
|
|
7302
|
-
/* @__PURE__ */ jsx13(Button, { onClick: onSave, size: "sm", variant: "default", "aria-label": "Save changes", children: /* @__PURE__ */ jsx13(Check3, { className: "
|
|
7303
|
-
/* @__PURE__ */ jsx13(Button, { onClick: onCancel, size: "sm", variant: "outline", "aria-label": "Cancel editing", children: /* @__PURE__ */ jsx13(X3, { className: "
|
|
7304
|
+
/* @__PURE__ */ jsx13(Button, { onClick: onSave, size: "sm", variant: "default", "aria-label": "Save changes", children: /* @__PURE__ */ jsx13(Check3, { className: "size-4" }) }),
|
|
7305
|
+
/* @__PURE__ */ jsx13(Button, { onClick: onCancel, size: "sm", variant: "outline", "aria-label": "Cancel editing", children: /* @__PURE__ */ jsx13(X3, { className: "size-4" }) })
|
|
7304
7306
|
] }) : (
|
|
7305
7307
|
// Select column: render the checkbox normally
|
|
7306
7308
|
flexRender(cell.column.columnDef.cell, cell.getContext())
|
|
@@ -7396,11 +7398,17 @@ function groupHierarchicalData(data) {
|
|
|
7396
7398
|
return groups;
|
|
7397
7399
|
}
|
|
7398
7400
|
var depthCache = /* @__PURE__ */ new WeakMap();
|
|
7399
|
-
|
|
7400
|
-
|
|
7401
|
+
var logger = createLogger("HierarchicalUtils");
|
|
7402
|
+
function getRowDepth(row, allData, maxDepth = 100) {
|
|
7403
|
+
let cachedDepthsByLimit = depthCache.get(allData);
|
|
7404
|
+
if (!cachedDepthsByLimit) {
|
|
7405
|
+
cachedDepthsByLimit = /* @__PURE__ */ new Map();
|
|
7406
|
+
depthCache.set(allData, cachedDepthsByLimit);
|
|
7407
|
+
}
|
|
7408
|
+
let cachedDepths = cachedDepthsByLimit.get(maxDepth);
|
|
7401
7409
|
if (!cachedDepths) {
|
|
7402
7410
|
cachedDepths = /* @__PURE__ */ new Map();
|
|
7403
|
-
|
|
7411
|
+
cachedDepthsByLimit.set(maxDepth, cachedDepths);
|
|
7404
7412
|
}
|
|
7405
7413
|
if (cachedDepths.has(row.id)) {
|
|
7406
7414
|
return cachedDepths.get(row.id);
|
|
@@ -7417,8 +7425,17 @@ function getRowDepth(row, allData) {
|
|
|
7417
7425
|
parentMap.set(item.id, item);
|
|
7418
7426
|
}
|
|
7419
7427
|
});
|
|
7428
|
+
const visited = /* @__PURE__ */ new Set();
|
|
7420
7429
|
let current = row;
|
|
7421
|
-
while (current.parentId) {
|
|
7430
|
+
while (current.parentId && depth < maxDepth) {
|
|
7431
|
+
if (visited.has(current.id)) {
|
|
7432
|
+
logger.warn("Circular reference detected while calculating row depth", {
|
|
7433
|
+
rowId: row.id,
|
|
7434
|
+
currentId: current.id
|
|
7435
|
+
});
|
|
7436
|
+
break;
|
|
7437
|
+
}
|
|
7438
|
+
visited.add(current.id);
|
|
7422
7439
|
depth++;
|
|
7423
7440
|
const parent = parentMap.get(current.parentId);
|
|
7424
7441
|
if (!parent || parent.isParent) {
|
|
@@ -7430,6 +7447,12 @@ function getRowDepth(row, allData) {
|
|
|
7430
7447
|
break;
|
|
7431
7448
|
}
|
|
7432
7449
|
}
|
|
7450
|
+
if (depth >= maxDepth && current.parentId) {
|
|
7451
|
+
logger.warn("Maximum hierarchy depth reached while calculating row depth", {
|
|
7452
|
+
rowId: row.id,
|
|
7453
|
+
maxDepth
|
|
7454
|
+
});
|
|
7455
|
+
}
|
|
7433
7456
|
}
|
|
7434
7457
|
cachedDepths.set(row.id, depth);
|
|
7435
7458
|
return depth;
|
|
@@ -7558,7 +7581,7 @@ function SelectEditField2({
|
|
|
7558
7581
|
placeholder,
|
|
7559
7582
|
onChange
|
|
7560
7583
|
}) {
|
|
7561
|
-
const
|
|
7584
|
+
const logger2 = React10.useMemo(() => createLogger("SelectEditField"), []);
|
|
7562
7585
|
const isSearchable = columnDef.selectSearchable !== false;
|
|
7563
7586
|
const isCreatable = columnDef.creatable === true;
|
|
7564
7587
|
const selectRef = React10.useRef(null);
|
|
@@ -7658,9 +7681,9 @@ function SelectEditField2({
|
|
|
7658
7681
|
setSearchTerm("");
|
|
7659
7682
|
setShowCreateOption(false);
|
|
7660
7683
|
} catch (error) {
|
|
7661
|
-
|
|
7684
|
+
logger2.error("Error creating new item:", error);
|
|
7662
7685
|
}
|
|
7663
|
-
}, [isCreatable, columnDef.onCreateNew, searchTerm, onChange,
|
|
7686
|
+
}, [isCreatable, columnDef.onCreateNew, searchTerm, onChange, logger2]);
|
|
7664
7687
|
return /* @__PURE__ */ jsxs10(
|
|
7665
7688
|
Select,
|
|
7666
7689
|
{
|
|
@@ -7799,7 +7822,7 @@ var RowComponent = React10.memo(({
|
|
|
7799
7822
|
}) => {
|
|
7800
7823
|
const rowRef = useRef2(null);
|
|
7801
7824
|
const firstInputRef = useRef2(null);
|
|
7802
|
-
const
|
|
7825
|
+
const logger2 = React10.useMemo(() => createLogger("RowComponent"), []);
|
|
7803
7826
|
const rowId = getRowIdSafe(row.original, row.index, getRowId);
|
|
7804
7827
|
const hierarchicalRow = row.original;
|
|
7805
7828
|
const isHierarchical = hierarchical?.enabled && hierarchicalRow?.isParent !== void 0;
|
|
@@ -7858,7 +7881,7 @@ var RowComponent = React10.memo(({
|
|
|
7858
7881
|
size: "sm",
|
|
7859
7882
|
onClick: () => row.toggleExpanded(),
|
|
7860
7883
|
className: "p-0 h-auto mr-2",
|
|
7861
|
-
children: isExpanded ? /* @__PURE__ */ jsx14(ChevronDown2, { className: "
|
|
7884
|
+
children: isExpanded ? /* @__PURE__ */ jsx14(ChevronDown2, { className: "size-4" }) : /* @__PURE__ */ jsx14(ChevronRight, { className: "size-4" })
|
|
7862
7885
|
}
|
|
7863
7886
|
),
|
|
7864
7887
|
/* @__PURE__ */ jsxs10("span", { className: "text-sm", children: [
|
|
@@ -7907,7 +7930,7 @@ var RowComponent = React10.memo(({
|
|
|
7907
7930
|
cell.id
|
|
7908
7931
|
);
|
|
7909
7932
|
} catch (error) {
|
|
7910
|
-
|
|
7933
|
+
logger2.warn("Error in aggregation function:", error);
|
|
7911
7934
|
return /* @__PURE__ */ jsx14(
|
|
7912
7935
|
"td",
|
|
7913
7936
|
{
|
|
@@ -7983,10 +8006,10 @@ var RowComponent = React10.memo(({
|
|
|
7983
8006
|
variant: "ghost",
|
|
7984
8007
|
size: "sm",
|
|
7985
8008
|
onClick: () => hierarchical?.state?.toggleRow(rowId),
|
|
7986
|
-
className: "
|
|
8009
|
+
className: "size-6 p-0 flex-shrink-0",
|
|
7987
8010
|
"aria-label": isExpanded ? "Collapse row" : "Expand row",
|
|
7988
8011
|
title: isExpanded ? "Collapse row" : "Expand row",
|
|
7989
|
-
children: isExpanded ? /* @__PURE__ */ jsx14(ChevronDown2, { className: "
|
|
8012
|
+
children: isExpanded ? /* @__PURE__ */ jsx14(ChevronDown2, { className: "size-4" }) : /* @__PURE__ */ jsx14(ChevronRight, { className: "size-4" })
|
|
7990
8013
|
}
|
|
7991
8014
|
),
|
|
7992
8015
|
cell.column.id === "actions" ? /* @__PURE__ */ jsx14(
|
|
@@ -8049,7 +8072,7 @@ function UnifiedTableBody({
|
|
|
8049
8072
|
rbac,
|
|
8050
8073
|
permissions
|
|
8051
8074
|
}) {
|
|
8052
|
-
const
|
|
8075
|
+
const logger2 = React10.useMemo(() => createLogger("UnifiedTableBody"), []);
|
|
8053
8076
|
const headerRef = useRef2(null);
|
|
8054
8077
|
const bodyRef = useRef2(null);
|
|
8055
8078
|
const parentRef = useRef2(null);
|
|
@@ -8068,12 +8091,12 @@ function UnifiedTableBody({
|
|
|
8068
8091
|
const totalSize = effectiveShouldVirtualize ? virtualizer.getTotalSize() : 0;
|
|
8069
8092
|
useEffect2(() => {
|
|
8070
8093
|
if (shouldVirtualize && !hasScrollContainer) {
|
|
8071
|
-
|
|
8094
|
+
logger2.warn("Virtualization enabled but no scroll container found. Falling back to standard rendering.", {
|
|
8072
8095
|
rowsLength: rows.length,
|
|
8073
8096
|
dataLength
|
|
8074
8097
|
});
|
|
8075
8098
|
}
|
|
8076
|
-
}, [shouldVirtualize, hasScrollContainer, rows.length, dataLength,
|
|
8099
|
+
}, [shouldVirtualize, hasScrollContainer, rows.length, dataLength, logger2]);
|
|
8077
8100
|
const renderTableContent = () => {
|
|
8078
8101
|
if (rows.length === 0) {
|
|
8079
8102
|
return /* @__PURE__ */ jsx14("tr", { children: /* @__PURE__ */ jsx14(
|
|
@@ -8221,18 +8244,18 @@ function UnifiedTableBody({
|
|
|
8221
8244
|
"button",
|
|
8222
8245
|
{
|
|
8223
8246
|
onClick: onSaveCreation,
|
|
8224
|
-
className: "
|
|
8247
|
+
className: "size-8 p-0 hover:bg-muted/50 flex items-center justify-center",
|
|
8225
8248
|
title: "Save new row",
|
|
8226
|
-
children: /* @__PURE__ */ jsx14("svg", { className: "
|
|
8249
|
+
children: /* @__PURE__ */ jsx14("svg", { className: "size-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ jsx14("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) })
|
|
8227
8250
|
}
|
|
8228
8251
|
),
|
|
8229
8252
|
/* @__PURE__ */ jsx14(
|
|
8230
8253
|
"button",
|
|
8231
8254
|
{
|
|
8232
8255
|
onClick: onCancelCreation,
|
|
8233
|
-
className: "
|
|
8256
|
+
className: "size-8 p-0 hover:bg-muted/50 flex items-center justify-center",
|
|
8234
8257
|
title: "Cancel new row",
|
|
8235
|
-
children: /* @__PURE__ */ jsx14("svg", { className: "
|
|
8258
|
+
children: /* @__PURE__ */ jsx14("svg", { className: "size-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ jsx14("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) })
|
|
8236
8259
|
}
|
|
8237
8260
|
)
|
|
8238
8261
|
]
|
|
@@ -8362,29 +8385,29 @@ function calculatePaginationState(config) {
|
|
|
8362
8385
|
}
|
|
8363
8386
|
function validatePaginationConfig(config) {
|
|
8364
8387
|
const { mode, table, serverData, onPageChange, onPageSizeChange } = config;
|
|
8365
|
-
const
|
|
8388
|
+
const logger2 = createLogger("PaginationUtils");
|
|
8366
8389
|
let isValid = true;
|
|
8367
8390
|
if (mode === "server") {
|
|
8368
8391
|
if (!serverData) {
|
|
8369
|
-
|
|
8392
|
+
logger2.warn("Server mode requires serverData");
|
|
8370
8393
|
isValid = false;
|
|
8371
8394
|
}
|
|
8372
8395
|
if (!onPageChange) {
|
|
8373
|
-
|
|
8396
|
+
logger2.warn("Server mode requires onPageChange callback");
|
|
8374
8397
|
isValid = false;
|
|
8375
8398
|
}
|
|
8376
8399
|
if (!onPageSizeChange) {
|
|
8377
|
-
|
|
8400
|
+
logger2.warn("Server mode requires onPageSizeChange callback");
|
|
8378
8401
|
isValid = false;
|
|
8379
8402
|
}
|
|
8380
8403
|
}
|
|
8381
8404
|
if ((mode === "client" || mode === "hybrid") && !table) {
|
|
8382
|
-
|
|
8405
|
+
logger2.warn(`${mode} mode requires table instance`);
|
|
8383
8406
|
isValid = false;
|
|
8384
8407
|
}
|
|
8385
8408
|
if (mode === "hybrid") {
|
|
8386
8409
|
if (!onPageChange) {
|
|
8387
|
-
|
|
8410
|
+
logger2.warn("Hybrid mode requires onPageChange callback for server pagination");
|
|
8388
8411
|
isValid = false;
|
|
8389
8412
|
}
|
|
8390
8413
|
}
|
|
@@ -8457,11 +8480,11 @@ function PaginationControls({
|
|
|
8457
8480
|
const getModeIcon = () => {
|
|
8458
8481
|
switch (paginationMode) {
|
|
8459
8482
|
case "server":
|
|
8460
|
-
return /* @__PURE__ */ jsx15(Server, { className: "
|
|
8483
|
+
return /* @__PURE__ */ jsx15(Server, { className: "size-3" });
|
|
8461
8484
|
case "hybrid":
|
|
8462
|
-
return /* @__PURE__ */ jsx15(Database2, { className: "
|
|
8485
|
+
return /* @__PURE__ */ jsx15(Database2, { className: "size-3" });
|
|
8463
8486
|
default:
|
|
8464
|
-
return /* @__PURE__ */ jsx15(Zap, { className: "
|
|
8487
|
+
return /* @__PURE__ */ jsx15(Zap, { className: "size-3" });
|
|
8465
8488
|
}
|
|
8466
8489
|
};
|
|
8467
8490
|
const getModeLabel = () => {
|
|
@@ -8520,12 +8543,12 @@ function PaginationControls({
|
|
|
8520
8543
|
{
|
|
8521
8544
|
variant: "outline",
|
|
8522
8545
|
size: "sm",
|
|
8523
|
-
className: "
|
|
8546
|
+
className: "size-8 p-0",
|
|
8524
8547
|
onClick: goToFirstPage,
|
|
8525
8548
|
disabled: !canPreviousPage || isLoading,
|
|
8526
8549
|
"aria-label": "Go to first page",
|
|
8527
8550
|
tabIndex: 0,
|
|
8528
|
-
children: /* @__PURE__ */ jsx15(ChevronsLeft, { className: "
|
|
8551
|
+
children: /* @__PURE__ */ jsx15(ChevronsLeft, { className: "size-4" })
|
|
8529
8552
|
}
|
|
8530
8553
|
),
|
|
8531
8554
|
/* @__PURE__ */ jsx15(
|
|
@@ -8533,12 +8556,12 @@ function PaginationControls({
|
|
|
8533
8556
|
{
|
|
8534
8557
|
variant: "outline",
|
|
8535
8558
|
size: "sm",
|
|
8536
|
-
className: "
|
|
8559
|
+
className: "size-8 p-0",
|
|
8537
8560
|
onClick: goToPreviousPage,
|
|
8538
8561
|
disabled: !canPreviousPage || isLoading,
|
|
8539
8562
|
"aria-label": "Go to previous page",
|
|
8540
8563
|
tabIndex: 0,
|
|
8541
|
-
children: /* @__PURE__ */ jsx15(ChevronLeft, { className: "
|
|
8564
|
+
children: /* @__PURE__ */ jsx15(ChevronLeft, { className: "size-4" })
|
|
8542
8565
|
}
|
|
8543
8566
|
),
|
|
8544
8567
|
/* @__PURE__ */ jsx15(
|
|
@@ -8546,12 +8569,12 @@ function PaginationControls({
|
|
|
8546
8569
|
{
|
|
8547
8570
|
variant: "outline",
|
|
8548
8571
|
size: "sm",
|
|
8549
|
-
className: "
|
|
8572
|
+
className: "size-8 p-0",
|
|
8550
8573
|
onClick: goToNextPage,
|
|
8551
8574
|
disabled: !canNextPage || isLoading,
|
|
8552
8575
|
"aria-label": "Go to next page",
|
|
8553
8576
|
tabIndex: 0,
|
|
8554
|
-
children: /* @__PURE__ */ jsx15(ChevronRight2, { className: "
|
|
8577
|
+
children: /* @__PURE__ */ jsx15(ChevronRight2, { className: "size-4" })
|
|
8555
8578
|
}
|
|
8556
8579
|
),
|
|
8557
8580
|
/* @__PURE__ */ jsx15(
|
|
@@ -8559,12 +8582,12 @@ function PaginationControls({
|
|
|
8559
8582
|
{
|
|
8560
8583
|
variant: "outline",
|
|
8561
8584
|
size: "sm",
|
|
8562
|
-
className: "
|
|
8585
|
+
className: "size-8 p-0",
|
|
8563
8586
|
onClick: goToLastPage,
|
|
8564
8587
|
disabled: !canNextPage || isLoading,
|
|
8565
8588
|
"aria-label": "Go to last page",
|
|
8566
8589
|
tabIndex: 0,
|
|
8567
|
-
children: /* @__PURE__ */ jsx15(ChevronsRight, { className: "
|
|
8590
|
+
children: /* @__PURE__ */ jsx15(ChevronsRight, { className: "size-4" })
|
|
8568
8591
|
}
|
|
8569
8592
|
)
|
|
8570
8593
|
]
|
|
@@ -8620,7 +8643,7 @@ function EnhancedPaginationControls({
|
|
|
8620
8643
|
import { jsx as jsx16, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
8621
8644
|
function LoadingState() {
|
|
8622
8645
|
return /* @__PURE__ */ jsx16("div", { className: "p-8 text-center", children: /* @__PURE__ */ jsxs12("div", { className: "flex items-center justify-center space-x-2", children: [
|
|
8623
|
-
/* @__PURE__ */ jsx16("div", { className: "animate-spin rounded-full
|
|
8646
|
+
/* @__PURE__ */ jsx16("div", { className: "animate-spin rounded-full size-6 border-b-2 border-primary" }),
|
|
8624
8647
|
/* @__PURE__ */ jsx16("span", { "aria-live": "polite", className: "text-muted-foreground", children: "Loading..." })
|
|
8625
8648
|
] }) });
|
|
8626
8649
|
}
|
|
@@ -8643,7 +8666,7 @@ var sizeClasses = {
|
|
|
8643
8666
|
md: "max-w-md",
|
|
8644
8667
|
lg: "max-w-lg",
|
|
8645
8668
|
xl: "max-w-xl",
|
|
8646
|
-
full: "max-w-full
|
|
8669
|
+
full: "max-w-full size-full",
|
|
8647
8670
|
auto: "max-w-none w-auto min-w-0"
|
|
8648
8671
|
};
|
|
8649
8672
|
var Dialog = DialogPrimitive.Root;
|
|
@@ -8806,7 +8829,7 @@ var DialogContent = React12.forwardRef(({
|
|
|
8806
8829
|
children: [
|
|
8807
8830
|
children,
|
|
8808
8831
|
showCloseButton && /* @__PURE__ */ jsxs13(DialogPrimitive.Close, { className: "absolute right-4 top-4 z-10 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground", children: [
|
|
8809
|
-
/* @__PURE__ */ jsx17(X4, { className: "
|
|
8832
|
+
/* @__PURE__ */ jsx17(X4, { className: "size-4" }),
|
|
8810
8833
|
/* @__PURE__ */ jsx17("span", { className: "sr-only", children: "Close" })
|
|
8811
8834
|
] })
|
|
8812
8835
|
]
|
|
@@ -8950,38 +8973,31 @@ DialogDescription.displayName = DialogPrimitive.Description.displayName;
|
|
|
8950
8973
|
|
|
8951
8974
|
// src/components/Progress/Progress.tsx
|
|
8952
8975
|
import * as React13 from "react";
|
|
8953
|
-
import * as ProgressPrimitive from "@radix-ui/react-progress";
|
|
8954
8976
|
import { jsx as jsx18 } from "react/jsx-runtime";
|
|
8955
|
-
var Progress = React13.forwardRef(({ className, value, max: max2 = 100, ...props }, ref) =>
|
|
8956
|
-
|
|
8957
|
-
|
|
8958
|
-
|
|
8959
|
-
|
|
8960
|
-
|
|
8961
|
-
className
|
|
8962
|
-
|
|
8963
|
-
|
|
8964
|
-
|
|
8965
|
-
|
|
8966
|
-
|
|
8967
|
-
|
|
8968
|
-
|
|
8969
|
-
|
|
8970
|
-
|
|
8971
|
-
|
|
8972
|
-
|
|
8973
|
-
style: { transform: `translateX(-${100 - (value || 0) / max2 * 100}%)` }
|
|
8974
|
-
}
|
|
8975
|
-
)
|
|
8976
|
-
}
|
|
8977
|
-
));
|
|
8978
|
-
Progress.displayName = ProgressPrimitive.Root.displayName;
|
|
8977
|
+
var Progress = React13.forwardRef(({ className, value, max: max2 = 100, ...props }, ref) => {
|
|
8978
|
+
const isIndeterminate = value === void 0;
|
|
8979
|
+
return /* @__PURE__ */ jsx18(
|
|
8980
|
+
"progress",
|
|
8981
|
+
{
|
|
8982
|
+
ref,
|
|
8983
|
+
className: cn(
|
|
8984
|
+
"appearance-none border-0 h-2 w-full rounded-full overflow-hidden transition-all accent-primary",
|
|
8985
|
+
isIndeterminate ? "bg-gradient-to-r from-primary/10 via-primary/90 to-primary/10" : "bg-primary/20",
|
|
8986
|
+
className
|
|
8987
|
+
),
|
|
8988
|
+
...isIndeterminate ? {} : { value },
|
|
8989
|
+
max: max2,
|
|
8990
|
+
...props
|
|
8991
|
+
}
|
|
8992
|
+
);
|
|
8993
|
+
});
|
|
8994
|
+
Progress.displayName = "Progress";
|
|
8979
8995
|
|
|
8980
8996
|
// src/components/DataTable/components/ImportModal.tsx
|
|
8981
8997
|
import { Upload as Upload2, FileText, AlertCircle } from "lucide-react";
|
|
8982
8998
|
import { jsx as jsx19, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
8983
8999
|
function ImportModal({ isOpen, onClose, onImport, config = {} }) {
|
|
8984
|
-
const
|
|
9000
|
+
const logger2 = createLogger("ImportModal");
|
|
8985
9001
|
const [file, setFile] = useState4(null);
|
|
8986
9002
|
const [isProcessing, setIsProcessing] = useState4(false);
|
|
8987
9003
|
const [error, setError] = useState4(null);
|
|
@@ -9173,7 +9189,7 @@ function ImportModal({ isOpen, onClose, onImport, config = {} }) {
|
|
|
9173
9189
|
setPreviewData(data.slice(0, 5));
|
|
9174
9190
|
setTotalCount(data.length);
|
|
9175
9191
|
} catch (err) {
|
|
9176
|
-
|
|
9192
|
+
logger2.error("CSV parsing error:", err);
|
|
9177
9193
|
setError(err instanceof Error ? err.message : "Failed to preview file");
|
|
9178
9194
|
setPreviewData(null);
|
|
9179
9195
|
setTotalCount(0);
|
|
@@ -9187,7 +9203,7 @@ function ImportModal({ isOpen, onClose, onImport, config = {} }) {
|
|
|
9187
9203
|
] }),
|
|
9188
9204
|
/* @__PURE__ */ jsxs14("div", { className: "space-y-4", children: [
|
|
9189
9205
|
/* @__PURE__ */ jsxs14("div", { className: "border-2 border-dashed border-sec-200 rounded-lg p-6 text-center", children: [
|
|
9190
|
-
/* @__PURE__ */ jsx19(FileText, { className: "
|
|
9206
|
+
/* @__PURE__ */ jsx19(FileText, { className: "size-8 mx-auto text-sec-400 mb-2" }),
|
|
9191
9207
|
/* @__PURE__ */ jsx19("p", { className: "text-sec-600 mb-2", children: file ? `Selected: ${file.name}` : uploadText }),
|
|
9192
9208
|
file && /* @__PURE__ */ jsx19("p", { className: "text-xs text-sec-500", children: "File selected, processing preview..." }),
|
|
9193
9209
|
/* @__PURE__ */ jsxs14(
|
|
@@ -9197,7 +9213,7 @@ function ImportModal({ isOpen, onClose, onImport, config = {} }) {
|
|
|
9197
9213
|
size: "sm",
|
|
9198
9214
|
onClick: () => fileInputRef.current?.click(),
|
|
9199
9215
|
children: [
|
|
9200
|
-
/* @__PURE__ */ jsx19(Upload2, { className: "
|
|
9216
|
+
/* @__PURE__ */ jsx19(Upload2, { className: "size-4 mr-2" }),
|
|
9201
9217
|
selectFileButtonText
|
|
9202
9218
|
]
|
|
9203
9219
|
}
|
|
@@ -9214,12 +9230,12 @@ function ImportModal({ isOpen, onClose, onImport, config = {} }) {
|
|
|
9214
9230
|
)
|
|
9215
9231
|
] }),
|
|
9216
9232
|
error && /* @__PURE__ */ jsxs14("div", { className: "flex items-center gap-2 p-3 bg-acc-50 border border-acc-200 rounded text-acc-700", children: [
|
|
9217
|
-
/* @__PURE__ */ jsx19(AlertCircle, { className: "
|
|
9233
|
+
/* @__PURE__ */ jsx19(AlertCircle, { className: "size-4" }),
|
|
9218
9234
|
/* @__PURE__ */ jsx19("span", { className: "text-sm", children: error })
|
|
9219
9235
|
] }),
|
|
9220
9236
|
validationErrors.length > 0 && /* @__PURE__ */ jsxs14("div", { className: "space-y-2", children: [
|
|
9221
9237
|
/* @__PURE__ */ jsxs14("div", { className: "flex items-center gap-2 p-3 bg-acc-50 border border-acc-200 rounded text-acc-700", children: [
|
|
9222
|
-
/* @__PURE__ */ jsx19(AlertCircle, { className: "
|
|
9238
|
+
/* @__PURE__ */ jsx19(AlertCircle, { className: "size-4" }),
|
|
9223
9239
|
/* @__PURE__ */ jsxs14("span", { className: "text-sm font-medium", children: [
|
|
9224
9240
|
validationErrors.length,
|
|
9225
9241
|
" validation error",
|
|
@@ -9290,7 +9306,7 @@ function ImportModal({ isOpen, onClose, onImport, config = {} }) {
|
|
|
9290
9306
|
// src/components/DataTable/components/DataTableModals.tsx
|
|
9291
9307
|
import { Fragment as Fragment4, jsx as jsx20 } from "react/jsx-runtime";
|
|
9292
9308
|
function mapCSVToTableColumns(csvData, columns) {
|
|
9293
|
-
const
|
|
9309
|
+
const logger2 = createLogger("mapCSVToTableColumns");
|
|
9294
9310
|
const columnMap = /* @__PURE__ */ new Map();
|
|
9295
9311
|
columns.forEach((col) => {
|
|
9296
9312
|
const fieldName = col.editAccessorKey || col.accessorKey || col.id;
|
|
@@ -9309,11 +9325,11 @@ function mapCSVToTableColumns(csvData, columns) {
|
|
|
9309
9325
|
columnMap.set(editAccessorKey.toLowerCase(), editAccessorKey);
|
|
9310
9326
|
}
|
|
9311
9327
|
} else {
|
|
9312
|
-
|
|
9328
|
+
logger2.warn("Skipping column with missing fieldName or header:", col);
|
|
9313
9329
|
}
|
|
9314
9330
|
});
|
|
9315
9331
|
if (csvData.length === 0) {
|
|
9316
|
-
|
|
9332
|
+
logger2.warn("No CSV data to map");
|
|
9317
9333
|
return [];
|
|
9318
9334
|
}
|
|
9319
9335
|
const mappedData = csvData.map((row, index) => {
|
|
@@ -9335,7 +9351,7 @@ function mapCSVToTableColumns(csvData, columns) {
|
|
|
9335
9351
|
} else {
|
|
9336
9352
|
mappedRow[csvHeaderLower] = row[csvHeader];
|
|
9337
9353
|
if (index === 0) {
|
|
9338
|
-
|
|
9354
|
+
logger2.warn(`No mapping found for "${csvHeader}", using as-is`);
|
|
9339
9355
|
}
|
|
9340
9356
|
}
|
|
9341
9357
|
});
|
|
@@ -9352,7 +9368,7 @@ function DataTableModals({
|
|
|
9352
9368
|
onStoreFocus,
|
|
9353
9369
|
onRestoreFocus
|
|
9354
9370
|
}) {
|
|
9355
|
-
const
|
|
9371
|
+
const logger2 = React15.useMemo(() => createLogger("DataTableModals"), []);
|
|
9356
9372
|
useEffect5(() => {
|
|
9357
9373
|
if (showImportModal) {
|
|
9358
9374
|
onStoreFocus?.();
|
|
@@ -9374,11 +9390,11 @@ function DataTableModals({
|
|
|
9374
9390
|
if (columns && columns.length > 0) {
|
|
9375
9391
|
mappedData = mapCSVToTableColumns(rawData, columns);
|
|
9376
9392
|
} else {
|
|
9377
|
-
|
|
9393
|
+
logger2.warn("No columns provided for mapping, using raw data");
|
|
9378
9394
|
mappedData = rawData;
|
|
9379
9395
|
}
|
|
9380
9396
|
if (!onImport) {
|
|
9381
|
-
|
|
9397
|
+
logger2.error("onImport callback is not provided");
|
|
9382
9398
|
throw new Error("Import handler is not configured. Please provide an onImport callback.");
|
|
9383
9399
|
}
|
|
9384
9400
|
const result = onImport(mappedData);
|
|
@@ -9386,7 +9402,7 @@ function DataTableModals({
|
|
|
9386
9402
|
await result;
|
|
9387
9403
|
}
|
|
9388
9404
|
} catch (error) {
|
|
9389
|
-
|
|
9405
|
+
logger2.error("Import error:", error);
|
|
9390
9406
|
throw error;
|
|
9391
9407
|
}
|
|
9392
9408
|
},
|
|
@@ -9418,7 +9434,7 @@ var Alert = React16.forwardRef(({ className, variant = "default", ...props }, re
|
|
|
9418
9434
|
return /* @__PURE__ */ jsx21(AlertContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx21(React16.Fragment, { ...props }) });
|
|
9419
9435
|
}
|
|
9420
9436
|
return /* @__PURE__ */ jsx21(AlertContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx21(
|
|
9421
|
-
"
|
|
9437
|
+
"aside",
|
|
9422
9438
|
{
|
|
9423
9439
|
ref,
|
|
9424
9440
|
className: cn(getAlertClasses(variant), className),
|
|
@@ -9586,7 +9602,7 @@ function useColumnOrderPersistence({
|
|
|
9586
9602
|
enablePersistence = false,
|
|
9587
9603
|
storageKey
|
|
9588
9604
|
}) {
|
|
9589
|
-
const
|
|
9605
|
+
const logger2 = createLogger("ColumnOrderPersistence");
|
|
9590
9606
|
const [columnOrder, setColumnOrder] = useState5(defaultOrder);
|
|
9591
9607
|
const [isLoaded, setIsLoaded] = useState5(false);
|
|
9592
9608
|
const finalStorageKey = storageKey ? `${storageKey}-column-order` : tableId ? `datatable-column-order-${tableId}` : "datatable-column-order";
|
|
@@ -9608,7 +9624,7 @@ function useColumnOrderPersistence({
|
|
|
9608
9624
|
}
|
|
9609
9625
|
}
|
|
9610
9626
|
} catch (error) {
|
|
9611
|
-
|
|
9627
|
+
logger2.warn("Failed to load column order from localStorage:", error);
|
|
9612
9628
|
} finally {
|
|
9613
9629
|
setIsLoaded(true);
|
|
9614
9630
|
}
|
|
@@ -9619,7 +9635,7 @@ function useColumnOrderPersistence({
|
|
|
9619
9635
|
try {
|
|
9620
9636
|
localStorage.setItem(finalStorageKey, JSON.stringify(newOrder));
|
|
9621
9637
|
} catch (error) {
|
|
9622
|
-
|
|
9638
|
+
logger2.warn("Failed to save column order to localStorage:", error);
|
|
9623
9639
|
}
|
|
9624
9640
|
}, [enablePersistence, finalStorageKey, storageKey, tableId]);
|
|
9625
9641
|
const updateColumnOrder = useCallback3((newOrder) => {
|
|
@@ -9632,7 +9648,7 @@ function useColumnOrderPersistence({
|
|
|
9632
9648
|
try {
|
|
9633
9649
|
localStorage.removeItem(finalStorageKey);
|
|
9634
9650
|
} catch (error) {
|
|
9635
|
-
|
|
9651
|
+
logger2.warn("Failed to remove column order from localStorage:", error);
|
|
9636
9652
|
}
|
|
9637
9653
|
}
|
|
9638
9654
|
}, [defaultOrder, enablePersistence, finalStorageKey, storageKey, tableId]);
|
|
@@ -9646,7 +9662,7 @@ function useColumnOrderPersistence({
|
|
|
9646
9662
|
}
|
|
9647
9663
|
});
|
|
9648
9664
|
} catch (error) {
|
|
9649
|
-
|
|
9665
|
+
logger2.warn("Failed to clear datatable preferences:", error);
|
|
9650
9666
|
}
|
|
9651
9667
|
}, [enablePersistence]);
|
|
9652
9668
|
return {
|
|
@@ -9666,7 +9682,7 @@ function useColumnVisibilityPersistence({
|
|
|
9666
9682
|
enablePersistence = false,
|
|
9667
9683
|
storageKey
|
|
9668
9684
|
}) {
|
|
9669
|
-
const
|
|
9685
|
+
const logger2 = createLogger("ColumnVisibilityPersistence");
|
|
9670
9686
|
const [columnVisibility, setColumnVisibility] = useState6(defaultVisibility);
|
|
9671
9687
|
const [isLoaded, setIsLoaded] = useState6(false);
|
|
9672
9688
|
const finalStorageKey = storageKey ? `${storageKey}-column-visibility` : tableId ? `datatable-column-visibility-${tableId}` : "datatable-column-visibility";
|
|
@@ -9684,7 +9700,7 @@ function useColumnVisibilityPersistence({
|
|
|
9684
9700
|
}
|
|
9685
9701
|
}
|
|
9686
9702
|
} catch (error) {
|
|
9687
|
-
|
|
9703
|
+
logger2.warn("Failed to load column visibility from localStorage:", error);
|
|
9688
9704
|
} finally {
|
|
9689
9705
|
setIsLoaded(true);
|
|
9690
9706
|
}
|
|
@@ -9694,7 +9710,7 @@ function useColumnVisibilityPersistence({
|
|
|
9694
9710
|
try {
|
|
9695
9711
|
localStorage.setItem(finalStorageKey, JSON.stringify(newVisibility));
|
|
9696
9712
|
} catch (error) {
|
|
9697
|
-
|
|
9713
|
+
logger2.warn("Failed to save column visibility to localStorage:", error);
|
|
9698
9714
|
}
|
|
9699
9715
|
}, [enablePersistence, finalStorageKey]);
|
|
9700
9716
|
const updateColumnVisibility = useCallback4((newVisibility) => {
|
|
@@ -9707,7 +9723,7 @@ function useColumnVisibilityPersistence({
|
|
|
9707
9723
|
try {
|
|
9708
9724
|
localStorage.removeItem(finalStorageKey);
|
|
9709
9725
|
} catch (error) {
|
|
9710
|
-
|
|
9726
|
+
logger2.warn("Failed to remove column visibility from localStorage:", error);
|
|
9711
9727
|
}
|
|
9712
9728
|
}
|
|
9713
9729
|
}, [defaultVisibility, enablePersistence, finalStorageKey]);
|
|
@@ -9721,7 +9737,7 @@ function useColumnVisibilityPersistence({
|
|
|
9721
9737
|
}
|
|
9722
9738
|
});
|
|
9723
9739
|
} catch (error) {
|
|
9724
|
-
|
|
9740
|
+
logger2.warn("Failed to clear datatable preferences:", error);
|
|
9725
9741
|
}
|
|
9726
9742
|
}, [enablePersistence]);
|
|
9727
9743
|
return {
|
|
@@ -10502,7 +10518,7 @@ var CardHeader = React18.forwardRef(({ className, ...props }, ref) => /* @__PURE
|
|
|
10502
10518
|
"header",
|
|
10503
10519
|
{
|
|
10504
10520
|
ref,
|
|
10505
|
-
className: cn("
|
|
10521
|
+
className: cn("p-6 min-w-0 w-full", className),
|
|
10506
10522
|
...props
|
|
10507
10523
|
}
|
|
10508
10524
|
));
|
|
@@ -10511,10 +10527,7 @@ var CardTitle = React18.forwardRef(({ className, ...props }, ref) => /* @__PURE_
|
|
|
10511
10527
|
"h3",
|
|
10512
10528
|
{
|
|
10513
10529
|
ref,
|
|
10514
|
-
className: cn(
|
|
10515
|
-
"text-2xl font-semibold leading-none tracking-tight",
|
|
10516
|
-
className
|
|
10517
|
-
),
|
|
10530
|
+
className: cn(className),
|
|
10518
10531
|
...props
|
|
10519
10532
|
}
|
|
10520
10533
|
));
|
|
@@ -10541,7 +10554,7 @@ var CardFooter = React18.forwardRef(({ className, ...props }, ref) => /* @__PURE
|
|
|
10541
10554
|
"footer",
|
|
10542
10555
|
{
|
|
10543
10556
|
ref,
|
|
10544
|
-
className: cn("
|
|
10557
|
+
className: cn("p-6 pt-0 min-w-0 w-full", className),
|
|
10545
10558
|
...props
|
|
10546
10559
|
}
|
|
10547
10560
|
));
|
|
@@ -10709,7 +10722,7 @@ function formatLocaleValue(value, locale) {
|
|
|
10709
10722
|
return String(value);
|
|
10710
10723
|
}
|
|
10711
10724
|
function generateCSVContent(data, columns, options = {}) {
|
|
10712
|
-
const
|
|
10725
|
+
const logger2 = createLogger("generateCSVContent");
|
|
10713
10726
|
if (!data.length) return "";
|
|
10714
10727
|
const {
|
|
10715
10728
|
includeHeaders = true,
|
|
@@ -10727,7 +10740,7 @@ function generateCSVContent(data, columns, options = {}) {
|
|
|
10727
10740
|
try {
|
|
10728
10741
|
value = col.accessorFn(row);
|
|
10729
10742
|
} catch (error) {
|
|
10730
|
-
|
|
10743
|
+
logger2.warn("Error evaluating accessorFn for column:", col.id || col.header, error);
|
|
10731
10744
|
value = void 0;
|
|
10732
10745
|
}
|
|
10733
10746
|
} else {
|
|
@@ -10744,7 +10757,7 @@ function generateCSVContent(data, columns, options = {}) {
|
|
|
10744
10757
|
return csvContent;
|
|
10745
10758
|
}
|
|
10746
10759
|
async function exportToCSVWithTableRows(tableRows, columns, columnIdToTableColumn, filename = "download.csv", options = {}) {
|
|
10747
|
-
const
|
|
10760
|
+
const logger2 = createLogger("ExportUtils");
|
|
10748
10761
|
return new Promise((resolve, reject) => {
|
|
10749
10762
|
try {
|
|
10750
10763
|
if (typeof window === "undefined") {
|
|
@@ -10773,7 +10786,7 @@ async function exportToCSVWithTableRows(tableRows, columns, columnIdToTableColum
|
|
|
10773
10786
|
try {
|
|
10774
10787
|
value = col.accessorFn(tableRow.original);
|
|
10775
10788
|
} catch (accessorError) {
|
|
10776
|
-
|
|
10789
|
+
logger2.warn("Error evaluating accessorFn for column:", col.id || col.header, accessorError);
|
|
10777
10790
|
value = void 0;
|
|
10778
10791
|
}
|
|
10779
10792
|
} else {
|
|
@@ -10808,13 +10821,13 @@ async function exportToCSVWithTableRows(tableRows, columns, columnIdToTableColum
|
|
|
10808
10821
|
link.click();
|
|
10809
10822
|
document.body.removeChild(link);
|
|
10810
10823
|
} catch (error) {
|
|
10811
|
-
|
|
10824
|
+
logger2.error("Failed to export data to CSV:", error);
|
|
10812
10825
|
reject(error);
|
|
10813
10826
|
}
|
|
10814
10827
|
});
|
|
10815
10828
|
}
|
|
10816
10829
|
function exportToCSV(data, columns, filename = "download.csv", options = {}) {
|
|
10817
|
-
const
|
|
10830
|
+
const logger2 = createLogger("ExportUtils");
|
|
10818
10831
|
return new Promise((resolve, reject) => {
|
|
10819
10832
|
try {
|
|
10820
10833
|
if (typeof window === "undefined") {
|
|
@@ -10843,7 +10856,7 @@ function exportToCSV(data, columns, filename = "download.csv", options = {}) {
|
|
|
10843
10856
|
link.click();
|
|
10844
10857
|
document.body.removeChild(link);
|
|
10845
10858
|
} catch (error) {
|
|
10846
|
-
|
|
10859
|
+
logger2.error("Failed to export data to CSV:", error);
|
|
10847
10860
|
reject(error);
|
|
10848
10861
|
}
|
|
10849
10862
|
});
|
|
@@ -10879,7 +10892,7 @@ function normalizeDataTableFeatures(features) {
|
|
|
10879
10892
|
|
|
10880
10893
|
// src/components/DataTable/hooks/useDataTablePermissions.ts
|
|
10881
10894
|
function useDataTablePermissions(rbac, features = {}) {
|
|
10882
|
-
const
|
|
10895
|
+
const logger2 = createLogger("DataTablePermissions");
|
|
10883
10896
|
const authResult = useUnifiedAuth();
|
|
10884
10897
|
const user = authResult.user;
|
|
10885
10898
|
const pageId = rbac?.pageId;
|
|
@@ -10899,7 +10912,7 @@ function useDataTablePermissions(rbac, features = {}) {
|
|
|
10899
10912
|
appId: void 0,
|
|
10900
10913
|
eventId: void 0
|
|
10901
10914
|
});
|
|
10902
|
-
if (rawResolvedScope
|
|
10915
|
+
if (rawResolvedScope) {
|
|
10903
10916
|
const newScope = {
|
|
10904
10917
|
organisationId: rawResolvedScope.organisationId,
|
|
10905
10918
|
appId: rawResolvedScope.appId,
|
|
@@ -10912,11 +10925,14 @@ function useDataTablePermissions(rbac, features = {}) {
|
|
|
10912
10925
|
eventId: newScope.eventId
|
|
10913
10926
|
};
|
|
10914
10927
|
}
|
|
10915
|
-
} else if (!rawResolvedScope) {
|
|
10928
|
+
} else if (!rawResolvedScope && !scopeLoading) {
|
|
10916
10929
|
stableScopeRef.current = { organisationId: void 0, appId: void 0, eventId: void 0 };
|
|
10917
10930
|
}
|
|
10918
10931
|
const stableScope = stableScopeRef.current;
|
|
10919
|
-
const
|
|
10932
|
+
const isPageName = !pageId && !!pageName;
|
|
10933
|
+
const needsAppIdForResolution = isPageName;
|
|
10934
|
+
const shouldWaitForScope = scopeLoading || needsAppIdForResolution && !stableScope.appId;
|
|
10935
|
+
const effectiveScope = !shouldWaitForScope ? stableScope : null;
|
|
10920
10936
|
const userId = user?.id || "";
|
|
10921
10937
|
const readPermission = `read:page.${effectivePageId}`;
|
|
10922
10938
|
const createPermission = `create:page.${effectivePageId}`;
|
|
@@ -11713,7 +11729,7 @@ function DataTableInternal(props) {
|
|
|
11713
11729
|
storageKey,
|
|
11714
11730
|
onLayoutChange
|
|
11715
11731
|
} = props;
|
|
11716
|
-
const
|
|
11732
|
+
const logger2 = React20.useMemo(() => createLogger("DataTableCore"), []);
|
|
11717
11733
|
const authResult = useUnifiedAuth();
|
|
11718
11734
|
const user = authResult.user;
|
|
11719
11735
|
const requestedFeatures = useMemo14(
|
|
@@ -11859,9 +11875,9 @@ function DataTableInternal(props) {
|
|
|
11859
11875
|
});
|
|
11860
11876
|
useEffect11(() => {
|
|
11861
11877
|
if (!hierarchicalValidation.isValid) {
|
|
11862
|
-
|
|
11878
|
+
logger2.error("Hierarchical data validation failed:", hierarchicalValidation.errors);
|
|
11863
11879
|
}
|
|
11864
|
-
}, [hierarchicalValidation,
|
|
11880
|
+
}, [hierarchicalValidation, logger2]);
|
|
11865
11881
|
const {
|
|
11866
11882
|
columnOrder: savedColumnOrder,
|
|
11867
11883
|
isLoaded: isColumnOrderLoaded,
|
|
@@ -11899,11 +11915,11 @@ function DataTableInternal(props) {
|
|
|
11899
11915
|
const closestOption = sortedOptions.reduce(
|
|
11900
11916
|
(prev, curr) => Math.abs(curr - initialPageSize) < Math.abs(prev - initialPageSize) ? curr : prev
|
|
11901
11917
|
);
|
|
11902
|
-
|
|
11918
|
+
logger2.warn(
|
|
11903
11919
|
`initialPageSize ${initialPageSize} is not available in page size options [${finalPageSizeOptions.join(", ")}]. Using closest option: ${closestOption}`
|
|
11904
11920
|
);
|
|
11905
11921
|
return closestOption;
|
|
11906
|
-
}, [initialPageSize, finalPageSizeOptions, secureFeatures.pagination,
|
|
11922
|
+
}, [initialPageSize, finalPageSizeOptions, secureFeatures.pagination, logger2]);
|
|
11907
11923
|
const effectivePageSize = useMemo14(() => {
|
|
11908
11924
|
if (!secureFeatures.pagination || !finalPageSizeOptions.length) {
|
|
11909
11925
|
return state.pagination.pageSize;
|
|
@@ -12009,7 +12025,7 @@ function DataTableInternal(props) {
|
|
|
12009
12025
|
variant: "default"
|
|
12010
12026
|
});
|
|
12011
12027
|
} catch (error) {
|
|
12012
|
-
|
|
12028
|
+
logger2.error("Delete error:", error);
|
|
12013
12029
|
toast({
|
|
12014
12030
|
title: "Delete Failed",
|
|
12015
12031
|
description: error instanceof Error ? error.message : "Failed to delete row",
|
|
@@ -12099,7 +12115,7 @@ function DataTableInternal(props) {
|
|
|
12099
12115
|
return /* @__PURE__ */ jsx25(LoadingComponent, {});
|
|
12100
12116
|
}
|
|
12101
12117
|
if (!permissions.canRead.can) {
|
|
12102
|
-
|
|
12118
|
+
logger2.warn("Access denied - no read permission:", {
|
|
12103
12119
|
canRead: permissions.canRead,
|
|
12104
12120
|
pageId: effectivePageId,
|
|
12105
12121
|
isLoading: permissions.canRead.isLoading
|
|
@@ -12213,7 +12229,7 @@ function DataTableInternal(props) {
|
|
|
12213
12229
|
variant: "default"
|
|
12214
12230
|
});
|
|
12215
12231
|
} catch (error) {
|
|
12216
|
-
|
|
12232
|
+
logger2.error("Failed to export data:", error);
|
|
12217
12233
|
const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
|
|
12218
12234
|
toast({
|
|
12219
12235
|
title: "Export Failed",
|
|
@@ -12244,7 +12260,7 @@ function DataTableInternal(props) {
|
|
|
12244
12260
|
variant: "default"
|
|
12245
12261
|
});
|
|
12246
12262
|
} catch (error) {
|
|
12247
|
-
|
|
12263
|
+
logger2.error("Bulk delete error:", error);
|
|
12248
12264
|
toast({
|
|
12249
12265
|
title: "Delete Failed",
|
|
12250
12266
|
description: error instanceof Error ? error.message : "Failed to delete selected rows",
|
|
@@ -12321,7 +12337,7 @@ function DataTableInternal(props) {
|
|
|
12321
12337
|
tabIndex: 0,
|
|
12322
12338
|
children: [
|
|
12323
12339
|
typeof header.column.columnDef.header === "function" ? header.column.columnDef.header(header.getContext()) : header.column.columnDef.header,
|
|
12324
|
-
header.column.getIsSorted() === "asc" ? /* @__PURE__ */ jsx25(ChevronUp2, { className: "
|
|
12340
|
+
header.column.getIsSorted() === "asc" ? /* @__PURE__ */ jsx25(ChevronUp2, { className: "size-4" }) : header.column.getIsSorted() === "desc" ? /* @__PURE__ */ jsx25(ChevronDown3, { className: "size-4" }) : /* @__PURE__ */ jsx25(ChevronsUpDown, { className: "size-4" })
|
|
12325
12341
|
]
|
|
12326
12342
|
}
|
|
12327
12343
|
) : typeof header.column.columnDef.header === "function" ? header.column.columnDef.header(header.getContext()) : header.column.columnDef.header
|
|
@@ -12433,7 +12449,7 @@ function DataTableInternal(props) {
|
|
|
12433
12449
|
variant: "default"
|
|
12434
12450
|
});
|
|
12435
12451
|
} catch (error) {
|
|
12436
|
-
|
|
12452
|
+
logger2.error("Import error:", error);
|
|
12437
12453
|
toast({
|
|
12438
12454
|
title: "Import Failed",
|
|
12439
12455
|
description: error instanceof Error ? error.message : "Failed to import data",
|
|
@@ -12442,7 +12458,7 @@ function DataTableInternal(props) {
|
|
|
12442
12458
|
return;
|
|
12443
12459
|
}
|
|
12444
12460
|
} else {
|
|
12445
|
-
|
|
12461
|
+
logger2.error("onImport handler not provided");
|
|
12446
12462
|
toast({
|
|
12447
12463
|
title: "Import Not Configured",
|
|
12448
12464
|
description: "Import functionality requires an onImport handler to be provided.",
|
|
@@ -12470,7 +12486,7 @@ function DataTableCore(props) {
|
|
|
12470
12486
|
// src/components/DataTable/DataTable.tsx
|
|
12471
12487
|
import { jsx as jsx26 } from "react/jsx-runtime";
|
|
12472
12488
|
function DataTable(props) {
|
|
12473
|
-
const
|
|
12489
|
+
const logger2 = React21.useMemo(() => createLogger("DataTable"), []);
|
|
12474
12490
|
const { features, ...rest } = props;
|
|
12475
12491
|
const normalizedFeatures = React21.useMemo(
|
|
12476
12492
|
() => normalizeDataTableFeatures(features),
|
|
@@ -12478,9 +12494,9 @@ function DataTable(props) {
|
|
|
12478
12494
|
);
|
|
12479
12495
|
React21.useEffect(() => {
|
|
12480
12496
|
if (normalizedFeatures.deleteSelected && !normalizedFeatures.deletion) {
|
|
12481
|
-
|
|
12497
|
+
logger2.warn("deleteSelected requires deletion to be enabled");
|
|
12482
12498
|
}
|
|
12483
|
-
}, [normalizedFeatures.deleteSelected, normalizedFeatures.deletion,
|
|
12499
|
+
}, [normalizedFeatures.deleteSelected, normalizedFeatures.deletion, logger2]);
|
|
12484
12500
|
return /* @__PURE__ */ jsx26(DataTableCore, { ...rest, features: normalizedFeatures });
|
|
12485
12501
|
}
|
|
12486
12502
|
var DataTableComponent = React21.memo(DataTable);
|
|
@@ -12528,7 +12544,7 @@ function BulkOperationsDropdown({
|
|
|
12528
12544
|
disabled: !hasSelection,
|
|
12529
12545
|
className: `min-w-[140px] h-9 px-3 py-2 text-sm font-medium ${className || ""}`,
|
|
12530
12546
|
children: [
|
|
12531
|
-
/* @__PURE__ */ jsx27(MoreHorizontal2, { className: "
|
|
12547
|
+
/* @__PURE__ */ jsx27(MoreHorizontal2, { className: "size-4 mr-2 flex-shrink-0" }),
|
|
12532
12548
|
/* @__PURE__ */ jsxs18("span", { className: "truncate", children: [
|
|
12533
12549
|
"Bulk Actions (",
|
|
12534
12550
|
selectedCount,
|
|
@@ -12549,7 +12565,7 @@ function BulkOperationsDropdown({
|
|
|
12549
12565
|
disabled: !hasSelection,
|
|
12550
12566
|
className: `flex items-center gap-2 ${variant === "destructive" ? "text-destructive focus:text-destructive" : ""}`,
|
|
12551
12567
|
children: [
|
|
12552
|
-
/* @__PURE__ */ jsx27(Icon, { className: "
|
|
12568
|
+
/* @__PURE__ */ jsx27(Icon, { className: "size-4" }),
|
|
12553
12569
|
/* @__PURE__ */ jsx27("span", { children: label })
|
|
12554
12570
|
]
|
|
12555
12571
|
},
|
|
@@ -12578,7 +12594,7 @@ function GroupHeader({
|
|
|
12578
12594
|
size: "sm",
|
|
12579
12595
|
onClick: onToggle,
|
|
12580
12596
|
className: "p-0 h-auto mr-2",
|
|
12581
|
-
children: isExpanded ? /* @__PURE__ */ jsx28(ChevronDown4, { className: "
|
|
12597
|
+
children: isExpanded ? /* @__PURE__ */ jsx28(ChevronDown4, { className: "size-4" }) : /* @__PURE__ */ jsx28(ChevronRight3, { className: "size-4" })
|
|
12582
12598
|
}
|
|
12583
12599
|
),
|
|
12584
12600
|
/* @__PURE__ */ jsxs19("span", { className: "text-sm", children: [
|
|
@@ -12753,4 +12769,4 @@ lodash/lodash.js:
|
|
|
12753
12769
|
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|
12754
12770
|
*)
|
|
12755
12771
|
*/
|
|
12756
|
-
//# sourceMappingURL=chunk-
|
|
12772
|
+
//# sourceMappingURL=chunk-SDMHPX3X.js.map
|