Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import ConfirmDialog from '../ConfirmDialog'
interface AdditionalInitializersProps {
items: AdditionalInitializerSetting[]
registeredInitializers: RegisteredInitializer[]
catalogUnavailable?: boolean
creating: boolean
savingInitializerId?: string | null
saveErrors?: Record<string, string>
Expand Down Expand Up @@ -157,6 +158,7 @@ function AdditionalInitializerCard({
export default function AdditionalInitializers({
items,
registeredInitializers,
catalogUnavailable,
creating,
savingInitializerId = null,
saveErrors = {},
Expand Down Expand Up @@ -237,7 +239,11 @@ export default function AdditionalInitializers({
<AdditionalInitializerCard
key={`${item.id}:${formatInitializerParameters(item.parameters)}:${item.order_index ?? ''}`}
item={item}
initializer={resolveRegisteredInitializer(item.initializer_name, registeredInitializers)}
initializer={resolveRegisteredInitializer(
item.initializer_name,
registeredInitializers,
catalogUnavailable,
)}
isSaving={savingInitializerId === item.id}
isApplying={applyingInitializerId === item.id}
isDeleting={deletingInitializerId === item.id}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@ import { useInitializersStyles } from './Initializers.styles'
interface BaselineInitializersProps {
items: BaselineInitializerSetting[]
registeredInitializers: RegisteredInitializer[]
catalogUnavailable?: boolean
}

export default function BaselineInitializers({
items,
registeredInitializers,
catalogUnavailable,
}: BaselineInitializersProps) {
const styles = useInitializersStyles()

Expand All @@ -32,7 +34,11 @@ export default function BaselineInitializers({
) : (
<div className={styles.baselineGroup} role="list" aria-label="Baseline initializers">
{items.map((item: BaselineInitializerSetting) => {
const initializer = resolveRegisteredInitializer(item.initializer_name, registeredInitializers)
const initializer = resolveRegisteredInitializer(
item.initializer_name,
registeredInitializers,
catalogUnavailable,
)
return (
<div
key={`${item.initializer_name}:${item.order_index}`}
Expand Down
5 changes: 5 additions & 0 deletions frontend/src/components/Initializers/Initializers.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ export default function Initializers() {
const styles = useInitializersStyles()
const [settings, setSettings] = useState<InitializerSettingsResponse>(EMPTY_SETTINGS)
const [registeredInitializers, setRegisteredInitializers] = useState<RegisteredInitializer[]>([])
const [catalogUnavailable, setCatalogUnavailable] = useState(false)
const [loading, setLoading] = useState(true)
const [statusMessage, setStatusMessage] = useState<StatusMessage | null>(null)
const [refetchCount, setRefetchCount] = useState(0)
Expand Down Expand Up @@ -55,7 +56,9 @@ export default function Initializers() {

if (registeredResult.status === 'fulfilled') {
setRegisteredInitializers(registeredResult.value.items)
setCatalogUnavailable(false)
} else {
setCatalogUnavailable(true)
const catalogError = toApiError(registeredResult.reason).detail
setStatusMessage((current: StatusMessage | null) =>
current
Expand Down Expand Up @@ -207,10 +210,12 @@ export default function Initializers() {
<BaselineInitializers
items={settings.baseline}
registeredInitializers={registeredInitializers}
catalogUnavailable={catalogUnavailable}
/>
<AdditionalInitializers
items={settings.additional}
registeredInitializers={registeredInitializers}
catalogUnavailable={catalogUnavailable}
creating={creating}
savingInitializerId={savingInitializerId}
saveErrors={saveErrors}
Expand Down
18 changes: 18 additions & 0 deletions frontend/src/components/Initializers/initializerLookup.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,22 @@ describe('resolveRegisteredInitializer', () => {
expect(result.initializer_name).toBe('target')
expect(result.initializer_type).toBe('UnknownInitializer')
})

it('returns a "temporarily unavailable" placeholder when the catalog fetch failed', () => {
const result = resolveRegisteredInitializer('target', [], true)

expect(result).toEqual({
initializer_name: 'target',
initializer_type: 'UnknownInitializer',
description: 'Catalog metadata temporarily unavailable.',
required_env_vars: [],
supported_parameters: [],
})
})

it('still matches by name when the catalog is available', () => {
const result = resolveRegisteredInitializer('target', registered, false)

expect(result).toBe(registered[0])
})
})
11 changes: 11 additions & 0 deletions frontend/src/components/Initializers/initializerLookup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,23 @@ import type { RegisteredInitializer } from '@/types'
export function resolveRegisteredInitializer(
initializerName: string,
registeredInitializers: RegisteredInitializer[],
catalogUnavailable?: boolean,
): RegisteredInitializer {
const match = registeredInitializers.find((item) => item.initializer_name === initializerName)
if (match) {
return match
}

if (catalogUnavailable) {
return {
initializer_name: initializerName,
initializer_type: 'UnknownInitializer',
description: 'Catalog metadata temporarily unavailable.',
required_env_vars: [],
supported_parameters: [],
}
}

return {
initializer_name: initializerName,
initializer_type: 'UnknownInitializer',
Expand Down