Skip to content

Commit 1591ecb

Browse files
feat(ui): add <NavigateToModelManagerButton /> to model comboboxes everywhere
1 parent 9f94950 commit 1591ecb

File tree

17 files changed

+103
-80
lines changed

17 files changed

+103
-80
lines changed

invokeai/frontend/web/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapterModel.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Combobox, FormControl, Tooltip } from '@invoke-ai/ui-library';
22
import { useAppSelector } from 'app/store/storeHooks';
33
import { useGroupedModelCombobox } from 'common/hooks/useGroupedModelCombobox';
44
import { selectBase } from 'features/controlLayers/store/paramsSlice';
5+
import { NavigateToModelManagerButton } from 'features/parameters/components/MainModel/NavigateToModelManagerButton';
56
import { memo, useCallback, useMemo } from 'react';
67
import { useTranslation } from 'react-i18next';
78
import { useControlLayerModels } from 'services/api/hooks/modelsByType';
@@ -61,6 +62,7 @@ export const ControlLayerControlAdapterModel = memo(({ modelKey, onChange: onCha
6162
onChange={onChange}
6263
noOptionsMessage={noOptionsMessage}
6364
/>
65+
<NavigateToModelManagerButton />
6466
</FormControl>
6567
</Tooltip>
6668
);

invokeai/frontend/web/src/features/controlLayers/components/Filters/FilterSpandrel.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
import { useModelCombobox } from 'common/hooks/useModelCombobox';
1414
import type { SpandrelFilterConfig } from 'features/controlLayers/store/filters';
1515
import { IMAGE_FILTERS } from 'features/controlLayers/store/filters';
16+
import { NavigateToModelManagerButton } from 'features/parameters/components/MainModel/NavigateToModelManagerButton';
1617
import type { ChangeEvent } from 'react';
1718
import { useCallback, useEffect, useMemo } from 'react';
1819
import { useTranslation } from 'react-i18next';
@@ -118,6 +119,7 @@ export const FilterSpandrel = ({ onChange, config }: Props) => {
118119
/>
119120
</Box>
120121
</Tooltip>
122+
<NavigateToModelManagerButton />
121123
</FormControl>
122124
</>
123125
);

invokeai/frontend/web/src/features/controlLayers/components/IPAdapter/CLIPVisionModel.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { useAppSelector } from 'app/store/storeHooks';
44
import { selectIsFLUX } from 'features/controlLayers/store/paramsSlice';
55
import type { CLIPVisionModelV2 } from 'features/controlLayers/store/types';
66
import { isCLIPVisionModelV2 } from 'features/controlLayers/store/types';
7+
import { NavigateToModelManagerButton } from 'features/parameters/components/MainModel/NavigateToModelManagerButton';
78
import { memo, useCallback, useMemo } from 'react';
89
import { useTranslation } from 'react-i18next';
910
import { assert } from 'tsafe';
@@ -54,6 +55,7 @@ export const CLIPVisionModel = memo(({ model, onChange }: Props) => {
5455
value={clipVisionModelValue}
5556
onChange={_onChangeCLIPVisionModel}
5657
/>
58+
<NavigateToModelManagerButton />
5759
</FormControl>
5860
);
5961
});

invokeai/frontend/web/src/features/controlLayers/components/IPAdapter/IPAdapterModel.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Combobox, FormControl, Tooltip } from '@invoke-ai/ui-library';
22
import { useAppSelector } from 'app/store/storeHooks';
33
import { useGroupedModelCombobox } from 'common/hooks/useGroupedModelCombobox';
44
import { selectBase } from 'features/controlLayers/store/paramsSlice';
5+
import { NavigateToModelManagerButton } from 'features/parameters/components/MainModel/NavigateToModelManagerButton';
56
import { memo, useCallback, useMemo } from 'react';
67
import { useTranslation } from 'react-i18next';
78
import { useIPAdapterOrFLUXReduxModels } from 'services/api/hooks/modelsByType';
@@ -66,6 +67,7 @@ export const IPAdapterModel = memo(({ isRegionalGuidance, modelKey, onChangeMode
6667
onChange={onChange}
6768
noOptionsMessage={noOptionsMessage}
6869
/>
70+
<NavigateToModelManagerButton />
6971
</FormControl>
7072
</Tooltip>
7173
);

invokeai/frontend/web/src/features/lora/components/LoRASelect.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { InformationalPopover } from 'common/components/InformationalPopover/Inf
66
import { useGroupedModelCombobox } from 'common/hooks/useGroupedModelCombobox';
77
import { loraAdded, selectLoRAsSlice } from 'features/controlLayers/store/lorasSlice';
88
import { selectBase } from 'features/controlLayers/store/paramsSlice';
9+
import { NavigateToModelManagerButton } from 'features/parameters/components/MainModel/NavigateToModelManagerButton';
910
import { memo, useCallback, useMemo } from 'react';
1011
import { useTranslation } from 'react-i18next';
1112
import { useLoRAModels } from 'services/api/hooks/modelsByType';
@@ -58,7 +59,7 @@ const LoRASelect = () => {
5859
const noOptionsMessage = useCallback(() => t('models.noMatchingLoRAs'), [t]);
5960

6061
return (
61-
<FormControl isDisabled={!options.length}>
62+
<FormControl isDisabled={!options.length} gap={2}>
6263
<InformationalPopover feature="lora">
6364
<FormLabel>{t('models.concepts')} </FormLabel>
6465
</InformationalPopover>
@@ -71,6 +72,7 @@ const LoRASelect = () => {
7172
data-testid="add-lora"
7273
sx={selectStyles}
7374
/>
75+
<NavigateToModelManagerButton />
7476
</FormControl>
7577
);
7678
};

invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { useGroupedModelCombobox } from 'common/hooks/useGroupedModelCombobox';
33
import { typedMemo } from 'common/util/typedMemo';
44
import type { ModelIdentifierField } from 'features/nodes/types/common';
55
import { NO_DRAG_CLASS, NO_WHEEL_CLASS } from 'features/nodes/types/constants';
6+
import { NavigateToModelManagerButton } from 'features/parameters/components/MainModel/NavigateToModelManagerButton';
67
import type { AnyModelConfig } from 'services/api/types';
78

89
type Props<T extends AnyModelConfig> = {
@@ -44,6 +45,7 @@ const _ModelFieldCombobox = <T extends AnyModelConfig>({
4445
onChange={onChange}
4546
noOptionsMessage={noOptionsMessage}
4647
/>
48+
<NavigateToModelManagerButton />
4749
</FormControl>
4850
);
4951
};

invokeai/frontend/web/src/features/parameters/components/Advanced/ParamCLIPEmbedModelSelect.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
33
import { useModelCombobox } from 'common/hooks/useModelCombobox';
44
import { clipEmbedModelSelected, selectCLIPEmbedModel } from 'features/controlLayers/store/paramsSlice';
55
import { zModelIdentifierField } from 'features/nodes/types/common';
6+
import { NavigateToModelManagerButton } from 'features/parameters/components/MainModel/NavigateToModelManagerButton';
67
import { memo, useCallback } from 'react';
78
import { useTranslation } from 'react-i18next';
89
import { useCLIPEmbedModels } from 'services/api/hooks/modelsByType';
@@ -31,9 +32,10 @@ const ParamCLIPEmbedModelSelect = () => {
3132
});
3233

3334
return (
34-
<FormControl isDisabled={!options.length} isInvalid={!options.length} minW={0} flexGrow={1}>
35+
<FormControl isDisabled={!options.length} isInvalid={!options.length} minW={0} flexGrow={1} gap={2}>
3536
<FormLabel m={0}>{t('modelManager.clipEmbed')}</FormLabel>
3637
<Combobox value={value} options={options} onChange={onChange} noOptionsMessage={noOptionsMessage} />
38+
<NavigateToModelManagerButton />
3739
</FormControl>
3840
);
3941
};

invokeai/frontend/web/src/features/parameters/components/Advanced/ParamCLIPGEmbedModelSelect.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
33
import { useModelCombobox } from 'common/hooks/useModelCombobox';
44
import { clipGEmbedModelSelected, selectCLIPGEmbedModel } from 'features/controlLayers/store/paramsSlice';
55
import { zModelIdentifierField } from 'features/nodes/types/common';
6+
import { NavigateToModelManagerButton } from 'features/parameters/components/MainModel/NavigateToModelManagerButton';
67
import { memo, useCallback } from 'react';
78
import { useTranslation } from 'react-i18next';
89
import { useCLIPEmbedModels } from 'services/api/hooks/modelsByType';
@@ -32,9 +33,10 @@ const ParamCLIPEmbedModelSelect = () => {
3233
});
3334

3435
return (
35-
<FormControl isDisabled={!options.length} isInvalid={!options.length} minW={0} flexGrow={1}>
36+
<FormControl isDisabled={!options.length} isInvalid={!options.length} minW={0} flexGrow={1} gap={2}>
3637
<FormLabel m={0}>{t('modelManager.clipGEmbed')}</FormLabel>
3738
<Combobox value={value} options={options} onChange={onChange} noOptionsMessage={noOptionsMessage} />
39+
<NavigateToModelManagerButton />
3840
</FormControl>
3941
);
4042
};

invokeai/frontend/web/src/features/parameters/components/Advanced/ParamCLIPLEmbedModelSelect.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
33
import { useModelCombobox } from 'common/hooks/useModelCombobox';
44
import { clipLEmbedModelSelected, selectCLIPLEmbedModel } from 'features/controlLayers/store/paramsSlice';
55
import { zModelIdentifierField } from 'features/nodes/types/common';
6+
import { NavigateToModelManagerButton } from 'features/parameters/components/MainModel/NavigateToModelManagerButton';
67
import { memo, useCallback } from 'react';
78
import { useTranslation } from 'react-i18next';
89
import { useCLIPEmbedModels } from 'services/api/hooks/modelsByType';
@@ -32,9 +33,10 @@ const ParamCLIPEmbedModelSelect = () => {
3233
});
3334

3435
return (
35-
<FormControl isDisabled={!options.length} isInvalid={!options.length} minW={0} flexGrow={1}>
36+
<FormControl isDisabled={!options.length} isInvalid={!options.length} minW={0} flexGrow={1} gap={2}>
3637
<FormLabel m={0}>{t('modelManager.clipLEmbed')}</FormLabel>
3738
<Combobox value={value} options={options} onChange={onChange} noOptionsMessage={noOptionsMessage} />
39+
<NavigateToModelManagerButton />
3840
</FormControl>
3941
);
4042
};

invokeai/frontend/web/src/features/parameters/components/Advanced/ParamT5EncoderModelSelect.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
33
import { useModelCombobox } from 'common/hooks/useModelCombobox';
44
import { selectT5EncoderModel, t5EncoderModelSelected } from 'features/controlLayers/store/paramsSlice';
55
import { zModelIdentifierField } from 'features/nodes/types/common';
6+
import { NavigateToModelManagerButton } from 'features/parameters/components/MainModel/NavigateToModelManagerButton';
67
import { memo, useCallback } from 'react';
78
import { useTranslation } from 'react-i18next';
89
import { useT5EncoderModels } from 'services/api/hooks/modelsByType';
@@ -31,9 +32,10 @@ const ParamT5EncoderModelSelect = () => {
3132
});
3233

3334
return (
34-
<FormControl isDisabled={!options.length} isInvalid={!options.length} minW={0} flexGrow={1}>
35+
<FormControl isDisabled={!options.length} isInvalid={!options.length} minW={0} flexGrow={1} gap={2}>
3536
<FormLabel m={0}>{t('modelManager.t5Encoder')}</FormLabel>
3637
<Combobox value={value} options={options} onChange={onChange} noOptionsMessage={noOptionsMessage} />
38+
<NavigateToModelManagerButton />
3739
</FormControl>
3840
);
3941
};

0 commit comments

Comments
 (0)