feat(channels): 增加模型摘要徽章和工具提示功能
在频道页面中添加了模型摘要徽章和工具提示,以便用户能够更直观地了解每个频道的模型信息。通过引入新的 `renderModelSummaryBadge` 函数,徽章现在可以显示模型的启用状态,并在用户悬停时提供详细的模型名称。此更改旨在提升用户体验,使得频道信息更加清晰易懂,尤其是在处理多个模型时,用户能够快速识别各个模型的状态和相关信息。
This commit is contained in:
1 parent
654a420a63
commit
b03b660de7
1 file changed
+45
-11
@@ -1105,6 +1105,29 @@ export function Channels({ createMode = false, editRoute = false }: { createMode
|
||||
});
|
||||
const endpointPreview = getChannelEndpointPreview(formData.type, formData.endpoint);
|
||||
const endpointPlaceholder = getChannelEndpointPlaceholder(formData.type);
|
||||
const renderModelSummaryBadge = (modelSummary: string, modelTooltipText: string, className: string) => {
|
||||
const badge = (
|
||||
<span
|
||||
className={cn(className, modelTooltipText && "cursor-help")}
|
||||
tabIndex={modelTooltipText ? 0 : undefined}
|
||||
>
|
||||
{modelSummary}
|
||||
</span>
|
||||
);
|
||||
|
||||
if (!modelTooltipText) {
|
||||
return badge;
|
||||
}
|
||||
|
||||
return (
|
||||
<Tooltip>
|
||||
<TooltipTrigger asChild>{badge}</TooltipTrigger>
|
||||
<TooltipContent className="max-w-sm whitespace-normal break-words leading-relaxed">
|
||||
{modelTooltipText}
|
||||
</TooltipContent>
|
||||
</Tooltip>
|
||||
);
|
||||
};
|
||||
|
||||
if (view === "list") {
|
||||
return (
|
||||
@@ -1172,17 +1195,23 @@ export function Channels({ createMode = false, editRoute = false }: { createMode
|
||||
</CardContent>
|
||||
</Card>
|
||||
) : (
|
||||
<Card>
|
||||
<TooltipProvider delayDuration={120}>
|
||||
<Card>
|
||||
<div className="divide-y">
|
||||
{filteredData?.map((channel) => {
|
||||
const rawConfig = parseChannelValue(channel);
|
||||
const config = normalizeChannelFormConfig(rawConfig);
|
||||
const modelCount = (config.models || []).length;
|
||||
const enabledModelCount = (config.models || []).filter((model) => model.enabled !== false).length;
|
||||
const models = config.models || [];
|
||||
const modelCount = models.length;
|
||||
const enabledModelCount = models.filter((model) => model.enabled !== false).length;
|
||||
const modelSummary =
|
||||
enabledModelCount === modelCount
|
||||
? t("channels.modelCount", { count: modelCount })
|
||||
: t("channels.modelCountPartial", { enabled: enabledModelCount, total: modelCount });
|
||||
const modelTooltipText = models
|
||||
.map((model) => (model.name || model.id || "").trim())
|
||||
.filter(Boolean)
|
||||
.join(", ");
|
||||
const isMenuOpen = openMenu === channel.key;
|
||||
const isEnabled = config.enabled !== false;
|
||||
const isToggling =
|
||||
@@ -1232,9 +1261,11 @@ export function Channels({ createMode = false, editRoute = false }: { createMode
|
||||
<span className="px-2 py-0.5 rounded bg-muted text-muted-foreground text-xs">
|
||||
{getTypeLabel(config.type)}
|
||||
</span>
|
||||
<span className="px-2 py-0.5 rounded bg-indigo-500/10 text-indigo-500 text-xs">
|
||||
{modelSummary}
|
||||
</span>
|
||||
{renderModelSummaryBadge(
|
||||
modelSummary,
|
||||
modelTooltipText,
|
||||
"px-2 py-0.5 rounded bg-indigo-500/10 text-indigo-500 text-xs",
|
||||
)}
|
||||
<span className="px-2 py-0.5 rounded bg-amber-500/10 text-amber-600 text-xs">
|
||||
{config.weight ?? 0}
|
||||
</span>
|
||||
@@ -1276,9 +1307,11 @@ export function Channels({ createMode = false, editRoute = false }: { createMode
|
||||
{config.endpoint.replace(/^https?:\/\//, "").split("/")[0]}
|
||||
</div>
|
||||
<div className="text-xs text-center flex-shrink-0">
|
||||
<span className="text-indigo-500 bg-indigo-500/10 px-3 h-6 rounded-full flex items-center justify-center">
|
||||
{modelSummary}
|
||||
</span>
|
||||
{renderModelSummaryBadge(
|
||||
modelSummary,
|
||||
modelTooltipText,
|
||||
"text-indigo-500 bg-indigo-500/10 px-3 h-6 rounded-full flex items-center justify-center",
|
||||
)}
|
||||
</div>
|
||||
<div className="text-xs text-center flex-shrink-0">
|
||||
<span className="text-amber-600 bg-amber-500/10 w-6 h-6 rounded-full flex items-center justify-center">
|
||||
@@ -1310,11 +1343,12 @@ export function Channels({ createMode = false, editRoute = false }: { createMode
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
{filteredData?.length === 0 && searchQuery && (
|
||||
{filteredData?.length === 0 && (
|
||||
<div className="p-8 text-center text-muted-foreground">{t("channels.noMatchingChannels")}</div>
|
||||
)}
|
||||
</div>
|
||||
</Card>
|
||||
</Card>
|
||||
</TooltipProvider>
|
||||
)}
|
||||
</PageContainer>
|
||||
);
|
||||
|
||||
Reference in new issue
Block a user