diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelTypeFilter.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelTypeFilter.tsx index 76802b36e7..85f3fd5bf6 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelTypeFilter.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelTypeFilter.tsx @@ -21,6 +21,7 @@ export const ModelTypeFilter = () => { t2i_adapter: t('common.t2iAdapter'), ip_adapter: t('common.ipAdapter'), clip_vision: 'Clip Vision', + spandrel_image_to_image: 'Spandrel Image to Image', }), [t] ); diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldRenderer.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldRenderer.tsx index b67439eb70..d863def973 100644 --- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldRenderer.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldRenderer.tsx @@ -129,8 +129,17 @@ const InputFieldRenderer = ({ nodeId, fieldName }: InputFieldProps) => { return ; } - if (isSpandrelImageToImageModelFieldInputInstance(fieldInstance) && isSpandrelImageToImageModelFieldInputTemplate(fieldTemplate)) { - return ; + if ( + isSpandrelImageToImageModelFieldInputInstance(fieldInstance) && + isSpandrelImageToImageModelFieldInputTemplate(fieldTemplate) + ) { + return ( + + ); } if (isColorFieldInputInstance(fieldInstance) && isColorFieldInputTemplate(fieldTemplate)) { diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SpandrelImageToImageModelFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SpandrelImageToImageModelFieldInputComponent.tsx index fbb23caa90..ccd4eaa797 100644 --- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SpandrelImageToImageModelFieldInputComponent.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SpandrelImageToImageModelFieldInputComponent.tsx @@ -1,7 +1,7 @@ import { Combobox, FormControl, Tooltip } from '@invoke-ai/ui-library'; import { useAppDispatch } from 'app/store/storeHooks'; import { useGroupedModelCombobox } from 'common/hooks/useGroupedModelCombobox'; -import { fieldSpandrelImageToImageModelValueChanged, } from 'features/nodes/store/nodesSlice'; +import { fieldSpandrelImageToImageModelValueChanged } from 'features/nodes/store/nodesSlice'; import type { SpandrelImageToImageModelFieldInputInstance, SpandrelImageToImageModelFieldInputTemplate, @@ -26,7 +26,6 @@ const SpandrelImageToImageModelFieldInputComponent = ( return; } dispatch( - fieldSpandrelImageToImageModelValueChanged({ nodeId, fieldName: field.name, diff --git a/invokeai/frontend/web/src/features/nodes/store/nodesSlice.ts b/invokeai/frontend/web/src/features/nodes/store/nodesSlice.ts index e1a74b947d..f9214c1572 100644 --- a/invokeai/frontend/web/src/features/nodes/store/nodesSlice.ts +++ b/invokeai/frontend/web/src/features/nodes/store/nodesSlice.ts @@ -335,7 +335,10 @@ export const nodesSlice = createSlice({ fieldT2IAdapterModelValueChanged: (state, action: FieldValueAction) => { fieldValueReducer(state, action, zT2IAdapterModelFieldValue); }, - fieldSpandrelImageToImageModelValueChanged: (state, action: FieldValueAction) => { + fieldSpandrelImageToImageModelValueChanged: ( + state, + action: FieldValueAction + ) => { fieldValueReducer(state, action, zSpandrelImageToImageModelFieldValue); }, fieldEnumModelValueChanged: (state, action: FieldValueAction) => { diff --git a/invokeai/frontend/web/src/features/nodes/types/field.ts b/invokeai/frontend/web/src/features/nodes/types/field.ts index ba9078bec2..925bd40b9d 100644 --- a/invokeai/frontend/web/src/features/nodes/types/field.ts +++ b/invokeai/frontend/web/src/features/nodes/types/field.ts @@ -603,13 +603,16 @@ const zSpandrelImageToImageModelFieldOutputTemplate = zFieldOutputTemplateBase.e export type SpandrelImageToImageModelFieldValue = z.infer; export type SpandrelImageToImageModelFieldInputInstance = z.infer; export type SpandrelImageToImageModelFieldInputTemplate = z.infer; -export const isSpandrelImageToImageModelFieldInputInstance = (val: unknown): val is SpandrelImageToImageModelFieldInputInstance => +export const isSpandrelImageToImageModelFieldInputInstance = ( + val: unknown +): val is SpandrelImageToImageModelFieldInputInstance => zSpandrelImageToImageModelFieldInputInstance.safeParse(val).success; -export const isSpandrelImageToImageModelFieldInputTemplate = (val: unknown): val is SpandrelImageToImageModelFieldInputTemplate => +export const isSpandrelImageToImageModelFieldInputTemplate = ( + val: unknown +): val is SpandrelImageToImageModelFieldInputTemplate => zSpandrelImageToImageModelFieldInputTemplate.safeParse(val).success; // #endregion - // #region SchedulerField export const zSchedulerFieldValue = zSchedulerField.optional(); diff --git a/invokeai/frontend/web/src/services/api/types.ts b/invokeai/frontend/web/src/services/api/types.ts index 7784d3f0e5..fdfa62342d 100644 --- a/invokeai/frontend/web/src/services/api/types.ts +++ b/invokeai/frontend/web/src/services/api/types.ts @@ -86,9 +86,11 @@ export const isT2IAdapterModelConfig = (config: AnyModelConfig): config is T2IAd return config.type === 't2i_adapter'; }; -export const isSpandrelImageToImageModelConfig = (config: AnyModelConfig): config is SpandrelImageToImageModelConfig => { +export const isSpandrelImageToImageModelConfig = ( + config: AnyModelConfig +): config is SpandrelImageToImageModelConfig => { return config.type === 'spandrel_image_to_image'; -} +}; export const isControlAdapterModelConfig = ( config: AnyModelConfig