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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -7,6 +7,7 @@
:data="folderList" :data="folderList"
:currentNodeKey="currentFolder?.id" :currentNodeKey="currentFolder?.id"
@handleNodeClick="folderClickHandel" @handleNodeClick="folderClickHandel"
@refreshTree="refreshFolder"
class="p-8" class="p-8"
/> />
</template> </template>
@ -129,7 +130,10 @@
</el-dropdown> </el-dropdown>
</div> </div>
</template> </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 <InfiniteScroll
:size="applicationList.length" :size="applicationList.length"
:total="paginationConfig.total" :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) { function clickFolder(item: any) {
currentFolder.value.id = item.id currentFolder.value.id = item.id
applicationList.value = [] 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 elUploadRef = ref()
const importApplication = (file: any) => { const importApplication = (file: any) => {
const formData = new FormData() 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() getFolder()
}
onMounted(() => {
getFolder(true)
}) })
</script> </script>

View File

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

View File

@ -146,7 +146,11 @@
</el-dropdown> </el-dropdown>
</div> </div>
</template> </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 <InfiniteScroll
:size="knowledgeList.length" :size="knowledgeList.length"
:total="paginationConfig.total" :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) { function clickFolder(item: any) {
currentFolder.value.id = item.id currentFolder.value.id = item.id
knowledgeList.value = [] knowledgeList.value = []
getList() getList()
} }
const CreateFolderDialogRef = ref()
function openCreateFolder() {
CreateFolderDialogRef.value.open(FolderSource.KNOWLEDGE, currentFolder.value.parent_id)
}
const GenerateRelatedDialogRef = ref<InstanceType<typeof GenerateRelatedDialog>>() const GenerateRelatedDialogRef = ref<InstanceType<typeof GenerateRelatedDialog>>()
function openGenerateDialog(row: any) { function openGenerateDialog(row: any) {
if (GenerateRelatedDialogRef.value) { if (GenerateRelatedDialogRef.value) {
@ -521,14 +503,36 @@ function deleteKnowledge(row: any) {
.catch(() => {}) .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() { function refreshFolder() {
console.log(currentFolder.value)
knowledgeList.value = [] knowledgeList.value = []
getFolder() getFolder()
getList()
} }
onMounted(() => { onMounted(() => {
getFolder() getFolder(true)
}) })
</script> </script>

View File

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

View File

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

View File

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

View File

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

View File

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