diff --git a/web/src/components/extensions/SkillCardList.vue b/web/src/components/extensions/SkillCardList.vue index 00b6ddbc..9a5fd390 100644 --- a/web/src/components/extensions/SkillCardList.vue +++ b/web/src/components/extensions/SkillCardList.vue @@ -294,71 +294,87 @@ skills.sh - 查询开源 skills。 + 查询开源 skills。 也支持 ModelScope 单个 Skill + 地址,每次仅限安装一个:`https://modelscope.cn/skills/<skill-id>`。 Skill + ID 可在 + ModelScope Skill 市场 + 进入详情后从地址栏获取。
-
-
- 全选 - 反选 - 清空 +
@@ -392,65 +408,86 @@
-
-
- 全选 - 反选 - 清空 +
@@ -587,11 +624,15 @@ const remoteInstallForm = reactive({ const remoteSkillOptions = ref([]) const repoFilterKeyword = ref('') const selectedRepoSkills = ref([]) +const hasSingleRepoSkill = computed(() => remoteSkillOptions.value.length === 1) +const singleRepoSkill = computed(() => remoteSkillOptions.value[0] || null) const searchKeyword = ref('') const searchingRemoteSkills = ref(false) const searchedSkills = ref([]) const selectedSearchSkills = ref([]) +const hasSingleSearchedSkill = computed(() => searchedSkills.value.length === 1) +const singleSearchedSkill = computed(() => searchedSkills.value[0] || null) const repoHistory = ref([]) const allowedSkillAccessLevels = ref(['user']) @@ -1049,12 +1090,17 @@ const handleListRemoteSkills = async () => { try { const result = await skillApi.listRemoteSkills(source) remoteSkillOptions.value = result?.data || [] - selectedRepoSkills.value = [] + selectedRepoSkills.value = + remoteSkillOptions.value.length === 1 ? [remoteSkillOptions.value[0].name] : [] if (!remoteSkillOptions.value.length) { message.warning('未发现可安装的 Skills') return } - message.success(`已发现 ${remoteSkillOptions.value.length} 个 Skills`) + if (remoteSkillOptions.value.length === 1) { + message.success('已发现 1 个 Skill,已自动选中') + } else { + message.success(`已发现 ${remoteSkillOptions.value.length} 个 Skills`) + } // 保存成功的拉取历史 let history = [...repoHistory.value] @@ -1112,9 +1158,11 @@ const handleSearchRemoteSkills = async () => { try { const result = await skillApi.searchRemoteSkills(query) searchedSkills.value = result?.data || [] - selectedSearchSkills.value = [] + selectedSearchSkills.value = searchedSkills.value.length === 1 ? [...searchedSkills.value] : [] if (!searchedSkills.value.length) { message.warning('未搜索到相关的 Skills') + } else if (searchedSkills.value.length === 1) { + message.success('搜索到 1 个 Skill,已自动选中') } else { message.success(`搜索到 ${searchedSkills.value.length} 个 Skills`) } @@ -1627,6 +1675,45 @@ defineExpose({ } } + .single-remote-skill-card { + border: 1px solid var(--gray-150); + border-radius: 6px; + background: var(--gray-0); + padding: 12px; + } + + .single-remote-skill-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + min-width: 0; + + .ant-tag { + flex-shrink: 0; + margin-inline-end: 0; + } + } + + .single-remote-skill-name { + line-height: 20px; + font-weight: 600; + color: var(--gray-900); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .single-remote-skill-meta { + margin-top: 2px; + font-size: 12px; + line-height: 18px; + color: var(--gray-500); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + .skill-list-item-content { display: flex; align-items: center; diff --git a/web/src/components/shared/InfoCard.vue b/web/src/components/shared/InfoCard.vue index 3d0fbbb3..e35c54c5 100644 --- a/web/src/components/shared/InfoCard.vue +++ b/web/src/components/shared/InfoCard.vue @@ -283,7 +283,7 @@ const normalizedTags = computed(() => { } &-mini { - padding: 12px 14px; + padding: 16px 14px; gap: 0; }