From 633310305075a9f17c30be8810bfbe383f69a495 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Fri, 28 Feb 2025 22:05:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=BA=E5=B7=A5=E4=BD=9C=E6=B5=81?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E6=B7=BB=E5=8A=A0=E5=A4=96=E5=B1=82=20div=20?= =?UTF-8?q?=E5=8C=85=E8=A3=B9=EF=BC=8C=E4=BC=98=E5=8C=96=E5=B8=83=E5=B1=80?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dialog/WorkflowActionsDialog.vue | 70 ++++++++++++++ src/components/workflow/AddDownloadAction.vue | 56 +++++------ .../workflow/AddSubscribeAction.vue | 28 +++--- .../workflow/FetchDownloadsAction.vue | 66 ++++++------- src/components/workflow/FetchMediasAction.vue | 53 ++++++---- src/components/workflow/FetchRssAction.vue | 62 ++++++------ .../workflow/FetchTorrentsAction.vue | 82 ++++++++-------- .../workflow/FilterMediasAction.vue | 62 ++++++------ .../workflow/FilterTorrentsAction.vue | 96 ++++++++++--------- src/components/workflow/ScanFileAction.vue | 50 +++++----- src/components/workflow/ScrapeFileAction.vue | 28 +++--- src/components/workflow/SendEventAction.vue | 28 +++--- src/components/workflow/SendMessageAction.vue | 68 ++++++------- .../workflow/TransferFileAction.vue | 44 +++++---- 14 files changed, 449 insertions(+), 344 deletions(-) diff --git a/src/components/dialog/WorkflowActionsDialog.vue b/src/components/dialog/WorkflowActionsDialog.vue index 38a6e09e..f2bdcb48 100644 --- a/src/components/dialog/WorkflowActionsDialog.vue +++ b/src/components/dialog/WorkflowActionsDialog.vue @@ -8,6 +8,7 @@ import { useToast } from 'vue-toast-notification' import api from '@/api' import WorkflowSidebar from '@/layouts/components/WorkflowSidebar.vue' import DropzoneBackground from '@/layouts/components/DropzoneBackground.vue' +import ImportCodeDialog from '@/components/dialog/ImportCodeDialog.vue' const { onConnect, addEdges, nodes, edges } = useVueFlow() @@ -55,6 +56,9 @@ const workflowForm = ref(props.workflow || {}) // 提示框 const $toast = useToast() +// 导入代码对话框 +const importCodeDialog = ref(false) + // 调用API 编辑任务 async function updateWorkflow() { // 更新节点和流程 @@ -74,6 +78,57 @@ async function updateWorkflow() { } } +// 保存导入的代码,直接覆盖原有值 +function saveCodeString(type: string, code: any) { + try { + if (code) { + if (type === 'workflow') { + nodes.value = code.actions + edges.value = code.flows + } + importCodeDialog.value = false + $toast.success('导入成功!') + } + } catch (error) { + $toast.error('导入失败!') + console.error(error) + } +} + +// 分享工作流程 +function shareWorkflow() { + const codeString = JSON.stringify({ actions: nodes.value, flows: edges.value }) + navigator.clipboard.writeText(codeString) + $toast.success('任务流程代码已复制到剪贴板!') +} + +// 删除选中节点或连接线 +const deleteSelectedNodeOrEdge = () => { + // 删除选中的节点 + const selectedNode = nodes.value.find((node: { selected: any }) => node.selected) + if (selectedNode) { + // 删除节点 + nodes.value = nodes.value.filter((node: { id: any }) => node.id !== selectedNode.id) + // 删除与该节点相关的 edges + edges.value = edges.value.filter( + (edge: { source: any; target: any }) => edge.source !== selectedNode.id && edge.target !== selectedNode.id, + ) + } + // 删除选中的连接线 + const selectedEdge = edges.value.find((edge: { selected: any }) => edge.selected) + if (selectedEdge) { + // 删除连接线 + edges.value = edges.value.filter((edge: { id: any }) => edge.id !== selectedEdge.id) + } +} + +// 键盘按键事件处理 +const handleKeyDown = (event: { key: string }) => { + if (event.key === 'Delete' || event.key === 'Backspace') { + deleteSelectedNodeOrEdge() + } +} + onMounted(() => { if (props.workflow) { nodes.value = props.workflow.actions ?? [] @@ -95,6 +150,12 @@ onMounted(() => { 编辑流程 - {{ workflow?.name }} + + + + + + @@ -111,6 +172,7 @@ onMounted(() => { :default-edge-options="{ type: 'animation', animated: true }" @dragover="onDragOver" @dragleave="onDragLeave" + @keydown="handleKeyDown" > { +