Skip to content

Commit 9d129f8

Browse files
committed
feat: add ToolStoreDescDrawer component and integrate with ToolListContainer
--story=1019826 --user=刘瑞斌 工具- 工具商店的工具,点击面板可以打开详情抽屉 https://www.tapd.cn/62980211/s/1782377
1 parent 39c3e13 commit 9d129f8

File tree

2 files changed

+101
-0
lines changed

2 files changed

+101
-0
lines changed

ui/src/views/tool/component/ToolListContainer.vue

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,7 @@
359359
ref="ResourceAuthorizationDrawerRef"
360360
v-if="apiType === 'workspace'"
361361
/>
362+
<ToolStoreDescDrawer ref="toolStoreDescDrawerRef" />
362363
</template>
363364

364365
<script lang="ts" setup>
@@ -383,6 +384,7 @@ import permissionMap from '@/permission'
383384
import useStore from '@/stores'
384385
import { t } from '@/locales'
385386
import ToolStoreApi from '@/api/tool/store.ts'
387+
import ToolStoreDescDrawer from "@/views/tool/component/ToolStoreDescDrawer.vue";
386388
const route = useRoute()
387389
const { folder, user, tool } = useStore()
388390
onBeforeRouteLeave((to, from) => {
@@ -473,12 +475,22 @@ function openAuthorizedWorkspaceDialog(row: any) {
473475
}
474476
}
475477
478+
const toolStoreDescDrawerRef = ref<InstanceType<typeof ToolStoreDescDrawer>>()
476479
function openCreateDialog(data?: any) {
477480
// mcp工具
478481
if (data?.tool_type === 'MCP') {
479482
openCreateMcpDialog(data)
480483
return
481484
}
485+
// 有版本号的展示readme,是商店更新过来的
486+
if (data?.version) {
487+
let readMe = ''
488+
storeTools.value.filter((item) => item.id === data.template_id).forEach((item) => {
489+
readMe = item.readMe
490+
})
491+
toolStoreDescDrawerRef.value?.open(readMe, data)
492+
return
493+
}
482494
// 有template_id的不允许编辑,是模板转换来的
483495
if (data?.template_id) {
484496
return
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
<template>
2+
<el-drawer v-model="visibleInternalDesc" size="60%" :append-to-body="true">
3+
<template #header>
4+
<div class="flex align-center" style="margin-left: -8px">
5+
<el-button class="cursor mr-4" link @click.prevent="visibleInternalDesc = false">
6+
<el-icon :size="20">
7+
<Back />
8+
</el-icon>
9+
</el-button>
10+
<h4>详情</h4>
11+
</div>
12+
</template>
13+
14+
<div>
15+
<div class="card-header">
16+
<div class="flex-between">
17+
<div class="title flex align-center">
18+
<el-avatar
19+
v-if="isAppIcon(toolDetail?.icon)"
20+
shape="square"
21+
:size="64"
22+
style="background: none"
23+
class="mr-8"
24+
>
25+
<img :src="toolDetail?.icon" alt="" />
26+
</el-avatar>
27+
<el-avatar
28+
v-else-if="toolDetail?.name"
29+
:name="toolDetail?.name"
30+
pinyinColor
31+
shape="square"
32+
:size="64"
33+
class="mr-8"
34+
/>
35+
<div class="ml-16">
36+
<h3 class="mb-8">{{ toolDetail.name }}</h3>
37+
<el-text type="info" v-if="toolDetail?.desc">
38+
{{ toolDetail.desc }}
39+
</el-text>
40+
</div>
41+
</div>
42+
</div>
43+
44+
<div class="mt-16">
45+
<el-text type="info">
46+
<div>{{ $t('common.author') }}: MaxKB</div>
47+
</el-text>
48+
</div>
49+
</div>
50+
<MdPreview
51+
ref="editorRef"
52+
editorId="preview-only"
53+
:modelValue="markdownContent"
54+
style="background: none"
55+
noImgZoomIn
56+
/>
57+
</div>
58+
</el-drawer>
59+
</template>
60+
61+
<script setup lang="ts">
62+
import { ref, watch } from 'vue'
63+
import { cloneDeep } from 'lodash'
64+
import { isAppIcon } from '@/utils/common'
65+
const emit = defineEmits(['refresh', 'addTool'])
66+
67+
const visibleInternalDesc = ref(false)
68+
const markdownContent = ref('')
69+
const toolDetail = ref<any>({})
70+
71+
watch(visibleInternalDesc, (bool) => {
72+
if (!bool) {
73+
markdownContent.value = ''
74+
}
75+
})
76+
77+
const open = (data: any, detail: any) => {
78+
toolDetail.value = detail
79+
if (data) {
80+
markdownContent.value = cloneDeep(data)
81+
}
82+
visibleInternalDesc.value = true
83+
}
84+
85+
defineExpose({
86+
open
87+
})
88+
</script>
89+
<style lang="scss"></style>

0 commit comments

Comments
 (0)