From 2a3fdc90488e8bdbde481d49c240b045a85b1379 Mon Sep 17 00:00:00 2001 From: Bram Date: Fri, 7 Nov 2025 06:48:54 +0100 Subject: [PATCH] Add node duplication --- .../contrib/automation/nodes/actions.py | 4 +- .../contrib/automation/nodes/service.py | 8 +-- .../components/workflow/WorkflowEdge.vue | 10 ++- .../components/workflow/WorkflowEditor.vue | 9 ++- .../components/workflow/WorkflowNode.vue | 3 + .../workflow/WorkflowNodeContent.vue | 26 +++++++- .../modules/automation/locales/en.json | 4 +- .../modules/automation/nodeTypeMixins.js | 4 ++ web-frontend/modules/automation/nodeTypes.js | 15 +++++ .../automation/pages/automationWorkflow.vue | 7 ++ .../services/automationWorkflowNode.js | 3 + .../store/automationWorkflowNode.js | 66 +++++++++++++++++++ 12 files changed, 148 insertions(+), 11 deletions(-) diff --git a/backend/src/baserow/contrib/automation/nodes/actions.py b/backend/src/baserow/contrib/automation/nodes/actions.py index 52092652df..d949f6ccce 100644 --- a/backend/src/baserow/contrib/automation/nodes/actions.py +++ b/backend/src/baserow/contrib/automation/nodes/actions.py @@ -264,7 +264,9 @@ def undo( action_to_undo: Action, ): # Trash the duplicated node. - AutomationNodeService().delete_node(user, params.duplicated_node_id) + AutomationNodeService().delete_node( + user, params.duplicated_node_id, ignore_user_for_signal=True + ) @classmethod def redo( diff --git a/backend/src/baserow/contrib/automation/nodes/service.py b/backend/src/baserow/contrib/automation/nodes/service.py index 074c24a297..f870e608f3 100644 --- a/backend/src/baserow/contrib/automation/nodes/service.py +++ b/backend/src/baserow/contrib/automation/nodes/service.py @@ -241,9 +241,7 @@ def update_node( ) def delete_node( - self, - user: AbstractUser, - node_id: int, + self, user: AbstractUser | None, node_id: int, ignore_user_for_signal=False ) -> AutomationNode: """ Deletes the specified automation node. @@ -268,7 +266,7 @@ def delete_node( node.get_type().before_delete(node.specific) TrashHandler.trash( - user, + user if not ignore_user_for_signal else None, automation.workspace, automation, node, @@ -278,7 +276,7 @@ def delete_node( self, workflow=workflow, node_id=node.id, - user=user, + user=user if not ignore_user_for_signal else None, ) return node diff --git a/web-frontend/modules/automation/components/workflow/WorkflowEdge.vue b/web-frontend/modules/automation/components/workflow/WorkflowEdge.vue index 0b80a1ed4a..d9f87a95d7 100644 --- a/web-frontend/modules/automation/components/workflow/WorkflowEdge.vue +++ b/web-frontend/modules/automation/components/workflow/WorkflowEdge.vue @@ -50,6 +50,7 @@ @remove-node="emit('remove-node', $event)" @replace-node="emit('replace-node', $event)" @move-node="emit('move-node', $event)" + @duplicate-node="emit('duplicate-node', $event)" /> @@ -90,7 +91,14 @@ const props = defineProps({ }, }) -const emit = defineEmits(['add-node', 'select-node', 'move-node']) +const emit = defineEmits([ + 'add-node', + 'select-node', + 'move-node', + 'remove-node', + 'replace-node', + 'duplicate-node', +]) const store = useStore() const workflow = inject('workflow') diff --git a/web-frontend/modules/automation/components/workflow/WorkflowEditor.vue b/web-frontend/modules/automation/components/workflow/WorkflowEditor.vue index 38d2e643f0..9849e6d189 100644 --- a/web-frontend/modules/automation/components/workflow/WorkflowEditor.vue +++ b/web-frontend/modules/automation/components/workflow/WorkflowEditor.vue @@ -29,6 +29,7 @@ @replace-node="emit('replace-node', $event)" @select-node="emit('input', $event.id)" @move-node="emit('move-node', $event)" + @duplicate-node="emit('duplicate-node', $event)" />