From dd9c52644785d64b02acd62586fb03e30eb78dd3 Mon Sep 17 00:00:00 2001 From: CodingOnStar Date: Thu, 5 Mar 2026 16:45:37 +0800 Subject: [PATCH] refactor: update model-selector popup-item to support collapsible items and improve icon color handling --- .../solid/general/arrow-down-round-fill.svg | 2 +- .../model-selector/popup-item.tsx | 170 +++++++++--------- .../provider-added-card/quota-panel.tsx | 4 +- web/eslint-suppressions.json | 6 - 4 files changed, 90 insertions(+), 92 deletions(-) diff --git a/web/app/components/base/icons/assets/vender/solid/general/arrow-down-round-fill.svg b/web/app/components/base/icons/assets/vender/solid/general/arrow-down-round-fill.svg index 9566fcc0c3..ac9908a85a 100644 --- a/web/app/components/base/icons/assets/vender/solid/general/arrow-down-round-fill.svg +++ b/web/app/components/base/icons/assets/vender/solid/general/arrow-down-round-fill.svg @@ -1,5 +1,5 @@ - + diff --git a/web/app/components/header/account-setting/model-provider-page/model-selector/popup-item.tsx b/web/app/components/header/account-setting/model-provider-page/model-selector/popup-item.tsx index 56c589e7bd..25415fe0d9 100644 --- a/web/app/components/header/account-setting/model-provider-page/model-selector/popup-item.tsx +++ b/web/app/components/header/account-setting/model-provider-page/model-selector/popup-item.tsx @@ -4,6 +4,7 @@ import type { Model, ModelItem, } from '../declarations' +import { useState } from 'react' import { useTranslation } from 'react-i18next' import { Check } from '@/app/components/base/icons/src/vender/line/general' @@ -41,6 +42,7 @@ const PopupItem: FC = ({ model, onSelect, }) => { + const [collapsed, setCollapsed] = useState(false) const { t } = useTranslation() const language = useLanguage() const { setShowModelModal } = useModalContext() @@ -73,99 +75,101 @@ const PopupItem: FC = ({ return (
-
+
setCollapsed(prev => !prev)} + > {model.label[language] || model.label.en_US} +
- { - model.models.map(modelItem => ( - -
- -
{modelItem.label[language] || modelItem.label.en_US}
-
- {/* {currentProvider?.description && ( -
{currentProvider?.description?.[language] || currentProvider?.description?.en_US}
- )} */} -
- {!!modelItem.model_type && ( - - {modelTypeFormat(modelItem.model_type)} - - )} - {!!modelItem.model_properties.mode && ( - - {(modelItem.model_properties.mode as string).toLocaleUpperCase()} - - )} - {!!modelItem.model_properties.context_size && ( - - {sizeFormat(modelItem.model_properties.context_size as number)} - - )} -
- {[ModelTypeEnum.textGeneration, ModelTypeEnum.textEmbedding, ModelTypeEnum.rerank].includes(modelItem.model_type as ModelTypeEnum) - && modelItem.features?.some(feature => [ModelFeatureEnum.vision, ModelFeatureEnum.audio, ModelFeatureEnum.video, ModelFeatureEnum.document].includes(feature)) - && ( -
-
{t('model.capabilities', { ns: 'common' })}
-
- {modelItem.features?.map(feature => ( - - ))} -
-
- )} -
- )} - > -
handleSelect(model.provider, modelItem)} - > -
+ {!collapsed && model.models.map(modelItem => ( + +
- +
{modelItem.label[language] || modelItem.label.en_US}
- { - defaultModel?.model === modelItem.model && defaultModel.provider === currentProvider.provider && ( - - ) - } - { - modelItem.status === ModelStatusEnum.noConfigure && ( -
- {t('operation.add', { ns: 'common' }).toLocaleUpperCase()} + {/* {currentProvider?.description && ( +
{currentProvider?.description?.[language] || currentProvider?.description?.en_US}
+ )} */} +
+ {!!modelItem.model_type && ( + + {modelTypeFormat(modelItem.model_type)} + + )} + {!!modelItem.model_properties.mode && ( + + {(modelItem.model_properties.mode as string).toLocaleUpperCase()} + + )} + {!!modelItem.model_properties.context_size && ( + + {sizeFormat(modelItem.model_properties.context_size as number)} + + )} +
+ {[ModelTypeEnum.textGeneration, ModelTypeEnum.textEmbedding, ModelTypeEnum.rerank].includes(modelItem.model_type as ModelTypeEnum) + && modelItem.features?.some(feature => [ModelFeatureEnum.vision, ModelFeatureEnum.audio, ModelFeatureEnum.video, ModelFeatureEnum.document].includes(feature)) + && ( +
+
{t('model.capabilities', { ns: 'common' })}
+
+ {modelItem.features?.map(feature => ( + + ))} +
- ) - } + )}
-
- )) - } + )} + > +
handleSelect(model.provider, modelItem)} + > +
+ + +
+ { + defaultModel?.model === modelItem.model && defaultModel.provider === currentProvider.provider && ( + + ) + } + { + modelItem.status === ModelStatusEnum.noConfigure && ( +
+ {t('operation.add', { ns: 'common' }).toLocaleUpperCase()} +
+ ) + } +
+ + ))}
) } diff --git a/web/app/components/header/account-setting/model-provider-page/provider-added-card/quota-panel.tsx b/web/app/components/header/account-setting/model-provider-page/provider-added-card/quota-panel.tsx index d44c201e0e..36a15b2a42 100644 --- a/web/app/components/header/account-setting/model-provider-page/provider-added-card/quota-panel.tsx +++ b/web/app/components/header/account-setting/model-provider-page/provider-added-card/quota-panel.tsx @@ -108,13 +108,13 @@ const QuotaPanel: FC = ({ return (
-
+
{t('modelProvider.quota', { ns: 'common' })} modelNameMap[key as keyof typeof modelNameMap]).filter(Boolean).join(', ') })} />
- {formatNumber(credits)} + {formatNumber(credits)} {t('modelProvider.credits', { ns: 'common' })} {currentWorkspace.next_credit_reset_date ? ( diff --git a/web/eslint-suppressions.json b/web/eslint-suppressions.json index 0880084320..6bf15e5788 100644 --- a/web/eslint-suppressions.json +++ b/web/eslint-suppressions.json @@ -4899,9 +4899,6 @@ "app/components/header/account-setting/model-provider-page/model-selector/popup-item.tsx": { "no-restricted-imports": { "count": 1 - }, - "tailwindcss/enforce-consistent-class-order": { - "count": 3 } }, "app/components/header/account-setting/model-provider-page/model-selector/popup.tsx": { @@ -4978,9 +4975,6 @@ "app/components/header/account-setting/model-provider-page/provider-added-card/quota-panel.tsx": { "no-restricted-imports": { "count": 1 - }, - "tailwindcss/enforce-consistent-class-order": { - "count": 2 } }, "app/components/header/account-setting/model-provider-page/provider-icon/index.tsx": {