|
1 | | -import { useState } from "react"; |
| 1 | +import { useMemo, useState } from "react"; |
2 | 2 | import { useTranslation } from "react-i18next"; |
3 | 3 |
|
4 | 4 | import { Modal, Button, Switch, App, Tooltip, Input } from "antd"; |
@@ -57,6 +57,7 @@ export const ModelDeleteDialog = ({ |
57 | 57 | const [selectedModelForSettings, setSelectedModelForSettings] = |
58 | 58 | useState<any>(null); |
59 | 59 | const [modelMaxTokens, setModelMaxTokens] = useState("4096"); |
| 60 | + const [providerModelSearchTerm, setProviderModelSearchTerm] = useState(""); |
60 | 61 |
|
61 | 62 | // Get model color scheme |
62 | 63 | const getModelColorScheme = ( |
@@ -305,6 +306,7 @@ export const ModelDeleteDialog = ({ |
305 | 306 | return; |
306 | 307 | } |
307 | 308 | setSelectedSource(source); |
| 309 | + setProviderModelSearchTerm(""); |
308 | 310 | }; |
309 | 311 |
|
310 | 312 | const handleEditModel = (model: ModelOption) => { |
@@ -415,8 +417,28 @@ export const ModelDeleteDialog = ({ |
415 | 417 | setProviderModels([]); |
416 | 418 | setPendingSelectedProviderIds(new Set()); |
417 | 419 | setMaxTokens(0); |
| 420 | + setProviderModelSearchTerm(""); |
418 | 421 | onClose(); |
419 | 422 | }; |
| 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 | + |
420 | 442 |
|
421 | 443 | // Handle provider config save |
422 | 444 | const handleProviderConfigSave = async ({ |
@@ -621,6 +643,7 @@ export const ModelDeleteDialog = ({ |
621 | 643 | onClick={() => { |
622 | 644 | setDeletingModelType(type); |
623 | 645 | setSelectedSource(null); |
| 646 | + setProviderModelSearchTerm(""); |
624 | 647 | // Initialize maxTokens with a value from existing models of this type |
625 | 648 | const existingModel = customModels.find( |
626 | 649 | (model) => model.type === type |
@@ -768,6 +791,7 @@ export const ModelDeleteDialog = ({ |
768 | 791 | onClick={() => { |
769 | 792 | setSelectedSource(null); |
770 | 793 | setProviderModels([]); |
| 794 | + setProviderModelSearchTerm(""); |
771 | 795 | }} |
772 | 796 | className="text-blue-500 hover:text-blue-700 flex items-center" |
773 | 797 | > |
@@ -819,7 +843,25 @@ export const ModelDeleteDialog = ({ |
819 | 843 | {selectedSource === MODEL_SOURCES.SILICON && |
820 | 844 | providerModels.length > 0 ? ( |
821 | 845 | <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) => { |
823 | 865 | const checked = pendingSelectedProviderIds.has( |
824 | 866 | providerModel.id |
825 | 867 | ); |
|
0 commit comments