refactor: dropdownMenu

This commit is contained in:
teukkk 2025-06-30 18:06:18 +08:00
parent 3e4aac3557
commit e5d26301c7
5 changed files with 67 additions and 44 deletions

View File

@ -79,6 +79,11 @@ export default {
cannotEndNode: 'This node cannot be used as an end node' cannotEndNode: 'This node cannot be used as an end node'
}, },
nodes: { nodes: {
classify: {
aiCapability: 'AI capability',
businessLogic: 'Business logic',
other: 'Other'
},
startNode: { startNode: {
label: 'Start', label: 'Start',
question: 'User Question', question: 'User Question',

View File

@ -80,6 +80,11 @@ export default {
cannotEndNode: '节点不能当做结束节点' cannotEndNode: '节点不能当做结束节点'
}, },
nodes: { nodes: {
classify: {
aiCapability: 'AI能力',
businessLogic: '业务逻辑',
other: '其他'
},
startNode: { startNode: {
label: '开始', label: '开始',
question: '用户问题', question: '用户问题',

View File

@ -80,6 +80,11 @@ export default {
cannotEndNode: '節點不能當做結束節點' cannotEndNode: '節點不能當做結束節點'
}, },
nodes: { nodes: {
classify: {
aiCapability: 'AI能力',
businessLogic: '業務邏輯',
other: '其他'
},
startNode: { startNode: {
label: '開始', label: '開始',
question: '用戶問題', question: '用戶問題',

View File

@ -1,12 +1,9 @@
<template> <template>
<div v-show="show" class="workflow-dropdown-menu border border-r-6"> <div v-show="show" class="workflow-dropdown-menu border border-r-6">
<el-tabs v-model="activeName" class="workflow-dropdown-tabs"> <el-tabs v-model="activeName" class="workflow-dropdown-tabs">
<div style="display: flex; width: 100%; justify-content: center" class="mb-4"> <div style="display: flex; width: 100%; justify-content: center;" class="mb-12">
<el-input <el-input v-model="search_text" class="mr-12 ml-12"
v-model="search_text" :placeholder="$t('views.applicationWorkflow.searchBar.placeholder')">
style="width: 240px"
:placeholder="$t('views.applicationWorkflow.searchBar.placeholder')"
>
<template #suffix> <template #suffix>
<el-icon class="el-input__icon"><search /></el-icon> <el-icon class="el-input__icon"><search /></el-icon>
</template> </template>
@ -16,17 +13,27 @@
<el-tab-pane :label="$t('views.applicationWorkflow.baseComponent')" name="base"> <el-tab-pane :label="$t('views.applicationWorkflow.baseComponent')" name="base">
<el-scrollbar height="400"> <el-scrollbar height="400">
<div v-if="filter_menu_nodes.length > 0"> <div v-if="filter_menu_nodes.length > 0">
<template v-for="(item, index) in filter_menu_nodes" :key="index"> <template v-for="(node, index) in filter_menu_nodes" :key="index">
<div <el-text type="info" size="small" class="color-secondary ml-12">{{ node.label }}</el-text>
class="workflow-dropdown-item cursor flex p-8-12" <div class="flex-wrap mt-8">
@click.stop="clickNodes(item)" <template v-for="(item, index) in node.list" :key="index">
@mousedown.stop="onmousedown(item)" <el-popover placement="right" :width="280">
> <template #reference>
<component :is="iconComponent(`${item.type}-icon`)" class="mr-8 mt-4" :size="32" /> <div class="flex align-center border border-r-6 mb-12 p-8-12 cursor ml-12" style="width: 39%; " @click.stop="clickNodes(item)"
<div class="pre-wrap"> @mousedown.stop="onmousedown(item)">
<div class="lighter">{{ item.label }}</div> <component :is="iconComponent(`${item.type}-icon`)" class="mr-8" :size="32" />
<el-text type="info" size="small">{{ item.text }}</el-text> <div class="lighter">{{ item.label }}</div>
</div> </div>
</template>
<template #default>
<div class="flex align-center mb-8">
<component :is="iconComponent(`${item.type}-icon`)" class="mr-8" :size="32" />
<div class="lighter color-text-primary">{{ item.label }}</div>
</div>
<el-text type="info" size="small" class="color-secondary lighter">{{ item.text }}</el-text>
</template>
</el-popover>
</template>
</div> </div>
</template> </template>
</div> </div>
@ -167,10 +174,21 @@ const filter_application_list = computed(() => {
}) })
const filter_menu_nodes = computed(() => { const filter_menu_nodes = computed(() => {
return menuNodes.filter((item) => if (!search_text.value) return menuNodes;
item.label.toLocaleLowerCase().includes(search_text.value.toLocaleLowerCase()), const searchTerm = search_text.value.toLowerCase();
)
}) return menuNodes.reduce((result, item) => {
const filteredList = item.list.filter(listItem =>
listItem.label.toLowerCase().includes(searchTerm)
);
if (filteredList.length) {
result.push({ ...item, list: filteredList });
}
return result;
}, []);
});
function clickNodes(item: any, data?: any, type?: string) { function clickNodes(item: any, data?: any, type?: string) {
if (data) { if (data) {
item['properties']['stepName'] = data.name item['properties']['stepName'] = data.name
@ -197,10 +215,10 @@ function clickNodes(item: any, data?: any, type?: string) {
...(!fileUploadSetting ...(!fileUploadSetting
? {} ? {}
: { : {
...(fileUploadSetting.document ? { document_list: [] } : {}), ...(fileUploadSetting.document ? { document_list: [] } : {}),
...(fileUploadSetting.image ? { image_list: [] } : {}), ...(fileUploadSetting.image ? { image_list: [] } : {}),
...(fileUploadSetting.audio ? { audio_list: [] } : {}), ...(fileUploadSetting.audio ? { audio_list: [] } : {}),
}), }),
} }
} else { } else {
item['properties']['node_data'] = { item['properties']['node_data'] = {
@ -242,10 +260,10 @@ function onmousedown(item: any, data?: any, type?: string) {
...(!fileUploadSetting ...(!fileUploadSetting
? {} ? {}
: { : {
...(fileUploadSetting.document ? { document_list: [] } : {}), ...(fileUploadSetting.document ? { document_list: [] } : {}),
...(fileUploadSetting.image ? { image_list: [] } : {}), ...(fileUploadSetting.image ? { image_list: [] } : {}),
...(fileUploadSetting.audio ? { audio_list: [] } : {}), ...(fileUploadSetting.audio ? { audio_list: [] } : {}),
}), }),
} }
} else { } else {
item['properties']['node_data'] = { item['properties']['node_data'] = {
@ -285,7 +303,7 @@ onMounted(() => {
top: 49px; top: 49px;
right: 122px; right: 122px;
z-index: 99; z-index: 99;
width: 268px; width: 400px;
box-shadow: 0px 4px 8px 0px var(--app-text-color-light-1); box-shadow: 0px 4px 8px 0px var(--app-text-color-light-1);
background: #ffffff; background: #ffffff;
padding-bottom: 8px; padding-bottom: 8px;

View File

@ -338,20 +338,10 @@ export const textToSpeechNode = {
} }
} }
export const menuNodes = [ export const menuNodes = [
aiChatNode, { label: t('views.applicationWorkflow.nodes.classify.aiCapability'), list: [aiChatNode, questionNode, imageGenerateNode, imageUnderstandNode, textToSpeechNode, speechToTextNode] },
imageUnderstandNode, { label: t('views.knowledge.title'), list: [searchKnowledgeNode, rerankerNode] },
imageGenerateNode, { label: t('views.applicationWorkflow.nodes.classify.businessLogic'), list: [conditionNode, formNode, variableAssignNode, replyNode] },
searchKnowledgeNode, { label: t('views.applicationWorkflow.nodes.classify.other'), list: [mcpNode, documentExtractNode] },
rerankerNode,
conditionNode,
replyNode,
formNode,
questionNode,
documentExtractNode,
speechToTextNode,
textToSpeechNode,
variableAssignNode,
mcpNode
] ]
/** /**