Skip to content

Commit 1263592

Browse files
feat: Folder directories support moving or dragging.
1 parent 6df1e19 commit 1263592

File tree

10 files changed

+166
-139
lines changed

10 files changed

+166
-139
lines changed

ui/src/components/folder-breadcrumb/index.vue

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,34 @@
33
{{ breadcrumbData[0]?.name }}
44
</h2>
55
<el-breadcrumb separator-icon="ArrowRight" style="line-height: normal" class="mt-4" v-else>
6-
<el-breadcrumb-item v-for="(item, index) in breadcrumbData" :key="index">
7-
<h5 class="ml-4 ellipsis" v-if="index === breadcrumbData.length - 1" :title="item.name">
8-
{{ item.name }}
9-
</h5>
10-
<el-button v-else link @click="handleClick(item)" :title="item.name">
11-
<span class="ellipsis"> {{ item.name }}</span>
12-
</el-button>
13-
</el-breadcrumb-item>
6+
<template v-if="breadcrumbData.length > 3">
7+
<el-breadcrumb-item>
8+
<el-button link @click="handleClick(breadcrumbData[0])" :title="breadcrumbData[0].name">
9+
<span class="ellipsis"> {{ breadcrumbData[0].name }}</span>
10+
</el-button>
11+
</el-breadcrumb-item>
12+
<el-breadcrumb-item>
13+
<el-button link @click="handleClick(breadcrumbData[breadcrumbData.length - 2])">
14+
<el-icon><MoreFilled /></el-icon>
15+
</el-button>
16+
</el-breadcrumb-item>
17+
<el-breadcrumb-item>
18+
<h5 class="ml-4 ellipsis" :title="breadcrumbData[breadcrumbData.length - 1].name">
19+
{{ breadcrumbData[breadcrumbData.length - 1].name }}
20+
</h5>
21+
</el-breadcrumb-item>
22+
</template>
23+
<template v-else>
24+
<el-breadcrumb-item v-for="(item, index) in breadcrumbData" :key="index">
25+
<h5 class="ml-4 ellipsis" v-if="index === breadcrumbData.length - 1" :title="item.name">
26+
{{ item.name }}
27+
</h5>
28+
29+
<el-button v-else link @click="handleClick(item)" :title="item.name">
30+
<span class="ellipsis"> {{ item.name }}</span>
31+
</el-button>
32+
</el-breadcrumb-item>
33+
</template>
1434
</el-breadcrumb>
1535
</template>
1636

ui/src/components/folder-tree/MoveToDialog.vue

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,6 @@
1111
ref="treeRef"
1212
:source="source"
1313
:data="folderList"
14-
:treeStyle="{
15-
height: 'calc(100vh - 320px)',
16-
border: '1px solid #ebeef5',
17-
borderRadius: '6px',
18-
padding: '8px',
19-
}"
2014
:default-expanded-keys="[currentNodeKey]"
2115
:canOperation="false"
2216
class="move-to-dialog-tree"
@@ -74,7 +68,7 @@ watch(dialogVisible, (bool) => {
7468
7569
const isFolder = ref<boolean>(false)
7670
77-
const open = (data: any, is_folder?:any) => {
71+
const open = (data: any, is_folder?: any) => {
7872
detail.value = data
7973
isFolder.value = is_folder
8074
getFolder()
@@ -105,17 +99,17 @@ const submitHandle = async () => {
10599
}
106100
if (isFolder.value) {
107101
const folder_obj = {
108-
...detail.value,
109-
parent_id: selectForderId.value,
110-
}
111-
folderApi.putFolder(detail.value.id, detail.value.folder_type, folder_obj, loading)
102+
...detail.value,
103+
parent_id: selectForderId.value,
104+
}
105+
folderApi
106+
.putFolder(detail.value.id, detail.value.folder_type, folder_obj, loading)
112107
.then(() => {
113108
MsgSuccess(t('common.saveSuccess'))
114-
emit('refresh')
115-
dialogVisible.value = false
116-
})
117-
}
118-
else if (props.source === SourceTypeEnum.KNOWLEDGE) {
109+
emit('refresh')
110+
dialogVisible.value = false
111+
})
112+
} else if (props.source === SourceTypeEnum.KNOWLEDGE) {
119113
if (detail.value.type === 2) {
120114
KnowledgeApi.putLarkKnowledge(detail.value.id, obj, loading).then(() => {
121115
MsgSuccess(t('common.saveSuccess'))
@@ -155,8 +149,12 @@ defineExpose({ open })
155149
padding: 0 !important;
156150
margin-bottom: 8px;
157151
}
158-
:deep(.tree-label) {
159-
max-width: 100% !important;
152+
:deep(.el-scrollbar) {
153+
border: 1px solid var(--el-border-color-light);
154+
border-radius: 6px;
155+
}
156+
:deep(.el-tree) {
157+
height: calc(100vh - 320px)!important;
160158
}
161159
}
162160
</style>

ui/src/components/folder-tree/index.vue

Lines changed: 39 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,28 @@
55
:placeholder="$t('common.search')"
66
prefix-icon="Search"
77
clearable
8-
class="p-8"
8+
class="p-16 pb-0"
99
/>
10-
11-
<div v-if="showShared && hasPermission(EditionConst.IS_EE, 'OR')" class="border-b mb-4">
12-
<div
13-
@click="handleSharedNodeClick"
14-
class="shared-button flex cursor"
15-
:class="currentNodeKey === 'share' && 'active'"
16-
>
17-
<AppIcon
18-
iconName="app-shared-active"
19-
style="font-size: 18px"
20-
class="color-primary"
21-
></AppIcon>
22-
<span class="ml-8">{{ shareTitle }}</span>
10+
<div class="p-8 pb-0" v-if="showShared && hasPermission(EditionConst.IS_EE, 'OR')">
11+
<div class="border-b">
12+
<div
13+
@click="handleSharedNodeClick"
14+
class="shared-button flex cursor border-r-6"
15+
:class="currentNodeKey === 'share' && 'active'"
16+
>
17+
<AppIcon
18+
iconName="app-shared-active"
19+
style="font-size: 18px"
20+
class="color-primary"
21+
></AppIcon>
22+
<span class="ml-8">{{ shareTitle }}</span>
23+
</div>
2324
</div>
2425
</div>
2526

2627
<el-scrollbar>
2728
<el-tree
28-
class="overflow-inherit_node__children"
29+
class="folder-tree__main p-8"
2930
:class="
3031
showShared && hasPermission(EditionConst.IS_EE, 'OR')
3132
? 'tree-height-shared'
@@ -40,7 +41,7 @@
4041
:default-expanded-keys="[currentNodeKey]"
4142
:current-node-key="currentNodeKey"
4243
highlight-current
43-
draggable
44+
:draggable="draggable"
4445
:allow-drop="allowDrop"
4546
:allow-drag="allowDrag"
4647
@node-drop="handleDrop"
@@ -49,21 +50,20 @@
4950
v-bind="$attrs"
5051
>
5152
<template #default="{ node, data }">
52-
<div class="flex-between w-full" @mouseenter.stop="handleMouseEnter(data)">
53-
<div class="flex align-center">
54-
<AppIcon iconName="app-folder" style="font-size: 20px"></AppIcon>
55-
<span class="ml-8 ellipsis tree-label" style="max-width: 110px" :title="node.label">{{
56-
i18n_name(node.label)
57-
}}</span>
58-
</div>
53+
<div
54+
@mouseenter.stop="handleMouseEnter(data)"
55+
class="flex align-center w-full custom-tree-node"
56+
>
57+
<AppIcon iconName="app-folder" style="font-size: 20px"></AppIcon>
58+
<span class="tree-label ml-8" :title="node.label">{{ i18n_name(node.label) }}</span>
5959

6060
<div
6161
v-if="canOperation && MoreFilledPermission(node, data)"
6262
@click.stop
6363
v-show="hoverNodeId === data.id"
6464
@mouseenter.stop="handleMouseEnter(data)"
6565
@mouseleave.stop="handleMouseleave"
66-
class="mr-16"
66+
class="mr-8 tree-operation-button"
6767
>
6868
<el-dropdown trigger="click" :teleported="false">
6969
<el-button text class="w-full" v-if="MoreFilledPermission(node, data)">
@@ -178,6 +178,10 @@ const props = defineProps({
178178
type: Object,
179179
default: () => ({}),
180180
},
181+
draggable: {
182+
type: Boolean,
183+
default: false,
184+
},
181185
})
182186
const resourceType = computed(() => {
183187
if (props.source === 'APPLICATION') {
@@ -399,7 +403,7 @@ onUnmounted(() => {
399403
padding-top: 4px;
400404
height: calc(100vh - 180px);
401405
}
402-
:deep(.el-tree) {
406+
:deep(.folder-tree__main) {
403407
.el-tree-node.is-dragging {
404408
opacity: 0.5;
405409
}
@@ -408,11 +412,19 @@ onUnmounted(() => {
408412
border: 2px dashed var(--el-color-primary);
409413
border-radius: 4px;
410414
}
415+
.custom-tree-node {
416+
box-sizing: content-box;
417+
width: calc(100% - 27px);
418+
}
419+
.tree-label {
420+
width: 100%;
421+
overflow: hidden;
422+
white-space: nowrap;
423+
text-overflow: ellipsis;
424+
}
411425
.el-tree-node__content {
412426
position: relative;
413427
}
414-
}
415-
:deep(.overflow-inherit_node__children) {
416428
.el-tree-node__children {
417429
overflow: inherit !important;
418430
}

ui/src/styles/element-plus.scss

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
cursor: pointer;
1515
flex-shrink: 0;
1616
}
17+
.el-icon {
18+
flex-shrink: 0;
19+
}
1720

1821
// card
1922
.el-card {

ui/src/views/application-workflow/component/DropdownMenu.vue

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -75,18 +75,16 @@
7575
<el-tab-pane :label="$t('views.tool.title')" name="tool">
7676
<LayoutContainer>
7777
<template #left>
78-
<div class="p-8">
79-
<folder-tree
80-
:source="SourceTypeEnum.TOOL"
81-
:data="toolTreeData"
82-
:currentNodeKey="folder.currentFolder?.id"
83-
@handleNodeClick="folderClickHandle"
84-
:shareTitle="$t('views.shared.shared_tool')"
85-
:showShared="permissionPrecise['is_share']()"
86-
:canOperation="false"
87-
:treeStyle="{ height: '400px' }"
88-
/>
89-
</div>
78+
<folder-tree
79+
:source="SourceTypeEnum.TOOL"
80+
:data="toolTreeData"
81+
:currentNodeKey="folder.currentFolder?.id"
82+
@handleNodeClick="folderClickHandle"
83+
:shareTitle="$t('views.shared.shared_tool')"
84+
:showShared="permissionPrecise['is_share']()"
85+
:canOperation="false"
86+
:treeStyle="{ height: '400px' }"
87+
/>
9088
</template>
9189
<el-scrollbar height="450">
9290
<NodeContent
@@ -101,16 +99,14 @@
10199
<el-tab-pane :label="$t('views.application.title')" name="application">
102100
<LayoutContainer>
103101
<template #left>
104-
<div class="p-8">
105-
<folder-tree
106-
:source="SourceTypeEnum.APPLICATION"
107-
:data="applicationTreeData"
108-
:currentNodeKey="folder.currentFolder?.id"
109-
@handleNodeClick="folderClickHandle"
110-
:canOperation="false"
111-
:treeStyle="{ height: '400px' }"
112-
/>
113-
</div>
102+
<folder-tree
103+
:source="SourceTypeEnum.APPLICATION"
104+
:data="applicationTreeData"
105+
:currentNodeKey="folder.currentFolder?.id"
106+
@handleNodeClick="folderClickHandle"
107+
:canOperation="false"
108+
:treeStyle="{ height: '400px' }"
109+
/>
114110
</template>
115111
<el-scrollbar height="450">
116112
<NodeContent

ui/src/views/application/component/AddKnowledgeDialog.vue

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,16 @@
2727
</template>
2828
<LayoutContainer class="application-manage">
2929
<template #left>
30-
<div class="p-8">
31-
<folder-tree
32-
:data="folderList"
33-
:currentNodeKey="currentFolder?.id"
34-
@handleNodeClick="folderClickHandle"
35-
v-loading="folderLoading"
36-
:canOperation="false"
37-
showShared
38-
:shareTitle="$t('views.shared.shared_knowledge')"
39-
:treeStyle="{ height: 'calc(100vh - 240px)' }"
40-
/>
41-
</div>
30+
<folder-tree
31+
:data="folderList"
32+
:currentNodeKey="currentFolder?.id"
33+
@handleNodeClick="folderClickHandle"
34+
v-loading="folderLoading"
35+
:canOperation="false"
36+
showShared
37+
:shareTitle="$t('views.shared.shared_knowledge')"
38+
:treeStyle="{ height: 'calc(100vh - 240px)' }"
39+
/>
4240
</template>
4341
<div class="layout-bg">
4442
<div class="flex-between p-16 ml-8">

ui/src/views/application/component/ToolDialog.vue

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,16 @@
2323
</template>
2424
<LayoutContainer class="application-manage">
2525
<template #left>
26-
<div class="p-8">
27-
<folder-tree
28-
:data="folderList"
29-
:currentNodeKey="currentFolder?.id"
30-
@handleNodeClick="folderClickHandle"
31-
v-loading="folderLoading"
32-
:canOperation="false"
33-
showShared
34-
:shareTitle="$t('views.shared.shared_tool')"
35-
:treeStyle="{ height: 'calc(100vh - 240px)' }"
36-
/>
37-
</div>
26+
<folder-tree
27+
:data="folderList"
28+
:currentNodeKey="currentFolder?.id"
29+
@handleNodeClick="folderClickHandle"
30+
v-loading="folderLoading"
31+
:canOperation="false"
32+
showShared
33+
:shareTitle="$t('views.shared.shared_tool')"
34+
:treeStyle="{ height: 'calc(100vh - 240px)' }"
35+
/>
3836
</template>
3937
<div class="layout-bg">
4038
<div class="flex-between p-16 ml-8">
@@ -198,15 +196,17 @@ function getList() {
198196
type: 'tool',
199197
isShared: folder_id === 'share',
200198
systemType: 'workspace',
201-
}).getToolList({
202-
folder_id: folder_id,
203-
tool_type: 'CUSTOM'
204-
}).then((res: any) => {
205-
toolList.value = res.data?.tools || res.data || []
206-
toolList.value = toolList.value?.filter((item: any) => item.is_active)
207-
searchData.value = res.data.tools || res.data
208-
searchData.value = searchData.value?.filter((item: any) => item.is_active)
209199
})
200+
.getToolList({
201+
folder_id: folder_id,
202+
tool_type: 'CUSTOM',
203+
})
204+
.then((res: any) => {
205+
toolList.value = res.data?.tools || res.data || []
206+
toolList.value = toolList.value?.filter((item: any) => item.is_active)
207+
searchData.value = res.data.tools || res.data
208+
searchData.value = searchData.value?.filter((item: any) => item.is_active)
209+
})
210210
}
211211
212212
defineExpose({ open })

0 commit comments

Comments
 (0)