feat: folder

This commit is contained in:
wangdan-fit2cloud 2025-06-19 17:10:39 +08:00
parent e02d417af9
commit 2e15552853
14 changed files with 336 additions and 295 deletions

View File

@ -41,7 +41,7 @@
{{ $t('common.cancel') }}
</el-button>
<el-button type="primary" @click="submitHandle" :loading="loading">
{{ $t('common.add') }}
{{ isEdit ? $t('common.confirm') : $t('common.add') }}
</el-button>
</span>
</template>
@ -67,6 +67,7 @@ const loading = ref(false)
const dialogVisible = ref<boolean>(false)
const sourceType = ref<any>('')
const isEdit = ref<boolean>(false)
const editId = ref<string>('')
const folderForm = ref<any>({
name: '',
@ -98,11 +99,16 @@ watch(dialogVisible, (bool) => {
const open = (source: string, id: string, data?: any) => {
sourceType.value = source
folderForm.value.parent_id = id
if (data) {
// id
editId.value = data.id
folderForm.value.name = data.name
folderForm.value.desc = data.desc
folderForm.value.parent_id = data.parent_id
isEdit.value = true
} else {
// idid
folderForm.value.parent_id = id
}
dialogVisible.value = true
}
@ -111,11 +117,13 @@ const submitHandle = async () => {
await FolderFormRef.value.validate((valid: any) => {
if (valid) {
if (isEdit.value) {
folderApi.putFolder(sourceType.value, folderForm.value, loading).then((res) => {
MsgSuccess(t('common.editSuccess'))
emit('refresh')
dialogVisible.value = false
})
folderApi
.putFolder(editId.value, sourceType.value, folderForm.value, loading)
.then((res) => {
MsgSuccess(t('common.editSuccess'))
emit('refresh')
dialogVisible.value = false
})
} else {
folderApi.postFolder(sourceType.value, folderForm.value, loading).then((res) => {
MsgSuccess(t('common.createSuccess'))

View File

@ -27,6 +27,7 @@
highlight-current
class="overflow-inherit_node__children"
node-key="id"
v-loading="loading"
>
<template #default="{ node, data }">
<div class="flex-between w-full" @mouseenter.stop="handleMouseEnter(data)">
@ -36,6 +37,7 @@
</div>
<div
v-if="canOperation"
@click.stop
v-show="hoverNodeId === data.id"
@mouseenter.stop="handleMouseEnter(data)"
@ -103,6 +105,10 @@ const props = defineProps({
type: String,
default: 'views.system.share_knowledge',
},
canOperation: {
type: Boolean,
default: true,
},
})
interface Tree {
name: string
@ -122,11 +128,12 @@ const treeRef = ref<TreeInstance>()
const filterText = ref('')
const hoverNodeId = ref<string | undefined>('')
const title = ref('')
const loading = ref(false)
watch(filterText, (val) => {
treeRef.value!.filter(val)
})
let time
let time: any
function handleMouseEnter(data: Tree) {
clearTimeout(time)
@ -153,7 +160,7 @@ const handleSharedNodeClick = () => {
}
function deleteFolder(row: Tree) {
folderApi.delFolder(row.id as string, props.source).then(() => {
folderApi.delFolder(row.id as string, props.source, loading).then(() => {
emit('refreshTree')
})
}

View File

@ -2,11 +2,11 @@
<div v-infinite-scroll="loadData" :infinite-scroll-disabled="disabledScroll">
<slot />
</div>
<div style="padding: 16px 10px">
<el-divider v-if="size > 0 && loading">
<div style="padding: 0 10px 16px">
<el-divider v-if="size > 0 && loading" style="background: none">
<el-text type="info"> {{ $t('components.loading') }}...</el-text>
</el-divider>
<el-divider v-if="noMore">
<el-divider v-if="noMore" style="background: none !important">
<el-text type="info"> {{ $t('components.noMore') }}</el-text>
</el-divider>
</div>
@ -21,27 +21,27 @@ const props = defineProps({
*/
size: {
type: Number,
default: 0
default: 0,
},
/**
* 总数
*/
total: {
type: Number,
default: 0
default: 0,
},
/**
* 总数
*/
page_size: {
type: Number,
default: 0
default: 0,
},
current_page: {
type: Number,
default: 0
default: 0,
},
loading: Boolean
loading: Boolean,
})
const emit = defineEmits(['update:current_page', 'load'])
@ -53,12 +53,12 @@ watch(
if (val === 1) {
current.value = 1
}
}
},
)
const noMore = computed(
() =>
props.size > 0 && props.size === props.total && props.total > props.page_size && !props.loading
props.size > 0 && props.size === props.total && props.total > props.page_size && !props.loading,
)
const disabledScroll = computed(() => props.size > 0 && (props.loading || noMore.value))

View File

@ -11,10 +11,11 @@
<slot name="search"> </slot>
</div>
</div>
<div class="content-container__main p-16">
<slot></slot>
</div>
<el-scrollbar>
<div class="content-container__main p-16">
<slot></slot>
</div>
</el-scrollbar>
</div>
</template>

View File

@ -241,3 +241,7 @@
.el-form--label-top .el-form-item .el-form-item__label {
padding-right: 0;
}
.el-divider__text {
background: var(--app-layout-bg-color);
}

View File

@ -43,6 +43,7 @@
@handleNodeClick="folderClickHandel"
class="p-8"
v-loading="folderLoading"
:canOperation="false"
/>
</template>
<el-scrollbar>

View File

@ -7,6 +7,7 @@
:data="folderList"
:currentNodeKey="currentFolder?.id"
@handleNodeClick="folderClickHandel"
@refreshTree="refreshFolder"
class="p-8"
/>
</template>
@ -129,7 +130,10 @@
</el-dropdown>
</div>
</template>
<div v-loading.fullscreen.lock="paginationConfig.current_page === 1 && loading">
<div
v-loading.fullscreen.lock="paginationConfig.current_page === 1 && loading"
style="max-height: calc(100vh - 140px)"
>
<InfiniteScroll
:size="applicationList.length"
:total="paginationConfig.total"
@ -367,21 +371,6 @@ function getList() {
})
}
function getFolder() {
const params = {}
folder.asyncGetFolder(FolderSource.APPLICATION, params, loading).then((res: any) => {
folderList.value = res.data
currentFolder.value = res.data?.[0] || {}
getList()
})
}
function folderClickHandel(row: any) {
currentFolder.value = row
applicationList.value = []
getList()
}
function clickFolder(item: any) {
currentFolder.value.id = item.id
applicationList.value = []
@ -482,15 +471,6 @@ const exportApplication = (application: any) => {
})
}
const CreateFolderDialogRef = ref()
function openCreateFolder() {
CreateFolderDialogRef.value.open(FolderSource.APPLICATION, currentFolder.value.parent_id)
}
function refreshFolder() {
applicationList.value = []
getFolder()
getList()
}
const elUploadRef = ref()
const importApplication = (file: any) => {
const formData = new FormData()
@ -515,8 +495,34 @@ const importApplication = (file: any) => {
})
}
onMounted(() => {
//
const CreateFolderDialogRef = ref()
function openCreateFolder() {
CreateFolderDialogRef.value.open(FolderSource.APPLICATION, currentFolder.value.id)
}
function getFolder(bool?: boolean) {
const params = {}
folder.asyncGetFolder(FolderSource.APPLICATION, params, loading).then((res: any) => {
folderList.value = res.data
if (bool) {
//
currentFolder.value = res.data?.[0] || {}
}
getList()
})
}
function folderClickHandel(row: any) {
currentFolder.value = row
applicationList.value = []
getList()
}
function refreshFolder() {
applicationList.value = []
getFolder()
}
onMounted(() => {
getFolder(true)
})
</script>

View File

@ -61,14 +61,14 @@ const props = withDefaults(
next_disable: boolean
}>(),
{}
{},
)
const emit = defineEmits(['update:chatId', 'update:currentAbstract', 'refresh'])
const route = useRoute()
const {
params: { id }
params: { id },
} = route
const loading = ref(false)
const visible = ref(false)
@ -77,7 +77,7 @@ const recordList = ref<chatType[]>([])
const paginationConfig = reactive({
current_page: 1,
page_size: 20,
total: 0
total: 0,
})
function closeHandle() {
@ -93,7 +93,7 @@ function getChatRecord() {
paginationConfig.total = res.data.total
const list = res.data.records
recordList.value = [...list, ...recordList.value].sort((a, b) =>
a.create_time.localeCompare(b.create_time)
a.create_time.localeCompare(b.create_time),
)
if (paginationConfig.current_page === 1) {
nextTick(() => {
@ -113,7 +113,7 @@ watch(
if (props.chatId) {
getChatRecord()
}
}
},
)
watch(visible, (bool) => {
@ -143,7 +143,7 @@ const open = () => {
}
defineExpose({
open
open,
})
</script>
<style lang="scss">
@ -158,9 +158,5 @@ defineExpose({
background: var(--app-layout-bg-color);
padding: 0;
}
:deep(.el-divider__text) {
background: var(--app-layout-bg-color);
}
}
</style>

View File

@ -146,7 +146,11 @@
</el-dropdown>
</div>
</template>
<div v-loading.fullscreen.lock="paginationConfig.current_page === 1 && loading">
<div
v-loading.fullscreen.lock="paginationConfig.current_page === 1 && loading"
style="max-height: calc(100vh - 140px)"
>
<InfiniteScroll
:size="knowledgeList.length"
:total="paginationConfig.total"
@ -456,34 +460,12 @@ function getList() {
})
}
function getFolder() {
const params = {}
folder.asyncGetFolder(FolderSource.KNOWLEDGE, params, loading).then((res: any) => {
folderList.value = res.data
currentFolder.value = res.data?.[0] || {}
getList()
})
}
function folderClickHandel(row: any) {
currentFolder.value = row
knowledgeList.value = []
if (currentFolder.value.id === 'share') return
getList()
}
function clickFolder(item: any) {
currentFolder.value.id = item.id
knowledgeList.value = []
getList()
}
const CreateFolderDialogRef = ref()
function openCreateFolder() {
CreateFolderDialogRef.value.open(FolderSource.KNOWLEDGE, currentFolder.value.parent_id)
}
const GenerateRelatedDialogRef = ref<InstanceType<typeof GenerateRelatedDialog>>()
function openGenerateDialog(row: any) {
if (GenerateRelatedDialogRef.value) {
@ -521,14 +503,36 @@ function deleteKnowledge(row: any) {
.catch(() => {})
}
//
const CreateFolderDialogRef = ref()
function openCreateFolder() {
CreateFolderDialogRef.value.open(FolderSource.KNOWLEDGE, currentFolder.value.id)
}
function getFolder(bool?: boolean) {
const params = {}
folder.asyncGetFolder(FolderSource.KNOWLEDGE, params, loading).then((res: any) => {
folderList.value = res.data
if (bool) {
//
currentFolder.value = res.data?.[0] || {}
}
getList()
})
}
function folderClickHandel(row: any) {
currentFolder.value = row
knowledgeList.value = []
if (currentFolder.value.id === 'share') return
getList()
}
function refreshFolder() {
console.log(currentFolder.value)
knowledgeList.value = []
getFolder()
getList()
}
onMounted(() => {
getFolder()
getFolder(true)
})
</script>

View File

@ -324,7 +324,7 @@ function clickFolder(item: any) {
const CreateFolderDialogRef = ref()
function openCreateFolder() {
CreateFolderDialogRef.value.open('KNOWLEDGE', currentFolder.value.parent_id)
CreateFolderDialogRef.value.open('KNOWLEDGE', currentFolder.value.id)
}
const GenerateRelatedDialogRef = ref<InstanceType<typeof GenerateRelatedDialog>>()

View File

@ -426,7 +426,7 @@ function configInitParams(item: any) {
const CreateFolderDialogRef = ref()
function openCreateFolder() {
CreateFolderDialogRef.value.open('TOOL', currentFolder.value.parent_id)
CreateFolderDialogRef.value.open('TOOL', currentFolder.value.id)
}
const elUploadRef = ref()

View File

@ -242,7 +242,7 @@ function folderClickHandel(row: any) {
const CreateFolderDialogRef = ref()
function openCreateFolder() {
CreateFolderDialogRef.value.open('KNOWLEDGE', currentFolder.value.parent_id)
CreateFolderDialogRef.value.open('KNOWLEDGE', currentFolder.value.id)
}
const GenerateRelatedDialogRef = ref<InstanceType<typeof GenerateRelatedDialog>>()

View File

@ -386,7 +386,7 @@ function folderClickHandel(row: any) {
const CreateFolderDialogRef = ref()
function openCreateFolder() {
CreateFolderDialogRef.value.open('KNOWLEDGE', currentFolder.value.parent_id)
CreateFolderDialogRef.value.open('KNOWLEDGE', currentFolder.value.id)
}
const GenerateRelatedDialogRef = ref<InstanceType<typeof GenerateRelatedDialog>>()

View File

@ -7,6 +7,7 @@
:data="folderList"
:currentNodeKey="currentFolder?.id"
@handleNodeClick="folderClickHandel"
@refreshTree ="refreshFolder"
shareTitle="views.system.share_tool"
isShared
class="p-8"
@ -109,183 +110,195 @@
</div>
</template>
<div>
<el-row v-if="toolList.length > 0" :gutter="15">
<template v-for="(item, index) in toolList" :key="index">
<el-col
v-if="item.resource_type === 'folder'"
:xs="24"
:sm="12"
:md="12"
:lg="8"
:xl="6"
class="mb-16"
>
<CardBox
:title="item.name"
:description="item.desc || $t('common.noData')"
class="cursor"
@click="clickFolder(item)"
<div
v-loading.fullscreen.lock="paginationConfig.current_page === 1 && loading"
style="max-height: calc(100vh - 140px)"
>
<InfiniteScroll
:size="toolList.length"
:total="paginationConfig.total"
:page_size="paginationConfig.page_size"
v-model:current_page="paginationConfig.current_page"
@load="getList"
:loading="loading"
>
<el-row v-if="toolList.length > 0" :gutter="15">
<template v-for="(item, index) in toolList" :key="index">
<el-col
v-if="item.resource_type === 'folder'"
:xs="24"
:sm="12"
:md="12"
:lg="8"
:xl="6"
class="mb-16"
>
<template #icon>
<el-avatar shape="square" :size="32" style="background: none">
<AppIcon iconName="app-folder" style="font-size: 32px"></AppIcon>
</el-avatar>
</template>
<template #subTitle>
<el-text class="color-secondary lighter" size="small">
{{ $t('common.creator') }}: {{ item.nick_name }}
</el-text>
</template>
</CardBox>
</el-col>
<el-col v-else :xs="24" :sm="12" :md="12" :lg="8" :xl="6" class="mb-16">
<CardBox :title="item.name" :description="item.desc" class="cursor">
<template #icon>
<el-avatar
v-if="isAppIcon(item?.icon)"
shape="square"
:size="32"
style="background: none"
class="mr-8"
>
<img :src="item?.icon" alt="" />
</el-avatar>
<el-avatar v-else class="avatar-green" shape="square" :size="32">
<img src="@/assets/node/icon_tool.svg" style="width: 58%" alt="" />
</el-avatar>
</template>
<template #subTitle>
<el-text class="color-secondary lighter" size="small">
{{ $t('common.creator') }}: {{ item.nick_name }}
</el-text>
</template>
<CardBox
:title="item.name"
:description="item.desc || $t('common.noData')"
class="cursor"
@click="clickFolder(item)"
>
<template #icon>
<el-avatar shape="square" :size="32" style="background: none">
<AppIcon iconName="app-folder" style="font-size: 32px"></AppIcon>
</el-avatar>
</template>
<template #subTitle>
<el-text class="color-secondary lighter" size="small">
{{ $t('common.creator') }}: {{ item.nick_name }}
</el-text>
</template>
</CardBox>
</el-col>
<el-col v-else :xs="24" :sm="12" :md="12" :lg="8" :xl="6" class="mb-16">
<CardBox :title="item.name" :description="item.desc" class="cursor">
<template #icon>
<el-avatar
v-if="isAppIcon(item?.icon)"
shape="square"
:size="32"
style="background: none"
class="mr-8"
>
<img :src="item?.icon" alt="" />
</el-avatar>
<el-avatar v-else class="avatar-green" shape="square" :size="32">
<img src="@/assets/node/icon_tool.svg" style="width: 58%" alt="" />
</el-avatar>
</template>
<template #subTitle>
<el-text class="color-secondary lighter" size="small">
{{ $t('common.creator') }}: {{ item.nick_name }}
</el-text>
</template>
<template #footer>
<div v-if="item.is_active" class="flex align-center">
<el-icon class="color-success mr-8" style="font-size: 16px">
<SuccessFilled />
</el-icon>
<span class="color-secondary">
{{ $t('common.status.enabled') }}
</span>
</div>
<div v-else class="flex align-center">
<AppIcon iconName="app-disabled" class="color-secondary mr-8"></AppIcon>
<span class="color-secondary">
{{ $t('common.status.disabled') }}
</span>
</div>
</template>
<template #mouseEnter>
<div @click.stop>
<el-switch
v-model="item.is_active"
:before-change="() => changeState(item)"
size="small"
class="mr-4"
v-hasPermission="[
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.TOOL_EDIT.getWorkspacePermission,
]"
/>
<el-divider direction="vertical" />
<el-dropdown trigger="click">
<el-button text @click.stop>
<el-icon>
<MoreFilled />
</el-icon>
</el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item
v-if="
!item.template_id &&
hasPermission(
[
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.TOOL_EDIT.getWorkspacePermission,
],
'OR',
)
"
:disabled="!canEdit(item)"
@click.stop="openCreateDialog(item)"
>
<el-icon>
<EditPen />
</el-icon>
{{ $t('common.edit') }}
</el-dropdown-item>
<el-dropdown-item
:disabled="!canEdit(item)"
v-if="
!item.template_id &&
hasPermission(
[
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.TOOL_EXPORT.getWorkspacePermission,
],
'OR',
)
"
@click.stop="copyTool(item)"
>
<AppIcon iconName="app-copy"></AppIcon>
{{ $t('common.copy') }}
</el-dropdown-item>
<el-dropdown-item
v-if="item.init_field_list?.length > 0"
:disabled="!canEdit(item)"
@click.stop="configInitParams(item)"
>
<AppIcon iconName="app-operation" class="mr-4"></AppIcon>
{{ $t('common.param.initParam') }}
</el-dropdown-item>
<el-dropdown-item
v-if="
!item.template_id &&
hasPermission(
[
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.TOOL_EXPORT.getWorkspacePermission,
],
'OR',
)
"
:disabled="!canEdit(item)"
@click.stop="exportTool(item)"
>
<AppIcon iconName="app-export"></AppIcon>
{{ $t('common.export') }}
</el-dropdown-item>
<el-dropdown-item
v-if="
hasPermission(
[
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.TOOL_DELETE.getWorkspacePermission,
],
'OR',
)
"
:disabled="!canEdit(item)"
divided
@click.stop="deleteTool(item)"
>
<el-icon><Delete /></el-icon>
{{ $t('common.delete') }}
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</template>
</CardBox>
</el-col>
</template>
</el-row>
<el-empty :description="$t('common.noData')" v-else />
<template #footer>
<div v-if="item.is_active" class="flex align-center">
<el-icon class="color-success mr-8" style="font-size: 16px">
<SuccessFilled />
</el-icon>
<span class="color-secondary">
{{ $t('common.status.enabled') }}
</span>
</div>
<div v-else class="flex align-center">
<AppIcon iconName="app-disabled" class="color-secondary mr-8"></AppIcon>
<span class="color-secondary">
{{ $t('common.status.disabled') }}
</span>
</div>
</template>
<template #mouseEnter>
<div @click.stop>
<el-switch
v-model="item.is_active"
:before-change="() => changeState(item)"
size="small"
class="mr-4"
v-hasPermission="[
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.TOOL_EDIT.getWorkspacePermission,
]"
/>
<el-divider direction="vertical" />
<el-dropdown trigger="click">
<el-button text @click.stop>
<el-icon>
<MoreFilled />
</el-icon>
</el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item
v-if="
!item.template_id &&
hasPermission(
[
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.TOOL_EDIT.getWorkspacePermission,
],
'OR',
)
"
:disabled="!canEdit(item)"
@click.stop="openCreateDialog(item)"
>
<el-icon>
<EditPen />
</el-icon>
{{ $t('common.edit') }}
</el-dropdown-item>
<el-dropdown-item
:disabled="!canEdit(item)"
v-if="
!item.template_id &&
hasPermission(
[
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.TOOL_EXPORT.getWorkspacePermission,
],
'OR',
)
"
@click.stop="copyTool(item)"
>
<AppIcon iconName="app-copy"></AppIcon>
{{ $t('common.copy') }}
</el-dropdown-item>
<el-dropdown-item
v-if="item.init_field_list?.length > 0"
:disabled="!canEdit(item)"
@click.stop="configInitParams(item)"
>
<AppIcon iconName="app-operation" class="mr-4"></AppIcon>
{{ $t('common.param.initParam') }}
</el-dropdown-item>
<el-dropdown-item
v-if="
!item.template_id &&
hasPermission(
[
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.TOOL_EXPORT.getWorkspacePermission,
],
'OR',
)
"
:disabled="!canEdit(item)"
@click.stop="exportTool(item)"
>
<AppIcon iconName="app-export"></AppIcon>
{{ $t('common.export') }}
</el-dropdown-item>
<el-dropdown-item
v-if="
hasPermission(
[
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.TOOL_DELETE.getWorkspacePermission,
],
'OR',
)
"
:disabled="!canEdit(item)"
divided
@click.stop="deleteTool(item)"
>
<el-icon><Delete /></el-icon>
{{ $t('common.delete') }}
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</template>
</CardBox>
</el-col>
</template>
</el-row>
<el-empty :description="$t('common.noData')" v-else />
</InfiniteScroll>
</div>
</ContentContainer>
<InitParamDrawer ref="InitParamDrawerRef" @refresh="refresh" />
@ -373,15 +386,11 @@ function getList() {
})
}
function getFolder() {
const params = {}
folder.asyncGetFolder(FolderSource.TOOL, params, loading).then((res: any) => {
folderList.value = res.data
currentFolder.value = res.data?.[0] || {}
getList()
})
function clickFolder(item: any) {
currentFolder.value.id = item.id
toolList.value = []
getList()
}
async function changeState(row: any) {
if (row.is_active) {
MsgConfirm(
@ -444,24 +453,6 @@ function refresh(data: any) {
getList()
}
function refreshFolder() {
toolList.value = []
getFolder()
getList()
}
function folderClickHandel(row: any) {
currentFolder.value = row
toolList.value = []
getList()
}
function clickFolder(item: any) {
currentFolder.value.id = item.id
toolList.value = []
getList()
}
function copyTool(row: any) {
ToolDrawertitle.value = t('views.tool.copyTool')
const obj = cloneDeep(row)
@ -506,11 +497,6 @@ function configInitParams(item: any) {
})
}
const CreateFolderDialogRef = ref()
function openCreateFolder() {
CreateFolderDialogRef.value.open(FolderSource.TOOL, currentFolder.value.parent_id)
}
const elUploadRef = ref()
function importTool(file: any) {
const formData = new FormData()
@ -535,8 +521,36 @@ function importTool(file: any) {
})
}
onMounted(() => {
//
const CreateFolderDialogRef = ref()
function openCreateFolder() {
CreateFolderDialogRef.value.open(FolderSource.TOOL, currentFolder.value.id)
}
function getFolder(bool?: boolean) {
const params = {}
folder.asyncGetFolder(FolderSource.TOOL, params, loading).then((res: any) => {
folderList.value = res.data
if (bool) {
//
currentFolder.value = res.data?.[0] || {}
}
getList()
})
}
function refreshFolder() {
toolList.value = []
getFolder()
}
function folderClickHandel(row: any) {
currentFolder.value = row
toolList.value = []
getList()
}
onMounted(() => {
getFolder(true)
})
</script>