diff --git a/frontend/src/components/Initializers/AdditionalInitializers.test.tsx b/frontend/src/components/Initializers/AdditionalInitializers.test.tsx index 74a909d626..8ddae07a63 100644 --- a/frontend/src/components/Initializers/AdditionalInitializers.test.tsx +++ b/frontend/src/components/Initializers/AdditionalInitializers.test.tsx @@ -162,6 +162,32 @@ describe('AdditionalInitializers', () => { expect(screen.getByText('tags (list[str], optional)')).toBeInTheDocument() }) + it('should disable Edit while the initializer catalog is unavailable', () => { + render( + + + , + ) + + const editButtons = screen.getAllByRole('button', { name: 'Edit' }) + expect(editButtons.length).toBeGreaterThan(0) + editButtons.forEach((button) => expect(button).toBeDisabled()) + // The row explains why editing is unavailable instead of failing silently on save. + expect(screen.getAllByText(/editing is disabled until it reloads/i).length).toBeGreaterThan(0) + }) + + it('should keep Apply and Remove usable while the initializer catalog is unavailable', () => { + render( + + + , + ) + + const row = screen.getByTestId('initializer-row-additional-2') + expect(within(row).getByRole('button', { name: 'Apply now' })).toBeEnabled() + expect(within(row).getByRole('button', { name: 'Remove' })).toBeEnabled() + }) + it('should show the saved parameters read-only without an inline editor', () => { render( diff --git a/frontend/src/components/Initializers/AdditionalInitializers.tsx b/frontend/src/components/Initializers/AdditionalInitializers.tsx index 992292ca3c..59c352c263 100644 --- a/frontend/src/components/Initializers/AdditionalInitializers.tsx +++ b/frontend/src/components/Initializers/AdditionalInitializers.tsx @@ -25,6 +25,7 @@ import ConfirmDialog from '../ConfirmDialog' interface AdditionalInitializersProps { items: AdditionalInitializerSetting[] registeredInitializers: RegisteredInitializer[] + catalogAvailable?: boolean creating: boolean savingInitializerId?: string | null saveErrors?: Record @@ -40,6 +41,7 @@ interface AdditionalInitializersProps { interface AdditionalInitializerCardProps { item: AdditionalInitializerSetting initializer: RegisteredInitializer + catalogAvailable: boolean isSaving: boolean isApplying: boolean isDeleting: boolean @@ -53,6 +55,7 @@ interface AdditionalInitializerCardProps { function AdditionalInitializerCard({ item, initializer, + catalogAvailable, isSaving, isApplying, isDeleting, @@ -93,6 +96,11 @@ function AdditionalInitializerCard({ Required env vars: {initializer.required_env_vars.join(', ')} )} + {!catalogAvailable && ( + + Initializer catalog is unavailable; editing is disabled until it reloads. + + )} @@ -110,7 +118,7 @@ function AdditionalInitializerCard({
-