diff --git a/invokeai/frontend/web/public/locales/en.json b/invokeai/frontend/web/public/locales/en.json
index 70b44a301f..9ba7428e7b 100644
--- a/invokeai/frontend/web/public/locales/en.json
+++ b/invokeai/frontend/web/public/locales/en.json
@@ -1646,6 +1646,7 @@
"structure": "Structure",
"upscaleModel": "Upscale Model",
"scale": "Scale",
+ "simpleUpscaleMissingModelWarning": "Visit the Model Manager to install an upscale (image to image) model.",
"missingModelsWarning": "Visit the Model Manager to install the required models:",
"mainModelDesc": "Main model (SD1.5 or SDXL architecture)",
"tileControlNetModelDesc": "Tile ControlNet model for the chosen main model architecture",
diff --git a/invokeai/frontend/web/src/features/parameters/components/Upscale/ParamSpandrelModel.tsx b/invokeai/frontend/web/src/features/parameters/components/Upscale/ParamSpandrelModel.tsx
index ae76e7d607..28c7b89c90 100644
--- a/invokeai/frontend/web/src/features/parameters/components/Upscale/ParamSpandrelModel.tsx
+++ b/invokeai/frontend/web/src/features/parameters/components/Upscale/ParamSpandrelModel.tsx
@@ -54,6 +54,7 @@ const ParamSpandrelModel = ({ isMultidiffusion }: Props) => {
options={options}
onChange={onChange}
noOptionsMessage={noOptionsMessage}
+ isDisabled={options.length === 0}
/>
diff --git a/invokeai/frontend/web/src/features/parameters/components/Upscale/ParamUpscaleSettings.tsx b/invokeai/frontend/web/src/features/parameters/components/Upscale/ParamUpscaleSettings.tsx
index 15393481a5..535ad35d5b 100644
--- a/invokeai/frontend/web/src/features/parameters/components/Upscale/ParamUpscaleSettings.tsx
+++ b/invokeai/frontend/web/src/features/parameters/components/Upscale/ParamUpscaleSettings.tsx
@@ -6,14 +6,16 @@ import {
PopoverBody,
PopoverContent,
PopoverTrigger,
+ Text,
useDisclosure,
} from '@invoke-ai/ui-library';
import { upscaleRequested } from 'app/store/middleware/listenerMiddleware/listeners/upscaleRequested';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
+import { $installModelsTab } from 'features/modelManagerV2/subpanels/InstallModels';
import { useIsQueueMutationInProgress } from 'features/queue/hooks/useIsQueueMutationInProgress';
-import { UpscaleWarning } from 'features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning';
+import { setActiveTab } from 'features/ui/store/uiSlice';
import { memo, useCallback } from 'react';
-import { useTranslation } from 'react-i18next';
+import { Trans, useTranslation } from 'react-i18next';
import { PiFrameCornersBold } from 'react-icons/pi';
import type { ImageDTO } from 'services/api/types';
@@ -51,7 +53,7 @@ const ParamUpscalePopover = (props: Props) => {
-
+ {!simpleUpscaleModel && }
@@ -63,3 +65,27 @@ const ParamUpscalePopover = (props: Props) => {
};
export default memo(ParamUpscalePopover);
+
+const MissingModelWarning = () => {
+ const dispatch = useAppDispatch();
+
+ const handleGoToModelManager = useCallback(() => {
+ dispatch(setActiveTab('models'));
+ $installModelsTab.set(3);
+ }, [dispatch]);
+
+ return (
+
+
+
+ ),
+ }}
+ />
+
+
+ );
+};
diff --git a/invokeai/frontend/web/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleSettingsAccordion.tsx b/invokeai/frontend/web/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleSettingsAccordion.tsx
index ddd5435205..b810b67d7b 100644
--- a/invokeai/frontend/web/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleSettingsAccordion.tsx
+++ b/invokeai/frontend/web/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleSettingsAccordion.tsx
@@ -58,7 +58,7 @@ export const UpscaleSettingsAccordion = memo(() => {
-
+
diff --git a/invokeai/frontend/web/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx b/invokeai/frontend/web/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx
index d1873c15ae..0c2c16d302 100644
--- a/invokeai/frontend/web/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx
+++ b/invokeai/frontend/web/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx
@@ -7,14 +7,11 @@ import { useCallback, useEffect, useMemo } from 'react';
import { Trans, useTranslation } from 'react-i18next';
import { useControlNetModels } from 'services/api/hooks/modelsByType';
-interface Props {
- usesTile: boolean;
-}
-
-export const UpscaleWarning = ({ usesTile }: Props) => {
+export const UpscaleWarning = () => {
const { t } = useTranslation();
const model = useAppSelector((s) => s.generation.model);
- const { tileControlnetModel, upscaleModel, simpleUpscaleModel } = useAppSelector((s) => s.upscale);
+ const upscaleModel = useAppSelector((s) => s.upscale.upscaleModel);
+ const tileControlnetModel = useAppSelector((s) => s.upscale.tileControlnetModel);
const dispatch = useAppDispatch();
const [modelConfigs, { isLoading }] = useControlNetModels();
const disabledTabs = useAppSelector((s) => s.config.disabledTabs);
@@ -29,23 +26,18 @@ export const UpscaleWarning = ({ usesTile }: Props) => {
const warnings = useMemo(() => {
const _warnings: string[] = [];
- if (!usesTile) {
- if (!simpleUpscaleModel) {
- _warnings.push(t('upscaling.upscaleModelDesc'));
- }
- return _warnings;
- }
if (!model) {
_warnings.push(t('upscaling.mainModelDesc'));
}
- if (!tileControlnetModel && usesTile) {
+ if (!tileControlnetModel) {
_warnings.push(t('upscaling.tileControlNetModelDesc'));
}
if (!upscaleModel) {
_warnings.push(t('upscaling.upscaleModelDesc'));
}
+
return _warnings;
- }, [model, upscaleModel, tileControlnetModel, usesTile, simpleUpscaleModel, t]);
+ }, [model, tileControlnetModel, upscaleModel, t]);
const handleGoToModelManager = useCallback(() => {
dispatch(setActiveTab('models'));