From 2781d40e82199a0f1cba50d5bed031d03ad3c042 Mon Sep 17 00:00:00 2001 From: thisTom Date: Tue, 23 Jun 2026 10:07:14 +0800 Subject: [PATCH] =?UTF-8?q?fix(ui):=20=E4=BF=AE=E5=A4=8D=20Skills=20?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E4=B8=8E=E6=A8=A1=E5=9E=8B=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E4=BA=A4=E4=BA=92=E5=B1=95=E7=A4=BA=E9=97=AE=E9=A2=98=20(#4323?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(ui): improve skills and provider interactions * fix(skills): keep repo manager available on skills.sh * test(skills): cover repo switch after refresh * fix(skills): keep refresh available for empty repo results --------- Co-authored-by: thisTom <19346741+thisTom@users.noreply.github.com> --- src/App.tsx | 51 +++-- src/components/providers/ProviderCard.tsx | 10 +- .../providers/forms/OmoFormFields.tsx | 36 ++-- src/components/skills/SkillsPage.tsx | 65 +++++- src/components/ui/select.tsx | 7 +- tests/components/ProviderCardLayout.test.ts | 26 +++ tests/components/SelectItemIndicator.test.ts | 39 ++++ tests/components/SkillsPageInstall.test.tsx | 188 +++++++++++++++++- 8 files changed, 366 insertions(+), 56 deletions(-) create mode 100644 tests/components/ProviderCardLayout.test.ts create mode 100644 tests/components/SelectItemIndicator.test.ts diff --git a/src/App.tsx b/src/App.tsx index 966e48a6f..7a913e7ef 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -15,7 +15,6 @@ import { Book, Brain, Wrench, - RefreshCw, History, BarChart2, Download, @@ -71,7 +70,11 @@ import { FailoverToggle } from "@/components/proxy/FailoverToggle"; import UsageScriptModal from "@/components/UsageScriptModal"; import UnifiedMcpPanel from "@/components/mcp/UnifiedMcpPanel"; import PromptPanel from "@/components/prompts/PromptPanel"; -import { SkillsPage } from "@/components/skills/SkillsPage"; +import { + SkillsPage, + getSkillsPageHeaderActions, + type SkillsPageSource, +} from "@/components/skills/SkillsPage"; import UnifiedSkillsPanel from "@/components/skills/UnifiedSkillsPanel"; import { DeepLinkImportDialog } from "@/components/DeepLinkImportDialog"; import { FirstRunNoticeDialog } from "@/components/FirstRunNoticeDialog"; @@ -169,6 +172,8 @@ function App() { const sharedFeatureApp: AppId = activeApp === "claude-desktop" ? "claude" : activeApp; const [currentView, setCurrentView] = useState(getInitialView); + const [skillsDiscoverySource, setSkillsDiscoverySource] = + useState("repos"); const [settingsDefaultTab, setSettingsDefaultTab] = useState("general"); const [isAddOpen, setIsAddOpen] = useState(false); const [isWindowMaximized, setIsWindowMaximized] = useState(false); @@ -857,6 +862,11 @@ function App() { } }; + const handleOpenSkillsDiscovery = () => { + setSkillsDiscoverySource("repos"); + setCurrentView("skillsDiscovery"); + }; + const renderContent = () => { const content = (() => { switch (currentView) { @@ -884,7 +894,7 @@ function App() { return ( setCurrentView("skillsDiscovery")} + onOpenDiscovery={handleOpenSkillsDiscovery} currentApp={ sharedFeatureApp === "openclaw" ? "claude" : sharedFeatureApp } @@ -897,6 +907,7 @@ function App() { initialApp={ sharedFeatureApp === "openclaw" ? "claude" : sharedFeatureApp } + onSourceChange={setSkillsDiscoverySource} /> ); case "mcp": @@ -1312,7 +1323,7 @@ function App() { - + {getSkillsPageHeaderActions(skillsDiscoverySource).map( + ({ key, labelKey, Icon, execute }) => ( + + ), + )} )} {currentView === "providers" && ( diff --git a/src/components/providers/ProviderCard.tsx b/src/components/providers/ProviderCard.tsx index 7a06513d3..23bd7c308 100644 --- a/src/components/providers/ProviderCard.tsx +++ b/src/components/providers/ProviderCard.tsx @@ -320,7 +320,7 @@ export function ProviderCard({ )} />
-
+
-
+
-
+

{provider.name} @@ -451,7 +451,7 @@ export function ProviderCard({ type="button" onClick={handleOpenWebsite} className={cn( - "inline-flex items-center text-sm max-w-[280px]", + "inline-flex max-w-full items-center overflow-hidden text-left text-sm", isClickableUrl ? "text-blue-500 transition-colors hover:underline dark:text-blue-400 cursor-pointer" : "text-muted-foreground cursor-default", @@ -459,7 +459,7 @@ export function ProviderCard({ title={displayUrl} disabled={!isClickableUrl} > - {displayUrl} + {displayUrl} )}

diff --git a/src/components/providers/forms/OmoFormFields.tsx b/src/components/providers/forms/OmoFormFields.tsx index 7702f9a9d..fedb0527f 100644 --- a/src/components/providers/forms/OmoFormFields.tsx +++ b/src/components/providers/forms/OmoFormFields.tsx @@ -10,7 +10,6 @@ import { SelectContent, SelectItem, SelectTrigger, - SelectValue, } from "@/components/ui/select"; import { Popover, @@ -471,6 +470,19 @@ export function OmoFormFields({ const firstIsUnavailable = Boolean(currentVariant) && !(modelVariantsMap[currentModel] || []).includes(currentVariant); + const defaultVariantLabel = t("omo.defaultWrapped", { + defaultValue: "(Default)", + }); + const getVariantLabel = (variant: string, index: number) => + firstIsUnavailable && index === 0 + ? t("omo.currentValueUnavailable", { + value: variant, + defaultValue: "{{value}} (current value, unavailable)", + }) + : variant; + const selectedVariantLabel = currentVariant + ? getVariantLabel(currentVariant, 0) + : defaultVariantLabel; return (