Skip to content

Commit 1ac2d19

Browse files
committed
🐛 Add filtering in the custom model modification section as well #1754
1 parent 5a671e3 commit 1ac2d19

File tree

1 file changed

+44
-2
lines changed

1 file changed

+44
-2
lines changed

frontend/app/[locale]/models/components/model/ModelDeleteDialog.tsx

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useState } from "react";
1+
import { useMemo, useState } from "react";
22
import { useTranslation } from "react-i18next";
33

44
import { Modal, Button, Switch, App, Tooltip, Input } from "antd";
@@ -57,6 +57,7 @@ export const ModelDeleteDialog = ({
5757
const [selectedModelForSettings, setSelectedModelForSettings] =
5858
useState<any>(null);
5959
const [modelMaxTokens, setModelMaxTokens] = useState("4096");
60+
const [providerModelSearchTerm, setProviderModelSearchTerm] = useState("");
6061

6162
// Get model color scheme
6263
const getModelColorScheme = (
@@ -305,6 +306,7 @@ export const ModelDeleteDialog = ({
305306
return;
306307
}
307308
setSelectedSource(source);
309+
setProviderModelSearchTerm("");
308310
};
309311

310312
const handleEditModel = (model: ModelOption) => {
@@ -415,8 +417,28 @@ export const ModelDeleteDialog = ({
415417
setProviderModels([]);
416418
setPendingSelectedProviderIds(new Set());
417419
setMaxTokens(0);
420+
setProviderModelSearchTerm("");
418421
onClose();
419422
};
423+
const filteredProviderModels = useMemo(() => {
424+
const keyword = providerModelSearchTerm.trim().toLowerCase();
425+
if (!keyword) {
426+
return providerModels;
427+
}
428+
return providerModels.filter((model) => {
429+
const candidates = [
430+
model?.id,
431+
model?.model_name,
432+
model?.model_tag,
433+
model?.description,
434+
];
435+
return candidates.some(
436+
(text) =>
437+
typeof text === "string" && text.toLowerCase().includes(keyword)
438+
);
439+
});
440+
}, [providerModels, providerModelSearchTerm]);
441+
420442

421443
// Handle provider config save
422444
const handleProviderConfigSave = async ({
@@ -621,6 +643,7 @@ export const ModelDeleteDialog = ({
621643
onClick={() => {
622644
setDeletingModelType(type);
623645
setSelectedSource(null);
646+
setProviderModelSearchTerm("");
624647
// Initialize maxTokens with a value from existing models of this type
625648
const existingModel = customModels.find(
626649
(model) => model.type === type
@@ -768,6 +791,7 @@ export const ModelDeleteDialog = ({
768791
onClick={() => {
769792
setSelectedSource(null);
770793
setProviderModels([]);
794+
setProviderModelSearchTerm("");
771795
}}
772796
className="text-blue-500 hover:text-blue-700 flex items-center"
773797
>
@@ -819,7 +843,25 @@ export const ModelDeleteDialog = ({
819843
{selectedSource === MODEL_SOURCES.SILICON &&
820844
providerModels.length > 0 ? (
821845
<div className="max-h-60 overflow-y-auto border border-gray-200 rounded-md divide-y divide-gray-200">
822-
{providerModels.map((providerModel: any) => {
846+
{providerModels.length > 0 && (
847+
<div className="sticky top-0 z-10 bg-white p-2">
848+
<Input
849+
allowClear
850+
size="small"
851+
placeholder={t("model.dialog.modelList.searchPlaceholder")}
852+
value={providerModelSearchTerm}
853+
onChange={(event) =>
854+
setProviderModelSearchTerm(event.target.value)
855+
}
856+
/>
857+
</div>
858+
)}
859+
{filteredProviderModels.length === 0 && (
860+
<div className="p-4 text-center text-xs text-gray-500">
861+
{t("model.dialog.modelList.noResults")}
862+
</div>
863+
)}
864+
{filteredProviderModels.map((providerModel: any) => {
823865
const checked = pendingSelectedProviderIds.has(
824866
providerModel.id
825867
);

0 commit comments

Comments
 (0)