n8n-editor-ui 1.48.0 → 1.48.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +79 -79
- package/dist/assets/{AuthView-Cfnovems.js → AuthView-DeM_7KeR.js} +2 -2
- package/dist/assets/{AuthView-Cfnovems.js.map → AuthView-DeM_7KeR.js.map} +1 -1
- package/dist/assets/{CanvasControls-Dis0UJTc.js → CanvasControls-BarjtIlw.js} +2 -2
- package/dist/assets/{CanvasControls-Dis0UJTc.js.map → CanvasControls-BarjtIlw.js.map} +1 -1
- package/dist/assets/{ChangePasswordView-CFVFfkrj.js → ChangePasswordView-BsVhSf9z.js} +2 -2
- package/dist/assets/{ChangePasswordView-CFVFfkrj.js.map → ChangePasswordView-BsVhSf9z.js.map} +1 -1
- package/dist/assets/{CollectionParameter-BKwsDV7i.js → CollectionParameter-ruqgU7kr.js} +2 -2
- package/dist/assets/CollectionParameter-ruqgU7kr.js.map +1 -0
- package/dist/assets/{CredentialsView-D-Gs1CW_.js → CredentialsView-CEWMy0O7.js} +2 -2
- package/dist/assets/{CredentialsView-D-Gs1CW_.js.map → CredentialsView-CEWMy0O7.js.map} +1 -1
- package/dist/assets/{ErrorView-B9fsIgpd.js → ErrorView-i1G_7Vnl.js} +2 -2
- package/dist/assets/{ErrorView-B9fsIgpd.js.map → ErrorView-i1G_7Vnl.js.map} +1 -1
- package/dist/assets/{ExecutionsFilter-Bp-2hjm2.js → ExecutionsFilter-8p_qD50I.js} +2 -2
- package/dist/assets/{ExecutionsFilter-Bp-2hjm2.js.map → ExecutionsFilter-8p_qD50I.js.map} +1 -1
- package/dist/assets/{ExecutionsView-CaF0x9T5.js → ExecutionsView-Bw4zWCsi.js} +2 -2
- package/dist/assets/{ExecutionsView-CaF0x9T5.js.map → ExecutionsView-Bw4zWCsi.js.map} +1 -1
- package/dist/assets/{ForgotMyPasswordView-C6mthrk9.js → ForgotMyPasswordView-xpgEo3Ld.js} +2 -2
- package/dist/assets/{ForgotMyPasswordView-C6mthrk9.js.map → ForgotMyPasswordView-xpgEo3Ld.js.map} +1 -1
- package/dist/assets/{MainHeader-Cq4gEd6q.js → MainHeader-BckwBOk-.js} +2 -2
- package/dist/assets/{MainHeader-Cq4gEd6q.js.map → MainHeader-BckwBOk-.js.map} +1 -1
- package/dist/assets/{MainSidebar-5O6ikbgz.js → MainSidebar-Cs4qBbtI.js} +2 -2
- package/dist/assets/{MainSidebar-5O6ikbgz.js.map → MainSidebar-Cs4qBbtI.js.map} +1 -1
- package/dist/assets/{NodeCreation-Ddbdc92L.js → NodeCreation-CicljMw4.js} +3 -3
- package/dist/assets/{NodeCreation-Ddbdc92L.js.map → NodeCreation-CicljMw4.js.map} +1 -1
- package/dist/assets/{NodeCreator-DCRSsCDa.js → NodeCreator-B_seYieX.js} +2 -2
- package/dist/assets/{NodeCreator-DCRSsCDa.js.map → NodeCreator-B_seYieX.js.map} +1 -1
- package/dist/assets/NodeDetailsView-uX6Ox6-p.js +4 -0
- package/dist/assets/NodeDetailsView-uX6Ox6-p.js.map +1 -0
- package/dist/assets/{NodeView-ZNm7_dIP.css → NodeView-B1741gUJ.css} +1 -1
- package/dist/assets/{NodeView-DHiWHy1x.js → NodeView-dhEa5JeF.js} +3 -3
- package/dist/assets/NodeView-dhEa5JeF.js.map +1 -0
- package/dist/assets/NodeView.v2-BTnhsVQt.js +3 -0
- package/dist/assets/{NodeView.v2-Ces_FOmN.js.map → NodeView.v2-BTnhsVQt.js.map} +1 -1
- package/dist/assets/{ProjectCardBadge.vue_vue_type_script_setup_true_lang-BrrHv_OT.js → ProjectCardBadge.vue_vue_type_script_setup_true_lang-DrgXuCbj.js} +2 -2
- package/dist/assets/{ProjectCardBadge.vue_vue_type_script_setup_true_lang-BrrHv_OT.js.map → ProjectCardBadge.vue_vue_type_script_setup_true_lang-DrgXuCbj.js.map} +1 -1
- package/dist/assets/{ProjectSettings-DwtXe_N9.js → ProjectSettings-H_vMYteG.js} +2 -2
- package/dist/assets/{ProjectSettings-DwtXe_N9.js.map → ProjectSettings-H_vMYteG.js.map} +1 -1
- package/dist/assets/{ProjectTabs-DY8rNWak.js → ProjectTabs-CBgK4uTk.js} +2 -2
- package/dist/assets/{ProjectTabs-DY8rNWak.js.map → ProjectTabs-CBgK4uTk.js.map} +1 -1
- package/dist/assets/{PushConnectionTracker-BodK8d2Q.js → PushConnectionTracker-CaBlBm3C.js} +2 -2
- package/dist/assets/{PushConnectionTracker-BodK8d2Q.js.map → PushConnectionTracker-CaBlBm3C.js.map} +1 -1
- package/dist/assets/{ResourcesListLayout-qK7zTnkk.js → ResourcesListLayout-DqfRSMy0.js} +2 -2
- package/dist/assets/{ResourcesListLayout-qK7zTnkk.js.map → ResourcesListLayout-DqfRSMy0.js.map} +1 -1
- package/dist/assets/{RunDataAi-CQWIq0sA.js → RunDataAi-BRDcniUj.js} +2 -2
- package/dist/assets/{RunDataAi-CQWIq0sA.js.map → RunDataAi-BRDcniUj.js.map} +1 -1
- package/dist/assets/{RunDataJson-DV2qWwIx.js → RunDataJson-CJg6rq7p.js} +3 -3
- package/dist/assets/{RunDataJson-DV2qWwIx.js.map → RunDataJson-CJg6rq7p.js.map} +1 -1
- package/dist/assets/{RunDataJsonActions-D9BQabwD.js → RunDataJsonActions-DtpaWP51.js} +2 -2
- package/dist/assets/{RunDataJsonActions-D9BQabwD.js.map → RunDataJsonActions-DtpaWP51.js.map} +1 -1
- package/dist/assets/{RunDataSchema-CEbOE_wk.js → RunDataSchema-CH1XRzPV.js} +2 -2
- package/dist/assets/{RunDataSchema-CEbOE_wk.js.map → RunDataSchema-CH1XRzPV.js.map} +1 -1
- package/dist/assets/{RunDataSearch-BIoMsNXa.js → RunDataSearch-CtzUEG0k.js} +2 -2
- package/dist/assets/{RunDataSearch-BIoMsNXa.js.map → RunDataSearch-CtzUEG0k.js.map} +1 -1
- package/dist/assets/{RunDataTable-DRwDl7l_.js → RunDataTable-Bwwqtg2e.js} +2 -2
- package/dist/assets/{RunDataTable-DRwDl7l_.js.map → RunDataTable-Bwwqtg2e.js.map} +1 -1
- package/dist/assets/{SamlOnboarding-B7CMPcIO.js → SamlOnboarding-C8J1wO2_.js} +2 -2
- package/dist/assets/{SamlOnboarding-B7CMPcIO.js.map → SamlOnboarding-C8J1wO2_.js.map} +1 -1
- package/dist/assets/{SettingsApiView-2o3tSk6F.js → SettingsApiView-CFZYL9SM.js} +2 -2
- package/dist/assets/{SettingsApiView-2o3tSk6F.js.map → SettingsApiView-CFZYL9SM.js.map} +1 -1
- package/dist/assets/{SettingsCommunityNodesView-DtFVlTax.js → SettingsCommunityNodesView-BJygUgC4.js} +2 -2
- package/dist/assets/{SettingsCommunityNodesView-DtFVlTax.js.map → SettingsCommunityNodesView-BJygUgC4.js.map} +1 -1
- package/dist/assets/{SettingsExternalSecrets-b3iC5CUl.js → SettingsExternalSecrets-Dvrb_hHi.js} +2 -2
- package/dist/assets/{SettingsExternalSecrets-b3iC5CUl.js.map → SettingsExternalSecrets-Dvrb_hHi.js.map} +1 -1
- package/dist/assets/{SettingsFakeDoorView-BDqufqIU.js → SettingsFakeDoorView-BAi6oJnj.js} +2 -2
- package/dist/assets/{SettingsFakeDoorView-BDqufqIU.js.map → SettingsFakeDoorView-BAi6oJnj.js.map} +1 -1
- package/dist/assets/{SettingsLdapView-KAZZv8gN.js → SettingsLdapView-BMSWqnQ9.js} +2 -2
- package/dist/assets/{SettingsLdapView-KAZZv8gN.js.map → SettingsLdapView-BMSWqnQ9.js.map} +1 -1
- package/dist/assets/{SettingsLogStreamingView-BQB24Jd7.js → SettingsLogStreamingView-HusCnCf9.js} +2 -2
- package/dist/assets/{SettingsLogStreamingView-BQB24Jd7.js.map → SettingsLogStreamingView-HusCnCf9.js.map} +1 -1
- package/dist/assets/{SettingsPersonalView-BucAs1ZA.js → SettingsPersonalView-CJLyPtEQ.js} +2 -2
- package/dist/assets/{SettingsPersonalView-BucAs1ZA.js.map → SettingsPersonalView-CJLyPtEQ.js.map} +1 -1
- package/dist/assets/{SettingsSourceControl-iph73y14.js → SettingsSourceControl-DEfa_Jc9.js} +2 -2
- package/dist/assets/{SettingsSourceControl-iph73y14.js.map → SettingsSourceControl-DEfa_Jc9.js.map} +1 -1
- package/dist/assets/{SettingsSso-dhn_J94r.js → SettingsSso-QPRaZWWj.js} +2 -2
- package/dist/assets/{SettingsSso-dhn_J94r.js.map → SettingsSso-QPRaZWWj.js.map} +1 -1
- package/dist/assets/{SettingsUsageAndPlan-UVZXvMB0.js → SettingsUsageAndPlan-CRnR3ZSO.js} +2 -2
- package/dist/assets/{SettingsUsageAndPlan-UVZXvMB0.js.map → SettingsUsageAndPlan-CRnR3ZSO.js.map} +1 -1
- package/dist/assets/{SettingsUsersView-D7RGgFQd.js → SettingsUsersView-DZFKtn1k.js} +2 -2
- package/dist/assets/{SettingsUsersView-D7RGgFQd.js.map → SettingsUsersView-DZFKtn1k.js.map} +1 -1
- package/dist/assets/{SettingsView-B162yoGp.js → SettingsView-DNVOn5WZ.js} +2 -2
- package/dist/assets/{SettingsView-B162yoGp.js.map → SettingsView-DNVOn5WZ.js.map} +1 -1
- package/dist/assets/{SetupView-njSOn-8-.js → SetupView-DotzeMGc.js} +2 -2
- package/dist/assets/{SetupView-njSOn-8-.js.map → SetupView-DotzeMGc.js.map} +1 -1
- package/dist/assets/{SetupWorkflowCredentialsButton-D6kdzcAr.js → SetupWorkflowCredentialsButton-B5QDECym.js} +2 -2
- package/dist/assets/{SetupWorkflowCredentialsButton-D6kdzcAr.js.map → SetupWorkflowCredentialsButton-B5QDECym.js.map} +1 -1
- package/dist/assets/{SetupWorkflowFromTemplateView-BG4CefMq.js → SetupWorkflowFromTemplateView-Cret3KQc.js} +2 -2
- package/dist/assets/{SetupWorkflowFromTemplateView-BG4CefMq.js.map → SetupWorkflowFromTemplateView-Cret3KQc.js.map} +1 -1
- package/dist/assets/{SigninView-CDnvthma.js → SigninView-C-e__nLi.js} +2 -2
- package/dist/assets/{SigninView-CDnvthma.js.map → SigninView-C-e__nLi.js.map} +1 -1
- package/dist/assets/{SignoutView-CGC8CP2R.js → SignoutView-BnQGk2l9.js} +2 -2
- package/dist/assets/{SignoutView-CGC8CP2R.js.map → SignoutView-BnQGk2l9.js.map} +1 -1
- package/dist/assets/{SignupView-DzjytZkS.js → SignupView-CXd-UXXE.js} +2 -2
- package/dist/assets/{SignupView-DzjytZkS.js.map → SignupView-CXd-UXXE.js.map} +1 -1
- package/dist/assets/{TemplateDetails-1Y3PVQer.js → TemplateDetails-d7bjG-lc.js} +2 -2
- package/dist/assets/{TemplateDetails-1Y3PVQer.js.map → TemplateDetails-d7bjG-lc.js.map} +1 -1
- package/dist/assets/{TemplateList-BAk7Min6.js → TemplateList-B-UGoryh.js} +2 -2
- package/dist/assets/{TemplateList-BAk7Min6.js.map → TemplateList-B-UGoryh.js.map} +1 -1
- package/dist/assets/{TemplatesCollectionView-B7-6TTfO.js → TemplatesCollectionView-C3NLN4r4.js} +2 -2
- package/dist/assets/{TemplatesCollectionView-B7-6TTfO.js.map → TemplatesCollectionView-C3NLN4r4.js.map} +1 -1
- package/dist/assets/{TemplatesSearchView-DbRpG5Mr.js → TemplatesSearchView-d6JOZHQV.js} +2 -2
- package/dist/assets/{TemplatesSearchView-DbRpG5Mr.js.map → TemplatesSearchView-d6JOZHQV.js.map} +1 -1
- package/dist/assets/{TemplatesView-COyKdRm2.js → TemplatesView-CWeiRxEd.js} +2 -2
- package/dist/assets/{TemplatesView-COyKdRm2.js.map → TemplatesView-CWeiRxEd.js.map} +1 -1
- package/dist/assets/{TemplatesWorkflowView-CIeAGGeu.js → TemplatesWorkflowView-BnHhke9R.js} +2 -2
- package/dist/assets/{TemplatesWorkflowView-CIeAGGeu.js.map → TemplatesWorkflowView-BnHhke9R.js.map} +1 -1
- package/dist/assets/{VariablesView-BWE4aH2w.js → VariablesView-HRSOjl6h.js} +2 -2
- package/dist/assets/{VariablesView-BWE4aH2w.js.map → VariablesView-HRSOjl6h.js.map} +1 -1
- package/dist/assets/{WorkerView-9f3_1jpS.js → WorkerView-BoBwGroS.js} +2 -2
- package/dist/assets/{WorkerView-9f3_1jpS.js.map → WorkerView-BoBwGroS.js.map} +1 -1
- package/dist/assets/{WorkflowActivator-B6RfdJ_9.js → WorkflowActivator-b_Aa-Z_t.js} +2 -2
- package/dist/assets/{WorkflowActivator-B6RfdJ_9.js.map → WorkflowActivator-b_Aa-Z_t.js.map} +1 -1
- package/dist/assets/{WorkflowExecutionsInfoAccordion-BluokbL6.js → WorkflowExecutionsInfoAccordion-B5WHuoYD.js} +2 -2
- package/dist/assets/{WorkflowExecutionsInfoAccordion-BluokbL6.js.map → WorkflowExecutionsInfoAccordion-B5WHuoYD.js.map} +1 -1
- package/dist/assets/{WorkflowExecutionsLandingPage-DNfzEsWQ.js → WorkflowExecutionsLandingPage-D5D2gCKQ.js} +2 -2
- package/dist/assets/{WorkflowExecutionsLandingPage-DNfzEsWQ.js.map → WorkflowExecutionsLandingPage-D5D2gCKQ.js.map} +1 -1
- package/dist/assets/{WorkflowExecutionsPreview-DAmDAF-W.js → WorkflowExecutionsPreview-CQgNc11q.js} +2 -2
- package/dist/assets/{WorkflowExecutionsPreview-DAmDAF-W.js.map → WorkflowExecutionsPreview-CQgNc11q.js.map} +1 -1
- package/dist/assets/{WorkflowExecutionsView-pwPLba8F.js → WorkflowExecutionsView-CR-bru7r.js} +2 -2
- package/dist/assets/{WorkflowExecutionsView-pwPLba8F.js.map → WorkflowExecutionsView-CR-bru7r.js.map} +1 -1
- package/dist/assets/{WorkflowHistory-Dxo17Hrn.js → WorkflowHistory-DZ-HRVUW.js} +2 -2
- package/dist/assets/{WorkflowHistory-Dxo17Hrn.js.map → WorkflowHistory-DZ-HRVUW.js.map} +1 -1
- package/dist/assets/{WorkflowOnboardingView-BBidrsf7.js → WorkflowOnboardingView-DOIdULx-.js} +2 -2
- package/dist/assets/{WorkflowOnboardingView-BBidrsf7.js.map → WorkflowOnboardingView-DOIdULx-.js.map} +1 -1
- package/dist/assets/{WorkflowPreview-OBQIslyy.js → WorkflowPreview-3iPlzE4s.js} +2 -2
- package/dist/assets/{WorkflowPreview-OBQIslyy.js.map → WorkflowPreview-3iPlzE4s.js.map} +1 -1
- package/dist/assets/{WorkflowsView-CODAAPom.js → WorkflowsView-Ch9-zyDd.js} +2 -2
- package/dist/assets/{WorkflowsView-CODAAPom.js.map → WorkflowsView-Ch9-zyDd.js.map} +1 -1
- package/dist/assets/{cloud-b1t6vFlo.js → cloud-PFRUu9iS.js} +2 -2
- package/dist/assets/{cloud-b1t6vFlo.js.map → cloud-PFRUu9iS.js.map} +1 -1
- package/dist/assets/{collaboration.store-C5F_y2IO.js → collaboration.store-CV20HjQm.js} +2 -2
- package/dist/assets/{collaboration.store-C5F_y2IO.js.map → collaboration.store-CV20HjQm.js.map} +1 -1
- package/dist/assets/{index-DATiCTBk.js → index-BjbCeTcj.js} +105 -105
- package/dist/assets/index-BjbCeTcj.js.map +1 -0
- package/dist/assets/{nodeCreator.store-BHeYrLWf.js → nodeCreator.store-LPbO-Os0.js} +2 -2
- package/dist/assets/{nodeCreator.store-BHeYrLWf.js.map → nodeCreator.store-LPbO-Os0.js.map} +1 -1
- package/dist/assets/{templateActions-C33KdEJM.js → templateActions-BZ9bA7ql.js} +2 -2
- package/dist/assets/{templateActions-C33KdEJM.js.map → templateActions-BZ9bA7ql.js.map} +1 -1
- package/dist/assets/{useExecutionDebugging-DejsFiYr.js → useExecutionDebugging-L_wm2gVK.js} +2 -2
- package/dist/assets/{useExecutionDebugging-DejsFiYr.js.map → useExecutionDebugging-L_wm2gVK.js.map} +1 -1
- package/dist/assets/{useExecutionHelpers-DrZ09ZbE.js → useExecutionHelpers-th1spplL.js} +2 -2
- package/dist/assets/{useExecutionHelpers-DrZ09ZbE.js.map → useExecutionHelpers-th1spplL.js.map} +1 -1
- package/dist/assets/{usePushConnection-qF8q4o13.js → usePushConnection-DsZw7iUE.js} +2 -2
- package/dist/assets/{usePushConnection-qF8q4o13.js.map → usePushConnection-DsZw7iUE.js.map} +1 -1
- package/dist/assets/{useUserHelpers-Dn-199Fi.js → useUserHelpers-lyQUjtql.js} +2 -2
- package/dist/assets/{useUserHelpers-Dn-199Fi.js.map → useUserHelpers-lyQUjtql.js.map} +1 -1
- package/dist/assets/{useWorkflowActivate-MNrM98NZ.js → useWorkflowActivate-DTmbKEGl.js} +2 -2
- package/dist/assets/{useWorkflowActivate-MNrM98NZ.js.map → useWorkflowActivate-DTmbKEGl.js.map} +1 -1
- package/dist/index.html +1 -1
- package/package.json +1 -1
- package/dist/assets/CollectionParameter-BKwsDV7i.js.map +0 -1
- package/dist/assets/NodeDetailsView-j5ZU-3Ol.js +0 -4
- package/dist/assets/NodeDetailsView-j5ZU-3Ol.js.map +0 -1
- package/dist/assets/NodeView-DHiWHy1x.js.map +0 -1
- package/dist/assets/NodeView.v2-Ces_FOmN.js +0 -3
- package/dist/assets/index-DATiCTBk.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"mappings":"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","names":["workflowRunning","nodeDisabledTitle","emit","__emit","$style","useCssModule","i18n","useI18n","node","inject","CanvasNodeKey","data","computed","executeNode","onToggleNode","onDeleteNode","openContextMenu","_e","_type","useNodeConnections","inputs","outputs","connections","mainInputs","unref","input","NodeConnectionType","nonMainInputs","requiredNonMainInputs","mainInputConnections","mainOutputs","output","nonMainOutputs","mainOutputConnections","isVisible","isSuccessStatus","classes","label","isDisabled","styles","stylesObject","spacerCount","slots","_useSlots","Render","Component","CanvasNodeConfigurable","CanvasNodeConfiguration","CanvasNodeDefault","h","handle","CanvasNodeHandleKey","props","__props","handleType","isConnectableStart","isConnectableEnd","renderProps","CanvasHandleMainInput","CanvasHandleMainOutput","CanvasHandleNonMain","toRef","provide","nodeTypesStore","useNodeTypesStore","nodeType","watch","selected","inputsWithPosition","mapEndpointWithPosition","Position","outputsWithPosition","position","offsetAxis","endpoint","index","endpoints","id","onDelete","onDisabledToggle","onActivate","edgeStyle","isEdgeToolbarVisible","edgeToolbarStyle","path","edgeToolbarClasses","getBezierPath","connection","getSelectedEdges","getSelectedNodes","viewportRef","project","useVueFlow","hoveredEdges","ref","onMounted","onKeyDown","onUnmounted","onNodeDragStop","e","onSetNodeActive","onSelectNode","selectedNodeId","_a","onToggleNodeEnabled","onDeleteConnection","onConnect","args","onMouseEnterEdge","event","onMouseLeaveEdge","onClickPane","bounds","useCanvasMapping","workflow","workflowObject","locale","renderTypeByNodeType","acc","renderType","nodeInputsById","nodeTypeDescription","workflowObjectNode","mapLegacyEndpointsToCanvasConnectionPort","NodeHelpers.getNodeInputs","nodeOutputsById","NodeHelpers.getNodeOutputs","elements","inputConnections","outputConnections","mapLegacyConnectionsToCanvasConnections","type","getConnectionType","getConnectionLabel","_","pinData","_b","uiStore","useUIStore","runButtonText","useCanvasOperations","router","lastClickPosition","workflowsStore","useWorkflowsStore","credentialsStore","useCredentialsStore","historyStore","useHistoryStore","ndvStore","useNDVStore","canvasStore","useCanvasStore","toast","useToast","workflowHelpers","useWorkflowHelpers","nodeHelpers","useNodeHelpers","telemetry","useTelemetry","externalHooks","useExternalHooks","editableWorkflow","editableWorkflowObject","triggerNodes","updateNodePosition","trackHistory","trackBulk","oldPosition","newPosition","MoveNodeCommand","renameNode","currentName","newName","getUniqueNodeName","RenameNodeCommand","revertRenameNode","previousName","deleteNode","RemoveNodeCommand","trackDeleteNode","revertDeleteNode","STICKY_NODE_TYPE","QUICKSTART_NOTE_NAME","setNodeActive","setNodeActiveByName","name","setNodeSelected","toggleNodeDisabled","addNodes","nodes","dragAndDrop","currentPosition","lastAddedNode","nodePosition","isAutoAdd","openDetail","createNode","error","NodeViewUtils.NODE_SIZE","NodeViewUtils.GRID_SIZE","lastNodeInputs","nodeUi","options","newNodeData","resolveNodeData","lastSelectedNode","lastSelectedNodeOutputIndex","lastSelectedNodeEndpointUuid","outputIndex","targetEndpoint","connectionType","parseCanvasConnectionHandleString","isConnectionAllowed","createConnection","initializeNodeDataWithDefaultCredentials","nodeVersion","uuid","loadNodeTypesProperties","nodeParameters","NodeHelpers.getNodeParameters","credentialPerType","defaultCredential","selectedCredentials","credentials","authentication","authDisplayOptions","_c","parameters","displayOption","optionValue","_d","showMaxNodeTypeError","NodeViewUtils.getNewNodePosition","lastSelectedConnection","diffX","NodeViewUtils.getConnectorLengths","NodeViewUtils.MAX_X_TO_PUSH_DOWNSTREAM_NODES","pushDownstreamNodes","NodeViewUtils.PUSH_NODES_OFFSET","yOffset","sourceNodeType","offsets","sourceNodeOutputs","sourceNodeOutputMainOutputs","NodeHelpers.getConnectionTypes","offset","sourceOutputIndex","outputTypes","lastSelectedNodeType","outputName","lastSelectedNodeWorkflow","lastSelectedInputs","scopedConnectionIndex","inputType","inputsTypes","pushOffset","localizedName","useSegment","trackProperties","sourceNodeName","margin","sourceNode","checkNodes","nodeName","updateInformation","nodeInfos","allNodeTypeDescriptions","nodesToBeFetched","nodeVersions","n","maxNodes","targetNode","mappedConnection","mapCanvasConnectionToLegacyConnection","deleteConnection","RemoveConnectionCommand","revertDeleteConnection","targetNodeConnectionType","targetNodeType","workflowNode","addConnections","offsetIndex","from","to","fromNode","toNode","NodeCreation","defineAsyncComponent","__vitePreload","NodeDetailsView","useRouter","route","useRoute","message","useMessage","titleChange","useTitleChange","sourceControlStore","useSourceControlStore","nodeCreatorStore","useNodeCreatorStore","settingsStore","useSettingsStore","environmentsStore","useEnvironmentsStore","externalSecretsStore","useExternalSecretsStore","rootStore","useRootStore","collaborationStore","useCollaborationStore","executionsStore","useExecutionsStore","npsSurveyStore","useNpsSurveyStore","projectsStore","useProjectsStore","runWorkflow","useRunWorkflow","isLoading","isBlankRedirect","readOnlyNotification","isProductionExecutionPreview","isExecutionPreview","isExecutionWaitingForWebhook","canOpenNDV","hideNodeIssues","workflowId","isDemoRoute","VIEWS","isReadOnlyRoute","isReadOnlyEnvironment","initializeData","resetWorkspace","loadPromises","EnterpriseEditionFeature","selectedExecution","initializeView","confirmModal","MODAL_CONFIRM","MODAL_CANCEL","workflowIdParam","NEW_WORKFLOW_ID","initializeViewForNewWorkflow","trackOpenWorkflowFromOnboardingTemplate","loadCredentials","getVariant","usePostHog","CANVAS_AUTO_ADD_MANUAL_TRIGGER_EXPERIMENT","manualTriggerNode","onToggleNodeCreator","onUpdateNodePosition","onRevertDeleteNode","onToggleNodeDisabled","checkIfEditingIsAllowed","onSetNodeSelected","onRenameNode","parameterData","onRevertRenameNode","projectId","onCreateConnection","onRevertDeleteConnection","importWorkflowExact","_workflow","onAddNodesAndConnections","onSwitchActiveNode","onOpenConnectionNodeCreator","onRunWorkflow","openExecution","_executionId","addUndoRedoEventBindings","historyBus","removeUndoRedoEventBindings","addPostMessageEventBindings","onPostMessageReceived","removePostMessageEventBindings","json","messageContext","onBeforeUnmount"],"ignoreList":[],"sources":["../../src/components/canvas/elements/nodes/CanvasNodeToolbar.vue","../../src/composables/useNodeConnections.ts","../../src/components/canvas/elements/nodes/render-types/parts/CanvasNodeDisabledStrikeThrough.vue","../../src/components/canvas/elements/nodes/render-types/CanvasNodeDefault.vue","../../src/components/canvas/elements/nodes/render-types/CanvasNodeConfiguration.vue","../../src/components/canvas/elements/nodes/render-types/CanvasNodeConfigurable.vue","../../src/components/canvas/elements/nodes/CanvasNodeRenderer.vue","../../src/components/canvas/elements/handles/render-types/CanvasHandleMainInput.vue","../../src/components/canvas/elements/handles/render-types/CanvasHandleMainOutput.vue","../../src/components/canvas/elements/handles/render-types/CanvasHandleNonMain.vue","../../src/components/canvas/elements/handles/HandleRenderer.vue","../../src/components/canvas/elements/nodes/CanvasNode.vue","../../src/components/canvas/elements/edges/CanvasEdgeToolbar.vue","../../src/components/canvas/elements/edges/CanvasEdge.vue","../../src/components/canvas/Canvas.vue","../../src/composables/useCanvasMapping.ts","../../src/components/canvas/WorkflowCanvas.vue","../../src/components/canvas/elements/buttons/CanvasExecuteWorkflowButton.vue","../../src/composables/useCanvasOperations.ts","../../src/views/NodeView.v2.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, inject, useCssModule } from 'vue';\nimport { CanvasNodeKey } from '@/constants';\nimport { useI18n } from '@/composables/useI18n';\n\nconst emit = defineEmits<{\n\tdelete: [];\n\ttoggle: [];\n}>();\n\nconst $style = useCssModule();\nconst i18n = useI18n();\nconst node = inject(CanvasNodeKey);\n\nconst data = computed(() => node?.data.value);\n\n// @TODO\nconst workflowRunning = false;\n\n// @TODO\nconst nodeDisabledTitle = 'Test';\n\n// @TODO\nfunction executeNode() {}\n\nfunction onToggleNode() {\n\temit('toggle');\n}\n\nfunction onDeleteNode() {\n\temit('delete');\n}\n\n// @TODO\nfunction openContextMenu(_e: MouseEvent, _type: string) {}\n</script>\n\n<template>\n\t<div :class=\"$style.canvasNodeToolbar\">\n\t\t<div :class=\"$style.canvasNodeToolbarItems\">\n\t\t\t<N8nIconButton\n\t\t\t\tv-if=\"data?.renderType !== 'configuration'\"\n\t\t\t\tdata-test-id=\"execute-node-button\"\n\t\t\t\ttype=\"tertiary\"\n\t\t\t\ttext\n\t\t\t\tsize=\"small\"\n\t\t\t\ticon=\"play\"\n\t\t\t\t:disabled=\"workflowRunning\"\n\t\t\t\t:title=\"i18n.baseText('node.testStep')\"\n\t\t\t\t@click=\"executeNode\"\n\t\t\t/>\n\t\t\t<N8nIconButton\n\t\t\t\tdata-test-id=\"disable-node-button\"\n\t\t\t\ttype=\"tertiary\"\n\t\t\t\ttext\n\t\t\t\tsize=\"small\"\n\t\t\t\ticon=\"power-off\"\n\t\t\t\t:title=\"nodeDisabledTitle\"\n\t\t\t\t@click=\"onToggleNode\"\n\t\t\t/>\n\t\t\t<N8nIconButton\n\t\t\t\tdata-test-id=\"delete-node-button\"\n\t\t\t\ttype=\"tertiary\"\n\t\t\t\tsize=\"small\"\n\t\t\t\ttext\n\t\t\t\ticon=\"trash\"\n\t\t\t\t:title=\"i18n.baseText('node.delete')\"\n\t\t\t\t@click=\"onDeleteNode\"\n\t\t\t/>\n\t\t\t<N8nIconButton\n\t\t\t\tdata-test-id=\"overflow-node-button\"\n\t\t\t\ttype=\"tertiary\"\n\t\t\t\tsize=\"small\"\n\t\t\t\ttext\n\t\t\t\ticon=\"ellipsis-h\"\n\t\t\t\t@click=\"(e: MouseEvent) => openContextMenu(e, 'node-button')\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.canvasNodeToolbar {\n\tpadding-bottom: var(--spacing-3xs);\n}\n\n.canvasNodeToolbarItems {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n</style>\n","import type { CanvasElementData } from '@/types';\nimport type { MaybeRef } from 'vue';\nimport { computed, unref } from 'vue';\nimport { NodeConnectionType } from 'n8n-workflow';\n\nexport function useNodeConnections({\n\tinputs,\n\toutputs,\n\tconnections,\n}: {\n\tinputs: MaybeRef<CanvasElementData['inputs']>;\n\toutputs: MaybeRef<CanvasElementData['outputs']>;\n\tconnections: MaybeRef<CanvasElementData['connections']>;\n}) {\n\t/**\n\t * Inputs\n\t */\n\n\tconst mainInputs = computed(() =>\n\t\tunref(inputs).filter((input) => input.type === NodeConnectionType.Main),\n\t);\n\n\tconst nonMainInputs = computed(() =>\n\t\tunref(inputs).filter((input) => input.type !== NodeConnectionType.Main),\n\t);\n\n\tconst requiredNonMainInputs = computed(() =>\n\t\tnonMainInputs.value.filter((input) => input.required),\n\t);\n\n\tconst mainInputConnections = computed(\n\t\t() => unref(connections).input[NodeConnectionType.Main] ?? [],\n\t);\n\n\t/**\n\t * Outputs\n\t */\n\n\tconst mainOutputs = computed(() =>\n\t\tunref(outputs).filter((output) => output.type === NodeConnectionType.Main),\n\t);\n\n\tconst nonMainOutputs = computed(() =>\n\t\tunref(outputs).filter((output) => output.type !== NodeConnectionType.Main),\n\t);\n\n\tconst mainOutputConnections = computed(\n\t\t() => unref(connections).output[NodeConnectionType.Main] ?? [],\n\t);\n\n\treturn {\n\t\tmainInputs,\n\t\tnonMainInputs,\n\t\trequiredNonMainInputs,\n\t\tmainInputConnections,\n\t\tmainOutputs,\n\t\tnonMainOutputs,\n\t\tmainOutputConnections,\n\t};\n}\n","<script setup lang=\"ts\">\nimport { computed, inject, useCssModule } from 'vue';\nimport { CanvasNodeKey } from '@/constants';\nimport { useNodeConnections } from '@/composables/useNodeConnections';\n\nconst $style = useCssModule();\nconst node = inject(CanvasNodeKey);\n\nconst inputs = computed(() => node?.data.value.inputs ?? []);\nconst outputs = computed(() => node?.data.value.outputs ?? []);\nconst connections = computed(() => node?.data.value.connections ?? { input: {}, output: {} });\nconst { mainInputConnections, mainOutputConnections } = useNodeConnections({\n\tinputs,\n\toutputs,\n\tconnections,\n});\n\nconst isVisible = computed(\n\t() => mainInputConnections.value.length === 1 && mainOutputConnections.value.length === 1,\n);\n\nconst isSuccessStatus = computed(\n\t() => false,\n\t// @TODO Implement this\n\t// () => !['unknown'].includes(node.status) && workflowDataItems > 0,\n);\n\nconst classes = computed(() => {\n\treturn {\n\t\t[$style.disabledStrikeThrough]: true,\n\t\t[$style.success]: isSuccessStatus.value,\n\t};\n});\n</script>\n\n<template>\n\t<div v-if=\"isVisible\" :class=\"classes\"></div>\n</template>\n\n<style lang=\"scss\" module>\n.disabledStrikeThrough {\n\tborder: 1px solid var(--color-foreground-dark);\n\tposition: absolute;\n\ttop: calc(var(--canvas-node--height) / 2 - 1px);\n\tleft: -4px;\n\twidth: calc(100% + 12px);\n\tpointer-events: none;\n}\n\n.success {\n\tborder-color: var(--color-success-light);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, inject, useCssModule } from 'vue';\nimport { useNodeConnections } from '@/composables/useNodeConnections';\nimport { CanvasNodeKey } from '@/constants';\nimport { useI18n } from '@/composables/useI18n';\nimport CanvasNodeDisabledStrikeThrough from './parts/CanvasNodeDisabledStrikeThrough.vue';\n\nconst node = inject(CanvasNodeKey);\n\nconst $style = useCssModule();\nconst i18n = useI18n();\n\nconst label = computed(() => node?.label.value ?? '');\n\nconst inputs = computed(() => node?.data.value.inputs ?? []);\nconst outputs = computed(() => node?.data.value.outputs ?? []);\nconst connections = computed(() => node?.data.value.connections ?? { input: {}, output: {} });\nconst { mainOutputs } = useNodeConnections({\n\tinputs,\n\toutputs,\n\tconnections,\n});\n\nconst isDisabled = computed(() => node?.data.value.disabled ?? false);\n\nconst classes = computed(() => {\n\treturn {\n\t\t[$style.node]: true,\n\t\t[$style.selected]: node?.selected.value,\n\t\t[$style.disabled]: isDisabled.value,\n\t};\n});\n\nconst styles = computed(() => {\n\treturn {\n\t\t'--node-main-output-count': mainOutputs.value.length,\n\t};\n});\n</script>\n\n<template>\n\t<div v-if=\"node\" :class=\"classes\" :style=\"styles\" data-test-id=\"canvas-node-default\">\n\t\t<slot />\n\t\t<CanvasNodeDisabledStrikeThrough v-if=\"isDisabled\" />\n\t\t<div v-if=\"label\" :class=\"$style.label\">\n\t\t\t{{ label }}\n\t\t\t<div v-if=\"isDisabled\">({{ i18n.baseText('node.disabled') }})</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.node {\n\t--canvas-node--height: calc(100px + max(0, var(--node-main-output-count, 1) - 4) * 50px);\n\t--canvas-node--width: 100px;\n\n\theight: var(--canvas-node--height);\n\twidth: var(--canvas-node--width);\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tbackground: var(--canvas-node--background, var(--color-node-background));\n\tborder: 2px solid var(--canvas-node--border-color, var(--color-foreground-xdark));\n\tborder-radius: var(--border-radius-large);\n}\n\n.label {\n\ttop: 100%;\n\tposition: absolute;\n\tfont-size: var(--font-size-m);\n\ttext-align: center;\n\twidth: 100%;\n\tmin-width: 200px;\n\tmargin-top: var(--spacing-2xs);\n}\n\n.selected {\n\tbox-shadow: 0 0 0 4px var(--color-canvas-selected);\n}\n\n.disabled {\n\tborder-color: var(--color-canvas-node-disabled-border, var(--color-foreground-base));\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, inject, useCssModule } from 'vue';\nimport { CanvasNodeKey } from '@/constants';\nimport { useI18n } from '@/composables/useI18n';\n\nconst node = inject(CanvasNodeKey);\n\nconst $style = useCssModule();\nconst i18n = useI18n();\n\nconst label = computed(() => node?.label.value ?? '');\n\nconst isDisabled = computed(() => node?.data.value.disabled ?? false);\n\nconst classes = computed(() => {\n\treturn {\n\t\t[$style.node]: true,\n\t\t[$style.selected]: node?.selected.value,\n\t\t[$style.disabled]: isDisabled.value,\n\t};\n});\n</script>\n\n<template>\n\t<div :class=\"classes\" data-test-id=\"canvas-node-configuration\">\n\t\t<slot />\n\t\t<div v-if=\"label\" :class=\"$style.label\">\n\t\t\t{{ label }}\n\t\t\t<div v-if=\"isDisabled\">({{ i18n.baseText('node.disabled') }})</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.node {\n\t--canvas-node--width: 75px;\n\t--canvas-node--height: 75px;\n\n\twidth: var(--canvas-node--width);\n\theight: var(--canvas-node--height);\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tbackground: var(--canvas-node--background, var(--node-type-supplemental-background));\n\tborder: 2px solid var(--canvas-node--border-color, var(--color-foreground-dark));\n\tborder-radius: 50%;\n}\n\n.label {\n\ttop: 100%;\n\tposition: absolute;\n\tfont-size: var(--font-size-m);\n\ttext-align: center;\n\twidth: 100%;\n\tmin-width: 200px;\n\tmargin-top: var(--spacing-2xs);\n}\n\n.selected {\n\tbox-shadow: 0 0 0 4px var(--color-canvas-selected);\n}\n\n.disabled {\n\tborder-color: var(--color-canvas-node-disabled-border, var(--color-foreground-base));\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, inject, useCssModule } from 'vue';\nimport { CanvasNodeKey, NODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS } from '@/constants';\nimport { useNodeConnections } from '@/composables/useNodeConnections';\nimport { useI18n } from '@/composables/useI18n';\nimport CanvasNodeDisabledStrikeThrough from './parts/CanvasNodeDisabledStrikeThrough.vue';\n\nconst node = inject(CanvasNodeKey);\n\nconst $style = useCssModule();\nconst i18n = useI18n();\n\nconst label = computed(() => node?.label.value ?? '');\n\nconst inputs = computed(() => node?.data.value.inputs ?? []);\nconst outputs = computed(() => node?.data.value.outputs ?? []);\nconst connections = computed(() => node?.data.value.connections ?? { input: {}, output: {} });\nconst { nonMainInputs, requiredNonMainInputs } = useNodeConnections({\n\tinputs,\n\toutputs,\n\tconnections,\n});\n\nconst isDisabled = computed(() => node?.data.value.disabled ?? false);\n\nconst classes = computed(() => {\n\treturn {\n\t\t[$style.node]: true,\n\t\t[$style.selected]: node?.selected.value,\n\t\t[$style.disabled]: isDisabled.value,\n\t};\n});\n\nconst styles = computed(() => {\n\tconst stylesObject: {\n\t\t[key: string]: string | number;\n\t} = {};\n\n\tif (requiredNonMainInputs.value.length > 0) {\n\t\tlet spacerCount = 0;\n\t\tif (NODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS) {\n\t\t\tconst requiredNonMainInputsCount = requiredNonMainInputs.value.length;\n\t\t\tconst optionalNonMainInputsCount = nonMainInputs.value.length - requiredNonMainInputsCount;\n\t\t\tspacerCount = requiredNonMainInputsCount > 0 && optionalNonMainInputsCount > 0 ? 1 : 0;\n\t\t}\n\n\t\tstylesObject['--configurable-node-input-count'] = nonMainInputs.value.length + spacerCount;\n\t}\n\n\treturn stylesObject;\n});\n</script>\n\n<template>\n\t<div :class=\"classes\" :style=\"styles\" data-test-id=\"canvas-node-configurable\">\n\t\t<slot />\n\t\t<CanvasNodeDisabledStrikeThrough v-if=\"isDisabled\" />\n\t\t<div :class=\"$style.label\">\n\t\t\t{{ label }}\n\t\t\t<div v-if=\"isDisabled\">({{ i18n.baseText('node.disabled') }})</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.node {\n\t--configurable-node-min-input-count: 4;\n\t--configurable-node-input-width: 65px;\n\t--canvas-node--height: 100px;\n\t--canvas-node--width: calc(\n\t\tmax(var(--configurable-node-input-count, 5), var(--configurable-node-min-input-count)) *\n\t\t\tvar(--configurable-node-input-width)\n\t);\n\n\twidth: var(--canvas-node--width);\n\theight: var(--canvas-node--height);\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tbackground: var(--canvas-node--background, var(--color-node-background));\n\tborder: 2px solid var(--canvas-node--border-color, var(--color-foreground-xdark));\n\tborder-radius: var(--border-radius-large);\n}\n\n.label {\n\ttop: 100%;\n\tfont-size: var(--font-size-m);\n\ttext-align: center;\n\tmargin-left: var(--spacing-s);\n\tmax-width: calc(\n\t\tvar(--node-width) - var(--configurable-node-icon-offset) - var(--configurable-node-icon-size) -\n\t\t\t2 * var(--spacing-s)\n\t);\n}\n\n.selected {\n\tbox-shadow: 0 0 0 4px var(--color-canvas-selected);\n}\n\n.disabled {\n\tborder-color: var(--color-canvas-node-disabled-border, var(--color-foreground-base));\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { h, inject } from 'vue';\nimport CanvasNodeDefault from '@/components/canvas/elements/nodes/render-types/CanvasNodeDefault.vue';\nimport CanvasNodeConfiguration from '@/components/canvas/elements/nodes/render-types/CanvasNodeConfiguration.vue';\nimport CanvasNodeConfigurable from '@/components/canvas/elements/nodes/render-types/CanvasNodeConfigurable.vue';\nimport { CanvasNodeKey } from '@/constants';\n\nconst node = inject(CanvasNodeKey);\n\nconst slots = defineSlots<{\n\tdefault?: () => unknown;\n}>();\n\nconst Render = () => {\n\tlet Component;\n\tswitch (node?.data.value.renderType) {\n\t\tcase 'configurable':\n\t\t\tComponent = CanvasNodeConfigurable;\n\t\t\tbreak;\n\n\t\tcase 'configuration':\n\t\t\tComponent = CanvasNodeConfiguration;\n\t\t\tbreak;\n\n\t\tcase 'trigger':\n\t\t\tComponent = CanvasNodeDefault;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tComponent = CanvasNodeDefault;\n\t}\n\n\treturn h(Component, slots.default);\n};\n</script>\n\n<template>\n\t<Render />\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, inject, useCssModule } from 'vue';\nimport { CanvasNodeHandleKey } from '@/constants';\n\nconst handle = inject(CanvasNodeHandleKey);\n\nconst $style = useCssModule();\n\nconst label = computed(() => handle?.label.value ?? '');\n</script>\n<template>\n\t<div :class=\"['canvas-node-handle-main-input', $style.handle]\">\n\t\t<div :class=\"$style.label\">{{ label }}</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.handle {\n\twidth: 8px;\n\theight: 16px;\n\tborder-radius: 0;\n\tbackground: var(--color-foreground-xdark);\n\n\t&:hover {\n\t\tbackground: var(--color-primary);\n\t}\n}\n\n.label {\n\tposition: absolute;\n\ttop: 50%;\n\tright: 12px;\n\ttransform: translate(0, -50%);\n\tfont-size: var(--font-size-2xs);\n\tcolor: var(--color-foreground-xdark);\n\tbackground: var(--color-background-light);\n\tz-index: 1;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, inject, useCssModule } from 'vue';\nimport { CanvasNodeHandleKey } from '@/constants';\n\nconst handle = inject(CanvasNodeHandleKey);\n\n// const group = svg.node('g');\n// const containerBorder = svg.node('rect', {\n// \trx: 3,\n// \t'stroke-width': 2,\n// \tfillOpacity: 0,\n// \theight: ep.params.dimensions - 2,\n// \twidth: ep.params.dimensions - 2,\n// \ty: 1,\n// \tx: 1,\n// });\n// const plusPath = svg.node('path', {\n// \td: 'm16.40655,10.89837l-3.30491,0l0,-3.30491c0,-0.40555 -0.32889,-0.73443 -0.73443,-0.73443l-0.73443,0c-0.40554,0 -0.73442,0.32888 -0.73442,0.73443l0,3.30491l-3.30491,0c-0.40555,0 -0.73443,0.32888 -0.73443,0.73442l0,0.73443c0,0.40554 0.32888,0.73443 0.73443,0.73443l3.30491,0l0,3.30491c0,0.40554 0.32888,0.73442 0.73442,0.73442l0.73443,0c0.40554,0 0.73443,-0.32888 0.73443,-0.73442l0,-3.30491l3.30491,0c0.40554,0 0.73442,-0.32889 0.73442,-0.73443l0,-0.73443c0,-0.40554 -0.32888,-0.73442 -0.73442,-0.73442z',\n// });\n// if (ep.params.size !== 'medium') {\n// \tep.addClass(ep.params.size);\n// }\n// group.appendChild(containerBorder);\n// group.appendChild(plusPath);\n//\n// ep.setupOverlays();\n// ep.setVisible(false);\n// return group;\n\nconst $style = useCssModule();\n\nconst label = computed(() => handle?.label.value ?? '');\n</script>\n<template>\n\t<div :class=\"['canvas-node-handle-main-output', $style.handle]\">\n\t\t<div :class=\"$style.label\">{{ label }}</div>\n\t\t<div :class=\"$style.circle\" />\n\t\t<!-- @TODO Determine whether handle is connected and find a way to make it work without pointer-events: none -->\n\t\t<!--\t\t<svg :class=\"$style.plus\" viewBox=\"0 0 70 24\">-->\n\t\t<!--\t\t\t<line x1=\"0\" y1=\"12\" x2=\"46\" y2=\"12\" stroke=\"var(--color-foreground-xdark)\" />-->\n\t\t<!--\t\t\t<rect-->\n\t\t<!--\t\t\t\tx=\"46\"-->\n\t\t<!--\t\t\t\ty=\"2\"-->\n\t\t<!--\t\t\t\twidth=\"20\"-->\n\t\t<!--\t\t\t\theight=\"20\"-->\n\t\t<!--\t\t\t\tstroke=\"var(--color-foreground-xdark)\"-->\n\t\t<!--\t\t\t\tstroke-width=\"2\"-->\n\t\t<!--\t\t\t\trx=\"4\"-->\n\t\t<!--\t\t\t\tfill=\"#ffffff\"-->\n\t\t<!--\t\t\t/>-->\n\t\t<!--\t\t\t<g transform=\"translate(44, 0)\">-->\n\t\t<!--\t\t\t\t<path-->\n\t\t<!--\t\t\t\t\tfill=\"var(--color-foreground-xdark)\"-->\n\t\t<!--\t\t\t\t\td=\"m16.40655,10.89837l-3.30491,0l0,-3.30491c0,-0.40555 -0.32889,-0.73443 -0.73443,-0.73443l-0.73443,0c-0.40554,0 -0.73442,0.32888 -0.73442,0.73443l0,3.30491l-3.30491,0c-0.40555,0 -0.73443,0.32888 -0.73443,0.73442l0,0.73443c0,0.40554 0.32888,0.73443 0.73443,0.73443l3.30491,0l0,3.30491c0,0.40554 0.32888,0.73442 0.73442,0.73442l0.73443,0c0.40554,0 0.73443,-0.32888 0.73443,-0.73442l0,-3.30491l3.30491,0c0.40554,0 0.73442,-0.32889 0.73442,-0.73443l0,-0.73443c0,-0.40554 -0.32888,-0.73442 -0.73442,-0.73442z\"-->\n\t\t<!--\t\t\t\t></path>-->\n\t\t<!--\t\t\t</g>-->\n\t\t<!--\t\t</svg>-->\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.handle {\n\twidth: 16px;\n\theight: 16px;\n}\n\n.circle {\n\twidth: 16px;\n\theight: 16px;\n\tborder-radius: 100%;\n\tbackground: var(--color-foreground-xdark);\n\n\t&:hover {\n\t\tbackground: var(--color-primary);\n\t}\n}\n\n.plus {\n\tposition: absolute;\n\tleft: 16px;\n\ttop: 50%;\n\ttransform: translate(0, -50%);\n\twidth: 70px;\n\theight: 24px;\n\n\t:global(.vue-flow__handle.connecting) & {\n\t\tdisplay: none;\n\t}\n}\n\n.label {\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 20px;\n\ttransform: translate(0, -50%);\n\tfont-size: var(--font-size-2xs);\n\tcolor: var(--color-foreground-xdark);\n\tbackground: var(--color-background-light);\n\tz-index: 1;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, inject, useCssModule } from 'vue';\nimport { CanvasNodeHandleKey } from '@/constants';\n\nconst handle = inject(CanvasNodeHandleKey);\n\nconst $style = useCssModule();\n\nconst label = computed(() => handle?.label.value ?? '');\n</script>\n<template>\n\t<div :class=\"['canvas-node-handle-non-main', $style.handle]\">\n\t\t<div :class=\"$style.diamond\" />\n\t\t<div :class=\"$style.label\">{{ label }}</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.handle {\n\twidth: 14px;\n\theight: 14px;\n\tborder-radius: 0;\n}\n\n.diamond {\n\twidth: 14px;\n\theight: 14px;\n\ttransform: rotate(45deg);\n\tbackground: hsl(\n\t\tvar(--node-type-supplemental-color-h) var(--node-type-supplemental-color-s)\n\t\t\tvar(--node-type-supplemental-color-l)\n\t);\n\n\t&:hover {\n\t\tbackground: var(--color-primary);\n\t}\n}\n\n.label {\n\tposition: absolute;\n\ttop: 18px;\n\tleft: 50%;\n\ttransform: translate(-50%, 0);\n\tfont-size: var(--font-size-2xs);\n\tcolor: var(--color-foreground-xdark);\n\tbackground: var(--color-background-light);\n\tz-index: 1;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, h, provide, toRef, useCssModule } from 'vue';\nimport type { CanvasConnectionPort, CanvasElementPortWithPosition } from '@/types';\n\nimport { Handle } from '@vue-flow/core';\nimport { NodeConnectionType } from 'n8n-workflow';\nimport CanvasHandleMainInput from '@/components/canvas/elements/handles/render-types/CanvasHandleMainInput.vue';\nimport CanvasHandleMainOutput from '@/components/canvas/elements/handles/render-types/CanvasHandleMainOutput.vue';\nimport CanvasHandleNonMain from '@/components/canvas/elements/handles/render-types/CanvasHandleNonMain.vue';\nimport { CanvasNodeHandleKey } from '@/constants';\n\nconst props = defineProps<{\n\tmode: 'output' | 'input';\n\tlabel?: string;\n\ttype: CanvasConnectionPort['type'];\n\tindex: CanvasConnectionPort['index'];\n\tposition: CanvasElementPortWithPosition['position'];\n\toffset: CanvasElementPortWithPosition['offset'];\n}>();\n\nconst $style = useCssModule();\n\nconst handleType = computed(() => (props.mode === 'input' ? 'target' : 'source'));\n\nconst isConnectableStart = computed(() => {\n\treturn props.mode === 'output' || props.type !== NodeConnectionType.Main;\n});\n\nconst isConnectableEnd = computed(() => {\n\treturn props.mode === 'input' || props.type !== NodeConnectionType.Main;\n});\n\nconst Render = (renderProps: { label?: string }) => {\n\tlet Component;\n\n\tif (props.type === NodeConnectionType.Main) {\n\t\tif (props.mode === 'input') {\n\t\t\tComponent = CanvasHandleMainInput;\n\t\t} else {\n\t\t\tComponent = CanvasHandleMainOutput;\n\t\t}\n\t} else {\n\t\tComponent = CanvasHandleNonMain;\n\t}\n\n\treturn h(Component, renderProps);\n};\n\n/**\n * Provide\n */\n\nconst label = toRef(props, 'label');\n\nprovide(CanvasNodeHandleKey, {\n\tlabel,\n});\n</script>\n\n<template>\n\t<Handle\n\t\t:id=\"`${mode}s/${type}/${index}`\"\n\t\t:class=\"[$style.handle]\"\n\t\t:type=\"handleType\"\n\t\t:position=\"position\"\n\t\t:style=\"offset\"\n\t\t:connectable-start=\"isConnectableStart\"\n\t\t:connectable-end=\"isConnectableEnd\"\n\t>\n\t\t<Render :label=\"label\" />\n\t</Handle>\n</template>\n\n<style lang=\"scss\" module>\n.handle {\n\twidth: auto;\n\theight: auto;\n\tdisplay: inline-flex;\n\tjustify-content: center;\n\talign-items: center;\n\tborder: 0;\n\tbackground: none;\n\n\t> * {\n\t\tpointer-events: none;\n\t}\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { Position } from '@vue-flow/core';\nimport { computed, provide, toRef, watch } from 'vue';\nimport type {\n\tCanvasElementData,\n\tCanvasConnectionPort,\n\tCanvasElementPortWithPosition,\n} from '@/types';\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport CanvasNodeToolbar from '@/components/canvas/elements/nodes/CanvasNodeToolbar.vue';\nimport CanvasNodeRenderer from '@/components/canvas/elements/nodes/CanvasNodeRenderer.vue';\nimport HandleRenderer from '@/components/canvas/elements/handles/HandleRenderer.vue';\nimport { useNodeConnections } from '@/composables/useNodeConnections';\nimport { CanvasNodeKey } from '@/constants';\nimport type { NodeProps } from '@vue-flow/core';\n\nconst emit = defineEmits<{\n\tdelete: [id: string];\n\tselect: [id: string, selected: boolean];\n\ttoggle: [id: string];\n\tactivate: [id: string];\n}>();\nconst props = defineProps<NodeProps<CanvasElementData>>();\n\nconst nodeTypesStore = useNodeTypesStore();\n\nconst inputs = computed(() => props.data.inputs);\nconst outputs = computed(() => props.data.outputs);\nconst connections = computed(() => props.data.connections);\nconst { mainInputs, nonMainInputs, mainOutputs, nonMainOutputs } = useNodeConnections({\n\tinputs,\n\toutputs,\n\tconnections,\n});\n\nconst isDisabled = computed(() => props.data.disabled);\n\nconst nodeType = computed(() => {\n\treturn nodeTypesStore.getNodeType(props.data.type, props.data.typeVersion);\n});\n\nwatch(\n\t() => props.selected,\n\t(selected) => {\n\t\temit('select', props.id, selected);\n\t},\n);\n\n/**\n * Inputs\n */\n\nconst inputsWithPosition = computed(() => {\n\treturn [\n\t\t...mainInputs.value.map(mapEndpointWithPosition(Position.Left, 'top')),\n\t\t...nonMainInputs.value.map(mapEndpointWithPosition(Position.Bottom, 'left')),\n\t];\n});\n\n/**\n * Outputs\n */\n\nconst outputsWithPosition = computed(() => {\n\treturn [\n\t\t...mainOutputs.value.map(mapEndpointWithPosition(Position.Right, 'top')),\n\t\t...nonMainOutputs.value.map(mapEndpointWithPosition(Position.Top, 'left')),\n\t];\n});\n\n/**\n * Endpoints\n */\n\nconst mapEndpointWithPosition =\n\t(position: Position, offsetAxis: 'top' | 'left') =>\n\t(\n\t\tendpoint: CanvasConnectionPort,\n\t\tindex: number,\n\t\tendpoints: CanvasConnectionPort[],\n\t): CanvasElementPortWithPosition => {\n\t\treturn {\n\t\t\t...endpoint,\n\t\t\tposition,\n\t\t\toffset: {\n\t\t\t\t[offsetAxis]: `${(100 / (endpoints.length + 1)) * (index + 1)}%`,\n\t\t\t},\n\t\t};\n\t};\n\n/**\n * Provide\n */\n\nconst id = toRef(props, 'id');\nconst data = toRef(props, 'data');\nconst label = toRef(props, 'label');\nconst selected = toRef(props, 'selected');\n\nprovide(CanvasNodeKey, {\n\tid,\n\tdata,\n\tlabel,\n\tselected,\n\tnodeType,\n});\n\nfunction onDelete() {\n\temit('delete', props.id);\n}\n\nfunction onDisabledToggle() {\n\temit('toggle', props.id);\n}\n\nfunction onActivate() {\n\temit('activate', props.id);\n}\n</script>\n\n<template>\n\t<div :class=\"$style.canvasNode\" data-test-id=\"canvas-node\">\n\t\t<template v-for=\"source in outputsWithPosition\" :key=\"`${source.type}/${source.index}`\">\n\t\t\t<HandleRenderer\n\t\t\t\tmode=\"output\"\n\t\t\t\tdata-test-id=\"canvas-node-output-handle\"\n\t\t\t\t:type=\"source.type\"\n\t\t\t\t:label=\"source.label\"\n\t\t\t\t:index=\"source.index\"\n\t\t\t\t:position=\"source.position\"\n\t\t\t\t:offset=\"source.offset\"\n\t\t\t/>\n\t\t</template>\n\n\t\t<template v-for=\"target in inputsWithPosition\" :key=\"`${target.type}/${target.index}`\">\n\t\t\t<HandleRenderer\n\t\t\t\tmode=\"input\"\n\t\t\t\tdata-test-id=\"canvas-node-input-handle\"\n\t\t\t\t:type=\"target.type\"\n\t\t\t\t:label=\"target.label\"\n\t\t\t\t:index=\"target.index\"\n\t\t\t\t:position=\"target.position\"\n\t\t\t\t:offset=\"target.offset\"\n\t\t\t/>\n\t\t</template>\n\n\t\t<CanvasNodeToolbar\n\t\t\tv-if=\"nodeType\"\n\t\t\tdata-test-id=\"canvas-node-toolbar\"\n\t\t\t:class=\"$style.canvasNodeToolbar\"\n\t\t\t@delete=\"onDelete\"\n\t\t\t@toggle=\"onDisabledToggle\"\n\t\t/>\n\n\t\t<CanvasNodeRenderer v-if=\"nodeType\" @dblclick=\"onActivate\">\n\t\t\t<NodeIcon :node-type=\"nodeType\" :size=\"40\" :shrink=\"false\" :disabled=\"isDisabled\" />\n\t\t\t<!--\t\t\t:color-default=\"iconColorDefault\"-->\n\t\t</CanvasNodeRenderer>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.canvasNode {\n\t&:hover {\n\t\t.canvasNodeToolbar {\n\t\t\tdisplay: flex;\n\t\t\topacity: 1;\n\t\t}\n\t}\n}\n\n.canvasNodeToolbar {\n\tdisplay: none;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 50%;\n\ttransform: translate(-50%, -100%);\n\topacity: 0;\n\ttransition: opacity 0.3s ease;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { useI18n } from '@/composables/useI18n';\nimport { computed, useCssModule } from 'vue';\n\nconst emit = defineEmits<{\n\tdelete: [];\n}>();\n\nconst $style = useCssModule();\n\nconst i18n = useI18n();\n\nconst classes = computed(() => ({\n\t[$style.canvasEdgeToolbar]: true,\n}));\n\nfunction onDelete() {\n\temit('delete');\n}\n</script>\n\n<template>\n\t<div :class=\"classes\" data-test-id=\"canvas-edge-toolbar\">\n\t\t<N8nIconButton\n\t\t\tdata-test-id=\"delete-connection-button\"\n\t\t\ttype=\"tertiary\"\n\t\t\tsize=\"small\"\n\t\t\ticon=\"trash\"\n\t\t\t:title=\"i18n.baseText('node.delete')\"\n\t\t\t@click=\"onDelete\"\n\t\t/>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.canvasEdgeToolbar {\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tpointer-events: all;\n}\n</style>\n","<script lang=\"ts\" setup>\n/* eslint-disable vue/no-multiple-template-root */\nimport type { Connection, EdgeProps } from '@vue-flow/core';\nimport { BaseEdge, EdgeLabelRenderer, getBezierPath } from '@vue-flow/core';\nimport CanvasEdgeToolbar from './CanvasEdgeToolbar.vue';\nimport { computed, useCssModule } from 'vue';\n\nconst emit = defineEmits<{\n\tdelete: [connection: Connection];\n}>();\n\nconst props = defineProps<\n\tEdgeProps & {\n\t\thovered?: boolean;\n\t}\n>();\n\nconst $style = useCssModule();\n\nconst edgeStyle = computed(() => ({\n\tstrokeWidth: 2,\n\t...props.style,\n}));\n\nconst isEdgeToolbarVisible = computed(() => props.selected || props.hovered);\n\nconst edgeToolbarStyle = computed(() => {\n\treturn {\n\t\ttransform: `translate(-50%, -50%) translate(${path.value[1]}px,${path.value[2]}px)`,\n\t};\n});\n\nconst edgeToolbarClasses = computed(() => ({\n\t[$style.edgeToolbar]: true,\n\t[$style.edgeToolbarVisible]: isEdgeToolbarVisible.value,\n\tnodrag: true,\n\tnopan: true,\n}));\n\nconst path = computed(() =>\n\tgetBezierPath({\n\t\tsourceX: props.sourceX,\n\t\tsourceY: props.sourceY,\n\t\tsourcePosition: props.sourcePosition,\n\t\ttargetX: props.targetX,\n\t\ttargetY: props.targetY,\n\t\ttargetPosition: props.targetPosition,\n\t}),\n);\n\nconst connection = computed<Connection>(() => ({\n\tsource: props.source,\n\ttarget: props.target,\n\tsourceHandle: props.sourceHandleId,\n\ttargetHandle: props.targetHandleId,\n}));\n\nfunction onDelete() {\n\temit('delete', connection.value);\n}\n</script>\n\n<template>\n\t<BaseEdge\n\t\t:id=\"id\"\n\t\t:style=\"edgeStyle\"\n\t\t:path=\"path[0]\"\n\t\t:marker-end=\"markerEnd\"\n\t\t:label=\"data?.label\"\n\t\t:label-x=\"path[1]\"\n\t\t:label-y=\"path[2]\"\n\t\t:label-style=\"{ fill: 'white' }\"\n\t\t:label-show-bg=\"true\"\n\t\t:label-bg-style=\"{ fill: 'red' }\"\n\t\t:label-bg-padding=\"[2, 4]\"\n\t\t:label-bg-border-radius=\"2\"\n\t\t:class=\"$style.edge\"\n\t/>\n\t<EdgeLabelRenderer>\n\t\t<CanvasEdgeToolbar :class=\"edgeToolbarClasses\" :style=\"edgeToolbarStyle\" @delete=\"onDelete\" />\n\t</EdgeLabelRenderer>\n</template>\n\n<style lang=\"scss\" module>\n.edgeToolbar {\n\tposition: absolute;\n\topacity: 0;\n\n\t&.edgeToolbarVisible {\n\t\topacity: 1;\n\t}\n\n\t&:hover {\n\t\topacity: 1;\n\t}\n}\n</style>\n","<script lang=\"ts\" setup>\nimport type { CanvasConnection, CanvasElement } from '@/types';\nimport type { EdgeMouseEvent, NodeDragEvent, Connection, XYPosition } from '@vue-flow/core';\nimport { useVueFlow, VueFlow, PanelPosition } from '@vue-flow/core';\nimport { Background } from '@vue-flow/background';\nimport { Controls } from '@vue-flow/controls';\nimport { MiniMap } from '@vue-flow/minimap';\nimport CanvasNode from './elements/nodes/CanvasNode.vue';\nimport CanvasEdge from './elements/edges/CanvasEdge.vue';\nimport { onMounted, onUnmounted, ref, useCssModule } from 'vue';\n\nconst $style = useCssModule();\n\nconst emit = defineEmits<{\n\t'update:modelValue': [elements: CanvasElement[]];\n\t'update:node:position': [id: string, position: XYPosition];\n\t'update:node:active': [id: string];\n\t'update:node:enabled': [id: string];\n\t'update:node:selected': [id?: string];\n\t'delete:node': [id: string];\n\t'delete:connection': [connection: Connection];\n\t'create:connection': [connection: Connection];\n\t'click:pane': [position: XYPosition];\n}>();\n\nconst props = withDefaults(\n\tdefineProps<{\n\t\tid?: string;\n\t\telements: CanvasElement[];\n\t\tconnections: CanvasConnection[];\n\t\tcontrolsPosition?: PanelPosition;\n\t}>(),\n\t{\n\t\tid: 'canvas',\n\t\telements: () => [],\n\t\tconnections: () => [],\n\t\tcontrolsPosition: PanelPosition.BottomLeft,\n\t},\n);\n\nconst { getSelectedEdges, getSelectedNodes, viewportRef, project } = useVueFlow({\n\tid: props.id,\n});\n\nconst hoveredEdges = ref<Record<string, boolean>>({});\n\nonMounted(() => {\n\tdocument.addEventListener('keydown', onKeyDown);\n});\n\nonUnmounted(() => {\n\tdocument.removeEventListener('keydown', onKeyDown);\n});\n\nfunction onNodeDragStop(e: NodeDragEvent) {\n\te.nodes.forEach((node) => {\n\t\temit('update:node:position', node.id, node.position);\n\t});\n}\n\nfunction onSetNodeActive(id: string) {\n\temit('update:node:active', id);\n}\n\nfunction onSelectNode() {\n\tconst selectedNodeId = getSelectedNodes.value[getSelectedNodes.value.length - 1]?.id;\n\temit('update:node:selected', selectedNodeId);\n}\n\nfunction onToggleNodeEnabled(id: string) {\n\temit('update:node:enabled', id);\n}\n\nfunction onDeleteNode(id: string) {\n\temit('delete:node', id);\n}\n\nfunction onDeleteConnection(connection: Connection) {\n\temit('delete:connection', connection);\n}\n\nfunction onConnect(...args: unknown[]) {\n\temit('create:connection', args[0] as Connection);\n}\n\nfunction onKeyDown(e: KeyboardEvent) {\n\tif (e.key === 'Delete') {\n\t\tgetSelectedEdges.value.forEach(onDeleteConnection);\n\t\tgetSelectedNodes.value.forEach(({ id }) => onDeleteNode(id));\n\t}\n}\n\nfunction onMouseEnterEdge(event: EdgeMouseEvent) {\n\thoveredEdges.value[event.edge.id] = true;\n}\n\nfunction onMouseLeaveEdge(event: EdgeMouseEvent) {\n\thoveredEdges.value[event.edge.id] = false;\n}\n\nfunction onClickPane(event: MouseEvent) {\n\tconst bounds = viewportRef.value?.getBoundingClientRect() ?? { left: 0, top: 0 };\n\tconst position = project({\n\t\tx: event.offsetX - bounds.left,\n\t\ty: event.offsetY - bounds.top,\n\t});\n\n\temit('click:pane', position);\n}\n</script>\n\n<template>\n\t<VueFlow\n\t\t:id=\"id\"\n\t\t:nodes=\"elements\"\n\t\t:edges=\"connections\"\n\t\t:apply-changes=\"false\"\n\t\tfit-view-on-init\n\t\tpan-on-scroll\n\t\t:min-zoom=\"0.2\"\n\t\t:max-zoom=\"2\"\n\t\tdata-test-id=\"canvas\"\n\t\t@node-drag-stop=\"onNodeDragStop\"\n\t\t@edge-mouse-enter=\"onMouseEnterEdge\"\n\t\t@edge-mouse-leave=\"onMouseLeaveEdge\"\n\t\t@pane-click=\"onClickPane\"\n\t\t@connect=\"onConnect\"\n\t>\n\t\t<template #node-canvas-node=\"canvasNodeProps\">\n\t\t\t<CanvasNode\n\t\t\t\tv-bind=\"canvasNodeProps\"\n\t\t\t\t@delete=\"onDeleteNode\"\n\t\t\t\t@select=\"onSelectNode\"\n\t\t\t\t@toggle=\"onToggleNodeEnabled\"\n\t\t\t\t@activate=\"onSetNodeActive\"\n\t\t\t/>\n\t\t</template>\n\n\t\t<template #edge-canvas-edge=\"canvasEdgeProps\">\n\t\t\t<CanvasEdge\n\t\t\t\tv-bind=\"canvasEdgeProps\"\n\t\t\t\t:hovered=\"hoveredEdges[canvasEdgeProps.id]\"\n\t\t\t\t@delete=\"onDeleteConnection\"\n\t\t\t/>\n\t\t</template>\n\n\t\t<Background data-test-id=\"canvas-background\" pattern-color=\"#aaa\" :gap=\"16\" />\n\n\t\t<MiniMap data-test-id=\"canvas-minimap\" pannable />\n\n\t\t<Controls\n\t\t\tdata-test-id=\"canvas-controls\"\n\t\t\t:class=\"$style.canvasControls\"\n\t\t\t:position=\"controlsPosition\"\n\t\t></Controls>\n\t</VueFlow>\n</template>\n\n<style lang=\"scss\" module></style>\n\n<style lang=\"scss\">\n.vue-flow__controls {\n\tdisplay: flex;\n\tgap: var(--spacing-2xs);\n\tbox-shadow: none;\n}\n\n.vue-flow__controls-button {\n\twidth: 42px;\n\theight: 42px;\n\tborder: var(--border-base);\n\tborder-radius: var(--border-radius-base);\n\tpadding: 0;\n\ttransition-property: transform, background, border, color;\n\ttransition-duration: 300ms;\n\ttransition-timing-function: ease;\n\n\t&:hover {\n\t\tborder-color: var(--color-button-secondary-hover-active-border);\n\t\tbackground-color: var(--color-button-secondary-active-background);\n\t\ttransform: scale(1.1);\n\n\t\tsvg {\n\t\t\tfill: var(--color-primary);\n\t\t}\n\t}\n\n\tsvg {\n\t\tmax-height: 16px;\n\t\tmax-width: 16px;\n\t\ttransition-property: fill;\n\t\ttransition-duration: 300ms;\n\t\ttransition-timing-function: ease;\n\t}\n}\n</style>\n","import { useI18n } from '@/composables/useI18n';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport type { Ref } from 'vue';\nimport { computed } from 'vue';\nimport type {\n\tCanvasConnection,\n\tCanvasConnectionPort,\n\tCanvasElement,\n\tCanvasElementData,\n} from '@/types';\nimport {\n\tmapLegacyConnectionsToCanvasConnections,\n\tmapLegacyEndpointsToCanvasConnectionPort,\n} from '@/utils/canvasUtilsV2';\nimport type { Workflow } from 'n8n-workflow';\nimport { NodeHelpers } from 'n8n-workflow';\nimport type { IWorkflowDb } from '@/Interface';\n\nexport function useCanvasMapping({\n\tworkflow,\n\tworkflowObject,\n}: {\n\tworkflow: Ref<IWorkflowDb>;\n\tworkflowObject: Ref<Workflow>;\n}) {\n\tconst locale = useI18n();\n\tconst nodeTypesStore = useNodeTypesStore();\n\n\tconst renderTypeByNodeType = computed(\n\t\t() =>\n\t\t\tworkflow.value.nodes.reduce<Record<string, CanvasElementData['renderType']>>((acc, node) => {\n\t\t\t\tlet renderType: CanvasElementData['renderType'] = 'default';\n\t\t\t\tswitch (true) {\n\t\t\t\t\tcase nodeTypesStore.isTriggerNode(node.type):\n\t\t\t\t\t\trenderType = 'trigger';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase nodeTypesStore.isConfigNode(workflowObject.value, node, node.type):\n\t\t\t\t\t\trenderType = 'configuration';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase nodeTypesStore.isConfigurableNode(workflowObject.value, node, node.type):\n\t\t\t\t\t\trenderType = 'configurable';\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tacc[node.type] = renderType;\n\t\t\t\treturn acc;\n\t\t\t}, {}) ?? {},\n\t);\n\n\tconst nodeInputsById = computed(() =>\n\t\tworkflow.value.nodes.reduce<Record<string, CanvasConnectionPort[]>>((acc, node) => {\n\t\t\tconst nodeTypeDescription = nodeTypesStore.getNodeType(node.type);\n\t\t\tconst workflowObjectNode = workflowObject.value.getNode(node.name);\n\n\t\t\tacc[node.id] =\n\t\t\t\tworkflowObjectNode && nodeTypeDescription\n\t\t\t\t\t? mapLegacyEndpointsToCanvasConnectionPort(\n\t\t\t\t\t\t\tNodeHelpers.getNodeInputs(\n\t\t\t\t\t\t\t\tworkflowObject.value,\n\t\t\t\t\t\t\t\tworkflowObjectNode,\n\t\t\t\t\t\t\t\tnodeTypeDescription,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t: [];\n\n\t\t\treturn acc;\n\t\t}, {}),\n\t);\n\n\tconst nodeOutputsById = computed(() =>\n\t\tworkflow.value.nodes.reduce<Record<string, CanvasConnectionPort[]>>((acc, node) => {\n\t\t\tconst nodeTypeDescription = nodeTypesStore.getNodeType(node.type);\n\t\t\tconst workflowObjectNode = workflowObject.value.getNode(node.name);\n\n\t\t\tacc[node.id] =\n\t\t\t\tworkflowObjectNode && nodeTypeDescription\n\t\t\t\t\t? mapLegacyEndpointsToCanvasConnectionPort(\n\t\t\t\t\t\t\tNodeHelpers.getNodeOutputs(\n\t\t\t\t\t\t\t\tworkflowObject.value,\n\t\t\t\t\t\t\t\tworkflowObjectNode,\n\t\t\t\t\t\t\t\tnodeTypeDescription,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t: [];\n\n\t\t\treturn acc;\n\t\t}, {}),\n\t);\n\n\tconst elements = computed<CanvasElement[]>(() => [\n\t\t...workflow.value.nodes.map<CanvasElement>((node) => {\n\t\t\tconst inputConnections = workflowObject.value.connectionsByDestinationNode[node.name] ?? {};\n\t\t\tconst outputConnections = workflowObject.value.connectionsBySourceNode[node.name] ?? {};\n\n\t\t\tconst data: CanvasElementData = {\n\t\t\t\tid: node.id,\n\t\t\t\ttype: node.type,\n\t\t\t\ttypeVersion: node.typeVersion,\n\t\t\t\tdisabled: !!node.disabled,\n\t\t\t\tinputs: nodeInputsById.value[node.id] ?? [],\n\t\t\t\toutputs: nodeOutputsById.value[node.id] ?? [],\n\t\t\t\tconnections: {\n\t\t\t\t\tinput: inputConnections,\n\t\t\t\t\toutput: outputConnections,\n\t\t\t\t},\n\t\t\t\trenderType: renderTypeByNodeType.value[node.type] ?? 'default',\n\t\t\t};\n\n\t\t\treturn {\n\t\t\t\tid: node.id,\n\t\t\t\tlabel: node.name,\n\t\t\t\ttype: 'canvas-node',\n\t\t\t\tposition: { x: node.position[0], y: node.position[1] },\n\t\t\t\tdata,\n\t\t\t};\n\t\t}),\n\t]);\n\n\tconst connections = computed<CanvasConnection[]>(() => {\n\t\tconst mappedConnections = mapLegacyConnectionsToCanvasConnections(\n\t\t\tworkflow.value.connections ?? [],\n\t\t\tworkflow.value.nodes ?? [],\n\t\t);\n\n\t\treturn mappedConnections.map((connection) => {\n\t\t\tconst type = getConnectionType(connection);\n\t\t\tconst label = getConnectionLabel(connection);\n\n\t\t\treturn {\n\t\t\t\t...connection,\n\t\t\t\ttype,\n\t\t\t\tlabel,\n\t\t\t};\n\t\t});\n\t});\n\n\tfunction getConnectionType(_: CanvasConnection): string {\n\t\treturn 'canvas-edge';\n\t}\n\n\tfunction getConnectionLabel(connection: CanvasConnection): string {\n\t\tconst pinData = workflow.value.pinData?.[connection.data?.fromNodeName ?? ''];\n\n\t\tif (pinData?.length) {\n\t\t\treturn locale.baseText('ndv.output.items', {\n\t\t\t\tadjustToNumber: pinData.length,\n\t\t\t\tinterpolate: { count: String(pinData.length) },\n\t\t\t});\n\t\t}\n\n\t\treturn '';\n\t}\n\n\treturn {\n\t\tconnections,\n\t\telements,\n\t};\n}\n","<script setup lang=\"ts\">\nimport Canvas from '@/components/canvas/Canvas.vue';\nimport { toRef, useCssModule } from 'vue';\nimport type { Workflow } from 'n8n-workflow';\nimport type { IWorkflowDb } from '@/Interface';\nimport { useCanvasMapping } from '@/composables/useCanvasMapping';\n\ndefineOptions({\n\tinheritAttrs: false,\n});\n\nconst props = defineProps<{\n\tid?: string;\n\tworkflow: IWorkflowDb;\n\tworkflowObject: Workflow;\n}>();\n\nconst $style = useCssModule();\n\nconst workflow = toRef(props, 'workflow');\nconst workflowObject = toRef(props, 'workflowObject');\n\nconst { elements, connections } = useCanvasMapping({ workflow, workflowObject });\n</script>\n\n<template>\n\t<div :class=\"$style.wrapper\">\n\t\t<div :class=\"$style.canvas\">\n\t\t\t<Canvas v-if=\"workflow\" :elements=\"elements\" :connections=\"connections\" v-bind=\"$attrs\" />\n\t\t</div>\n\t\t<slot />\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.wrapper {\n\tdisplay: block;\n\tposition: relative;\n\twidth: 100%;\n\theight: 100%;\n\toverflow: hidden;\n}\n\n.canvas {\n\twidth: 100%;\n\theight: 100%;\n\tposition: relative;\n\tdisplay: block;\n}\n\n.executionButtons {\n\tposition: absolute;\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tbottom: var(--spacing-l);\n\twidth: auto;\n\n\t@media (max-width: $breakpoint-2xs) {\n\t\tbottom: 150px;\n\t}\n\n\tbutton {\n\t\tdisplay: flex;\n\t\tjustify-content: center;\n\t\talign-items: center;\n\t\tmargin-left: 0.625rem;\n\n\t\t&:first-child {\n\t\t\tmargin: 0;\n\t\t}\n\t}\n}\n</style>\n","<script setup lang=\"ts\">\nimport KeyboardShortcutTooltip from '@/components/KeyboardShortcutTooltip.vue';\nimport { computed } from 'vue';\nimport { useI18n } from '@/composables/useI18n';\nimport { useUIStore } from '@/stores/ui.store';\n\ndefineEmits(['click']);\n\nconst uiStore = useUIStore();\nconst locale = useI18n();\n\nconst workflowRunning = computed(() => uiStore.isActionActive('workflowRunning'));\n\nconst runButtonText = computed(() => {\n\tif (!workflowRunning.value) {\n\t\treturn locale.baseText('nodeView.runButtonText.executeWorkflow');\n\t}\n\n\treturn locale.baseText('nodeView.runButtonText.executingWorkflow');\n});\n</script>\n\n<template>\n\t<KeyboardShortcutTooltip :label=\"runButtonText\" :shortcut=\"{ metaKey: true, keys: ['↵'] }\">\n\t\t<N8nButton\n\t\t\t:loading=\"workflowRunning\"\n\t\t\t:label=\"runButtonText\"\n\t\t\tsize=\"large\"\n\t\t\ticon=\"flask\"\n\t\t\ttype=\"primary\"\n\t\t\tdata-test-id=\"execute-workflow-button\"\n\t\t\t@click.stop=\"$emit('click', $event)\"\n\t\t/>\n\t</KeyboardShortcutTooltip>\n</template>\n","import type { CanvasElement } from '@/types';\nimport type {\n\tAddedNodesAndConnections,\n\tINodeUi,\n\tINodeUpdatePropertiesInformation,\n\tXYPosition,\n} from '@/Interface';\nimport { QUICKSTART_NOTE_NAME, STICKY_NODE_TYPE } from '@/constants';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useHistoryStore } from '@/stores/history.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport {\n\tMoveNodeCommand,\n\tRemoveConnectionCommand,\n\tRemoveNodeCommand,\n\tRenameNodeCommand,\n} from '@/models/history';\nimport type { Connection } from '@vue-flow/core';\nimport {\n\tgetUniqueNodeName,\n\tmapCanvasConnectionToLegacyConnection,\n\tparseCanvasConnectionHandleString,\n} from '@/utils/canvasUtilsV2';\nimport type {\n\tConnectionTypes,\n\tIConnection,\n\tINodeInputConfiguration,\n\tINodeOutputConfiguration,\n\tINodeTypeDescription,\n\tINodeTypeNameVersion,\n\tITelemetryTrackProperties,\n} from 'n8n-workflow';\nimport { NodeConnectionType, NodeHelpers } from 'n8n-workflow';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useI18n } from '@/composables/useI18n';\nimport { useToast } from '@/composables/useToast';\nimport * as NodeViewUtils from '@/utils/nodeViewUtils';\nimport { v4 as uuid } from 'uuid';\nimport { useSegment } from '@/stores/segment.store';\nimport type { Ref } from 'vue';\nimport { computed } from 'vue';\nimport { useCredentialsStore } from '@/stores/credentials.store';\nimport { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';\nimport type { useRouter } from 'vue-router';\nimport { useCanvasStore } from '@/stores/canvas.store';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\n\ntype AddNodeData = {\n\tname?: string;\n\ttype: string;\n\tposition?: XYPosition;\n};\n\ntype AddNodeOptions = {\n\tdragAndDrop?: boolean;\n\topenNDV?: boolean;\n\ttrackHistory?: boolean;\n\tisAutoAdd?: boolean;\n};\n\nexport function useCanvasOperations({\n\trouter,\n\tlastClickPosition,\n}: {\n\trouter: ReturnType<typeof useRouter>;\n\tlastClickPosition: Ref<XYPosition>;\n}) {\n\tconst workflowsStore = useWorkflowsStore();\n\tconst credentialsStore = useCredentialsStore();\n\tconst historyStore = useHistoryStore();\n\tconst uiStore = useUIStore();\n\tconst ndvStore = useNDVStore();\n\tconst nodeTypesStore = useNodeTypesStore();\n\tconst canvasStore = useCanvasStore();\n\n\tconst i18n = useI18n();\n\tconst toast = useToast();\n\tconst workflowHelpers = useWorkflowHelpers({ router });\n\tconst nodeHelpers = useNodeHelpers();\n\tconst telemetry = useTelemetry();\n\tconst externalHooks = useExternalHooks();\n\n\tconst editableWorkflow = computed(() => workflowsStore.workflow);\n\tconst editableWorkflowObject = computed(() => workflowsStore.getCurrentWorkflow());\n\n\tconst triggerNodes = computed<INodeUi[]>(() => {\n\t\treturn workflowsStore.workflowTriggerNodes;\n\t});\n\n\t/**\n\t * Node operations\n\t */\n\n\tfunction updateNodePosition(\n\t\tid: string,\n\t\tposition: CanvasElement['position'],\n\t\t{ trackHistory = false, trackBulk = true } = {},\n\t) {\n\t\tconst node = workflowsStore.getNodeById(id);\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (trackHistory && trackBulk) {\n\t\t\thistoryStore.startRecordingUndo();\n\t\t}\n\n\t\tconst oldPosition: XYPosition = [...node.position];\n\t\tconst newPosition: XYPosition = [position.x, position.y];\n\n\t\tworkflowsStore.setNodePositionById(id, newPosition);\n\n\t\tif (trackHistory) {\n\t\t\thistoryStore.pushCommandToUndo(new MoveNodeCommand(node.name, oldPosition, newPosition));\n\n\t\t\tif (trackBulk) {\n\t\t\t\thistoryStore.stopRecordingUndo();\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function renameNode(currentName: string, newName: string, { trackHistory = false } = {}) {\n\t\tif (currentName === newName) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (trackHistory) {\n\t\t\thistoryStore.startRecordingUndo();\n\t\t}\n\n\t\tnewName = getUniqueNodeName(newName, workflowsStore.canvasNames);\n\n\t\t// Rename the node and update the connections\n\t\tconst workflow = workflowsStore.getCurrentWorkflow(true);\n\t\tworkflow.renameNode(currentName, newName);\n\n\t\tif (trackHistory) {\n\t\t\thistoryStore.pushCommandToUndo(new RenameNodeCommand(currentName, newName));\n\t\t}\n\n\t\t// Update also last selected node and execution data\n\t\tworkflowsStore.renameNodeSelectedAndExecution({ old: currentName, new: newName });\n\n\t\tworkflowsStore.setNodes(Object.values(workflow.nodes));\n\t\tworkflowsStore.setConnections(workflow.connectionsBySourceNode);\n\n\t\tconst isRenamingActiveNode = ndvStore.activeNodeName === currentName;\n\t\tif (isRenamingActiveNode) {\n\t\t\tndvStore.activeNodeName = newName;\n\t\t}\n\n\t\tif (trackHistory) {\n\t\t\thistoryStore.stopRecordingUndo();\n\t\t}\n\t}\n\n\tasync function revertRenameNode(currentName: string, previousName: string) {\n\t\tawait renameNode(currentName, previousName);\n\t}\n\n\tfunction deleteNode(id: string, { trackHistory = false, trackBulk = true } = {}) {\n\t\tconst node = workflowsStore.getNodeById(id);\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (trackHistory && trackBulk) {\n\t\t\thistoryStore.startRecordingUndo();\n\t\t}\n\n\t\tworkflowsStore.removeNodeById(id);\n\t\tworkflowsStore.removeNodeConnectionsById(id);\n\t\tworkflowsStore.removeNodeExecutionDataById(id);\n\n\t\tif (trackHistory) {\n\t\t\thistoryStore.pushCommandToUndo(new RemoveNodeCommand(node));\n\n\t\t\tif (trackBulk) {\n\t\t\t\thistoryStore.stopRecordingUndo();\n\t\t\t}\n\t\t}\n\n\t\ttrackDeleteNode(id);\n\t}\n\n\tfunction revertDeleteNode(node: INodeUi) {\n\t\tworkflowsStore.addNode(node);\n\t}\n\n\tfunction trackDeleteNode(id: string) {\n\t\tconst node = workflowsStore.getNodeById(id);\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (node.type === STICKY_NODE_TYPE) {\n\t\t\ttelemetry.track('User deleted workflow note', {\n\t\t\t\tworkflow_id: workflowsStore.workflowId,\n\t\t\t\tis_welcome_note: node.name === QUICKSTART_NOTE_NAME,\n\t\t\t});\n\t\t} else {\n\t\t\tvoid externalHooks.run('node.deleteNode', { node });\n\t\t\ttelemetry.track('User deleted node', {\n\t\t\t\tnode_type: node.type,\n\t\t\t\tworkflow_id: workflowsStore.workflowId,\n\t\t\t});\n\t\t}\n\t}\n\n\tfunction setNodeActive(id: string) {\n\t\tconst node = workflowsStore.getNodeById(id);\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\n\t\tndvStore.activeNodeName = node.name;\n\t}\n\n\tfunction setNodeActiveByName(name: string) {\n\t\tndvStore.activeNodeName = name;\n\t}\n\n\tfunction setNodeSelected(id?: string) {\n\t\tif (!id) {\n\t\t\tuiStore.lastSelectedNode = '';\n\t\t\treturn;\n\t\t}\n\n\t\tconst node = workflowsStore.getNodeById(id);\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\n\t\tuiStore.lastSelectedNode = node.name;\n\t}\n\n\tfunction toggleNodeDisabled(\n\t\tid: string,\n\t\t{ trackHistory = true }: { trackHistory?: boolean } = {},\n\t) {\n\t\tconst node = workflowsStore.getNodeById(id);\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\n\t\tnodeHelpers.disableNodes([node], trackHistory);\n\t}\n\n\tasync function addNodes(\n\t\tnodes: AddedNodesAndConnections['nodes'],\n\t\t{\n\t\t\tdragAndDrop,\n\t\t\tposition,\n\t\t}: {\n\t\t\tdragAndDrop?: boolean;\n\t\t\tposition?: XYPosition;\n\t\t} = {},\n\t) {\n\t\tlet currentPosition = position;\n\t\tlet lastAddedNode: INodeUi | undefined;\n\t\tfor (const { type, name, position: nodePosition, isAutoAdd, openDetail } of nodes) {\n\t\t\ttry {\n\t\t\t\tawait createNode(\n\t\t\t\t\t{\n\t\t\t\t\t\tname,\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\tposition: nodePosition ?? currentPosition,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdragAndDrop,\n\t\t\t\t\t\topenNDV: openDetail ?? false,\n\t\t\t\t\t\ttrackHistory: true,\n\t\t\t\t\t\tisAutoAdd,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\ttoast.showError(error, i18n.baseText('error'));\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlastAddedNode = editableWorkflow.value.nodes[editableWorkflow.value.nodes.length - 1];\n\t\t\tcurrentPosition = [\n\t\t\t\tlastAddedNode.position[0] + NodeViewUtils.NODE_SIZE * 2 + NodeViewUtils.GRID_SIZE,\n\t\t\t\tlastAddedNode.position[1],\n\t\t\t];\n\t\t}\n\n\t\t// If the last added node has multiple inputs, move them down\n\t\tif (!lastAddedNode) {\n\t\t\treturn;\n\t\t}\n\t\tconst lastNodeInputs = editableWorkflowObject.value.getParentNodesByDepth(\n\t\t\tlastAddedNode.name,\n\t\t\t1,\n\t\t);\n\t\tif (lastNodeInputs.length > 1) {\n\t\t\tlastNodeInputs.slice(1).forEach((node, index) => {\n\t\t\t\tconst nodeUi = workflowsStore.getNodeByName(node.name);\n\t\t\t\tif (!nodeUi) return;\n\n\t\t\t\tupdateNodePosition(nodeUi.id, {\n\t\t\t\t\tx: nodeUi.position[0],\n\t\t\t\t\ty: nodeUi.position[1] + 100 * (index + 1),\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n\n\tasync function createNode(node: AddNodeData, options: AddNodeOptions = {}): Promise<INodeUi> {\n\t\tconst newNodeData = await resolveNodeData(node, options);\n\t\tif (!newNodeData) {\n\t\t\tthrow new Error(i18n.baseText('nodeViewV2.showError.failedToCreateNode'));\n\t\t}\n\n\t\t/**\n\t\t * @TODO Check if maximum node type limit reached\n\t\t */\n\n\t\tnewNodeData.name = getUniqueNodeName(newNodeData.name, workflowsStore.canvasNames);\n\n\t\tworkflowsStore.addNode(newNodeData);\n\n\t\t// @TODO Figure out why this is needed and if we can do better...\n\t\t// this.matchCredentials(node);\n\n\t\tconst lastSelectedNode = uiStore.getLastSelectedNode;\n\t\tconst lastSelectedNodeOutputIndex = uiStore.lastSelectedNodeOutputIndex;\n\t\tconst lastSelectedNodeEndpointUuid = uiStore.lastSelectedNodeEndpointUuid;\n\n\t\thistoryStore.startRecordingUndo();\n\n\t\tconst outputIndex = lastSelectedNodeOutputIndex ?? 0;\n\t\tconst targetEndpoint = lastSelectedNodeEndpointUuid ?? '';\n\n\t\t// Handle connection of scoped_endpoint types\n\t\tif (lastSelectedNode && !options.isAutoAdd) {\n\t\t\tif (lastSelectedNodeEndpointUuid) {\n\t\t\t\tconst { type: connectionType } = parseCanvasConnectionHandleString(\n\t\t\t\t\tlastSelectedNodeEndpointUuid,\n\t\t\t\t);\n\t\t\t\tif (isConnectionAllowed(lastSelectedNode, newNodeData, connectionType)) {\n\t\t\t\t\tcreateConnection({\n\t\t\t\t\t\tsource: lastSelectedNode.id,\n\t\t\t\t\t\tsourceHandle: targetEndpoint,\n\t\t\t\t\t\ttarget: newNodeData.id,\n\t\t\t\t\t\ttargetHandle: `inputs/${connectionType}/0`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If a node is last selected then connect between the active and its child ones\n\t\t\t\t// Connect active node to the newly created one\n\t\t\t\tcreateConnection({\n\t\t\t\t\tsource: lastSelectedNode.id,\n\t\t\t\t\tsourceHandle: `outputs/${NodeConnectionType.Main}/${outputIndex}`,\n\t\t\t\t\ttarget: newNodeData.id,\n\t\t\t\t\ttargetHandle: `inputs/${NodeConnectionType.Main}/0`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\thistoryStore.stopRecordingUndo();\n\n\t\treturn newNodeData;\n\t}\n\n\tasync function initializeNodeDataWithDefaultCredentials(node: AddNodeData) {\n\t\tconst nodeTypeDescription = nodeTypesStore.getNodeType(node.type);\n\t\tif (!nodeTypeDescription) {\n\t\t\tthrow new Error(i18n.baseText('nodeViewV2.showError.failedToCreateNode'));\n\t\t}\n\n\t\tlet nodeVersion = nodeTypeDescription.defaultVersion;\n\t\tif (typeof nodeVersion === 'undefined') {\n\t\t\tnodeVersion = Array.isArray(nodeTypeDescription.version)\n\t\t\t\t? nodeTypeDescription.version.slice(-1)[0]\n\t\t\t\t: nodeTypeDescription.version;\n\t\t}\n\n\t\tconst newNodeData: INodeUi = {\n\t\t\tid: uuid(),\n\t\t\tname: node.name ?? (nodeTypeDescription.defaults.name as string),\n\t\t\ttype: nodeTypeDescription.name,\n\t\t\ttypeVersion: nodeVersion,\n\t\t\tposition: node.position ?? [0, 0],\n\t\t\tparameters: {},\n\t\t};\n\n\t\tawait loadNodeTypesProperties([{ name: newNodeData.type, version: newNodeData.typeVersion }]);\n\n\t\tconst nodeType = nodeTypesStore.getNodeType(newNodeData.type, newNodeData.typeVersion);\n\t\tconst nodeParameters = NodeHelpers.getNodeParameters(\n\t\t\tnodeType?.properties ?? [],\n\t\t\t{},\n\t\t\ttrue,\n\t\t\tfalse,\n\t\t\tnewNodeData,\n\t\t);\n\n\t\tnewNodeData.parameters = nodeParameters ?? {};\n\n\t\tconst credentialPerType = nodeTypeDescription.credentials\n\t\t\t?.map((type) => credentialsStore.getUsableCredentialByType(type.name))\n\t\t\t.flat();\n\n\t\tif (credentialPerType?.length === 1) {\n\t\t\tconst defaultCredential = credentialPerType[0];\n\n\t\t\tconst selectedCredentials = credentialsStore.getCredentialById(defaultCredential.id);\n\t\t\tconst selected = { id: selectedCredentials.id, name: selectedCredentials.name };\n\t\t\tconst credentials = {\n\t\t\t\t[defaultCredential.type]: selected,\n\t\t\t};\n\n\t\t\tif (nodeTypeDescription.credentials) {\n\t\t\t\tconst authentication = nodeTypeDescription.credentials.find(\n\t\t\t\t\t(type) => type.name === defaultCredential.type,\n\t\t\t\t);\n\t\t\t\tif (authentication?.displayOptions?.hide) {\n\t\t\t\t\treturn newNodeData;\n\t\t\t\t}\n\n\t\t\t\tconst authDisplayOptions = authentication?.displayOptions?.show;\n\t\t\t\tif (!authDisplayOptions) {\n\t\t\t\t\tnewNodeData.credentials = credentials;\n\t\t\t\t\treturn newNodeData;\n\t\t\t\t}\n\n\t\t\t\tif (Object.keys(authDisplayOptions).length === 1 && authDisplayOptions.authentication) {\n\t\t\t\t\t// ignore complex case when there's multiple dependencies\n\t\t\t\t\tnewNodeData.credentials = credentials;\n\n\t\t\t\t\tlet parameters: { [key: string]: string } = {};\n\t\t\t\t\tfor (const displayOption of Object.keys(authDisplayOptions)) {\n\t\t\t\t\t\tif (nodeParameters && !nodeParameters[displayOption]) {\n\t\t\t\t\t\t\tparameters = {};\n\t\t\t\t\t\t\tnewNodeData.credentials = undefined;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst optionValue = authDisplayOptions[displayOption]?.[0];\n\t\t\t\t\t\tif (optionValue && typeof optionValue === 'string') {\n\t\t\t\t\t\t\tparameters[displayOption] = optionValue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnewNodeData.parameters = {\n\t\t\t\t\t\t\t...newNodeData.parameters,\n\t\t\t\t\t\t\t...parameters,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn newNodeData;\n\t}\n\n\t/**\n\t * Resolves the data for a new node\n\t */\n\tasync function resolveNodeData(node: AddNodeData, options: AddNodeOptions = {}) {\n\t\tconst nodeTypeDescription: INodeTypeDescription | null = nodeTypesStore.getNodeType(node.type);\n\t\tif (nodeTypeDescription === null) {\n\t\t\ttoast.showMessage({\n\t\t\t\ttitle: i18n.baseText('nodeView.showMessage.addNodeButton.title'),\n\t\t\t\tmessage: i18n.baseText('nodeView.showMessage.addNodeButton.message', {\n\t\t\t\t\tinterpolate: { nodeTypeName: node.type },\n\t\t\t\t}),\n\t\t\t\ttype: 'error',\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\tnodeTypeDescription.maxNodes !== undefined &&\n\t\t\tworkflowHelpers.getNodeTypeCount(node.type) >= nodeTypeDescription.maxNodes\n\t\t) {\n\t\t\tshowMaxNodeTypeError(nodeTypeDescription);\n\t\t\treturn;\n\t\t}\n\n\t\tconst newNodeData = await initializeNodeDataWithDefaultCredentials(node);\n\n\t\t// When pulling new connection from node or injecting into a connection\n\t\tconst lastSelectedNode = uiStore.getLastSelectedNode;\n\n\t\tif (node.position) {\n\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(\n\t\t\t\tcanvasStore.getNodesWithPlaceholderNode(),\n\t\t\t\tnode.position,\n\t\t\t);\n\t\t} else if (lastSelectedNode) {\n\t\t\t// @TODO Implement settings lastSelectedConnection for new canvas\n\t\t\tconst lastSelectedConnection = canvasStore.lastSelectedConnection;\n\t\t\tif (lastSelectedConnection) {\n\t\t\t\t// set when injecting into a connection\n\t\t\t\tconst [diffX] = NodeViewUtils.getConnectorLengths(lastSelectedConnection);\n\t\t\t\tif (diffX <= NodeViewUtils.MAX_X_TO_PUSH_DOWNSTREAM_NODES) {\n\t\t\t\t\tpushDownstreamNodes(lastSelectedNode.name, NodeViewUtils.PUSH_NODES_OFFSET, {\n\t\t\t\t\t\ttrackHistory: options.trackHistory,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// This position is set in `onMouseUp` when pulling connections\n\t\t\tif (canvasStore.newNodeInsertPosition) {\n\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(workflowsStore.allNodes, [\n\t\t\t\t\tcanvasStore.newNodeInsertPosition[0] + NodeViewUtils.GRID_SIZE,\n\t\t\t\t\tcanvasStore.newNodeInsertPosition[1] - NodeViewUtils.NODE_SIZE / 2,\n\t\t\t\t]);\n\t\t\t\tcanvasStore.newNodeInsertPosition = null;\n\t\t\t} else {\n\t\t\t\tlet yOffset = 0;\n\t\t\t\tconst workflow = workflowsStore.getCurrentWorkflow();\n\n\t\t\t\tif (lastSelectedConnection) {\n\t\t\t\t\tconst sourceNodeType = nodeTypesStore.getNodeType(\n\t\t\t\t\t\tlastSelectedNode.type,\n\t\t\t\t\t\tlastSelectedNode.typeVersion,\n\t\t\t\t\t);\n\n\t\t\t\t\tif (sourceNodeType) {\n\t\t\t\t\t\tconst offsets = [\n\t\t\t\t\t\t\t[-100, 100],\n\t\t\t\t\t\t\t[-140, 0, 140],\n\t\t\t\t\t\t\t[-240, -100, 100, 240],\n\t\t\t\t\t\t];\n\n\t\t\t\t\t\tconst sourceNodeOutputs = NodeHelpers.getNodeOutputs(\n\t\t\t\t\t\t\tworkflow,\n\t\t\t\t\t\t\tlastSelectedNode,\n\t\t\t\t\t\t\tsourceNodeType,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst sourceNodeOutputTypes = NodeHelpers.getConnectionTypes(sourceNodeOutputs);\n\n\t\t\t\t\t\tconst sourceNodeOutputMainOutputs = sourceNodeOutputTypes.filter(\n\t\t\t\t\t\t\t(output) => output === NodeConnectionType.Main,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (sourceNodeOutputMainOutputs.length > 1) {\n\t\t\t\t\t\t\tconst offset = offsets[sourceNodeOutputMainOutputs.length - 2];\n\t\t\t\t\t\t\tconst sourceOutputIndex = lastSelectedConnection.__meta\n\t\t\t\t\t\t\t\t? lastSelectedConnection.__meta.sourceOutputIndex\n\t\t\t\t\t\t\t\t: 0;\n\t\t\t\t\t\t\tyOffset = offset[sourceOutputIndex];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet outputs: Array<ConnectionTypes | INodeOutputConfiguration> = [];\n\t\t\t\ttry {\n\t\t\t\t\t// It fails when the outputs are an expression. As those nodes have\n\t\t\t\t\t// normally no outputs by default and the only reason we need the\n\t\t\t\t\t// outputs here is to calculate the position, it is fine to assume\n\t\t\t\t\t// that they have no outputs and are so treated as a regular node\n\t\t\t\t\t// with only \"main\" outputs.\n\t\t\t\t\toutputs = NodeHelpers.getNodeOutputs(workflow, newNodeData, nodeTypeDescription);\n\t\t\t\t} catch (e) {}\n\t\t\t\tconst outputTypes = NodeHelpers.getConnectionTypes(outputs);\n\t\t\t\tconst lastSelectedNodeType = nodeTypesStore.getNodeType(\n\t\t\t\t\tlastSelectedNode.type,\n\t\t\t\t\tlastSelectedNode.typeVersion,\n\t\t\t\t);\n\n\t\t\t\t// If node has only scoped outputs, position it below the last selected node\n\t\t\t\tif (\n\t\t\t\t\toutputTypes.length > 0 &&\n\t\t\t\t\toutputTypes.every((outputName) => outputName !== NodeConnectionType.Main)\n\t\t\t\t) {\n\t\t\t\t\tconst lastSelectedNodeWorkflow = workflow.getNode(lastSelectedNode.name);\n\t\t\t\t\tif (!lastSelectedNodeWorkflow || !lastSelectedNodeType) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst lastSelectedInputs = NodeHelpers.getNodeInputs(\n\t\t\t\t\t\tworkflow,\n\t\t\t\t\t\tlastSelectedNodeWorkflow,\n\t\t\t\t\t\tlastSelectedNodeType,\n\t\t\t\t\t);\n\t\t\t\t\tconst lastSelectedInputTypes = NodeHelpers.getConnectionTypes(lastSelectedInputs);\n\n\t\t\t\t\tconst scopedConnectionIndex = (lastSelectedInputTypes || [])\n\t\t\t\t\t\t.filter((input) => input !== NodeConnectionType.Main)\n\t\t\t\t\t\t.findIndex((inputType) => outputs[0] === inputType);\n\n\t\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(\n\t\t\t\t\t\tworkflowsStore.allNodes,\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tlastSelectedNode.position[0] +\n\t\t\t\t\t\t\t\t(NodeViewUtils.NODE_SIZE /\n\t\t\t\t\t\t\t\t\t(Math.max(lastSelectedNodeType?.inputs?.length ?? 1), 1)) *\n\t\t\t\t\t\t\t\t\tscopedConnectionIndex,\n\t\t\t\t\t\t\tlastSelectedNode.position[1] + NodeViewUtils.PUSH_NODES_OFFSET,\n\t\t\t\t\t\t],\n\t\t\t\t\t\t[100, 0],\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tif (!lastSelectedNodeType) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Has only main outputs or no outputs at all\n\t\t\t\t\tconst inputs = NodeHelpers.getNodeInputs(\n\t\t\t\t\t\tworkflow,\n\t\t\t\t\t\tlastSelectedNode,\n\t\t\t\t\t\tlastSelectedNodeType,\n\t\t\t\t\t);\n\t\t\t\t\tconst inputsTypes = NodeHelpers.getConnectionTypes(inputs);\n\n\t\t\t\t\tlet pushOffset = NodeViewUtils.PUSH_NODES_OFFSET;\n\t\t\t\t\tif (!!inputsTypes.find((input) => input !== NodeConnectionType.Main)) {\n\t\t\t\t\t\t// If the node has scoped inputs, push it down a bit more\n\t\t\t\t\t\tpushOffset += 150;\n\t\t\t\t\t}\n\n\t\t\t\t\t// If a node is active then add the new node directly after the current one\n\t\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(\n\t\t\t\t\t\tworkflowsStore.allNodes,\n\t\t\t\t\t\t[lastSelectedNode.position[0] + pushOffset, lastSelectedNode.position[1] + yOffset],\n\t\t\t\t\t\t[100, 0],\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// If added node is a trigger and it's the first one added to the canvas\n\t\t\t// we place it at canvasAddButtonPosition to replace the canvas add button\n\t\t\tconst position =\n\t\t\t\tnodeTypesStore.isTriggerNode(node.type) && triggerNodes.value.length === 0\n\t\t\t\t\t? canvasStore.canvasAddButtonPosition\n\t\t\t\t\t: // If no node is active find a free spot\n\t\t\t\t\t\t(lastClickPosition.value as XYPosition);\n\n\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(workflowsStore.allNodes, position);\n\t\t}\n\n\t\tconst localizedName = i18n.localizeNodeName(newNodeData.name, newNodeData.type);\n\n\t\tnewNodeData.name = getUniqueNodeName(localizedName, workflowsStore.canvasNames);\n\n\t\tif (nodeTypeDescription.webhooks?.length) {\n\t\t\tnewNodeData.webhookId = uuid();\n\t\t}\n\n\t\tworkflowsStore.setNodePristine(newNodeData.name, true);\n\t\tuiStore.stateIsDirty = true;\n\n\t\tif (node.type === STICKY_NODE_TYPE) {\n\t\t\ttelemetry.trackNodesPanel('nodeView.addSticky', {\n\t\t\t\tworkflow_id: workflowsStore.workflowId,\n\t\t\t});\n\t\t} else {\n\t\t\tvoid externalHooks.run('nodeView.addNodeButton', { nodeTypeName: node.type });\n\t\t\tuseSegment().trackAddedTrigger(node.type);\n\t\t\tconst trackProperties: ITelemetryTrackProperties = {\n\t\t\t\tnode_type: node.type,\n\t\t\t\tnode_version: newNodeData.typeVersion,\n\t\t\t\tis_auto_add: options.isAutoAdd,\n\t\t\t\tworkflow_id: workflowsStore.workflowId,\n\t\t\t\tdrag_and_drop: options.dragAndDrop,\n\t\t\t};\n\n\t\t\tif (lastSelectedNode) {\n\t\t\t\ttrackProperties.input_node_type = lastSelectedNode.type;\n\t\t\t}\n\n\t\t\ttelemetry.trackNodesPanel('nodeView.addNodeButton', trackProperties);\n\t\t}\n\n\t\t// Automatically deselect all nodes and select the current one and also active\n\t\t// current node. But only if it's added manually by the user (not by undo/redo mechanism)\n\t\t// @TODO\n\t\t// if (trackHistory) {\n\t\t// \tthis.deselectAllNodes();\n\t\t// \tsetTimeout(() => {\n\t\t// \t\tthis.nodeSelectedByName(newNodeData.name, showDetail && nodeTypeName !== STICKY_NODE_TYPE);\n\t\t// \t});\n\t\t// }\n\n\t\treturn newNodeData;\n\t}\n\n\tfunction pushDownstreamNodes(\n\t\tsourceNodeName: string,\n\t\tmargin: number,\n\t\t{ trackHistory = false }: { trackHistory?: boolean },\n\t) {\n\t\tconst sourceNode = workflowsStore.nodesByName[sourceNodeName];\n\n\t\tconst workflow = workflowHelpers.getCurrentWorkflow();\n\n\t\tconst checkNodes = workflowHelpers.getConnectedNodes('downstream', workflow, sourceNodeName);\n\t\tfor (const nodeName of checkNodes) {\n\t\t\tconst node = workflowsStore.nodesByName[nodeName];\n\t\t\tconst oldPosition = node.position;\n\n\t\t\tif (node.position[0] < sourceNode.position[0]) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst updateInformation: INodeUpdatePropertiesInformation = {\n\t\t\t\tname: nodeName,\n\t\t\t\tproperties: {\n\t\t\t\t\tposition: [node.position[0] + margin, node.position[1]],\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tworkflowsStore.updateNodeProperties(updateInformation);\n\t\t\tupdateNodePosition(node.id, { x: node.position[0], y: node.position[1] });\n\n\t\t\tif (\n\t\t\t\t(trackHistory && oldPosition[0] !== updateInformation.properties.position[0]) ||\n\t\t\t\toldPosition[1] !== updateInformation.properties.position[1]\n\t\t\t) {\n\t\t\t\thistoryStore.pushCommandToUndo(\n\t\t\t\t\tnew MoveNodeCommand(nodeName, oldPosition, updateInformation.properties.position),\n\t\t\t\t\ttrackHistory,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function loadNodeTypesProperties(nodeInfos: INodeTypeNameVersion[]): Promise<void> {\n\t\tconst allNodeTypeDescriptions: INodeTypeDescription[] = nodeTypesStore.allNodeTypes;\n\n\t\tconst nodesToBeFetched: INodeTypeNameVersion[] = [];\n\t\tallNodeTypeDescriptions.forEach((nodeTypeDescription) => {\n\t\t\tconst nodeVersions = Array.isArray(nodeTypeDescription.version)\n\t\t\t\t? nodeTypeDescription.version\n\t\t\t\t: [nodeTypeDescription.version];\n\t\t\tif (\n\t\t\t\t!!nodeInfos.find(\n\t\t\t\t\t(n) => n.name === nodeTypeDescription.name && nodeVersions.includes(n.version),\n\t\t\t\t) &&\n\t\t\t\t!nodeTypeDescription.hasOwnProperty('properties')\n\t\t\t) {\n\t\t\t\tnodesToBeFetched.push({\n\t\t\t\t\tname: nodeTypeDescription.name,\n\t\t\t\t\tversion: Array.isArray(nodeTypeDescription.version)\n\t\t\t\t\t\t? nodeTypeDescription.version.slice(-1)[0]\n\t\t\t\t\t\t: nodeTypeDescription.version,\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tif (nodesToBeFetched.length > 0) {\n\t\t\t// Only call API if node information is actually missing\n\t\t\tawait nodeTypesStore.getNodesInformation(nodesToBeFetched);\n\t\t}\n\t}\n\n\tfunction showMaxNodeTypeError(nodeTypeDescription: INodeTypeDescription) {\n\t\tconst maxNodes = nodeTypeDescription.maxNodes;\n\t\ttoast.showMessage({\n\t\t\ttitle: i18n.baseText('nodeView.showMessage.showMaxNodeTypeError.title'),\n\t\t\tmessage: i18n.baseText('nodeView.showMessage.showMaxNodeTypeError.message', {\n\t\t\t\tadjustToNumber: maxNodes,\n\t\t\t\tinterpolate: { nodeTypeDataDisplayName: nodeTypeDescription.displayName },\n\t\t\t}),\n\t\t\ttype: 'error',\n\t\t\tduration: 0,\n\t\t});\n\t}\n\n\t/**\n\t * Connection operations\n\t */\n\n\tfunction createConnection(connection: Connection) {\n\t\tconst sourceNode = workflowsStore.getNodeById(connection.source);\n\t\tconst targetNode = workflowsStore.getNodeById(connection.target);\n\t\tif (!sourceNode || !targetNode) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst mappedConnection = mapCanvasConnectionToLegacyConnection(\n\t\t\tsourceNode,\n\t\t\ttargetNode,\n\t\t\tconnection,\n\t\t);\n\n\t\tif (!isConnectionAllowed(sourceNode, targetNode, mappedConnection[1].type)) {\n\t\t\treturn;\n\t\t}\n\n\t\tworkflowsStore.addConnection({\n\t\t\tconnection: mappedConnection,\n\t\t});\n\n\t\tuiStore.stateIsDirty = true;\n\t}\n\n\tfunction deleteConnection(\n\t\tconnection: Connection,\n\t\t{ trackHistory = false, trackBulk = true } = {},\n\t) {\n\t\tconst sourceNode = workflowsStore.getNodeById(connection.source);\n\t\tconst targetNode = workflowsStore.getNodeById(connection.target);\n\t\tif (!sourceNode || !targetNode) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst mappedConnection = mapCanvasConnectionToLegacyConnection(\n\t\t\tsourceNode,\n\t\t\ttargetNode,\n\t\t\tconnection,\n\t\t);\n\n\t\tif (trackHistory && trackBulk) {\n\t\t\thistoryStore.startRecordingUndo();\n\t\t}\n\n\t\tworkflowsStore.removeConnection({\n\t\t\tconnection: mappedConnection,\n\t\t});\n\n\t\tif (trackHistory) {\n\t\t\thistoryStore.pushCommandToUndo(new RemoveConnectionCommand(mappedConnection));\n\n\t\t\tif (trackBulk) {\n\t\t\t\thistoryStore.stopRecordingUndo();\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction revertDeleteConnection(connection: [IConnection, IConnection]) {\n\t\tworkflowsStore.addConnection({\n\t\t\tconnection,\n\t\t});\n\t}\n\n\tfunction isConnectionAllowed(\n\t\tsourceNode: INodeUi,\n\t\ttargetNode: INodeUi,\n\t\ttargetNodeConnectionType: NodeConnectionType,\n\t): boolean {\n\t\tconst targetNodeType = nodeTypesStore.getNodeType(targetNode.type, targetNode.typeVersion);\n\n\t\tif (targetNodeType?.inputs?.length) {\n\t\t\tconst workflow = workflowsStore.getCurrentWorkflow();\n\t\t\tconst workflowNode = workflow.getNode(targetNode.name);\n\t\t\tif (!workflowNode) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tlet inputs: Array<ConnectionTypes | INodeInputConfiguration> = [];\n\t\t\tif (targetNodeType) {\n\t\t\t\tinputs = NodeHelpers.getNodeInputs(workflow, workflowNode, targetNodeType) || [];\n\t\t\t}\n\n\t\t\tfor (const input of inputs) {\n\t\t\t\tif (typeof input === 'string' || input.type !== targetNodeConnectionType || !input.filter) {\n\t\t\t\t\t// No filters defined or wrong connection type\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (input.filter.nodes.length) {\n\t\t\t\t\tif (!input.filter.nodes.includes(sourceNode.type)) {\n\t\t\t\t\t\t// this.dropPrevented = true;\n\t\t\t\t\t\ttoast.showToast({\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeView.showError.nodeNodeCompatible.title'),\n\t\t\t\t\t\t\tmessage: i18n.baseText('nodeView.showError.nodeNodeCompatible.message', {\n\t\t\t\t\t\t\t\tinterpolate: { sourceNodeName: sourceNode.name, targetNodeName: targetNode.name },\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\t\tduration: 5000,\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn sourceNode.id !== targetNode.id;\n\t}\n\n\tasync function addConnections(\n\t\tconnections: AddedNodesAndConnections['connections'],\n\t\t{ offsetIndex }: { offsetIndex: number },\n\t) {\n\t\tfor (const { from, to } of connections) {\n\t\t\tconst fromNode = editableWorkflow.value.nodes[offsetIndex + from.nodeIndex];\n\t\t\tconst toNode = editableWorkflow.value.nodes[offsetIndex + to.nodeIndex];\n\n\t\t\tcreateConnection({\n\t\t\t\tsource: fromNode.id,\n\t\t\t\tsourceHandle: `outputs/${NodeConnectionType.Main}/${from.outputIndex ?? 0}`,\n\t\t\t\ttarget: toNode.id,\n\t\t\t\ttargetHandle: `inputs/${NodeConnectionType.Main}/${to.inputIndex ?? 0}`,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn {\n\t\teditableWorkflow,\n\t\teditableWorkflowObject,\n\t\ttriggerNodes,\n\t\tinitializeNodeDataWithDefaultCredentials,\n\t\taddNodes,\n\t\tupdateNodePosition,\n\t\tsetNodeActive,\n\t\tsetNodeActiveByName,\n\t\tsetNodeSelected,\n\t\ttoggleNodeDisabled,\n\t\trenameNode,\n\t\trevertRenameNode,\n\t\tdeleteNode,\n\t\trevertDeleteNode,\n\t\taddConnections,\n\t\tcreateConnection,\n\t\tdeleteConnection,\n\t\trevertDeleteConnection,\n\t};\n}\n","<script setup lang=\"ts\">\nimport { computed, defineAsyncComponent, onBeforeUnmount, onMounted, ref, useCssModule } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport WorkflowCanvas from '@/components/canvas/WorkflowCanvas.vue';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport CanvasExecuteWorkflowButton from '@/components/canvas/elements/buttons/CanvasExecuteWorkflowButton.vue';\nimport { useI18n } from '@/composables/useI18n';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useRunWorkflow } from '@/composables/useRunWorkflow';\nimport type {\n\tAddedNodesAndConnections,\n\tINodeUi,\n\tIUpdateInformation,\n\tIWorkflowDataUpdate,\n\tToggleNodeCreatorOptions,\n\tXYPosition,\n} from '@/Interface';\nimport type { Connection } from '@vue-flow/core';\nimport type { CanvasElement } from '@/types';\nimport {\n\tCANVAS_AUTO_ADD_MANUAL_TRIGGER_EXPERIMENT,\n\tEnterpriseEditionFeature,\n\tMODAL_CANCEL,\n\tMODAL_CONFIRM,\n\tNEW_WORKFLOW_ID,\n\tVIEWS,\n} from '@/constants';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useNodeCreatorStore } from '@/stores/nodeCreator.store';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport type { NodeConnectionType, ExecutionSummary, IConnection } from 'n8n-workflow';\nimport { useToast } from '@/composables/useToast';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useCredentialsStore } from '@/stores/credentials.store';\nimport useEnvironmentsStore from '@/stores/environments.ee.store';\nimport { useExternalSecretsStore } from '@/stores/externalSecrets.ee.store';\nimport { useRootStore } from '@/stores/root.store';\nimport { useCollaborationStore } from '@/stores/collaboration.store';\nimport { historyBus } from '@/models/history';\nimport { useCanvasOperations } from '@/composables/useCanvasOperations';\nimport { useExecutionsStore } from '@/stores/executions.store';\nimport { useCanvasStore } from '@/stores/canvas.store';\nimport { useMessage } from '@/composables/useMessage';\nimport { useTitleChange } from '@/composables/useTitleChange';\nimport { useNpsSurveyStore } from '@/stores/npsSurvey.store';\nimport { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport { useHistoryStore } from '@/stores/history.store';\nimport { useProjectsStore } from '@/stores/projects.store';\nimport { usePostHog } from '@/stores/posthog.store';\n\nconst NodeCreation = defineAsyncComponent(\n\tasync () => await import('@/components/Node/NodeCreation.vue'),\n);\n\nconst NodeDetailsView = defineAsyncComponent(\n\tasync () => await import('@/components/NodeDetailsView.vue'),\n);\n\nconst $style = useCssModule();\nconst router = useRouter();\nconst route = useRoute();\nconst i18n = useI18n();\nconst telemetry = useTelemetry();\nconst externalHooks = useExternalHooks();\nconst toast = useToast();\nconst message = useMessage();\nconst titleChange = useTitleChange();\nconst workflowHelpers = useWorkflowHelpers({ router });\n\nconst nodeTypesStore = useNodeTypesStore();\nconst uiStore = useUIStore();\nconst workflowsStore = useWorkflowsStore();\nconst sourceControlStore = useSourceControlStore();\nconst nodeCreatorStore = useNodeCreatorStore();\nconst settingsStore = useSettingsStore();\nconst credentialsStore = useCredentialsStore();\nconst environmentsStore = useEnvironmentsStore();\nconst externalSecretsStore = useExternalSecretsStore();\nconst rootStore = useRootStore();\nconst collaborationStore = useCollaborationStore();\nconst executionsStore = useExecutionsStore();\nconst canvasStore = useCanvasStore();\nconst npsSurveyStore = useNpsSurveyStore();\nconst historyStore = useHistoryStore();\nconst projectsStore = useProjectsStore();\n\nconst lastClickPosition = ref<XYPosition>([450, 450]);\n\nconst { runWorkflow } = useRunWorkflow({ router });\nconst {\n\tupdateNodePosition,\n\trenameNode,\n\trevertRenameNode,\n\tsetNodeActive,\n\tsetNodeSelected,\n\ttoggleNodeDisabled,\n\tdeleteNode,\n\trevertDeleteNode,\n\taddNodes,\n\tcreateConnection,\n\tdeleteConnection,\n\trevertDeleteConnection,\n\tsetNodeActiveByName,\n\taddConnections,\n\teditableWorkflow,\n\teditableWorkflowObject,\n} = useCanvasOperations({ router, lastClickPosition });\n\nconst isLoading = ref(true);\nconst isBlankRedirect = ref(false);\nconst readOnlyNotification = ref<null | { visible: boolean }>(null);\n\nconst isProductionExecutionPreview = ref(false);\nconst isExecutionPreview = ref(false);\nconst isExecutionWaitingForWebhook = ref(false);\n\nconst canOpenNDV = ref(true);\nconst hideNodeIssues = ref(false);\n\nconst workflowId = computed<string>(() => route.params.workflowId as string);\nconst workflow = computed(() => workflowsStore.workflowsById[workflowId.value]);\n\nconst isDemoRoute = computed(() => route.name === VIEWS.DEMO);\nconst isReadOnlyRoute = computed(() => route?.meta?.readOnlyCanvas === true);\nconst isReadOnlyEnvironment = computed(() => {\n\treturn sourceControlStore.preferences.branchReadOnly;\n});\n\n/**\n * Initialization\n */\n\nasync function initializeData() {\n\tisLoading.value = true;\n\n\tresetWorkspace();\n\ttitleChange.titleReset();\n\n\tconst loadPromises: Array<Promise<unknown>> = [\n\t\tnodeTypesStore.getNodeTypes(),\n\t\tworkflowsStore.fetchWorkflow(workflowId.value),\n\t];\n\n\tif (!settingsStore.isPreviewMode && !isDemoRoute.value) {\n\t\tloadPromises.push(\n\t\t\tworkflowsStore.fetchActiveWorkflows(),\n\t\t\tcredentialsStore.fetchAllCredentials(),\n\t\t\tcredentialsStore.fetchCredentialTypes(true),\n\t\t);\n\n\t\tif (settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Variables)) {\n\t\t\tloadPromises.push(environmentsStore.fetchAllVariables());\n\t\t}\n\n\t\tif (settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.ExternalSecrets)) {\n\t\t\tloadPromises.push(externalSecretsStore.fetchAllSecrets());\n\t\t}\n\t}\n\n\ttry {\n\t\tawait Promise.all(loadPromises);\n\t} catch (error) {\n\t\treturn toast.showError(\n\t\t\terror,\n\t\t\ti18n.baseText('nodeView.showError.mounted1.title'),\n\t\t\ti18n.baseText('nodeView.showError.mounted1.message') + ':',\n\t\t);\n\t}\n\n\tvoid externalHooks.run('workflow.open', {\n\t\tworkflowId: workflowsStore.workflow.id,\n\t\tworkflowName: workflowsStore.workflow.name,\n\t});\n\tcollaborationStore.notifyWorkflowOpened(workflowsStore.workflow.id);\n\n\tconst selectedExecution = executionsStore.activeExecution;\n\tif (selectedExecution?.workflowId !== workflowsStore.workflow.id) {\n\t\texecutionsStore.activeExecution = null;\n\t\tworkflowsStore.currentWorkflowExecutions = [];\n\t} else {\n\t\texecutionsStore.activeExecution = selectedExecution;\n\t}\n\n\t// @TODO Implement this\n\t// this.clipboard.onPaste.value = this.onClipboardPasteEvent;\n\n\tisLoading.value = false;\n}\n\nasync function initializeView() {\n\t// In case the workflow got saved we do not have to run init\n\t// as only the route changed but all the needed data is already loaded\n\tif (route.params.action === 'workflowSave') {\n\t\tuiStore.stateIsDirty = false;\n\t\treturn;\n\t}\n\n\t// This function is called on route change as well, so we need to do the following:\n\t// - if the redirect is blank, then do nothing\n\t// - if the route is the template import view, then open the template\n\t// - if the user is leaving the current view without saving the changes, then show a confirmation modal\n\tif (isBlankRedirect.value) {\n\t\tisBlankRedirect.value = false;\n\t} else if (route.name === VIEWS.TEMPLATE_IMPORT) {\n\t\t// @TODO Implement template import\n\t\t// const templateId = route.params.id;\n\t\t// await openWorkflowTemplate(templateId.toString());\n\t} else {\n\t\tif (uiStore.stateIsDirty && !isReadOnlyEnvironment.value) {\n\t\t\tconst confirmModal = await message.confirm(\n\t\t\t\ti18n.baseText('generic.unsavedWork.confirmMessage.message'),\n\t\t\t\t{\n\t\t\t\t\ttitle: i18n.baseText('generic.unsavedWork.confirmMessage.headline'),\n\t\t\t\t\ttype: 'warning',\n\t\t\t\t\tconfirmButtonText: i18n.baseText('generic.unsavedWork.confirmMessage.confirmButtonText'),\n\t\t\t\t\tcancelButtonText: i18n.baseText('generic.unsavedWork.confirmMessage.cancelButtonText'),\n\t\t\t\t\tshowClose: true,\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tif (confirmModal === MODAL_CONFIRM) {\n\t\t\t\tconst saved = await workflowHelpers.saveCurrentWorkflow();\n\t\t\t\tif (saved) {\n\t\t\t\t\tawait npsSurveyStore.fetchPromptsData();\n\t\t\t\t}\n\t\t\t} else if (confirmModal === MODAL_CANCEL) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Get workflow id\n\t\tlet workflowIdParam: string | null = null;\n\t\tif (route.params.workflowId) {\n\t\t\tworkflowIdParam = route.params.workflowId.toString();\n\t\t}\n\n\t\thistoryStore.reset();\n\n\t\t// If there is no workflow id, treat it as a new workflow\n\t\tif (!workflowIdParam || workflowIdParam === NEW_WORKFLOW_ID) {\n\t\t\tif (route.meta?.nodeView === true) {\n\t\t\t\tawait initializeViewForNewWorkflow();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Load workflow data\n\t\ttry {\n\t\t\tawait workflowsStore.fetchWorkflow(workflowIdParam);\n\n\t\t\ttitleChange.titleSet(workflow.value.name, 'IDLE');\n\t\t\t// @TODO Implement this\n\t\t\t// await openWorkflow(workflow);\n\t\t\t// await checkAndInitDebugMode();\n\n\t\t\tworkflowsStore.initializeEditableWorkflow(workflowIdParam);\n\t\t\tawait projectsStore.setProjectNavActiveIdByWorkflowHomeProject(workflow.value.homeProject);\n\n\t\t\ttrackOpenWorkflowFromOnboardingTemplate();\n\t\t} catch (error) {\n\t\t\ttoast.showError(error, i18n.baseText('openWorkflow.workflowNotFoundError'));\n\n\t\t\tvoid router.push({\n\t\t\t\tname: VIEWS.NEW_WORKFLOW,\n\t\t\t});\n\t\t}\n\t}\n\n\tawait loadCredentials();\n\tuiStore.nodeViewInitialized = true;\n\n\t// Once view is initialized, pick up all toast notifications\n\t// waiting in the store and display them\n\ttoast.showNotificationForViews([VIEWS.WORKFLOW, VIEWS.NEW_WORKFLOW]);\n}\n\nasync function initializeViewForNewWorkflow() {\n\tresetWorkspace();\n\n\tawait workflowsStore.getNewWorkflowData(undefined, projectsStore.currentProjectId);\n\n\tworkflowsStore.currentWorkflowExecutions = [];\n\texecutionsStore.activeExecution = null;\n\tuiStore.stateIsDirty = false;\n\tuiStore.nodeViewInitialized = true;\n\texecutionsStore.activeExecution = null;\n\n\t// @TODO Implement this\n\t// canvasStore.setZoomLevel(1, [0, 0]);\n\t// canvasStore.zoomToFit();\n\n\t// @TODO Implement this\n\t// this.makeNewWorkflowShareable();\n\n\t// Pre-populate the canvas with the manual trigger node if the experiment is enabled and the user is in the variant group\n\tconst { getVariant } = usePostHog();\n\tif (\n\t\tgetVariant(CANVAS_AUTO_ADD_MANUAL_TRIGGER_EXPERIMENT.name) ===\n\t\tCANVAS_AUTO_ADD_MANUAL_TRIGGER_EXPERIMENT.variant\n\t) {\n\t\tconst manualTriggerNode = canvasStore.getAutoAddManualTriggerNode();\n\t\tif (manualTriggerNode) {\n\t\t\tawait addNodes([manualTriggerNode]);\n\t\t\tuiStore.lastSelectedNode = manualTriggerNode.name;\n\t\t}\n\t}\n}\n\nfunction resetWorkspace() {\n\tworkflowsStore.resetWorkflow();\n\n\tonToggleNodeCreator({ createNodeActive: false });\n\tnodeCreatorStore.setShowScrim(false);\n\n\t// @TODO Implement this\n\t// Reset nodes\n\t// this.unbindEndpointEventListeners();\n\t// this.deleteEveryEndpoint();\n\n\t// Make sure that if there is a waiting test-webhook that it gets removed\n\tif (isExecutionWaitingForWebhook.value) {\n\t\ttry {\n\t\t\tvoid workflowsStore.removeTestWebhook(workflowsStore.workflowId);\n\t\t} catch (error) {}\n\t}\n\tworkflowsStore.resetState();\n\tuiStore.removeActiveAction('workflowRunning');\n\n\tuiStore.resetSelectedNodes();\n\tuiStore.nodeViewOffsetPosition = [0, 0]; // @TODO Not sure if needed\n\n\t// this.credentialsUpdated = false;\n}\n\nfunction trackOpenWorkflowFromOnboardingTemplate() {\n\tif (workflow.value.meta?.onboardingId) {\n\t\ttelemetry.track(\n\t\t\t`User opened workflow from onboarding template with ID ${workflow.value.meta.onboardingId}`,\n\t\t\t{\n\t\t\t\tworkflow_id: workflowId.value,\n\t\t\t},\n\t\t\t{\n\t\t\t\twithPostHog: true,\n\t\t\t},\n\t\t);\n\t}\n}\n\n/**\n * Nodes\n */\n\nfunction onUpdateNodePosition(id: string, position: CanvasElement['position']) {\n\tupdateNodePosition(id, position, { trackHistory: true });\n}\n\nfunction onDeleteNode(id: string) {\n\tdeleteNode(id, { trackHistory: true });\n}\n\nfunction onRevertDeleteNode({ node }: { node: INodeUi }) {\n\trevertDeleteNode(node);\n}\n\nfunction onToggleNodeDisabled(id: string) {\n\tif (!checkIfEditingIsAllowed()) {\n\t\treturn;\n\t}\n\n\ttoggleNodeDisabled(id);\n}\n\nfunction onSetNodeActive(id: string) {\n\tsetNodeActive(id);\n}\n\nfunction onSetNodeSelected(id?: string) {\n\tsetNodeSelected(id);\n}\n\nfunction onRenameNode(parameterData: IUpdateInformation) {\n\t// The name changed. Do not forget to change the connections as well\n\tif (parameterData.name === 'name' && parameterData.oldValue) {\n\t\tvoid renameNode(parameterData.oldValue as string, parameterData.value as string);\n\t}\n}\n\nasync function onRevertRenameNode({\n\tcurrentName,\n\tnewName,\n}: {\n\tcurrentName: string;\n\tnewName: string;\n}) {\n\tawait revertRenameNode(currentName, newName);\n}\n\n/**\n * Credentials\n */\n\nasync function loadCredentials() {\n\tlet options: { workflowId: string } | { projectId: string };\n\n\tif (workflow.value) {\n\t\toptions = { workflowId: workflow.value.id };\n\t} else {\n\t\tconst queryParam =\n\t\t\ttypeof route.query?.projectId === 'string' ? route.query?.projectId : undefined;\n\t\tconst projectId = queryParam ?? projectsStore.personalProject?.id;\n\t\tif (projectId === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t'Could not find projectId in the query nor could I find the personal project in the project store',\n\t\t\t);\n\t\t}\n\n\t\toptions = { projectId };\n\t}\n\n\tawait credentialsStore.fetchAllCredentialsForWorkflow(options);\n}\n\n/**\n * Connections\n */\n\nfunction onCreateConnection(connection: Connection) {\n\tcreateConnection(connection);\n}\n\nfunction onDeleteConnection(connection: Connection) {\n\tdeleteConnection(connection, { trackHistory: true });\n}\n\nfunction onRevertDeleteConnection({ connection }: { connection: [IConnection, IConnection] }) {\n\trevertDeleteConnection(connection);\n}\n\n/**\n * Import / Export\n */\n\nasync function importWorkflowExact(_workflow: IWorkflowDataUpdate) {\n\t// @TODO\n}\n\n/**\n * Node creator\n */\n\nasync function onAddNodesAndConnections(\n\t{ nodes, connections }: AddedNodesAndConnections,\n\tdragAndDrop = false,\n\tposition?: XYPosition,\n) {\n\tif (!checkIfEditingIsAllowed()) {\n\t\treturn;\n\t}\n\n\tawait addNodes(nodes, { dragAndDrop, position });\n\tawait addConnections(connections, {\n\t\toffsetIndex: editableWorkflow.value.nodes.length - nodes.length,\n\t});\n}\n\nasync function onSwitchActiveNode(nodeName: string) {\n\tsetNodeActiveByName(nodeName);\n}\n\nasync function onOpenConnectionNodeCreator(node: string, connectionType: NodeConnectionType) {\n\tnodeCreatorStore.openSelectiveNodeCreator({ node, connectionType });\n}\n\nfunction onToggleNodeCreator(options: ToggleNodeCreatorOptions) {\n\tnodeCreatorStore.openNodeCreator(options);\n}\n\n/**\n * Executions\n */\n\nasync function onRunWorkflow() {\n\tawait runWorkflow({});\n}\n\nasync function openExecution(_executionId: string) {\n\t// @TODO\n}\n\n/**\n * Unload\n */\n\nfunction addUnloadEventBindings() {\n\t// window.addEventListener('beforeunload', this.onBeforeUnload);\n\t// window.addEventListener('unload', this.onUnload);\n}\n\nfunction removeUnloadEventBindings() {\n\t// window.removeEventListener('beforeunload', this.onBeforeUnload);\n\t// window.removeEventListener('unload', this.onUnload);\n}\n\n/**\n * Keboard\n */\n\nfunction addKeyboardEventBindings() {\n\t// document.addEventListener('keydown', this.keyDown);\n\t// document.addEventListener('keyup', this.keyUp);\n}\n\nfunction removeKeyboardEventBindings() {\n\t// document.removeEventListener('keydown', this.keyDown);\n\t// document.removeEventListener('keyup', this.keyUp);\n}\n\n/**\n * History events\n */\n\nfunction addUndoRedoEventBindings() {\n\t// historyBus.on('nodeMove', onMoveNode);\n\t// historyBus.on('revertAddNode', onRevertAddNode);\n\thistoryBus.on('revertRemoveNode', onRevertDeleteNode);\n\t// historyBus.on('revertAddConnection', onRevertAddConnection);\n\thistoryBus.on('revertRemoveConnection', onRevertDeleteConnection);\n\thistoryBus.on('revertRenameNode', onRevertRenameNode);\n\t// historyBus.on('enableNodeToggle', onRevertEnableToggle);\n}\n\nfunction removeUndoRedoEventBindings() {\n\t// historyBus.off('nodeMove', onMoveNode);\n\t// historyBus.off('revertAddNode', onRevertAddNode);\n\thistoryBus.off('revertRemoveNode', onRevertDeleteNode);\n\t// historyBus.off('revertAddConnection', onRevertAddConnection);\n\thistoryBus.off('revertRemoveConnection', onRevertDeleteConnection);\n\thistoryBus.off('revertRenameNode', onRevertRenameNode);\n\t// historyBus.off('enableNodeToggle', onRevertEnableToggle);\n}\n\n/**\n * Post message events\n */\n\nfunction addPostMessageEventBindings() {\n\twindow.addEventListener('message', onPostMessageReceived);\n\n\tif (window.parent) {\n\t\twindow.parent.postMessage(\n\t\t\tJSON.stringify({ command: 'n8nReady', version: rootStore.versionCli }),\n\t\t\t'*',\n\t\t);\n\t}\n}\n\nfunction removePostMessageEventBindings() {\n\twindow.removeEventListener('message', onPostMessageReceived);\n}\n\nasync function onPostMessageReceived(message: MessageEvent) {\n\tif (!message || typeof message.data !== 'string' || !message.data?.includes?.('\"command\"')) {\n\t\treturn;\n\t}\n\ttry {\n\t\tconst json = JSON.parse(message.data);\n\t\tif (json && json.command === 'openWorkflow') {\n\t\t\ttry {\n\t\t\t\tawait importWorkflowExact(json.data);\n\t\t\t\tcanOpenNDV.value = json.canOpenNDV ?? true;\n\t\t\t\thideNodeIssues.value = json.hideNodeIssues ?? false;\n\t\t\t\tisExecutionPreview.value = false;\n\t\t\t} catch (e) {\n\t\t\t\tif (window.top) {\n\t\t\t\t\twindow.top.postMessage(\n\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\tcommand: 'error',\n\t\t\t\t\t\t\tmessage: i18n.baseText('openWorkflow.workflowImportError'),\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t'*',\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\ttoast.showError(e, i18n.baseText('openWorkflow.workflowImportError'));\n\t\t\t}\n\t\t} else if (json && json.command === 'openExecution') {\n\t\t\ttry {\n\t\t\t\t// If this NodeView is used in preview mode (in iframe) it will not have access to the main app store\n\t\t\t\t// so everything it needs has to be sent using post messages and passed down to child components\n\t\t\t\tisProductionExecutionPreview.value = json.executionMode !== 'manual';\n\n\t\t\t\tawait openExecution(json.executionId);\n\t\t\t\tcanOpenNDV.value = json.canOpenNDV ?? true;\n\t\t\t\thideNodeIssues.value = json.hideNodeIssues ?? false;\n\t\t\t\tisExecutionPreview.value = true;\n\t\t\t} catch (e) {\n\t\t\t\tif (window.top) {\n\t\t\t\t\twindow.top.postMessage(\n\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\tcommand: 'error',\n\t\t\t\t\t\t\tmessage: i18n.baseText('nodeView.showError.openExecution.title'),\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t'*',\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\ttoast.showMessage({\n\t\t\t\t\ttitle: i18n.baseText('nodeView.showError.openExecution.title'),\n\t\t\t\t\tmessage: (e as Error).message,\n\t\t\t\t\ttype: 'error',\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (json?.command === 'setActiveExecution') {\n\t\t\texecutionsStore.activeExecution = (await executionsStore.fetchExecution(\n\t\t\t\tjson.executionId,\n\t\t\t)) as ExecutionSummary;\n\t\t}\n\t} catch (e) {}\n}\n\n/**\n * Permission checks\n */\n\nfunction checkIfEditingIsAllowed(): boolean {\n\tif (readOnlyNotification.value?.visible) {\n\t\treturn false;\n\t}\n\n\tif (isReadOnlyRoute.value || isReadOnlyEnvironment.value) {\n\t\tconst messageContext = isReadOnlyRoute.value ? 'executions' : 'workflows';\n\t\treadOnlyNotification.value = toast.showMessage({\n\t\t\ttitle: i18n.baseText(\n\t\t\t\tisReadOnlyEnvironment.value\n\t\t\t\t\t? `readOnlyEnv.showMessage.${messageContext}.title`\n\t\t\t\t\t: 'readOnly.showMessage.executions.title',\n\t\t\t),\n\t\t\tmessage: i18n.baseText(\n\t\t\t\tisReadOnlyEnvironment.value\n\t\t\t\t\t? `readOnlyEnv.showMessage.${messageContext}.message`\n\t\t\t\t\t: 'readOnly.showMessage.executions.message',\n\t\t\t),\n\t\t\ttype: 'info',\n\t\t\tdangerouslyUseHTMLString: true,\n\t\t}) as unknown as { visible: boolean };\n\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n/**\n * Mouse events\n */\n\nfunction onClickPane(position: CanvasElement['position']) {\n\tlastClickPosition.value = [position.x, position.y];\n\tcanvasStore.newNodeInsertPosition = [position.x, position.y];\n}\n\n/**\n * Lifecycle\n */\n\nonMounted(async () => {\n\tawait initializeData();\n\tawait initializeView();\n\n\taddUndoRedoEventBindings();\n\taddPostMessageEventBindings();\n\taddKeyboardEventBindings();\n\taddUnloadEventBindings();\n});\n\nonBeforeUnmount(() => {\n\tremoveUnloadEventBindings();\n\tremoveKeyboardEventBindings();\n\tremovePostMessageEventBindings();\n\tremoveUndoRedoEventBindings();\n});\n</script>\n\n<template>\n\t<WorkflowCanvas\n\t\tv-if=\"editableWorkflow && editableWorkflowObject\"\n\t\t:workflow=\"editableWorkflow\"\n\t\t:workflow-object=\"editableWorkflowObject\"\n\t\t@update:node:position=\"onUpdateNodePosition\"\n\t\t@update:node:active=\"onSetNodeActive\"\n\t\t@update:node:selected=\"onSetNodeSelected\"\n\t\t@update:node:enabled=\"onToggleNodeDisabled\"\n\t\t@delete:node=\"onDeleteNode\"\n\t\t@create:connection=\"onCreateConnection\"\n\t\t@delete:connection=\"onDeleteConnection\"\n\t\t@click:pane=\"onClickPane\"\n\t>\n\t\t<div :class=\"$style.executionButtons\">\n\t\t\t<CanvasExecuteWorkflowButton @click=\"onRunWorkflow\" />\n\t\t</div>\n\t\t<Suspense>\n\t\t\t<NodeCreation\n\t\t\t\tv-if=\"!isReadOnlyRoute && !isReadOnlyEnvironment\"\n\t\t\t\t:create-node-active=\"uiStore.isCreateNodeActive\"\n\t\t\t\t:node-view-scale=\"1\"\n\t\t\t\t@toggle-node-creator=\"onToggleNodeCreator\"\n\t\t\t\t@add-nodes=\"onAddNodesAndConnections\"\n\t\t\t/>\n\t\t</Suspense>\n\t\t<Suspense>\n\t\t\t<NodeDetailsView\n\t\t\t\t:read-only=\"isReadOnlyRoute || isReadOnlyEnvironment\"\n\t\t\t\t:is-production-execution-preview=\"isProductionExecutionPreview\"\n\t\t\t\t:renaming=\"false\"\n\t\t\t\t@value-changed=\"onRenameNode\"\n\t\t\t\t@switch-selected-node=\"onSwitchActiveNode\"\n\t\t\t\t@open-connection-node-creator=\"onOpenConnectionNodeCreator\"\n\t\t\t/>\n\t\t\t<!--\n\t\t\t\t:renaming=\"renamingActive\"\n\t\t\t\t@stop-execution=\"stopExecution\"\n\t\t\t\t@save-keyboard-shortcut=\"onSaveKeyboardShortcut\"\n\t\t\t-->\n\t\t</Suspense>\n\t</WorkflowCanvas>\n</template>\n\n<style lang=\"scss\" module>\n.executionButtons {\n\tposition: absolute;\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tbottom: var(--spacing-l);\n\twidth: auto;\n\n\t@media (max-width: $breakpoint-2xs) {\n\t\tbottom: 150px;\n\t}\n\n\tbutton {\n\t\tdisplay: flex;\n\t\tjustify-content: center;\n\t\talign-items: center;\n\t\tmargin-left: 0.625rem;\n\n\t\t&:first-child {\n\t\t\tmargin: 0;\n\t\t}\n\t}\n}\n</style>\n"],"file":"assets/NodeView.v2-Ces_FOmN.js"}
|
|
1
|
+
{"version":3,"mappings":"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","names":["workflowRunning","nodeDisabledTitle","emit","__emit","$style","useCssModule","i18n","useI18n","node","inject","CanvasNodeKey","data","computed","executeNode","onToggleNode","onDeleteNode","openContextMenu","_e","_type","useNodeConnections","inputs","outputs","connections","mainInputs","unref","input","NodeConnectionType","nonMainInputs","requiredNonMainInputs","mainInputConnections","mainOutputs","output","nonMainOutputs","mainOutputConnections","isVisible","isSuccessStatus","classes","label","isDisabled","styles","stylesObject","spacerCount","slots","_useSlots","Render","Component","CanvasNodeConfigurable","CanvasNodeConfiguration","CanvasNodeDefault","h","handle","CanvasNodeHandleKey","props","__props","handleType","isConnectableStart","isConnectableEnd","renderProps","CanvasHandleMainInput","CanvasHandleMainOutput","CanvasHandleNonMain","toRef","provide","nodeTypesStore","useNodeTypesStore","nodeType","watch","selected","inputsWithPosition","mapEndpointWithPosition","Position","outputsWithPosition","position","offsetAxis","endpoint","index","endpoints","id","onDelete","onDisabledToggle","onActivate","edgeStyle","isEdgeToolbarVisible","edgeToolbarStyle","path","edgeToolbarClasses","getBezierPath","connection","getSelectedEdges","getSelectedNodes","viewportRef","project","useVueFlow","hoveredEdges","ref","onMounted","onKeyDown","onUnmounted","onNodeDragStop","e","onSetNodeActive","onSelectNode","selectedNodeId","_a","onToggleNodeEnabled","onDeleteConnection","onConnect","args","onMouseEnterEdge","event","onMouseLeaveEdge","onClickPane","bounds","useCanvasMapping","workflow","workflowObject","locale","renderTypeByNodeType","acc","renderType","nodeInputsById","nodeTypeDescription","workflowObjectNode","mapLegacyEndpointsToCanvasConnectionPort","NodeHelpers.getNodeInputs","nodeOutputsById","NodeHelpers.getNodeOutputs","elements","inputConnections","outputConnections","mapLegacyConnectionsToCanvasConnections","type","getConnectionType","getConnectionLabel","_","pinData","_b","uiStore","useUIStore","runButtonText","useCanvasOperations","router","lastClickPosition","workflowsStore","useWorkflowsStore","credentialsStore","useCredentialsStore","historyStore","useHistoryStore","ndvStore","useNDVStore","canvasStore","useCanvasStore","toast","useToast","workflowHelpers","useWorkflowHelpers","nodeHelpers","useNodeHelpers","telemetry","useTelemetry","externalHooks","useExternalHooks","editableWorkflow","editableWorkflowObject","triggerNodes","updateNodePosition","trackHistory","trackBulk","oldPosition","newPosition","MoveNodeCommand","renameNode","currentName","newName","getUniqueNodeName","RenameNodeCommand","revertRenameNode","previousName","deleteNode","RemoveNodeCommand","trackDeleteNode","revertDeleteNode","STICKY_NODE_TYPE","QUICKSTART_NOTE_NAME","setNodeActive","setNodeActiveByName","name","setNodeSelected","toggleNodeDisabled","addNodes","nodes","dragAndDrop","currentPosition","lastAddedNode","nodePosition","isAutoAdd","openDetail","createNode","error","NodeViewUtils.NODE_SIZE","NodeViewUtils.GRID_SIZE","lastNodeInputs","nodeUi","options","newNodeData","resolveNodeData","lastSelectedNode","lastSelectedNodeOutputIndex","lastSelectedNodeEndpointUuid","outputIndex","targetEndpoint","connectionType","parseCanvasConnectionHandleString","isConnectionAllowed","createConnection","initializeNodeDataWithDefaultCredentials","nodeVersion","uuid","loadNodeTypesProperties","nodeParameters","NodeHelpers.getNodeParameters","credentialPerType","defaultCredential","selectedCredentials","credentials","authentication","authDisplayOptions","_c","parameters","displayOption","optionValue","_d","showMaxNodeTypeError","NodeViewUtils.getNewNodePosition","lastSelectedConnection","diffX","NodeViewUtils.getConnectorLengths","NodeViewUtils.MAX_X_TO_PUSH_DOWNSTREAM_NODES","pushDownstreamNodes","NodeViewUtils.PUSH_NODES_OFFSET","yOffset","sourceNodeType","offsets","sourceNodeOutputs","sourceNodeOutputMainOutputs","NodeHelpers.getConnectionTypes","offset","sourceOutputIndex","outputTypes","lastSelectedNodeType","outputName","lastSelectedNodeWorkflow","lastSelectedInputs","scopedConnectionIndex","inputType","inputsTypes","pushOffset","localizedName","useSegment","trackProperties","sourceNodeName","margin","sourceNode","checkNodes","nodeName","updateInformation","nodeInfos","allNodeTypeDescriptions","nodesToBeFetched","nodeVersions","n","maxNodes","targetNode","mappedConnection","mapCanvasConnectionToLegacyConnection","deleteConnection","RemoveConnectionCommand","revertDeleteConnection","targetNodeConnectionType","targetNodeType","workflowNode","addConnections","offsetIndex","from","to","fromNode","toNode","NodeCreation","defineAsyncComponent","__vitePreload","NodeDetailsView","useRouter","route","useRoute","message","useMessage","titleChange","useTitleChange","sourceControlStore","useSourceControlStore","nodeCreatorStore","useNodeCreatorStore","settingsStore","useSettingsStore","environmentsStore","useEnvironmentsStore","externalSecretsStore","useExternalSecretsStore","rootStore","useRootStore","collaborationStore","useCollaborationStore","executionsStore","useExecutionsStore","npsSurveyStore","useNpsSurveyStore","projectsStore","useProjectsStore","runWorkflow","useRunWorkflow","isLoading","isBlankRedirect","readOnlyNotification","isProductionExecutionPreview","isExecutionPreview","isExecutionWaitingForWebhook","canOpenNDV","hideNodeIssues","workflowId","isDemoRoute","VIEWS","isReadOnlyRoute","isReadOnlyEnvironment","initializeData","resetWorkspace","loadPromises","EnterpriseEditionFeature","selectedExecution","initializeView","confirmModal","MODAL_CONFIRM","MODAL_CANCEL","workflowIdParam","NEW_WORKFLOW_ID","initializeViewForNewWorkflow","trackOpenWorkflowFromOnboardingTemplate","loadCredentials","getVariant","usePostHog","CANVAS_AUTO_ADD_MANUAL_TRIGGER_EXPERIMENT","manualTriggerNode","onToggleNodeCreator","onUpdateNodePosition","onRevertDeleteNode","onToggleNodeDisabled","checkIfEditingIsAllowed","onSetNodeSelected","onRenameNode","parameterData","onRevertRenameNode","projectId","onCreateConnection","onRevertDeleteConnection","importWorkflowExact","_workflow","onAddNodesAndConnections","onSwitchActiveNode","onOpenConnectionNodeCreator","onRunWorkflow","openExecution","_executionId","addUndoRedoEventBindings","historyBus","removeUndoRedoEventBindings","addPostMessageEventBindings","onPostMessageReceived","removePostMessageEventBindings","json","messageContext","onBeforeUnmount"],"ignoreList":[],"sources":["../../src/components/canvas/elements/nodes/CanvasNodeToolbar.vue","../../src/composables/useNodeConnections.ts","../../src/components/canvas/elements/nodes/render-types/parts/CanvasNodeDisabledStrikeThrough.vue","../../src/components/canvas/elements/nodes/render-types/CanvasNodeDefault.vue","../../src/components/canvas/elements/nodes/render-types/CanvasNodeConfiguration.vue","../../src/components/canvas/elements/nodes/render-types/CanvasNodeConfigurable.vue","../../src/components/canvas/elements/nodes/CanvasNodeRenderer.vue","../../src/components/canvas/elements/handles/render-types/CanvasHandleMainInput.vue","../../src/components/canvas/elements/handles/render-types/CanvasHandleMainOutput.vue","../../src/components/canvas/elements/handles/render-types/CanvasHandleNonMain.vue","../../src/components/canvas/elements/handles/HandleRenderer.vue","../../src/components/canvas/elements/nodes/CanvasNode.vue","../../src/components/canvas/elements/edges/CanvasEdgeToolbar.vue","../../src/components/canvas/elements/edges/CanvasEdge.vue","../../src/components/canvas/Canvas.vue","../../src/composables/useCanvasMapping.ts","../../src/components/canvas/WorkflowCanvas.vue","../../src/components/canvas/elements/buttons/CanvasExecuteWorkflowButton.vue","../../src/composables/useCanvasOperations.ts","../../src/views/NodeView.v2.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, inject, useCssModule } from 'vue';\nimport { CanvasNodeKey } from '@/constants';\nimport { useI18n } from '@/composables/useI18n';\n\nconst emit = defineEmits<{\n\tdelete: [];\n\ttoggle: [];\n}>();\n\nconst $style = useCssModule();\nconst i18n = useI18n();\nconst node = inject(CanvasNodeKey);\n\nconst data = computed(() => node?.data.value);\n\n// @TODO\nconst workflowRunning = false;\n\n// @TODO\nconst nodeDisabledTitle = 'Test';\n\n// @TODO\nfunction executeNode() {}\n\nfunction onToggleNode() {\n\temit('toggle');\n}\n\nfunction onDeleteNode() {\n\temit('delete');\n}\n\n// @TODO\nfunction openContextMenu(_e: MouseEvent, _type: string) {}\n</script>\n\n<template>\n\t<div :class=\"$style.canvasNodeToolbar\">\n\t\t<div :class=\"$style.canvasNodeToolbarItems\">\n\t\t\t<N8nIconButton\n\t\t\t\tv-if=\"data?.renderType !== 'configuration'\"\n\t\t\t\tdata-test-id=\"execute-node-button\"\n\t\t\t\ttype=\"tertiary\"\n\t\t\t\ttext\n\t\t\t\tsize=\"small\"\n\t\t\t\ticon=\"play\"\n\t\t\t\t:disabled=\"workflowRunning\"\n\t\t\t\t:title=\"i18n.baseText('node.testStep')\"\n\t\t\t\t@click=\"executeNode\"\n\t\t\t/>\n\t\t\t<N8nIconButton\n\t\t\t\tdata-test-id=\"disable-node-button\"\n\t\t\t\ttype=\"tertiary\"\n\t\t\t\ttext\n\t\t\t\tsize=\"small\"\n\t\t\t\ticon=\"power-off\"\n\t\t\t\t:title=\"nodeDisabledTitle\"\n\t\t\t\t@click=\"onToggleNode\"\n\t\t\t/>\n\t\t\t<N8nIconButton\n\t\t\t\tdata-test-id=\"delete-node-button\"\n\t\t\t\ttype=\"tertiary\"\n\t\t\t\tsize=\"small\"\n\t\t\t\ttext\n\t\t\t\ticon=\"trash\"\n\t\t\t\t:title=\"i18n.baseText('node.delete')\"\n\t\t\t\t@click=\"onDeleteNode\"\n\t\t\t/>\n\t\t\t<N8nIconButton\n\t\t\t\tdata-test-id=\"overflow-node-button\"\n\t\t\t\ttype=\"tertiary\"\n\t\t\t\tsize=\"small\"\n\t\t\t\ttext\n\t\t\t\ticon=\"ellipsis-h\"\n\t\t\t\t@click=\"(e: MouseEvent) => openContextMenu(e, 'node-button')\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.canvasNodeToolbar {\n\tpadding-bottom: var(--spacing-3xs);\n}\n\n.canvasNodeToolbarItems {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n</style>\n","import type { CanvasElementData } from '@/types';\nimport type { MaybeRef } from 'vue';\nimport { computed, unref } from 'vue';\nimport { NodeConnectionType } from 'n8n-workflow';\n\nexport function useNodeConnections({\n\tinputs,\n\toutputs,\n\tconnections,\n}: {\n\tinputs: MaybeRef<CanvasElementData['inputs']>;\n\toutputs: MaybeRef<CanvasElementData['outputs']>;\n\tconnections: MaybeRef<CanvasElementData['connections']>;\n}) {\n\t/**\n\t * Inputs\n\t */\n\n\tconst mainInputs = computed(() =>\n\t\tunref(inputs).filter((input) => input.type === NodeConnectionType.Main),\n\t);\n\n\tconst nonMainInputs = computed(() =>\n\t\tunref(inputs).filter((input) => input.type !== NodeConnectionType.Main),\n\t);\n\n\tconst requiredNonMainInputs = computed(() =>\n\t\tnonMainInputs.value.filter((input) => input.required),\n\t);\n\n\tconst mainInputConnections = computed(\n\t\t() => unref(connections).input[NodeConnectionType.Main] ?? [],\n\t);\n\n\t/**\n\t * Outputs\n\t */\n\n\tconst mainOutputs = computed(() =>\n\t\tunref(outputs).filter((output) => output.type === NodeConnectionType.Main),\n\t);\n\n\tconst nonMainOutputs = computed(() =>\n\t\tunref(outputs).filter((output) => output.type !== NodeConnectionType.Main),\n\t);\n\n\tconst mainOutputConnections = computed(\n\t\t() => unref(connections).output[NodeConnectionType.Main] ?? [],\n\t);\n\n\treturn {\n\t\tmainInputs,\n\t\tnonMainInputs,\n\t\trequiredNonMainInputs,\n\t\tmainInputConnections,\n\t\tmainOutputs,\n\t\tnonMainOutputs,\n\t\tmainOutputConnections,\n\t};\n}\n","<script setup lang=\"ts\">\nimport { computed, inject, useCssModule } from 'vue';\nimport { CanvasNodeKey } from '@/constants';\nimport { useNodeConnections } from '@/composables/useNodeConnections';\n\nconst $style = useCssModule();\nconst node = inject(CanvasNodeKey);\n\nconst inputs = computed(() => node?.data.value.inputs ?? []);\nconst outputs = computed(() => node?.data.value.outputs ?? []);\nconst connections = computed(() => node?.data.value.connections ?? { input: {}, output: {} });\nconst { mainInputConnections, mainOutputConnections } = useNodeConnections({\n\tinputs,\n\toutputs,\n\tconnections,\n});\n\nconst isVisible = computed(\n\t() => mainInputConnections.value.length === 1 && mainOutputConnections.value.length === 1,\n);\n\nconst isSuccessStatus = computed(\n\t() => false,\n\t// @TODO Implement this\n\t// () => !['unknown'].includes(node.status) && workflowDataItems > 0,\n);\n\nconst classes = computed(() => {\n\treturn {\n\t\t[$style.disabledStrikeThrough]: true,\n\t\t[$style.success]: isSuccessStatus.value,\n\t};\n});\n</script>\n\n<template>\n\t<div v-if=\"isVisible\" :class=\"classes\"></div>\n</template>\n\n<style lang=\"scss\" module>\n.disabledStrikeThrough {\n\tborder: 1px solid var(--color-foreground-dark);\n\tposition: absolute;\n\ttop: calc(var(--canvas-node--height) / 2 - 1px);\n\tleft: -4px;\n\twidth: calc(100% + 12px);\n\tpointer-events: none;\n}\n\n.success {\n\tborder-color: var(--color-success-light);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, inject, useCssModule } from 'vue';\nimport { useNodeConnections } from '@/composables/useNodeConnections';\nimport { CanvasNodeKey } from '@/constants';\nimport { useI18n } from '@/composables/useI18n';\nimport CanvasNodeDisabledStrikeThrough from './parts/CanvasNodeDisabledStrikeThrough.vue';\n\nconst node = inject(CanvasNodeKey);\n\nconst $style = useCssModule();\nconst i18n = useI18n();\n\nconst label = computed(() => node?.label.value ?? '');\n\nconst inputs = computed(() => node?.data.value.inputs ?? []);\nconst outputs = computed(() => node?.data.value.outputs ?? []);\nconst connections = computed(() => node?.data.value.connections ?? { input: {}, output: {} });\nconst { mainOutputs } = useNodeConnections({\n\tinputs,\n\toutputs,\n\tconnections,\n});\n\nconst isDisabled = computed(() => node?.data.value.disabled ?? false);\n\nconst classes = computed(() => {\n\treturn {\n\t\t[$style.node]: true,\n\t\t[$style.selected]: node?.selected.value,\n\t\t[$style.disabled]: isDisabled.value,\n\t};\n});\n\nconst styles = computed(() => {\n\treturn {\n\t\t'--node-main-output-count': mainOutputs.value.length,\n\t};\n});\n</script>\n\n<template>\n\t<div v-if=\"node\" :class=\"classes\" :style=\"styles\" data-test-id=\"canvas-node-default\">\n\t\t<slot />\n\t\t<CanvasNodeDisabledStrikeThrough v-if=\"isDisabled\" />\n\t\t<div v-if=\"label\" :class=\"$style.label\">\n\t\t\t{{ label }}\n\t\t\t<div v-if=\"isDisabled\">({{ i18n.baseText('node.disabled') }})</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.node {\n\t--canvas-node--height: calc(100px + max(0, var(--node-main-output-count, 1) - 4) * 50px);\n\t--canvas-node--width: 100px;\n\n\theight: var(--canvas-node--height);\n\twidth: var(--canvas-node--width);\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tbackground: var(--canvas-node--background, var(--color-node-background));\n\tborder: 2px solid var(--canvas-node--border-color, var(--color-foreground-xdark));\n\tborder-radius: var(--border-radius-large);\n}\n\n.label {\n\ttop: 100%;\n\tposition: absolute;\n\tfont-size: var(--font-size-m);\n\ttext-align: center;\n\twidth: 100%;\n\tmin-width: 200px;\n\tmargin-top: var(--spacing-2xs);\n}\n\n.selected {\n\tbox-shadow: 0 0 0 4px var(--color-canvas-selected);\n}\n\n.disabled {\n\tborder-color: var(--color-canvas-node-disabled-border, var(--color-foreground-base));\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, inject, useCssModule } from 'vue';\nimport { CanvasNodeKey } from '@/constants';\nimport { useI18n } from '@/composables/useI18n';\n\nconst node = inject(CanvasNodeKey);\n\nconst $style = useCssModule();\nconst i18n = useI18n();\n\nconst label = computed(() => node?.label.value ?? '');\n\nconst isDisabled = computed(() => node?.data.value.disabled ?? false);\n\nconst classes = computed(() => {\n\treturn {\n\t\t[$style.node]: true,\n\t\t[$style.selected]: node?.selected.value,\n\t\t[$style.disabled]: isDisabled.value,\n\t};\n});\n</script>\n\n<template>\n\t<div :class=\"classes\" data-test-id=\"canvas-node-configuration\">\n\t\t<slot />\n\t\t<div v-if=\"label\" :class=\"$style.label\">\n\t\t\t{{ label }}\n\t\t\t<div v-if=\"isDisabled\">({{ i18n.baseText('node.disabled') }})</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.node {\n\t--canvas-node--width: 75px;\n\t--canvas-node--height: 75px;\n\n\twidth: var(--canvas-node--width);\n\theight: var(--canvas-node--height);\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tbackground: var(--canvas-node--background, var(--node-type-supplemental-background));\n\tborder: 2px solid var(--canvas-node--border-color, var(--color-foreground-dark));\n\tborder-radius: 50%;\n}\n\n.label {\n\ttop: 100%;\n\tposition: absolute;\n\tfont-size: var(--font-size-m);\n\ttext-align: center;\n\twidth: 100%;\n\tmin-width: 200px;\n\tmargin-top: var(--spacing-2xs);\n}\n\n.selected {\n\tbox-shadow: 0 0 0 4px var(--color-canvas-selected);\n}\n\n.disabled {\n\tborder-color: var(--color-canvas-node-disabled-border, var(--color-foreground-base));\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, inject, useCssModule } from 'vue';\nimport { CanvasNodeKey, NODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS } from '@/constants';\nimport { useNodeConnections } from '@/composables/useNodeConnections';\nimport { useI18n } from '@/composables/useI18n';\nimport CanvasNodeDisabledStrikeThrough from './parts/CanvasNodeDisabledStrikeThrough.vue';\n\nconst node = inject(CanvasNodeKey);\n\nconst $style = useCssModule();\nconst i18n = useI18n();\n\nconst label = computed(() => node?.label.value ?? '');\n\nconst inputs = computed(() => node?.data.value.inputs ?? []);\nconst outputs = computed(() => node?.data.value.outputs ?? []);\nconst connections = computed(() => node?.data.value.connections ?? { input: {}, output: {} });\nconst { nonMainInputs, requiredNonMainInputs } = useNodeConnections({\n\tinputs,\n\toutputs,\n\tconnections,\n});\n\nconst isDisabled = computed(() => node?.data.value.disabled ?? false);\n\nconst classes = computed(() => {\n\treturn {\n\t\t[$style.node]: true,\n\t\t[$style.selected]: node?.selected.value,\n\t\t[$style.disabled]: isDisabled.value,\n\t};\n});\n\nconst styles = computed(() => {\n\tconst stylesObject: {\n\t\t[key: string]: string | number;\n\t} = {};\n\n\tif (requiredNonMainInputs.value.length > 0) {\n\t\tlet spacerCount = 0;\n\t\tif (NODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS) {\n\t\t\tconst requiredNonMainInputsCount = requiredNonMainInputs.value.length;\n\t\t\tconst optionalNonMainInputsCount = nonMainInputs.value.length - requiredNonMainInputsCount;\n\t\t\tspacerCount = requiredNonMainInputsCount > 0 && optionalNonMainInputsCount > 0 ? 1 : 0;\n\t\t}\n\n\t\tstylesObject['--configurable-node-input-count'] = nonMainInputs.value.length + spacerCount;\n\t}\n\n\treturn stylesObject;\n});\n</script>\n\n<template>\n\t<div :class=\"classes\" :style=\"styles\" data-test-id=\"canvas-node-configurable\">\n\t\t<slot />\n\t\t<CanvasNodeDisabledStrikeThrough v-if=\"isDisabled\" />\n\t\t<div :class=\"$style.label\">\n\t\t\t{{ label }}\n\t\t\t<div v-if=\"isDisabled\">({{ i18n.baseText('node.disabled') }})</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.node {\n\t--configurable-node-min-input-count: 4;\n\t--configurable-node-input-width: 65px;\n\t--canvas-node--height: 100px;\n\t--canvas-node--width: calc(\n\t\tmax(var(--configurable-node-input-count, 5), var(--configurable-node-min-input-count)) *\n\t\t\tvar(--configurable-node-input-width)\n\t);\n\n\twidth: var(--canvas-node--width);\n\theight: var(--canvas-node--height);\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tbackground: var(--canvas-node--background, var(--color-node-background));\n\tborder: 2px solid var(--canvas-node--border-color, var(--color-foreground-xdark));\n\tborder-radius: var(--border-radius-large);\n}\n\n.label {\n\ttop: 100%;\n\tfont-size: var(--font-size-m);\n\ttext-align: center;\n\tmargin-left: var(--spacing-s);\n\tmax-width: calc(\n\t\tvar(--node-width) - var(--configurable-node-icon-offset) - var(--configurable-node-icon-size) -\n\t\t\t2 * var(--spacing-s)\n\t);\n}\n\n.selected {\n\tbox-shadow: 0 0 0 4px var(--color-canvas-selected);\n}\n\n.disabled {\n\tborder-color: var(--color-canvas-node-disabled-border, var(--color-foreground-base));\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { h, inject } from 'vue';\nimport CanvasNodeDefault from '@/components/canvas/elements/nodes/render-types/CanvasNodeDefault.vue';\nimport CanvasNodeConfiguration from '@/components/canvas/elements/nodes/render-types/CanvasNodeConfiguration.vue';\nimport CanvasNodeConfigurable from '@/components/canvas/elements/nodes/render-types/CanvasNodeConfigurable.vue';\nimport { CanvasNodeKey } from '@/constants';\n\nconst node = inject(CanvasNodeKey);\n\nconst slots = defineSlots<{\n\tdefault?: () => unknown;\n}>();\n\nconst Render = () => {\n\tlet Component;\n\tswitch (node?.data.value.renderType) {\n\t\tcase 'configurable':\n\t\t\tComponent = CanvasNodeConfigurable;\n\t\t\tbreak;\n\n\t\tcase 'configuration':\n\t\t\tComponent = CanvasNodeConfiguration;\n\t\t\tbreak;\n\n\t\tcase 'trigger':\n\t\t\tComponent = CanvasNodeDefault;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tComponent = CanvasNodeDefault;\n\t}\n\n\treturn h(Component, slots.default);\n};\n</script>\n\n<template>\n\t<Render />\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, inject, useCssModule } from 'vue';\nimport { CanvasNodeHandleKey } from '@/constants';\n\nconst handle = inject(CanvasNodeHandleKey);\n\nconst $style = useCssModule();\n\nconst label = computed(() => handle?.label.value ?? '');\n</script>\n<template>\n\t<div :class=\"['canvas-node-handle-main-input', $style.handle]\">\n\t\t<div :class=\"$style.label\">{{ label }}</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.handle {\n\twidth: 8px;\n\theight: 16px;\n\tborder-radius: 0;\n\tbackground: var(--color-foreground-xdark);\n\n\t&:hover {\n\t\tbackground: var(--color-primary);\n\t}\n}\n\n.label {\n\tposition: absolute;\n\ttop: 50%;\n\tright: 12px;\n\ttransform: translate(0, -50%);\n\tfont-size: var(--font-size-2xs);\n\tcolor: var(--color-foreground-xdark);\n\tbackground: var(--color-background-light);\n\tz-index: 1;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, inject, useCssModule } from 'vue';\nimport { CanvasNodeHandleKey } from '@/constants';\n\nconst handle = inject(CanvasNodeHandleKey);\n\n// const group = svg.node('g');\n// const containerBorder = svg.node('rect', {\n// \trx: 3,\n// \t'stroke-width': 2,\n// \tfillOpacity: 0,\n// \theight: ep.params.dimensions - 2,\n// \twidth: ep.params.dimensions - 2,\n// \ty: 1,\n// \tx: 1,\n// });\n// const plusPath = svg.node('path', {\n// \td: 'm16.40655,10.89837l-3.30491,0l0,-3.30491c0,-0.40555 -0.32889,-0.73443 -0.73443,-0.73443l-0.73443,0c-0.40554,0 -0.73442,0.32888 -0.73442,0.73443l0,3.30491l-3.30491,0c-0.40555,0 -0.73443,0.32888 -0.73443,0.73442l0,0.73443c0,0.40554 0.32888,0.73443 0.73443,0.73443l3.30491,0l0,3.30491c0,0.40554 0.32888,0.73442 0.73442,0.73442l0.73443,0c0.40554,0 0.73443,-0.32888 0.73443,-0.73442l0,-3.30491l3.30491,0c0.40554,0 0.73442,-0.32889 0.73442,-0.73443l0,-0.73443c0,-0.40554 -0.32888,-0.73442 -0.73442,-0.73442z',\n// });\n// if (ep.params.size !== 'medium') {\n// \tep.addClass(ep.params.size);\n// }\n// group.appendChild(containerBorder);\n// group.appendChild(plusPath);\n//\n// ep.setupOverlays();\n// ep.setVisible(false);\n// return group;\n\nconst $style = useCssModule();\n\nconst label = computed(() => handle?.label.value ?? '');\n</script>\n<template>\n\t<div :class=\"['canvas-node-handle-main-output', $style.handle]\">\n\t\t<div :class=\"$style.label\">{{ label }}</div>\n\t\t<div :class=\"$style.circle\" />\n\t\t<!-- @TODO Determine whether handle is connected and find a way to make it work without pointer-events: none -->\n\t\t<!--\t\t<svg :class=\"$style.plus\" viewBox=\"0 0 70 24\">-->\n\t\t<!--\t\t\t<line x1=\"0\" y1=\"12\" x2=\"46\" y2=\"12\" stroke=\"var(--color-foreground-xdark)\" />-->\n\t\t<!--\t\t\t<rect-->\n\t\t<!--\t\t\t\tx=\"46\"-->\n\t\t<!--\t\t\t\ty=\"2\"-->\n\t\t<!--\t\t\t\twidth=\"20\"-->\n\t\t<!--\t\t\t\theight=\"20\"-->\n\t\t<!--\t\t\t\tstroke=\"var(--color-foreground-xdark)\"-->\n\t\t<!--\t\t\t\tstroke-width=\"2\"-->\n\t\t<!--\t\t\t\trx=\"4\"-->\n\t\t<!--\t\t\t\tfill=\"#ffffff\"-->\n\t\t<!--\t\t\t/>-->\n\t\t<!--\t\t\t<g transform=\"translate(44, 0)\">-->\n\t\t<!--\t\t\t\t<path-->\n\t\t<!--\t\t\t\t\tfill=\"var(--color-foreground-xdark)\"-->\n\t\t<!--\t\t\t\t\td=\"m16.40655,10.89837l-3.30491,0l0,-3.30491c0,-0.40555 -0.32889,-0.73443 -0.73443,-0.73443l-0.73443,0c-0.40554,0 -0.73442,0.32888 -0.73442,0.73443l0,3.30491l-3.30491,0c-0.40555,0 -0.73443,0.32888 -0.73443,0.73442l0,0.73443c0,0.40554 0.32888,0.73443 0.73443,0.73443l3.30491,0l0,3.30491c0,0.40554 0.32888,0.73442 0.73442,0.73442l0.73443,0c0.40554,0 0.73443,-0.32888 0.73443,-0.73442l0,-3.30491l3.30491,0c0.40554,0 0.73442,-0.32889 0.73442,-0.73443l0,-0.73443c0,-0.40554 -0.32888,-0.73442 -0.73442,-0.73442z\"-->\n\t\t<!--\t\t\t\t></path>-->\n\t\t<!--\t\t\t</g>-->\n\t\t<!--\t\t</svg>-->\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.handle {\n\twidth: 16px;\n\theight: 16px;\n}\n\n.circle {\n\twidth: 16px;\n\theight: 16px;\n\tborder-radius: 100%;\n\tbackground: var(--color-foreground-xdark);\n\n\t&:hover {\n\t\tbackground: var(--color-primary);\n\t}\n}\n\n.plus {\n\tposition: absolute;\n\tleft: 16px;\n\ttop: 50%;\n\ttransform: translate(0, -50%);\n\twidth: 70px;\n\theight: 24px;\n\n\t:global(.vue-flow__handle.connecting) & {\n\t\tdisplay: none;\n\t}\n}\n\n.label {\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 20px;\n\ttransform: translate(0, -50%);\n\tfont-size: var(--font-size-2xs);\n\tcolor: var(--color-foreground-xdark);\n\tbackground: var(--color-background-light);\n\tz-index: 1;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, inject, useCssModule } from 'vue';\nimport { CanvasNodeHandleKey } from '@/constants';\n\nconst handle = inject(CanvasNodeHandleKey);\n\nconst $style = useCssModule();\n\nconst label = computed(() => handle?.label.value ?? '');\n</script>\n<template>\n\t<div :class=\"['canvas-node-handle-non-main', $style.handle]\">\n\t\t<div :class=\"$style.diamond\" />\n\t\t<div :class=\"$style.label\">{{ label }}</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.handle {\n\twidth: 14px;\n\theight: 14px;\n\tborder-radius: 0;\n}\n\n.diamond {\n\twidth: 14px;\n\theight: 14px;\n\ttransform: rotate(45deg);\n\tbackground: hsl(\n\t\tvar(--node-type-supplemental-color-h) var(--node-type-supplemental-color-s)\n\t\t\tvar(--node-type-supplemental-color-l)\n\t);\n\n\t&:hover {\n\t\tbackground: var(--color-primary);\n\t}\n}\n\n.label {\n\tposition: absolute;\n\ttop: 18px;\n\tleft: 50%;\n\ttransform: translate(-50%, 0);\n\tfont-size: var(--font-size-2xs);\n\tcolor: var(--color-foreground-xdark);\n\tbackground: var(--color-background-light);\n\tz-index: 1;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, h, provide, toRef, useCssModule } from 'vue';\nimport type { CanvasConnectionPort, CanvasElementPortWithPosition } from '@/types';\n\nimport { Handle } from '@vue-flow/core';\nimport { NodeConnectionType } from 'n8n-workflow';\nimport CanvasHandleMainInput from '@/components/canvas/elements/handles/render-types/CanvasHandleMainInput.vue';\nimport CanvasHandleMainOutput from '@/components/canvas/elements/handles/render-types/CanvasHandleMainOutput.vue';\nimport CanvasHandleNonMain from '@/components/canvas/elements/handles/render-types/CanvasHandleNonMain.vue';\nimport { CanvasNodeHandleKey } from '@/constants';\n\nconst props = defineProps<{\n\tmode: 'output' | 'input';\n\tlabel?: string;\n\ttype: CanvasConnectionPort['type'];\n\tindex: CanvasConnectionPort['index'];\n\tposition: CanvasElementPortWithPosition['position'];\n\toffset: CanvasElementPortWithPosition['offset'];\n}>();\n\nconst $style = useCssModule();\n\nconst handleType = computed(() => (props.mode === 'input' ? 'target' : 'source'));\n\nconst isConnectableStart = computed(() => {\n\treturn props.mode === 'output' || props.type !== NodeConnectionType.Main;\n});\n\nconst isConnectableEnd = computed(() => {\n\treturn props.mode === 'input' || props.type !== NodeConnectionType.Main;\n});\n\nconst Render = (renderProps: { label?: string }) => {\n\tlet Component;\n\n\tif (props.type === NodeConnectionType.Main) {\n\t\tif (props.mode === 'input') {\n\t\t\tComponent = CanvasHandleMainInput;\n\t\t} else {\n\t\t\tComponent = CanvasHandleMainOutput;\n\t\t}\n\t} else {\n\t\tComponent = CanvasHandleNonMain;\n\t}\n\n\treturn h(Component, renderProps);\n};\n\n/**\n * Provide\n */\n\nconst label = toRef(props, 'label');\n\nprovide(CanvasNodeHandleKey, {\n\tlabel,\n});\n</script>\n\n<template>\n\t<Handle\n\t\t:id=\"`${mode}s/${type}/${index}`\"\n\t\t:class=\"[$style.handle]\"\n\t\t:type=\"handleType\"\n\t\t:position=\"position\"\n\t\t:style=\"offset\"\n\t\t:connectable-start=\"isConnectableStart\"\n\t\t:connectable-end=\"isConnectableEnd\"\n\t>\n\t\t<Render :label=\"label\" />\n\t</Handle>\n</template>\n\n<style lang=\"scss\" module>\n.handle {\n\twidth: auto;\n\theight: auto;\n\tdisplay: inline-flex;\n\tjustify-content: center;\n\talign-items: center;\n\tborder: 0;\n\tbackground: none;\n\n\t> * {\n\t\tpointer-events: none;\n\t}\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { Position } from '@vue-flow/core';\nimport { computed, provide, toRef, watch } from 'vue';\nimport type {\n\tCanvasElementData,\n\tCanvasConnectionPort,\n\tCanvasElementPortWithPosition,\n} from '@/types';\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport CanvasNodeToolbar from '@/components/canvas/elements/nodes/CanvasNodeToolbar.vue';\nimport CanvasNodeRenderer from '@/components/canvas/elements/nodes/CanvasNodeRenderer.vue';\nimport HandleRenderer from '@/components/canvas/elements/handles/HandleRenderer.vue';\nimport { useNodeConnections } from '@/composables/useNodeConnections';\nimport { CanvasNodeKey } from '@/constants';\nimport type { NodeProps } from '@vue-flow/core';\n\nconst emit = defineEmits<{\n\tdelete: [id: string];\n\tselect: [id: string, selected: boolean];\n\ttoggle: [id: string];\n\tactivate: [id: string];\n}>();\nconst props = defineProps<NodeProps<CanvasElementData>>();\n\nconst nodeTypesStore = useNodeTypesStore();\n\nconst inputs = computed(() => props.data.inputs);\nconst outputs = computed(() => props.data.outputs);\nconst connections = computed(() => props.data.connections);\nconst { mainInputs, nonMainInputs, mainOutputs, nonMainOutputs } = useNodeConnections({\n\tinputs,\n\toutputs,\n\tconnections,\n});\n\nconst isDisabled = computed(() => props.data.disabled);\n\nconst nodeType = computed(() => {\n\treturn nodeTypesStore.getNodeType(props.data.type, props.data.typeVersion);\n});\n\nwatch(\n\t() => props.selected,\n\t(selected) => {\n\t\temit('select', props.id, selected);\n\t},\n);\n\n/**\n * Inputs\n */\n\nconst inputsWithPosition = computed(() => {\n\treturn [\n\t\t...mainInputs.value.map(mapEndpointWithPosition(Position.Left, 'top')),\n\t\t...nonMainInputs.value.map(mapEndpointWithPosition(Position.Bottom, 'left')),\n\t];\n});\n\n/**\n * Outputs\n */\n\nconst outputsWithPosition = computed(() => {\n\treturn [\n\t\t...mainOutputs.value.map(mapEndpointWithPosition(Position.Right, 'top')),\n\t\t...nonMainOutputs.value.map(mapEndpointWithPosition(Position.Top, 'left')),\n\t];\n});\n\n/**\n * Endpoints\n */\n\nconst mapEndpointWithPosition =\n\t(position: Position, offsetAxis: 'top' | 'left') =>\n\t(\n\t\tendpoint: CanvasConnectionPort,\n\t\tindex: number,\n\t\tendpoints: CanvasConnectionPort[],\n\t): CanvasElementPortWithPosition => {\n\t\treturn {\n\t\t\t...endpoint,\n\t\t\tposition,\n\t\t\toffset: {\n\t\t\t\t[offsetAxis]: `${(100 / (endpoints.length + 1)) * (index + 1)}%`,\n\t\t\t},\n\t\t};\n\t};\n\n/**\n * Provide\n */\n\nconst id = toRef(props, 'id');\nconst data = toRef(props, 'data');\nconst label = toRef(props, 'label');\nconst selected = toRef(props, 'selected');\n\nprovide(CanvasNodeKey, {\n\tid,\n\tdata,\n\tlabel,\n\tselected,\n\tnodeType,\n});\n\nfunction onDelete() {\n\temit('delete', props.id);\n}\n\nfunction onDisabledToggle() {\n\temit('toggle', props.id);\n}\n\nfunction onActivate() {\n\temit('activate', props.id);\n}\n</script>\n\n<template>\n\t<div :class=\"$style.canvasNode\" data-test-id=\"canvas-node\">\n\t\t<template v-for=\"source in outputsWithPosition\" :key=\"`${source.type}/${source.index}`\">\n\t\t\t<HandleRenderer\n\t\t\t\tmode=\"output\"\n\t\t\t\tdata-test-id=\"canvas-node-output-handle\"\n\t\t\t\t:type=\"source.type\"\n\t\t\t\t:label=\"source.label\"\n\t\t\t\t:index=\"source.index\"\n\t\t\t\t:position=\"source.position\"\n\t\t\t\t:offset=\"source.offset\"\n\t\t\t/>\n\t\t</template>\n\n\t\t<template v-for=\"target in inputsWithPosition\" :key=\"`${target.type}/${target.index}`\">\n\t\t\t<HandleRenderer\n\t\t\t\tmode=\"input\"\n\t\t\t\tdata-test-id=\"canvas-node-input-handle\"\n\t\t\t\t:type=\"target.type\"\n\t\t\t\t:label=\"target.label\"\n\t\t\t\t:index=\"target.index\"\n\t\t\t\t:position=\"target.position\"\n\t\t\t\t:offset=\"target.offset\"\n\t\t\t/>\n\t\t</template>\n\n\t\t<CanvasNodeToolbar\n\t\t\tv-if=\"nodeType\"\n\t\t\tdata-test-id=\"canvas-node-toolbar\"\n\t\t\t:class=\"$style.canvasNodeToolbar\"\n\t\t\t@delete=\"onDelete\"\n\t\t\t@toggle=\"onDisabledToggle\"\n\t\t/>\n\n\t\t<CanvasNodeRenderer v-if=\"nodeType\" @dblclick=\"onActivate\">\n\t\t\t<NodeIcon :node-type=\"nodeType\" :size=\"40\" :shrink=\"false\" :disabled=\"isDisabled\" />\n\t\t\t<!--\t\t\t:color-default=\"iconColorDefault\"-->\n\t\t</CanvasNodeRenderer>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.canvasNode {\n\t&:hover {\n\t\t.canvasNodeToolbar {\n\t\t\tdisplay: flex;\n\t\t\topacity: 1;\n\t\t}\n\t}\n}\n\n.canvasNodeToolbar {\n\tdisplay: none;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 50%;\n\ttransform: translate(-50%, -100%);\n\topacity: 0;\n\ttransition: opacity 0.3s ease;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { useI18n } from '@/composables/useI18n';\nimport { computed, useCssModule } from 'vue';\n\nconst emit = defineEmits<{\n\tdelete: [];\n}>();\n\nconst $style = useCssModule();\n\nconst i18n = useI18n();\n\nconst classes = computed(() => ({\n\t[$style.canvasEdgeToolbar]: true,\n}));\n\nfunction onDelete() {\n\temit('delete');\n}\n</script>\n\n<template>\n\t<div :class=\"classes\" data-test-id=\"canvas-edge-toolbar\">\n\t\t<N8nIconButton\n\t\t\tdata-test-id=\"delete-connection-button\"\n\t\t\ttype=\"tertiary\"\n\t\t\tsize=\"small\"\n\t\t\ticon=\"trash\"\n\t\t\t:title=\"i18n.baseText('node.delete')\"\n\t\t\t@click=\"onDelete\"\n\t\t/>\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.canvasEdgeToolbar {\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tpointer-events: all;\n}\n</style>\n","<script lang=\"ts\" setup>\n/* eslint-disable vue/no-multiple-template-root */\nimport type { Connection, EdgeProps } from '@vue-flow/core';\nimport { BaseEdge, EdgeLabelRenderer, getBezierPath } from '@vue-flow/core';\nimport CanvasEdgeToolbar from './CanvasEdgeToolbar.vue';\nimport { computed, useCssModule } from 'vue';\n\nconst emit = defineEmits<{\n\tdelete: [connection: Connection];\n}>();\n\nconst props = defineProps<\n\tEdgeProps & {\n\t\thovered?: boolean;\n\t}\n>();\n\nconst $style = useCssModule();\n\nconst edgeStyle = computed(() => ({\n\tstrokeWidth: 2,\n\t...props.style,\n}));\n\nconst isEdgeToolbarVisible = computed(() => props.selected || props.hovered);\n\nconst edgeToolbarStyle = computed(() => {\n\treturn {\n\t\ttransform: `translate(-50%, -50%) translate(${path.value[1]}px,${path.value[2]}px)`,\n\t};\n});\n\nconst edgeToolbarClasses = computed(() => ({\n\t[$style.edgeToolbar]: true,\n\t[$style.edgeToolbarVisible]: isEdgeToolbarVisible.value,\n\tnodrag: true,\n\tnopan: true,\n}));\n\nconst path = computed(() =>\n\tgetBezierPath({\n\t\tsourceX: props.sourceX,\n\t\tsourceY: props.sourceY,\n\t\tsourcePosition: props.sourcePosition,\n\t\ttargetX: props.targetX,\n\t\ttargetY: props.targetY,\n\t\ttargetPosition: props.targetPosition,\n\t}),\n);\n\nconst connection = computed<Connection>(() => ({\n\tsource: props.source,\n\ttarget: props.target,\n\tsourceHandle: props.sourceHandleId,\n\ttargetHandle: props.targetHandleId,\n}));\n\nfunction onDelete() {\n\temit('delete', connection.value);\n}\n</script>\n\n<template>\n\t<BaseEdge\n\t\t:id=\"id\"\n\t\t:style=\"edgeStyle\"\n\t\t:path=\"path[0]\"\n\t\t:marker-end=\"markerEnd\"\n\t\t:label=\"data?.label\"\n\t\t:label-x=\"path[1]\"\n\t\t:label-y=\"path[2]\"\n\t\t:label-style=\"{ fill: 'white' }\"\n\t\t:label-show-bg=\"true\"\n\t\t:label-bg-style=\"{ fill: 'red' }\"\n\t\t:label-bg-padding=\"[2, 4]\"\n\t\t:label-bg-border-radius=\"2\"\n\t\t:class=\"$style.edge\"\n\t/>\n\t<EdgeLabelRenderer>\n\t\t<CanvasEdgeToolbar :class=\"edgeToolbarClasses\" :style=\"edgeToolbarStyle\" @delete=\"onDelete\" />\n\t</EdgeLabelRenderer>\n</template>\n\n<style lang=\"scss\" module>\n.edgeToolbar {\n\tposition: absolute;\n\topacity: 0;\n\n\t&.edgeToolbarVisible {\n\t\topacity: 1;\n\t}\n\n\t&:hover {\n\t\topacity: 1;\n\t}\n}\n</style>\n","<script lang=\"ts\" setup>\nimport type { CanvasConnection, CanvasElement } from '@/types';\nimport type { EdgeMouseEvent, NodeDragEvent, Connection, XYPosition } from '@vue-flow/core';\nimport { useVueFlow, VueFlow, PanelPosition } from '@vue-flow/core';\nimport { Background } from '@vue-flow/background';\nimport { Controls } from '@vue-flow/controls';\nimport { MiniMap } from '@vue-flow/minimap';\nimport CanvasNode from './elements/nodes/CanvasNode.vue';\nimport CanvasEdge from './elements/edges/CanvasEdge.vue';\nimport { onMounted, onUnmounted, ref, useCssModule } from 'vue';\n\nconst $style = useCssModule();\n\nconst emit = defineEmits<{\n\t'update:modelValue': [elements: CanvasElement[]];\n\t'update:node:position': [id: string, position: XYPosition];\n\t'update:node:active': [id: string];\n\t'update:node:enabled': [id: string];\n\t'update:node:selected': [id?: string];\n\t'delete:node': [id: string];\n\t'delete:connection': [connection: Connection];\n\t'create:connection': [connection: Connection];\n\t'click:pane': [position: XYPosition];\n}>();\n\nconst props = withDefaults(\n\tdefineProps<{\n\t\tid?: string;\n\t\telements: CanvasElement[];\n\t\tconnections: CanvasConnection[];\n\t\tcontrolsPosition?: PanelPosition;\n\t}>(),\n\t{\n\t\tid: 'canvas',\n\t\telements: () => [],\n\t\tconnections: () => [],\n\t\tcontrolsPosition: PanelPosition.BottomLeft,\n\t},\n);\n\nconst { getSelectedEdges, getSelectedNodes, viewportRef, project } = useVueFlow({\n\tid: props.id,\n});\n\nconst hoveredEdges = ref<Record<string, boolean>>({});\n\nonMounted(() => {\n\tdocument.addEventListener('keydown', onKeyDown);\n});\n\nonUnmounted(() => {\n\tdocument.removeEventListener('keydown', onKeyDown);\n});\n\nfunction onNodeDragStop(e: NodeDragEvent) {\n\te.nodes.forEach((node) => {\n\t\temit('update:node:position', node.id, node.position);\n\t});\n}\n\nfunction onSetNodeActive(id: string) {\n\temit('update:node:active', id);\n}\n\nfunction onSelectNode() {\n\tconst selectedNodeId = getSelectedNodes.value[getSelectedNodes.value.length - 1]?.id;\n\temit('update:node:selected', selectedNodeId);\n}\n\nfunction onToggleNodeEnabled(id: string) {\n\temit('update:node:enabled', id);\n}\n\nfunction onDeleteNode(id: string) {\n\temit('delete:node', id);\n}\n\nfunction onDeleteConnection(connection: Connection) {\n\temit('delete:connection', connection);\n}\n\nfunction onConnect(...args: unknown[]) {\n\temit('create:connection', args[0] as Connection);\n}\n\nfunction onKeyDown(e: KeyboardEvent) {\n\tif (e.key === 'Delete') {\n\t\tgetSelectedEdges.value.forEach(onDeleteConnection);\n\t\tgetSelectedNodes.value.forEach(({ id }) => onDeleteNode(id));\n\t}\n}\n\nfunction onMouseEnterEdge(event: EdgeMouseEvent) {\n\thoveredEdges.value[event.edge.id] = true;\n}\n\nfunction onMouseLeaveEdge(event: EdgeMouseEvent) {\n\thoveredEdges.value[event.edge.id] = false;\n}\n\nfunction onClickPane(event: MouseEvent) {\n\tconst bounds = viewportRef.value?.getBoundingClientRect() ?? { left: 0, top: 0 };\n\tconst position = project({\n\t\tx: event.offsetX - bounds.left,\n\t\ty: event.offsetY - bounds.top,\n\t});\n\n\temit('click:pane', position);\n}\n</script>\n\n<template>\n\t<VueFlow\n\t\t:id=\"id\"\n\t\t:nodes=\"elements\"\n\t\t:edges=\"connections\"\n\t\t:apply-changes=\"false\"\n\t\tfit-view-on-init\n\t\tpan-on-scroll\n\t\t:min-zoom=\"0.2\"\n\t\t:max-zoom=\"2\"\n\t\tdata-test-id=\"canvas\"\n\t\t@node-drag-stop=\"onNodeDragStop\"\n\t\t@edge-mouse-enter=\"onMouseEnterEdge\"\n\t\t@edge-mouse-leave=\"onMouseLeaveEdge\"\n\t\t@pane-click=\"onClickPane\"\n\t\t@connect=\"onConnect\"\n\t>\n\t\t<template #node-canvas-node=\"canvasNodeProps\">\n\t\t\t<CanvasNode\n\t\t\t\tv-bind=\"canvasNodeProps\"\n\t\t\t\t@delete=\"onDeleteNode\"\n\t\t\t\t@select=\"onSelectNode\"\n\t\t\t\t@toggle=\"onToggleNodeEnabled\"\n\t\t\t\t@activate=\"onSetNodeActive\"\n\t\t\t/>\n\t\t</template>\n\n\t\t<template #edge-canvas-edge=\"canvasEdgeProps\">\n\t\t\t<CanvasEdge\n\t\t\t\tv-bind=\"canvasEdgeProps\"\n\t\t\t\t:hovered=\"hoveredEdges[canvasEdgeProps.id]\"\n\t\t\t\t@delete=\"onDeleteConnection\"\n\t\t\t/>\n\t\t</template>\n\n\t\t<Background data-test-id=\"canvas-background\" pattern-color=\"#aaa\" :gap=\"16\" />\n\n\t\t<MiniMap data-test-id=\"canvas-minimap\" pannable />\n\n\t\t<Controls\n\t\t\tdata-test-id=\"canvas-controls\"\n\t\t\t:class=\"$style.canvasControls\"\n\t\t\t:position=\"controlsPosition\"\n\t\t></Controls>\n\t</VueFlow>\n</template>\n\n<style lang=\"scss\" module></style>\n\n<style lang=\"scss\">\n.vue-flow__controls {\n\tdisplay: flex;\n\tgap: var(--spacing-2xs);\n\tbox-shadow: none;\n}\n\n.vue-flow__controls-button {\n\twidth: 42px;\n\theight: 42px;\n\tborder: var(--border-base);\n\tborder-radius: var(--border-radius-base);\n\tpadding: 0;\n\ttransition-property: transform, background, border, color;\n\ttransition-duration: 300ms;\n\ttransition-timing-function: ease;\n\n\t&:hover {\n\t\tborder-color: var(--color-button-secondary-hover-active-border);\n\t\tbackground-color: var(--color-button-secondary-active-background);\n\t\ttransform: scale(1.1);\n\n\t\tsvg {\n\t\t\tfill: var(--color-primary);\n\t\t}\n\t}\n\n\tsvg {\n\t\tmax-height: 16px;\n\t\tmax-width: 16px;\n\t\ttransition-property: fill;\n\t\ttransition-duration: 300ms;\n\t\ttransition-timing-function: ease;\n\t}\n}\n</style>\n","import { useI18n } from '@/composables/useI18n';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport type { Ref } from 'vue';\nimport { computed } from 'vue';\nimport type {\n\tCanvasConnection,\n\tCanvasConnectionPort,\n\tCanvasElement,\n\tCanvasElementData,\n} from '@/types';\nimport {\n\tmapLegacyConnectionsToCanvasConnections,\n\tmapLegacyEndpointsToCanvasConnectionPort,\n} from '@/utils/canvasUtilsV2';\nimport type { Workflow } from 'n8n-workflow';\nimport { NodeHelpers } from 'n8n-workflow';\nimport type { IWorkflowDb } from '@/Interface';\n\nexport function useCanvasMapping({\n\tworkflow,\n\tworkflowObject,\n}: {\n\tworkflow: Ref<IWorkflowDb>;\n\tworkflowObject: Ref<Workflow>;\n}) {\n\tconst locale = useI18n();\n\tconst nodeTypesStore = useNodeTypesStore();\n\n\tconst renderTypeByNodeType = computed(\n\t\t() =>\n\t\t\tworkflow.value.nodes.reduce<Record<string, CanvasElementData['renderType']>>((acc, node) => {\n\t\t\t\tlet renderType: CanvasElementData['renderType'] = 'default';\n\t\t\t\tswitch (true) {\n\t\t\t\t\tcase nodeTypesStore.isTriggerNode(node.type):\n\t\t\t\t\t\trenderType = 'trigger';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase nodeTypesStore.isConfigNode(workflowObject.value, node, node.type):\n\t\t\t\t\t\trenderType = 'configuration';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase nodeTypesStore.isConfigurableNode(workflowObject.value, node, node.type):\n\t\t\t\t\t\trenderType = 'configurable';\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tacc[node.type] = renderType;\n\t\t\t\treturn acc;\n\t\t\t}, {}) ?? {},\n\t);\n\n\tconst nodeInputsById = computed(() =>\n\t\tworkflow.value.nodes.reduce<Record<string, CanvasConnectionPort[]>>((acc, node) => {\n\t\t\tconst nodeTypeDescription = nodeTypesStore.getNodeType(node.type);\n\t\t\tconst workflowObjectNode = workflowObject.value.getNode(node.name);\n\n\t\t\tacc[node.id] =\n\t\t\t\tworkflowObjectNode && nodeTypeDescription\n\t\t\t\t\t? mapLegacyEndpointsToCanvasConnectionPort(\n\t\t\t\t\t\t\tNodeHelpers.getNodeInputs(\n\t\t\t\t\t\t\t\tworkflowObject.value,\n\t\t\t\t\t\t\t\tworkflowObjectNode,\n\t\t\t\t\t\t\t\tnodeTypeDescription,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t: [];\n\n\t\t\treturn acc;\n\t\t}, {}),\n\t);\n\n\tconst nodeOutputsById = computed(() =>\n\t\tworkflow.value.nodes.reduce<Record<string, CanvasConnectionPort[]>>((acc, node) => {\n\t\t\tconst nodeTypeDescription = nodeTypesStore.getNodeType(node.type);\n\t\t\tconst workflowObjectNode = workflowObject.value.getNode(node.name);\n\n\t\t\tacc[node.id] =\n\t\t\t\tworkflowObjectNode && nodeTypeDescription\n\t\t\t\t\t? mapLegacyEndpointsToCanvasConnectionPort(\n\t\t\t\t\t\t\tNodeHelpers.getNodeOutputs(\n\t\t\t\t\t\t\t\tworkflowObject.value,\n\t\t\t\t\t\t\t\tworkflowObjectNode,\n\t\t\t\t\t\t\t\tnodeTypeDescription,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t: [];\n\n\t\t\treturn acc;\n\t\t}, {}),\n\t);\n\n\tconst elements = computed<CanvasElement[]>(() => [\n\t\t...workflow.value.nodes.map<CanvasElement>((node) => {\n\t\t\tconst inputConnections = workflowObject.value.connectionsByDestinationNode[node.name] ?? {};\n\t\t\tconst outputConnections = workflowObject.value.connectionsBySourceNode[node.name] ?? {};\n\n\t\t\tconst data: CanvasElementData = {\n\t\t\t\tid: node.id,\n\t\t\t\ttype: node.type,\n\t\t\t\ttypeVersion: node.typeVersion,\n\t\t\t\tdisabled: !!node.disabled,\n\t\t\t\tinputs: nodeInputsById.value[node.id] ?? [],\n\t\t\t\toutputs: nodeOutputsById.value[node.id] ?? [],\n\t\t\t\tconnections: {\n\t\t\t\t\tinput: inputConnections,\n\t\t\t\t\toutput: outputConnections,\n\t\t\t\t},\n\t\t\t\trenderType: renderTypeByNodeType.value[node.type] ?? 'default',\n\t\t\t};\n\n\t\t\treturn {\n\t\t\t\tid: node.id,\n\t\t\t\tlabel: node.name,\n\t\t\t\ttype: 'canvas-node',\n\t\t\t\tposition: { x: node.position[0], y: node.position[1] },\n\t\t\t\tdata,\n\t\t\t};\n\t\t}),\n\t]);\n\n\tconst connections = computed<CanvasConnection[]>(() => {\n\t\tconst mappedConnections = mapLegacyConnectionsToCanvasConnections(\n\t\t\tworkflow.value.connections ?? [],\n\t\t\tworkflow.value.nodes ?? [],\n\t\t);\n\n\t\treturn mappedConnections.map((connection) => {\n\t\t\tconst type = getConnectionType(connection);\n\t\t\tconst label = getConnectionLabel(connection);\n\n\t\t\treturn {\n\t\t\t\t...connection,\n\t\t\t\ttype,\n\t\t\t\tlabel,\n\t\t\t};\n\t\t});\n\t});\n\n\tfunction getConnectionType(_: CanvasConnection): string {\n\t\treturn 'canvas-edge';\n\t}\n\n\tfunction getConnectionLabel(connection: CanvasConnection): string {\n\t\tconst pinData = workflow.value.pinData?.[connection.data?.fromNodeName ?? ''];\n\n\t\tif (pinData?.length) {\n\t\t\treturn locale.baseText('ndv.output.items', {\n\t\t\t\tadjustToNumber: pinData.length,\n\t\t\t\tinterpolate: { count: String(pinData.length) },\n\t\t\t});\n\t\t}\n\n\t\treturn '';\n\t}\n\n\treturn {\n\t\tconnections,\n\t\telements,\n\t};\n}\n","<script setup lang=\"ts\">\nimport Canvas from '@/components/canvas/Canvas.vue';\nimport { toRef, useCssModule } from 'vue';\nimport type { Workflow } from 'n8n-workflow';\nimport type { IWorkflowDb } from '@/Interface';\nimport { useCanvasMapping } from '@/composables/useCanvasMapping';\n\ndefineOptions({\n\tinheritAttrs: false,\n});\n\nconst props = defineProps<{\n\tid?: string;\n\tworkflow: IWorkflowDb;\n\tworkflowObject: Workflow;\n}>();\n\nconst $style = useCssModule();\n\nconst workflow = toRef(props, 'workflow');\nconst workflowObject = toRef(props, 'workflowObject');\n\nconst { elements, connections } = useCanvasMapping({ workflow, workflowObject });\n</script>\n\n<template>\n\t<div :class=\"$style.wrapper\">\n\t\t<div :class=\"$style.canvas\">\n\t\t\t<Canvas v-if=\"workflow\" :elements=\"elements\" :connections=\"connections\" v-bind=\"$attrs\" />\n\t\t</div>\n\t\t<slot />\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.wrapper {\n\tdisplay: block;\n\tposition: relative;\n\twidth: 100%;\n\theight: 100%;\n\toverflow: hidden;\n}\n\n.canvas {\n\twidth: 100%;\n\theight: 100%;\n\tposition: relative;\n\tdisplay: block;\n}\n\n.executionButtons {\n\tposition: absolute;\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tbottom: var(--spacing-l);\n\twidth: auto;\n\n\t@media (max-width: $breakpoint-2xs) {\n\t\tbottom: 150px;\n\t}\n\n\tbutton {\n\t\tdisplay: flex;\n\t\tjustify-content: center;\n\t\talign-items: center;\n\t\tmargin-left: 0.625rem;\n\n\t\t&:first-child {\n\t\t\tmargin: 0;\n\t\t}\n\t}\n}\n</style>\n","<script setup lang=\"ts\">\nimport KeyboardShortcutTooltip from '@/components/KeyboardShortcutTooltip.vue';\nimport { computed } from 'vue';\nimport { useI18n } from '@/composables/useI18n';\nimport { useUIStore } from '@/stores/ui.store';\n\ndefineEmits(['click']);\n\nconst uiStore = useUIStore();\nconst locale = useI18n();\n\nconst workflowRunning = computed(() => uiStore.isActionActive('workflowRunning'));\n\nconst runButtonText = computed(() => {\n\tif (!workflowRunning.value) {\n\t\treturn locale.baseText('nodeView.runButtonText.executeWorkflow');\n\t}\n\n\treturn locale.baseText('nodeView.runButtonText.executingWorkflow');\n});\n</script>\n\n<template>\n\t<KeyboardShortcutTooltip :label=\"runButtonText\" :shortcut=\"{ metaKey: true, keys: ['↵'] }\">\n\t\t<N8nButton\n\t\t\t:loading=\"workflowRunning\"\n\t\t\t:label=\"runButtonText\"\n\t\t\tsize=\"large\"\n\t\t\ticon=\"flask\"\n\t\t\ttype=\"primary\"\n\t\t\tdata-test-id=\"execute-workflow-button\"\n\t\t\t@click.stop=\"$emit('click', $event)\"\n\t\t/>\n\t</KeyboardShortcutTooltip>\n</template>\n","import type { CanvasElement } from '@/types';\nimport type {\n\tAddedNodesAndConnections,\n\tINodeUi,\n\tINodeUpdatePropertiesInformation,\n\tXYPosition,\n} from '@/Interface';\nimport { QUICKSTART_NOTE_NAME, STICKY_NODE_TYPE } from '@/constants';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useHistoryStore } from '@/stores/history.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport {\n\tMoveNodeCommand,\n\tRemoveConnectionCommand,\n\tRemoveNodeCommand,\n\tRenameNodeCommand,\n} from '@/models/history';\nimport type { Connection } from '@vue-flow/core';\nimport {\n\tgetUniqueNodeName,\n\tmapCanvasConnectionToLegacyConnection,\n\tparseCanvasConnectionHandleString,\n} from '@/utils/canvasUtilsV2';\nimport type {\n\tConnectionTypes,\n\tIConnection,\n\tINodeInputConfiguration,\n\tINodeOutputConfiguration,\n\tINodeTypeDescription,\n\tINodeTypeNameVersion,\n\tITelemetryTrackProperties,\n} from 'n8n-workflow';\nimport { NodeConnectionType, NodeHelpers } from 'n8n-workflow';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useI18n } from '@/composables/useI18n';\nimport { useToast } from '@/composables/useToast';\nimport * as NodeViewUtils from '@/utils/nodeViewUtils';\nimport { v4 as uuid } from 'uuid';\nimport { useSegment } from '@/stores/segment.store';\nimport type { Ref } from 'vue';\nimport { computed } from 'vue';\nimport { useCredentialsStore } from '@/stores/credentials.store';\nimport { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';\nimport type { useRouter } from 'vue-router';\nimport { useCanvasStore } from '@/stores/canvas.store';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\n\ntype AddNodeData = {\n\tname?: string;\n\ttype: string;\n\tposition?: XYPosition;\n};\n\ntype AddNodeOptions = {\n\tdragAndDrop?: boolean;\n\topenNDV?: boolean;\n\ttrackHistory?: boolean;\n\tisAutoAdd?: boolean;\n};\n\nexport function useCanvasOperations({\n\trouter,\n\tlastClickPosition,\n}: {\n\trouter: ReturnType<typeof useRouter>;\n\tlastClickPosition: Ref<XYPosition>;\n}) {\n\tconst workflowsStore = useWorkflowsStore();\n\tconst credentialsStore = useCredentialsStore();\n\tconst historyStore = useHistoryStore();\n\tconst uiStore = useUIStore();\n\tconst ndvStore = useNDVStore();\n\tconst nodeTypesStore = useNodeTypesStore();\n\tconst canvasStore = useCanvasStore();\n\n\tconst i18n = useI18n();\n\tconst toast = useToast();\n\tconst workflowHelpers = useWorkflowHelpers({ router });\n\tconst nodeHelpers = useNodeHelpers();\n\tconst telemetry = useTelemetry();\n\tconst externalHooks = useExternalHooks();\n\n\tconst editableWorkflow = computed(() => workflowsStore.workflow);\n\tconst editableWorkflowObject = computed(() => workflowsStore.getCurrentWorkflow());\n\n\tconst triggerNodes = computed<INodeUi[]>(() => {\n\t\treturn workflowsStore.workflowTriggerNodes;\n\t});\n\n\t/**\n\t * Node operations\n\t */\n\n\tfunction updateNodePosition(\n\t\tid: string,\n\t\tposition: CanvasElement['position'],\n\t\t{ trackHistory = false, trackBulk = true } = {},\n\t) {\n\t\tconst node = workflowsStore.getNodeById(id);\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (trackHistory && trackBulk) {\n\t\t\thistoryStore.startRecordingUndo();\n\t\t}\n\n\t\tconst oldPosition: XYPosition = [...node.position];\n\t\tconst newPosition: XYPosition = [position.x, position.y];\n\n\t\tworkflowsStore.setNodePositionById(id, newPosition);\n\n\t\tif (trackHistory) {\n\t\t\thistoryStore.pushCommandToUndo(new MoveNodeCommand(node.name, oldPosition, newPosition));\n\n\t\t\tif (trackBulk) {\n\t\t\t\thistoryStore.stopRecordingUndo();\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function renameNode(currentName: string, newName: string, { trackHistory = false } = {}) {\n\t\tif (currentName === newName) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (trackHistory) {\n\t\t\thistoryStore.startRecordingUndo();\n\t\t}\n\n\t\tnewName = getUniqueNodeName(newName, workflowsStore.canvasNames);\n\n\t\t// Rename the node and update the connections\n\t\tconst workflow = workflowsStore.getCurrentWorkflow(true);\n\t\tworkflow.renameNode(currentName, newName);\n\n\t\tif (trackHistory) {\n\t\t\thistoryStore.pushCommandToUndo(new RenameNodeCommand(currentName, newName));\n\t\t}\n\n\t\t// Update also last selected node and execution data\n\t\tworkflowsStore.renameNodeSelectedAndExecution({ old: currentName, new: newName });\n\n\t\tworkflowsStore.setNodes(Object.values(workflow.nodes));\n\t\tworkflowsStore.setConnections(workflow.connectionsBySourceNode);\n\n\t\tconst isRenamingActiveNode = ndvStore.activeNodeName === currentName;\n\t\tif (isRenamingActiveNode) {\n\t\t\tndvStore.activeNodeName = newName;\n\t\t}\n\n\t\tif (trackHistory) {\n\t\t\thistoryStore.stopRecordingUndo();\n\t\t}\n\t}\n\n\tasync function revertRenameNode(currentName: string, previousName: string) {\n\t\tawait renameNode(currentName, previousName);\n\t}\n\n\tfunction deleteNode(id: string, { trackHistory = false, trackBulk = true } = {}) {\n\t\tconst node = workflowsStore.getNodeById(id);\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (trackHistory && trackBulk) {\n\t\t\thistoryStore.startRecordingUndo();\n\t\t}\n\n\t\tworkflowsStore.removeNodeById(id);\n\t\tworkflowsStore.removeNodeConnectionsById(id);\n\t\tworkflowsStore.removeNodeExecutionDataById(id);\n\n\t\tif (trackHistory) {\n\t\t\thistoryStore.pushCommandToUndo(new RemoveNodeCommand(node));\n\n\t\t\tif (trackBulk) {\n\t\t\t\thistoryStore.stopRecordingUndo();\n\t\t\t}\n\t\t}\n\n\t\ttrackDeleteNode(id);\n\t}\n\n\tfunction revertDeleteNode(node: INodeUi) {\n\t\tworkflowsStore.addNode(node);\n\t}\n\n\tfunction trackDeleteNode(id: string) {\n\t\tconst node = workflowsStore.getNodeById(id);\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (node.type === STICKY_NODE_TYPE) {\n\t\t\ttelemetry.track('User deleted workflow note', {\n\t\t\t\tworkflow_id: workflowsStore.workflowId,\n\t\t\t\tis_welcome_note: node.name === QUICKSTART_NOTE_NAME,\n\t\t\t});\n\t\t} else {\n\t\t\tvoid externalHooks.run('node.deleteNode', { node });\n\t\t\ttelemetry.track('User deleted node', {\n\t\t\t\tnode_type: node.type,\n\t\t\t\tworkflow_id: workflowsStore.workflowId,\n\t\t\t});\n\t\t}\n\t}\n\n\tfunction setNodeActive(id: string) {\n\t\tconst node = workflowsStore.getNodeById(id);\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\n\t\tndvStore.activeNodeName = node.name;\n\t}\n\n\tfunction setNodeActiveByName(name: string) {\n\t\tndvStore.activeNodeName = name;\n\t}\n\n\tfunction setNodeSelected(id?: string) {\n\t\tif (!id) {\n\t\t\tuiStore.lastSelectedNode = '';\n\t\t\treturn;\n\t\t}\n\n\t\tconst node = workflowsStore.getNodeById(id);\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\n\t\tuiStore.lastSelectedNode = node.name;\n\t}\n\n\tfunction toggleNodeDisabled(\n\t\tid: string,\n\t\t{ trackHistory = true }: { trackHistory?: boolean } = {},\n\t) {\n\t\tconst node = workflowsStore.getNodeById(id);\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\n\t\tnodeHelpers.disableNodes([node], trackHistory);\n\t}\n\n\tasync function addNodes(\n\t\tnodes: AddedNodesAndConnections['nodes'],\n\t\t{\n\t\t\tdragAndDrop,\n\t\t\tposition,\n\t\t}: {\n\t\t\tdragAndDrop?: boolean;\n\t\t\tposition?: XYPosition;\n\t\t} = {},\n\t) {\n\t\tlet currentPosition = position;\n\t\tlet lastAddedNode: INodeUi | undefined;\n\t\tfor (const { type, name, position: nodePosition, isAutoAdd, openDetail } of nodes) {\n\t\t\ttry {\n\t\t\t\tawait createNode(\n\t\t\t\t\t{\n\t\t\t\t\t\tname,\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\tposition: nodePosition ?? currentPosition,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdragAndDrop,\n\t\t\t\t\t\topenNDV: openDetail ?? false,\n\t\t\t\t\t\ttrackHistory: true,\n\t\t\t\t\t\tisAutoAdd,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\ttoast.showError(error, i18n.baseText('error'));\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlastAddedNode = editableWorkflow.value.nodes[editableWorkflow.value.nodes.length - 1];\n\t\t\tcurrentPosition = [\n\t\t\t\tlastAddedNode.position[0] + NodeViewUtils.NODE_SIZE * 2 + NodeViewUtils.GRID_SIZE,\n\t\t\t\tlastAddedNode.position[1],\n\t\t\t];\n\t\t}\n\n\t\t// If the last added node has multiple inputs, move them down\n\t\tif (!lastAddedNode) {\n\t\t\treturn;\n\t\t}\n\t\tconst lastNodeInputs = editableWorkflowObject.value.getParentNodesByDepth(\n\t\t\tlastAddedNode.name,\n\t\t\t1,\n\t\t);\n\t\tif (lastNodeInputs.length > 1) {\n\t\t\tlastNodeInputs.slice(1).forEach((node, index) => {\n\t\t\t\tconst nodeUi = workflowsStore.getNodeByName(node.name);\n\t\t\t\tif (!nodeUi) return;\n\n\t\t\t\tupdateNodePosition(nodeUi.id, {\n\t\t\t\t\tx: nodeUi.position[0],\n\t\t\t\t\ty: nodeUi.position[1] + 100 * (index + 1),\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n\n\tasync function createNode(node: AddNodeData, options: AddNodeOptions = {}): Promise<INodeUi> {\n\t\tconst newNodeData = await resolveNodeData(node, options);\n\t\tif (!newNodeData) {\n\t\t\tthrow new Error(i18n.baseText('nodeViewV2.showError.failedToCreateNode'));\n\t\t}\n\n\t\t/**\n\t\t * @TODO Check if maximum node type limit reached\n\t\t */\n\n\t\tnewNodeData.name = getUniqueNodeName(newNodeData.name, workflowsStore.canvasNames);\n\n\t\tworkflowsStore.addNode(newNodeData);\n\n\t\t// @TODO Figure out why this is needed and if we can do better...\n\t\t// this.matchCredentials(node);\n\n\t\tconst lastSelectedNode = uiStore.getLastSelectedNode;\n\t\tconst lastSelectedNodeOutputIndex = uiStore.lastSelectedNodeOutputIndex;\n\t\tconst lastSelectedNodeEndpointUuid = uiStore.lastSelectedNodeEndpointUuid;\n\n\t\thistoryStore.startRecordingUndo();\n\n\t\tconst outputIndex = lastSelectedNodeOutputIndex ?? 0;\n\t\tconst targetEndpoint = lastSelectedNodeEndpointUuid ?? '';\n\n\t\t// Handle connection of scoped_endpoint types\n\t\tif (lastSelectedNode && !options.isAutoAdd) {\n\t\t\tif (lastSelectedNodeEndpointUuid) {\n\t\t\t\tconst { type: connectionType } = parseCanvasConnectionHandleString(\n\t\t\t\t\tlastSelectedNodeEndpointUuid,\n\t\t\t\t);\n\t\t\t\tif (isConnectionAllowed(lastSelectedNode, newNodeData, connectionType)) {\n\t\t\t\t\tcreateConnection({\n\t\t\t\t\t\tsource: lastSelectedNode.id,\n\t\t\t\t\t\tsourceHandle: targetEndpoint,\n\t\t\t\t\t\ttarget: newNodeData.id,\n\t\t\t\t\t\ttargetHandle: `inputs/${connectionType}/0`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If a node is last selected then connect between the active and its child ones\n\t\t\t\t// Connect active node to the newly created one\n\t\t\t\tcreateConnection({\n\t\t\t\t\tsource: lastSelectedNode.id,\n\t\t\t\t\tsourceHandle: `outputs/${NodeConnectionType.Main}/${outputIndex}`,\n\t\t\t\t\ttarget: newNodeData.id,\n\t\t\t\t\ttargetHandle: `inputs/${NodeConnectionType.Main}/0`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\thistoryStore.stopRecordingUndo();\n\n\t\treturn newNodeData;\n\t}\n\n\tasync function initializeNodeDataWithDefaultCredentials(node: AddNodeData) {\n\t\tconst nodeTypeDescription = nodeTypesStore.getNodeType(node.type);\n\t\tif (!nodeTypeDescription) {\n\t\t\tthrow new Error(i18n.baseText('nodeViewV2.showError.failedToCreateNode'));\n\t\t}\n\n\t\tlet nodeVersion = nodeTypeDescription.defaultVersion;\n\t\tif (typeof nodeVersion === 'undefined') {\n\t\t\tnodeVersion = Array.isArray(nodeTypeDescription.version)\n\t\t\t\t? nodeTypeDescription.version.slice(-1)[0]\n\t\t\t\t: nodeTypeDescription.version;\n\t\t}\n\n\t\tconst newNodeData: INodeUi = {\n\t\t\tid: uuid(),\n\t\t\tname: node.name ?? (nodeTypeDescription.defaults.name as string),\n\t\t\ttype: nodeTypeDescription.name,\n\t\t\ttypeVersion: nodeVersion,\n\t\t\tposition: node.position ?? [0, 0],\n\t\t\tparameters: {},\n\t\t};\n\n\t\tawait loadNodeTypesProperties([{ name: newNodeData.type, version: newNodeData.typeVersion }]);\n\n\t\tconst nodeType = nodeTypesStore.getNodeType(newNodeData.type, newNodeData.typeVersion);\n\t\tconst nodeParameters = NodeHelpers.getNodeParameters(\n\t\t\tnodeType?.properties ?? [],\n\t\t\t{},\n\t\t\ttrue,\n\t\t\tfalse,\n\t\t\tnewNodeData,\n\t\t);\n\n\t\tnewNodeData.parameters = nodeParameters ?? {};\n\n\t\tconst credentialPerType = nodeTypeDescription.credentials\n\t\t\t?.map((type) => credentialsStore.getUsableCredentialByType(type.name))\n\t\t\t.flat();\n\n\t\tif (credentialPerType?.length === 1) {\n\t\t\tconst defaultCredential = credentialPerType[0];\n\n\t\t\tconst selectedCredentials = credentialsStore.getCredentialById(defaultCredential.id);\n\t\t\tconst selected = { id: selectedCredentials.id, name: selectedCredentials.name };\n\t\t\tconst credentials = {\n\t\t\t\t[defaultCredential.type]: selected,\n\t\t\t};\n\n\t\t\tif (nodeTypeDescription.credentials) {\n\t\t\t\tconst authentication = nodeTypeDescription.credentials.find(\n\t\t\t\t\t(type) => type.name === defaultCredential.type,\n\t\t\t\t);\n\t\t\t\tif (authentication?.displayOptions?.hide) {\n\t\t\t\t\treturn newNodeData;\n\t\t\t\t}\n\n\t\t\t\tconst authDisplayOptions = authentication?.displayOptions?.show;\n\t\t\t\tif (!authDisplayOptions) {\n\t\t\t\t\tnewNodeData.credentials = credentials;\n\t\t\t\t\treturn newNodeData;\n\t\t\t\t}\n\n\t\t\t\tif (Object.keys(authDisplayOptions).length === 1 && authDisplayOptions.authentication) {\n\t\t\t\t\t// ignore complex case when there's multiple dependencies\n\t\t\t\t\tnewNodeData.credentials = credentials;\n\n\t\t\t\t\tlet parameters: { [key: string]: string } = {};\n\t\t\t\t\tfor (const displayOption of Object.keys(authDisplayOptions)) {\n\t\t\t\t\t\tif (nodeParameters && !nodeParameters[displayOption]) {\n\t\t\t\t\t\t\tparameters = {};\n\t\t\t\t\t\t\tnewNodeData.credentials = undefined;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst optionValue = authDisplayOptions[displayOption]?.[0];\n\t\t\t\t\t\tif (optionValue && typeof optionValue === 'string') {\n\t\t\t\t\t\t\tparameters[displayOption] = optionValue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnewNodeData.parameters = {\n\t\t\t\t\t\t\t...newNodeData.parameters,\n\t\t\t\t\t\t\t...parameters,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn newNodeData;\n\t}\n\n\t/**\n\t * Resolves the data for a new node\n\t */\n\tasync function resolveNodeData(node: AddNodeData, options: AddNodeOptions = {}) {\n\t\tconst nodeTypeDescription: INodeTypeDescription | null = nodeTypesStore.getNodeType(node.type);\n\t\tif (nodeTypeDescription === null) {\n\t\t\ttoast.showMessage({\n\t\t\t\ttitle: i18n.baseText('nodeView.showMessage.addNodeButton.title'),\n\t\t\t\tmessage: i18n.baseText('nodeView.showMessage.addNodeButton.message', {\n\t\t\t\t\tinterpolate: { nodeTypeName: node.type },\n\t\t\t\t}),\n\t\t\t\ttype: 'error',\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\tnodeTypeDescription.maxNodes !== undefined &&\n\t\t\tworkflowHelpers.getNodeTypeCount(node.type) >= nodeTypeDescription.maxNodes\n\t\t) {\n\t\t\tshowMaxNodeTypeError(nodeTypeDescription);\n\t\t\treturn;\n\t\t}\n\n\t\tconst newNodeData = await initializeNodeDataWithDefaultCredentials(node);\n\n\t\t// When pulling new connection from node or injecting into a connection\n\t\tconst lastSelectedNode = uiStore.getLastSelectedNode;\n\n\t\tif (node.position) {\n\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(\n\t\t\t\tcanvasStore.getNodesWithPlaceholderNode(),\n\t\t\t\tnode.position,\n\t\t\t);\n\t\t} else if (lastSelectedNode) {\n\t\t\t// @TODO Implement settings lastSelectedConnection for new canvas\n\t\t\tconst lastSelectedConnection = canvasStore.lastSelectedConnection;\n\t\t\tif (lastSelectedConnection) {\n\t\t\t\t// set when injecting into a connection\n\t\t\t\tconst [diffX] = NodeViewUtils.getConnectorLengths(lastSelectedConnection);\n\t\t\t\tif (diffX <= NodeViewUtils.MAX_X_TO_PUSH_DOWNSTREAM_NODES) {\n\t\t\t\t\tpushDownstreamNodes(lastSelectedNode.name, NodeViewUtils.PUSH_NODES_OFFSET, {\n\t\t\t\t\t\ttrackHistory: options.trackHistory,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// This position is set in `onMouseUp` when pulling connections\n\t\t\tif (canvasStore.newNodeInsertPosition) {\n\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(workflowsStore.allNodes, [\n\t\t\t\t\tcanvasStore.newNodeInsertPosition[0] + NodeViewUtils.GRID_SIZE,\n\t\t\t\t\tcanvasStore.newNodeInsertPosition[1] - NodeViewUtils.NODE_SIZE / 2,\n\t\t\t\t]);\n\t\t\t\tcanvasStore.newNodeInsertPosition = null;\n\t\t\t} else {\n\t\t\t\tlet yOffset = 0;\n\t\t\t\tconst workflow = workflowsStore.getCurrentWorkflow();\n\n\t\t\t\tif (lastSelectedConnection) {\n\t\t\t\t\tconst sourceNodeType = nodeTypesStore.getNodeType(\n\t\t\t\t\t\tlastSelectedNode.type,\n\t\t\t\t\t\tlastSelectedNode.typeVersion,\n\t\t\t\t\t);\n\n\t\t\t\t\tif (sourceNodeType) {\n\t\t\t\t\t\tconst offsets = [\n\t\t\t\t\t\t\t[-100, 100],\n\t\t\t\t\t\t\t[-140, 0, 140],\n\t\t\t\t\t\t\t[-240, -100, 100, 240],\n\t\t\t\t\t\t];\n\n\t\t\t\t\t\tconst sourceNodeOutputs = NodeHelpers.getNodeOutputs(\n\t\t\t\t\t\t\tworkflow,\n\t\t\t\t\t\t\tlastSelectedNode,\n\t\t\t\t\t\t\tsourceNodeType,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst sourceNodeOutputTypes = NodeHelpers.getConnectionTypes(sourceNodeOutputs);\n\n\t\t\t\t\t\tconst sourceNodeOutputMainOutputs = sourceNodeOutputTypes.filter(\n\t\t\t\t\t\t\t(output) => output === NodeConnectionType.Main,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (sourceNodeOutputMainOutputs.length > 1) {\n\t\t\t\t\t\t\tconst offset = offsets[sourceNodeOutputMainOutputs.length - 2];\n\t\t\t\t\t\t\tconst sourceOutputIndex = lastSelectedConnection.__meta\n\t\t\t\t\t\t\t\t? lastSelectedConnection.__meta.sourceOutputIndex\n\t\t\t\t\t\t\t\t: 0;\n\t\t\t\t\t\t\tyOffset = offset[sourceOutputIndex];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet outputs: Array<ConnectionTypes | INodeOutputConfiguration> = [];\n\t\t\t\ttry {\n\t\t\t\t\t// It fails when the outputs are an expression. As those nodes have\n\t\t\t\t\t// normally no outputs by default and the only reason we need the\n\t\t\t\t\t// outputs here is to calculate the position, it is fine to assume\n\t\t\t\t\t// that they have no outputs and are so treated as a regular node\n\t\t\t\t\t// with only \"main\" outputs.\n\t\t\t\t\toutputs = NodeHelpers.getNodeOutputs(workflow, newNodeData, nodeTypeDescription);\n\t\t\t\t} catch (e) {}\n\t\t\t\tconst outputTypes = NodeHelpers.getConnectionTypes(outputs);\n\t\t\t\tconst lastSelectedNodeType = nodeTypesStore.getNodeType(\n\t\t\t\t\tlastSelectedNode.type,\n\t\t\t\t\tlastSelectedNode.typeVersion,\n\t\t\t\t);\n\n\t\t\t\t// If node has only scoped outputs, position it below the last selected node\n\t\t\t\tif (\n\t\t\t\t\toutputTypes.length > 0 &&\n\t\t\t\t\toutputTypes.every((outputName) => outputName !== NodeConnectionType.Main)\n\t\t\t\t) {\n\t\t\t\t\tconst lastSelectedNodeWorkflow = workflow.getNode(lastSelectedNode.name);\n\t\t\t\t\tif (!lastSelectedNodeWorkflow || !lastSelectedNodeType) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst lastSelectedInputs = NodeHelpers.getNodeInputs(\n\t\t\t\t\t\tworkflow,\n\t\t\t\t\t\tlastSelectedNodeWorkflow,\n\t\t\t\t\t\tlastSelectedNodeType,\n\t\t\t\t\t);\n\t\t\t\t\tconst lastSelectedInputTypes = NodeHelpers.getConnectionTypes(lastSelectedInputs);\n\n\t\t\t\t\tconst scopedConnectionIndex = (lastSelectedInputTypes || [])\n\t\t\t\t\t\t.filter((input) => input !== NodeConnectionType.Main)\n\t\t\t\t\t\t.findIndex((inputType) => outputs[0] === inputType);\n\n\t\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(\n\t\t\t\t\t\tworkflowsStore.allNodes,\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tlastSelectedNode.position[0] +\n\t\t\t\t\t\t\t\t(NodeViewUtils.NODE_SIZE /\n\t\t\t\t\t\t\t\t\t(Math.max(lastSelectedNodeType?.inputs?.length ?? 1), 1)) *\n\t\t\t\t\t\t\t\t\tscopedConnectionIndex,\n\t\t\t\t\t\t\tlastSelectedNode.position[1] + NodeViewUtils.PUSH_NODES_OFFSET,\n\t\t\t\t\t\t],\n\t\t\t\t\t\t[100, 0],\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tif (!lastSelectedNodeType) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Has only main outputs or no outputs at all\n\t\t\t\t\tconst inputs = NodeHelpers.getNodeInputs(\n\t\t\t\t\t\tworkflow,\n\t\t\t\t\t\tlastSelectedNode,\n\t\t\t\t\t\tlastSelectedNodeType,\n\t\t\t\t\t);\n\t\t\t\t\tconst inputsTypes = NodeHelpers.getConnectionTypes(inputs);\n\n\t\t\t\t\tlet pushOffset = NodeViewUtils.PUSH_NODES_OFFSET;\n\t\t\t\t\tif (!!inputsTypes.find((input) => input !== NodeConnectionType.Main)) {\n\t\t\t\t\t\t// If the node has scoped inputs, push it down a bit more\n\t\t\t\t\t\tpushOffset += 150;\n\t\t\t\t\t}\n\n\t\t\t\t\t// If a node is active then add the new node directly after the current one\n\t\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(\n\t\t\t\t\t\tworkflowsStore.allNodes,\n\t\t\t\t\t\t[lastSelectedNode.position[0] + pushOffset, lastSelectedNode.position[1] + yOffset],\n\t\t\t\t\t\t[100, 0],\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// If added node is a trigger and it's the first one added to the canvas\n\t\t\t// we place it at canvasAddButtonPosition to replace the canvas add button\n\t\t\tconst position =\n\t\t\t\tnodeTypesStore.isTriggerNode(node.type) && triggerNodes.value.length === 0\n\t\t\t\t\t? canvasStore.canvasAddButtonPosition\n\t\t\t\t\t: // If no node is active find a free spot\n\t\t\t\t\t\t(lastClickPosition.value as XYPosition);\n\n\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(workflowsStore.allNodes, position);\n\t\t}\n\n\t\tconst localizedName = i18n.localizeNodeName(newNodeData.name, newNodeData.type);\n\n\t\tnewNodeData.name = getUniqueNodeName(localizedName, workflowsStore.canvasNames);\n\n\t\tif (nodeTypeDescription.webhooks?.length) {\n\t\t\tnewNodeData.webhookId = uuid();\n\t\t}\n\n\t\tworkflowsStore.setNodePristine(newNodeData.name, true);\n\t\tuiStore.stateIsDirty = true;\n\n\t\tif (node.type === STICKY_NODE_TYPE) {\n\t\t\ttelemetry.trackNodesPanel('nodeView.addSticky', {\n\t\t\t\tworkflow_id: workflowsStore.workflowId,\n\t\t\t});\n\t\t} else {\n\t\t\tvoid externalHooks.run('nodeView.addNodeButton', { nodeTypeName: node.type });\n\t\t\tuseSegment().trackAddedTrigger(node.type);\n\t\t\tconst trackProperties: ITelemetryTrackProperties = {\n\t\t\t\tnode_type: node.type,\n\t\t\t\tnode_version: newNodeData.typeVersion,\n\t\t\t\tis_auto_add: options.isAutoAdd,\n\t\t\t\tworkflow_id: workflowsStore.workflowId,\n\t\t\t\tdrag_and_drop: options.dragAndDrop,\n\t\t\t};\n\n\t\t\tif (lastSelectedNode) {\n\t\t\t\ttrackProperties.input_node_type = lastSelectedNode.type;\n\t\t\t}\n\n\t\t\ttelemetry.trackNodesPanel('nodeView.addNodeButton', trackProperties);\n\t\t}\n\n\t\t// Automatically deselect all nodes and select the current one and also active\n\t\t// current node. But only if it's added manually by the user (not by undo/redo mechanism)\n\t\t// @TODO\n\t\t// if (trackHistory) {\n\t\t// \tthis.deselectAllNodes();\n\t\t// \tsetTimeout(() => {\n\t\t// \t\tthis.nodeSelectedByName(newNodeData.name, showDetail && nodeTypeName !== STICKY_NODE_TYPE);\n\t\t// \t});\n\t\t// }\n\n\t\treturn newNodeData;\n\t}\n\n\tfunction pushDownstreamNodes(\n\t\tsourceNodeName: string,\n\t\tmargin: number,\n\t\t{ trackHistory = false }: { trackHistory?: boolean },\n\t) {\n\t\tconst sourceNode = workflowsStore.nodesByName[sourceNodeName];\n\n\t\tconst workflow = workflowHelpers.getCurrentWorkflow();\n\n\t\tconst checkNodes = workflowHelpers.getConnectedNodes('downstream', workflow, sourceNodeName);\n\t\tfor (const nodeName of checkNodes) {\n\t\t\tconst node = workflowsStore.nodesByName[nodeName];\n\t\t\tconst oldPosition = node.position;\n\n\t\t\tif (node.position[0] < sourceNode.position[0]) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst updateInformation: INodeUpdatePropertiesInformation = {\n\t\t\t\tname: nodeName,\n\t\t\t\tproperties: {\n\t\t\t\t\tposition: [node.position[0] + margin, node.position[1]],\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tworkflowsStore.updateNodeProperties(updateInformation);\n\t\t\tupdateNodePosition(node.id, { x: node.position[0], y: node.position[1] });\n\n\t\t\tif (\n\t\t\t\t(trackHistory && oldPosition[0] !== updateInformation.properties.position[0]) ||\n\t\t\t\toldPosition[1] !== updateInformation.properties.position[1]\n\t\t\t) {\n\t\t\t\thistoryStore.pushCommandToUndo(\n\t\t\t\t\tnew MoveNodeCommand(nodeName, oldPosition, updateInformation.properties.position),\n\t\t\t\t\ttrackHistory,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function loadNodeTypesProperties(nodeInfos: INodeTypeNameVersion[]): Promise<void> {\n\t\tconst allNodeTypeDescriptions: INodeTypeDescription[] = nodeTypesStore.allNodeTypes;\n\n\t\tconst nodesToBeFetched: INodeTypeNameVersion[] = [];\n\t\tallNodeTypeDescriptions.forEach((nodeTypeDescription) => {\n\t\t\tconst nodeVersions = Array.isArray(nodeTypeDescription.version)\n\t\t\t\t? nodeTypeDescription.version\n\t\t\t\t: [nodeTypeDescription.version];\n\t\t\tif (\n\t\t\t\t!!nodeInfos.find(\n\t\t\t\t\t(n) => n.name === nodeTypeDescription.name && nodeVersions.includes(n.version),\n\t\t\t\t) &&\n\t\t\t\t!nodeTypeDescription.hasOwnProperty('properties')\n\t\t\t) {\n\t\t\t\tnodesToBeFetched.push({\n\t\t\t\t\tname: nodeTypeDescription.name,\n\t\t\t\t\tversion: Array.isArray(nodeTypeDescription.version)\n\t\t\t\t\t\t? nodeTypeDescription.version.slice(-1)[0]\n\t\t\t\t\t\t: nodeTypeDescription.version,\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tif (nodesToBeFetched.length > 0) {\n\t\t\t// Only call API if node information is actually missing\n\t\t\tawait nodeTypesStore.getNodesInformation(nodesToBeFetched);\n\t\t}\n\t}\n\n\tfunction showMaxNodeTypeError(nodeTypeDescription: INodeTypeDescription) {\n\t\tconst maxNodes = nodeTypeDescription.maxNodes;\n\t\ttoast.showMessage({\n\t\t\ttitle: i18n.baseText('nodeView.showMessage.showMaxNodeTypeError.title'),\n\t\t\tmessage: i18n.baseText('nodeView.showMessage.showMaxNodeTypeError.message', {\n\t\t\t\tadjustToNumber: maxNodes,\n\t\t\t\tinterpolate: { nodeTypeDataDisplayName: nodeTypeDescription.displayName },\n\t\t\t}),\n\t\t\ttype: 'error',\n\t\t\tduration: 0,\n\t\t});\n\t}\n\n\t/**\n\t * Connection operations\n\t */\n\n\tfunction createConnection(connection: Connection) {\n\t\tconst sourceNode = workflowsStore.getNodeById(connection.source);\n\t\tconst targetNode = workflowsStore.getNodeById(connection.target);\n\t\tif (!sourceNode || !targetNode) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst mappedConnection = mapCanvasConnectionToLegacyConnection(\n\t\t\tsourceNode,\n\t\t\ttargetNode,\n\t\t\tconnection,\n\t\t);\n\n\t\tif (!isConnectionAllowed(sourceNode, targetNode, mappedConnection[1].type)) {\n\t\t\treturn;\n\t\t}\n\n\t\tworkflowsStore.addConnection({\n\t\t\tconnection: mappedConnection,\n\t\t});\n\n\t\tuiStore.stateIsDirty = true;\n\t}\n\n\tfunction deleteConnection(\n\t\tconnection: Connection,\n\t\t{ trackHistory = false, trackBulk = true } = {},\n\t) {\n\t\tconst sourceNode = workflowsStore.getNodeById(connection.source);\n\t\tconst targetNode = workflowsStore.getNodeById(connection.target);\n\t\tif (!sourceNode || !targetNode) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst mappedConnection = mapCanvasConnectionToLegacyConnection(\n\t\t\tsourceNode,\n\t\t\ttargetNode,\n\t\t\tconnection,\n\t\t);\n\n\t\tif (trackHistory && trackBulk) {\n\t\t\thistoryStore.startRecordingUndo();\n\t\t}\n\n\t\tworkflowsStore.removeConnection({\n\t\t\tconnection: mappedConnection,\n\t\t});\n\n\t\tif (trackHistory) {\n\t\t\thistoryStore.pushCommandToUndo(new RemoveConnectionCommand(mappedConnection));\n\n\t\t\tif (trackBulk) {\n\t\t\t\thistoryStore.stopRecordingUndo();\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction revertDeleteConnection(connection: [IConnection, IConnection]) {\n\t\tworkflowsStore.addConnection({\n\t\t\tconnection,\n\t\t});\n\t}\n\n\tfunction isConnectionAllowed(\n\t\tsourceNode: INodeUi,\n\t\ttargetNode: INodeUi,\n\t\ttargetNodeConnectionType: NodeConnectionType,\n\t): boolean {\n\t\tconst targetNodeType = nodeTypesStore.getNodeType(targetNode.type, targetNode.typeVersion);\n\n\t\tif (targetNodeType?.inputs?.length) {\n\t\t\tconst workflow = workflowsStore.getCurrentWorkflow();\n\t\t\tconst workflowNode = workflow.getNode(targetNode.name);\n\t\t\tif (!workflowNode) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tlet inputs: Array<ConnectionTypes | INodeInputConfiguration> = [];\n\t\t\tif (targetNodeType) {\n\t\t\t\tinputs = NodeHelpers.getNodeInputs(workflow, workflowNode, targetNodeType) || [];\n\t\t\t}\n\n\t\t\tfor (const input of inputs) {\n\t\t\t\tif (typeof input === 'string' || input.type !== targetNodeConnectionType || !input.filter) {\n\t\t\t\t\t// No filters defined or wrong connection type\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (input.filter.nodes.length) {\n\t\t\t\t\tif (!input.filter.nodes.includes(sourceNode.type)) {\n\t\t\t\t\t\t// this.dropPrevented = true;\n\t\t\t\t\t\ttoast.showToast({\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeView.showError.nodeNodeCompatible.title'),\n\t\t\t\t\t\t\tmessage: i18n.baseText('nodeView.showError.nodeNodeCompatible.message', {\n\t\t\t\t\t\t\t\tinterpolate: { sourceNodeName: sourceNode.name, targetNodeName: targetNode.name },\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\t\tduration: 5000,\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn sourceNode.id !== targetNode.id;\n\t}\n\n\tasync function addConnections(\n\t\tconnections: AddedNodesAndConnections['connections'],\n\t\t{ offsetIndex }: { offsetIndex: number },\n\t) {\n\t\tfor (const { from, to } of connections) {\n\t\t\tconst fromNode = editableWorkflow.value.nodes[offsetIndex + from.nodeIndex];\n\t\t\tconst toNode = editableWorkflow.value.nodes[offsetIndex + to.nodeIndex];\n\n\t\t\tcreateConnection({\n\t\t\t\tsource: fromNode.id,\n\t\t\t\tsourceHandle: `outputs/${NodeConnectionType.Main}/${from.outputIndex ?? 0}`,\n\t\t\t\ttarget: toNode.id,\n\t\t\t\ttargetHandle: `inputs/${NodeConnectionType.Main}/${to.inputIndex ?? 0}`,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn {\n\t\teditableWorkflow,\n\t\teditableWorkflowObject,\n\t\ttriggerNodes,\n\t\tinitializeNodeDataWithDefaultCredentials,\n\t\taddNodes,\n\t\tupdateNodePosition,\n\t\tsetNodeActive,\n\t\tsetNodeActiveByName,\n\t\tsetNodeSelected,\n\t\ttoggleNodeDisabled,\n\t\trenameNode,\n\t\trevertRenameNode,\n\t\tdeleteNode,\n\t\trevertDeleteNode,\n\t\taddConnections,\n\t\tcreateConnection,\n\t\tdeleteConnection,\n\t\trevertDeleteConnection,\n\t};\n}\n","<script setup lang=\"ts\">\nimport { computed, defineAsyncComponent, onBeforeUnmount, onMounted, ref, useCssModule } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport WorkflowCanvas from '@/components/canvas/WorkflowCanvas.vue';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport CanvasExecuteWorkflowButton from '@/components/canvas/elements/buttons/CanvasExecuteWorkflowButton.vue';\nimport { useI18n } from '@/composables/useI18n';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useRunWorkflow } from '@/composables/useRunWorkflow';\nimport type {\n\tAddedNodesAndConnections,\n\tINodeUi,\n\tIUpdateInformation,\n\tIWorkflowDataUpdate,\n\tToggleNodeCreatorOptions,\n\tXYPosition,\n} from '@/Interface';\nimport type { Connection } from '@vue-flow/core';\nimport type { CanvasElement } from '@/types';\nimport {\n\tCANVAS_AUTO_ADD_MANUAL_TRIGGER_EXPERIMENT,\n\tEnterpriseEditionFeature,\n\tMODAL_CANCEL,\n\tMODAL_CONFIRM,\n\tNEW_WORKFLOW_ID,\n\tVIEWS,\n} from '@/constants';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useNodeCreatorStore } from '@/stores/nodeCreator.store';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport type { NodeConnectionType, ExecutionSummary, IConnection } from 'n8n-workflow';\nimport { useToast } from '@/composables/useToast';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useCredentialsStore } from '@/stores/credentials.store';\nimport useEnvironmentsStore from '@/stores/environments.ee.store';\nimport { useExternalSecretsStore } from '@/stores/externalSecrets.ee.store';\nimport { useRootStore } from '@/stores/root.store';\nimport { useCollaborationStore } from '@/stores/collaboration.store';\nimport { historyBus } from '@/models/history';\nimport { useCanvasOperations } from '@/composables/useCanvasOperations';\nimport { useExecutionsStore } from '@/stores/executions.store';\nimport { useCanvasStore } from '@/stores/canvas.store';\nimport { useMessage } from '@/composables/useMessage';\nimport { useTitleChange } from '@/composables/useTitleChange';\nimport { useNpsSurveyStore } from '@/stores/npsSurvey.store';\nimport { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport { useHistoryStore } from '@/stores/history.store';\nimport { useProjectsStore } from '@/stores/projects.store';\nimport { usePostHog } from '@/stores/posthog.store';\n\nconst NodeCreation = defineAsyncComponent(\n\tasync () => await import('@/components/Node/NodeCreation.vue'),\n);\n\nconst NodeDetailsView = defineAsyncComponent(\n\tasync () => await import('@/components/NodeDetailsView.vue'),\n);\n\nconst $style = useCssModule();\nconst router = useRouter();\nconst route = useRoute();\nconst i18n = useI18n();\nconst telemetry = useTelemetry();\nconst externalHooks = useExternalHooks();\nconst toast = useToast();\nconst message = useMessage();\nconst titleChange = useTitleChange();\nconst workflowHelpers = useWorkflowHelpers({ router });\n\nconst nodeTypesStore = useNodeTypesStore();\nconst uiStore = useUIStore();\nconst workflowsStore = useWorkflowsStore();\nconst sourceControlStore = useSourceControlStore();\nconst nodeCreatorStore = useNodeCreatorStore();\nconst settingsStore = useSettingsStore();\nconst credentialsStore = useCredentialsStore();\nconst environmentsStore = useEnvironmentsStore();\nconst externalSecretsStore = useExternalSecretsStore();\nconst rootStore = useRootStore();\nconst collaborationStore = useCollaborationStore();\nconst executionsStore = useExecutionsStore();\nconst canvasStore = useCanvasStore();\nconst npsSurveyStore = useNpsSurveyStore();\nconst historyStore = useHistoryStore();\nconst projectsStore = useProjectsStore();\n\nconst lastClickPosition = ref<XYPosition>([450, 450]);\n\nconst { runWorkflow } = useRunWorkflow({ router });\nconst {\n\tupdateNodePosition,\n\trenameNode,\n\trevertRenameNode,\n\tsetNodeActive,\n\tsetNodeSelected,\n\ttoggleNodeDisabled,\n\tdeleteNode,\n\trevertDeleteNode,\n\taddNodes,\n\tcreateConnection,\n\tdeleteConnection,\n\trevertDeleteConnection,\n\tsetNodeActiveByName,\n\taddConnections,\n\teditableWorkflow,\n\teditableWorkflowObject,\n} = useCanvasOperations({ router, lastClickPosition });\n\nconst isLoading = ref(true);\nconst isBlankRedirect = ref(false);\nconst readOnlyNotification = ref<null | { visible: boolean }>(null);\n\nconst isProductionExecutionPreview = ref(false);\nconst isExecutionPreview = ref(false);\nconst isExecutionWaitingForWebhook = ref(false);\n\nconst canOpenNDV = ref(true);\nconst hideNodeIssues = ref(false);\n\nconst workflowId = computed<string>(() => route.params.workflowId as string);\nconst workflow = computed(() => workflowsStore.workflowsById[workflowId.value]);\n\nconst isDemoRoute = computed(() => route.name === VIEWS.DEMO);\nconst isReadOnlyRoute = computed(() => route?.meta?.readOnlyCanvas === true);\nconst isReadOnlyEnvironment = computed(() => {\n\treturn sourceControlStore.preferences.branchReadOnly;\n});\n\n/**\n * Initialization\n */\n\nasync function initializeData() {\n\tisLoading.value = true;\n\n\tresetWorkspace();\n\ttitleChange.titleReset();\n\n\tconst loadPromises: Array<Promise<unknown>> = [\n\t\tnodeTypesStore.getNodeTypes(),\n\t\tworkflowsStore.fetchWorkflow(workflowId.value),\n\t];\n\n\tif (!settingsStore.isPreviewMode && !isDemoRoute.value) {\n\t\tloadPromises.push(\n\t\t\tworkflowsStore.fetchActiveWorkflows(),\n\t\t\tcredentialsStore.fetchAllCredentials(),\n\t\t\tcredentialsStore.fetchCredentialTypes(true),\n\t\t);\n\n\t\tif (settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Variables)) {\n\t\t\tloadPromises.push(environmentsStore.fetchAllVariables());\n\t\t}\n\n\t\tif (settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.ExternalSecrets)) {\n\t\t\tloadPromises.push(externalSecretsStore.fetchAllSecrets());\n\t\t}\n\t}\n\n\ttry {\n\t\tawait Promise.all(loadPromises);\n\t} catch (error) {\n\t\treturn toast.showError(\n\t\t\terror,\n\t\t\ti18n.baseText('nodeView.showError.mounted1.title'),\n\t\t\ti18n.baseText('nodeView.showError.mounted1.message') + ':',\n\t\t);\n\t}\n\n\tvoid externalHooks.run('workflow.open', {\n\t\tworkflowId: workflowsStore.workflow.id,\n\t\tworkflowName: workflowsStore.workflow.name,\n\t});\n\tcollaborationStore.notifyWorkflowOpened(workflowsStore.workflow.id);\n\n\tconst selectedExecution = executionsStore.activeExecution;\n\tif (selectedExecution?.workflowId !== workflowsStore.workflow.id) {\n\t\texecutionsStore.activeExecution = null;\n\t\tworkflowsStore.currentWorkflowExecutions = [];\n\t} else {\n\t\texecutionsStore.activeExecution = selectedExecution;\n\t}\n\n\t// @TODO Implement this\n\t// this.clipboard.onPaste.value = this.onClipboardPasteEvent;\n\n\tisLoading.value = false;\n}\n\nasync function initializeView() {\n\t// In case the workflow got saved we do not have to run init\n\t// as only the route changed but all the needed data is already loaded\n\tif (route.params.action === 'workflowSave') {\n\t\tuiStore.stateIsDirty = false;\n\t\treturn;\n\t}\n\n\t// This function is called on route change as well, so we need to do the following:\n\t// - if the redirect is blank, then do nothing\n\t// - if the route is the template import view, then open the template\n\t// - if the user is leaving the current view without saving the changes, then show a confirmation modal\n\tif (isBlankRedirect.value) {\n\t\tisBlankRedirect.value = false;\n\t} else if (route.name === VIEWS.TEMPLATE_IMPORT) {\n\t\t// @TODO Implement template import\n\t\t// const templateId = route.params.id;\n\t\t// await openWorkflowTemplate(templateId.toString());\n\t} else {\n\t\tif (uiStore.stateIsDirty && !isReadOnlyEnvironment.value) {\n\t\t\tconst confirmModal = await message.confirm(\n\t\t\t\ti18n.baseText('generic.unsavedWork.confirmMessage.message'),\n\t\t\t\t{\n\t\t\t\t\ttitle: i18n.baseText('generic.unsavedWork.confirmMessage.headline'),\n\t\t\t\t\ttype: 'warning',\n\t\t\t\t\tconfirmButtonText: i18n.baseText('generic.unsavedWork.confirmMessage.confirmButtonText'),\n\t\t\t\t\tcancelButtonText: i18n.baseText('generic.unsavedWork.confirmMessage.cancelButtonText'),\n\t\t\t\t\tshowClose: true,\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tif (confirmModal === MODAL_CONFIRM) {\n\t\t\t\tconst saved = await workflowHelpers.saveCurrentWorkflow();\n\t\t\t\tif (saved) {\n\t\t\t\t\tawait npsSurveyStore.fetchPromptsData();\n\t\t\t\t}\n\t\t\t} else if (confirmModal === MODAL_CANCEL) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Get workflow id\n\t\tlet workflowIdParam: string | null = null;\n\t\tif (route.params.workflowId) {\n\t\t\tworkflowIdParam = route.params.workflowId.toString();\n\t\t}\n\n\t\thistoryStore.reset();\n\n\t\t// If there is no workflow id, treat it as a new workflow\n\t\tif (!workflowIdParam || workflowIdParam === NEW_WORKFLOW_ID) {\n\t\t\tif (route.meta?.nodeView === true) {\n\t\t\t\tawait initializeViewForNewWorkflow();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Load workflow data\n\t\ttry {\n\t\t\tawait workflowsStore.fetchWorkflow(workflowIdParam);\n\n\t\t\ttitleChange.titleSet(workflow.value.name, 'IDLE');\n\t\t\t// @TODO Implement this\n\t\t\t// await openWorkflow(workflow);\n\t\t\t// await checkAndInitDebugMode();\n\n\t\t\tworkflowsStore.initializeEditableWorkflow(workflowIdParam);\n\t\t\tawait projectsStore.setProjectNavActiveIdByWorkflowHomeProject(workflow.value.homeProject);\n\n\t\t\ttrackOpenWorkflowFromOnboardingTemplate();\n\t\t} catch (error) {\n\t\t\ttoast.showError(error, i18n.baseText('openWorkflow.workflowNotFoundError'));\n\n\t\t\tvoid router.push({\n\t\t\t\tname: VIEWS.NEW_WORKFLOW,\n\t\t\t});\n\t\t}\n\t}\n\n\tawait loadCredentials();\n\tuiStore.nodeViewInitialized = true;\n\n\t// Once view is initialized, pick up all toast notifications\n\t// waiting in the store and display them\n\ttoast.showNotificationForViews([VIEWS.WORKFLOW, VIEWS.NEW_WORKFLOW]);\n}\n\nasync function initializeViewForNewWorkflow() {\n\tresetWorkspace();\n\n\tawait workflowsStore.getNewWorkflowData(undefined, projectsStore.currentProjectId);\n\n\tworkflowsStore.currentWorkflowExecutions = [];\n\texecutionsStore.activeExecution = null;\n\tuiStore.stateIsDirty = false;\n\tuiStore.nodeViewInitialized = true;\n\texecutionsStore.activeExecution = null;\n\n\t// @TODO Implement this\n\t// canvasStore.setZoomLevel(1, [0, 0]);\n\t// canvasStore.zoomToFit();\n\n\t// @TODO Implement this\n\t// this.makeNewWorkflowShareable();\n\n\t// Pre-populate the canvas with the manual trigger node if the experiment is enabled and the user is in the variant group\n\tconst { getVariant } = usePostHog();\n\tif (\n\t\tgetVariant(CANVAS_AUTO_ADD_MANUAL_TRIGGER_EXPERIMENT.name) ===\n\t\tCANVAS_AUTO_ADD_MANUAL_TRIGGER_EXPERIMENT.variant\n\t) {\n\t\tconst manualTriggerNode = canvasStore.getAutoAddManualTriggerNode();\n\t\tif (manualTriggerNode) {\n\t\t\tawait addNodes([manualTriggerNode]);\n\t\t\tuiStore.lastSelectedNode = manualTriggerNode.name;\n\t\t}\n\t}\n}\n\nfunction resetWorkspace() {\n\tworkflowsStore.resetWorkflow();\n\n\tonToggleNodeCreator({ createNodeActive: false });\n\tnodeCreatorStore.setShowScrim(false);\n\n\t// @TODO Implement this\n\t// Reset nodes\n\t// this.unbindEndpointEventListeners();\n\t// this.deleteEveryEndpoint();\n\n\t// Make sure that if there is a waiting test-webhook that it gets removed\n\tif (isExecutionWaitingForWebhook.value) {\n\t\ttry {\n\t\t\tvoid workflowsStore.removeTestWebhook(workflowsStore.workflowId);\n\t\t} catch (error) {}\n\t}\n\tworkflowsStore.resetState();\n\tuiStore.removeActiveAction('workflowRunning');\n\n\tuiStore.resetSelectedNodes();\n\tuiStore.nodeViewOffsetPosition = [0, 0]; // @TODO Not sure if needed\n\n\t// this.credentialsUpdated = false;\n}\n\nfunction trackOpenWorkflowFromOnboardingTemplate() {\n\tif (workflow.value.meta?.onboardingId) {\n\t\ttelemetry.track(\n\t\t\t`User opened workflow from onboarding template with ID ${workflow.value.meta.onboardingId}`,\n\t\t\t{\n\t\t\t\tworkflow_id: workflowId.value,\n\t\t\t},\n\t\t\t{\n\t\t\t\twithPostHog: true,\n\t\t\t},\n\t\t);\n\t}\n}\n\n/**\n * Nodes\n */\n\nfunction onUpdateNodePosition(id: string, position: CanvasElement['position']) {\n\tupdateNodePosition(id, position, { trackHistory: true });\n}\n\nfunction onDeleteNode(id: string) {\n\tdeleteNode(id, { trackHistory: true });\n}\n\nfunction onRevertDeleteNode({ node }: { node: INodeUi }) {\n\trevertDeleteNode(node);\n}\n\nfunction onToggleNodeDisabled(id: string) {\n\tif (!checkIfEditingIsAllowed()) {\n\t\treturn;\n\t}\n\n\ttoggleNodeDisabled(id);\n}\n\nfunction onSetNodeActive(id: string) {\n\tsetNodeActive(id);\n}\n\nfunction onSetNodeSelected(id?: string) {\n\tsetNodeSelected(id);\n}\n\nfunction onRenameNode(parameterData: IUpdateInformation) {\n\t// The name changed. Do not forget to change the connections as well\n\tif (parameterData.name === 'name' && parameterData.oldValue) {\n\t\tvoid renameNode(parameterData.oldValue as string, parameterData.value as string);\n\t}\n}\n\nasync function onRevertRenameNode({\n\tcurrentName,\n\tnewName,\n}: {\n\tcurrentName: string;\n\tnewName: string;\n}) {\n\tawait revertRenameNode(currentName, newName);\n}\n\n/**\n * Credentials\n */\n\nasync function loadCredentials() {\n\tlet options: { workflowId: string } | { projectId: string };\n\n\tif (workflow.value) {\n\t\toptions = { workflowId: workflow.value.id };\n\t} else {\n\t\tconst queryParam =\n\t\t\ttypeof route.query?.projectId === 'string' ? route.query?.projectId : undefined;\n\t\tconst projectId = queryParam ?? projectsStore.personalProject?.id;\n\t\tif (projectId === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t'Could not find projectId in the query nor could I find the personal project in the project store',\n\t\t\t);\n\t\t}\n\n\t\toptions = { projectId };\n\t}\n\n\tawait credentialsStore.fetchAllCredentialsForWorkflow(options);\n}\n\n/**\n * Connections\n */\n\nfunction onCreateConnection(connection: Connection) {\n\tcreateConnection(connection);\n}\n\nfunction onDeleteConnection(connection: Connection) {\n\tdeleteConnection(connection, { trackHistory: true });\n}\n\nfunction onRevertDeleteConnection({ connection }: { connection: [IConnection, IConnection] }) {\n\trevertDeleteConnection(connection);\n}\n\n/**\n * Import / Export\n */\n\nasync function importWorkflowExact(_workflow: IWorkflowDataUpdate) {\n\t// @TODO\n}\n\n/**\n * Node creator\n */\n\nasync function onAddNodesAndConnections(\n\t{ nodes, connections }: AddedNodesAndConnections,\n\tdragAndDrop = false,\n\tposition?: XYPosition,\n) {\n\tif (!checkIfEditingIsAllowed()) {\n\t\treturn;\n\t}\n\n\tawait addNodes(nodes, { dragAndDrop, position });\n\tawait addConnections(connections, {\n\t\toffsetIndex: editableWorkflow.value.nodes.length - nodes.length,\n\t});\n}\n\nasync function onSwitchActiveNode(nodeName: string) {\n\tsetNodeActiveByName(nodeName);\n}\n\nasync function onOpenConnectionNodeCreator(node: string, connectionType: NodeConnectionType) {\n\tnodeCreatorStore.openSelectiveNodeCreator({ node, connectionType });\n}\n\nfunction onToggleNodeCreator(options: ToggleNodeCreatorOptions) {\n\tnodeCreatorStore.openNodeCreator(options);\n}\n\n/**\n * Executions\n */\n\nasync function onRunWorkflow() {\n\tawait runWorkflow({});\n}\n\nasync function openExecution(_executionId: string) {\n\t// @TODO\n}\n\n/**\n * Unload\n */\n\nfunction addUnloadEventBindings() {\n\t// window.addEventListener('beforeunload', this.onBeforeUnload);\n\t// window.addEventListener('unload', this.onUnload);\n}\n\nfunction removeUnloadEventBindings() {\n\t// window.removeEventListener('beforeunload', this.onBeforeUnload);\n\t// window.removeEventListener('unload', this.onUnload);\n}\n\n/**\n * Keboard\n */\n\nfunction addKeyboardEventBindings() {\n\t// document.addEventListener('keydown', this.keyDown);\n\t// document.addEventListener('keyup', this.keyUp);\n}\n\nfunction removeKeyboardEventBindings() {\n\t// document.removeEventListener('keydown', this.keyDown);\n\t// document.removeEventListener('keyup', this.keyUp);\n}\n\n/**\n * History events\n */\n\nfunction addUndoRedoEventBindings() {\n\t// historyBus.on('nodeMove', onMoveNode);\n\t// historyBus.on('revertAddNode', onRevertAddNode);\n\thistoryBus.on('revertRemoveNode', onRevertDeleteNode);\n\t// historyBus.on('revertAddConnection', onRevertAddConnection);\n\thistoryBus.on('revertRemoveConnection', onRevertDeleteConnection);\n\thistoryBus.on('revertRenameNode', onRevertRenameNode);\n\t// historyBus.on('enableNodeToggle', onRevertEnableToggle);\n}\n\nfunction removeUndoRedoEventBindings() {\n\t// historyBus.off('nodeMove', onMoveNode);\n\t// historyBus.off('revertAddNode', onRevertAddNode);\n\thistoryBus.off('revertRemoveNode', onRevertDeleteNode);\n\t// historyBus.off('revertAddConnection', onRevertAddConnection);\n\thistoryBus.off('revertRemoveConnection', onRevertDeleteConnection);\n\thistoryBus.off('revertRenameNode', onRevertRenameNode);\n\t// historyBus.off('enableNodeToggle', onRevertEnableToggle);\n}\n\n/**\n * Post message events\n */\n\nfunction addPostMessageEventBindings() {\n\twindow.addEventListener('message', onPostMessageReceived);\n\n\tif (window.parent) {\n\t\twindow.parent.postMessage(\n\t\t\tJSON.stringify({ command: 'n8nReady', version: rootStore.versionCli }),\n\t\t\t'*',\n\t\t);\n\t}\n}\n\nfunction removePostMessageEventBindings() {\n\twindow.removeEventListener('message', onPostMessageReceived);\n}\n\nasync function onPostMessageReceived(message: MessageEvent) {\n\tif (!message || typeof message.data !== 'string' || !message.data?.includes?.('\"command\"')) {\n\t\treturn;\n\t}\n\ttry {\n\t\tconst json = JSON.parse(message.data);\n\t\tif (json && json.command === 'openWorkflow') {\n\t\t\ttry {\n\t\t\t\tawait importWorkflowExact(json.data);\n\t\t\t\tcanOpenNDV.value = json.canOpenNDV ?? true;\n\t\t\t\thideNodeIssues.value = json.hideNodeIssues ?? false;\n\t\t\t\tisExecutionPreview.value = false;\n\t\t\t} catch (e) {\n\t\t\t\tif (window.top) {\n\t\t\t\t\twindow.top.postMessage(\n\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\tcommand: 'error',\n\t\t\t\t\t\t\tmessage: i18n.baseText('openWorkflow.workflowImportError'),\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t'*',\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\ttoast.showError(e, i18n.baseText('openWorkflow.workflowImportError'));\n\t\t\t}\n\t\t} else if (json && json.command === 'openExecution') {\n\t\t\ttry {\n\t\t\t\t// If this NodeView is used in preview mode (in iframe) it will not have access to the main app store\n\t\t\t\t// so everything it needs has to be sent using post messages and passed down to child components\n\t\t\t\tisProductionExecutionPreview.value = json.executionMode !== 'manual';\n\n\t\t\t\tawait openExecution(json.executionId);\n\t\t\t\tcanOpenNDV.value = json.canOpenNDV ?? true;\n\t\t\t\thideNodeIssues.value = json.hideNodeIssues ?? false;\n\t\t\t\tisExecutionPreview.value = true;\n\t\t\t} catch (e) {\n\t\t\t\tif (window.top) {\n\t\t\t\t\twindow.top.postMessage(\n\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\tcommand: 'error',\n\t\t\t\t\t\t\tmessage: i18n.baseText('nodeView.showError.openExecution.title'),\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t'*',\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\ttoast.showMessage({\n\t\t\t\t\ttitle: i18n.baseText('nodeView.showError.openExecution.title'),\n\t\t\t\t\tmessage: (e as Error).message,\n\t\t\t\t\ttype: 'error',\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (json?.command === 'setActiveExecution') {\n\t\t\texecutionsStore.activeExecution = (await executionsStore.fetchExecution(\n\t\t\t\tjson.executionId,\n\t\t\t)) as ExecutionSummary;\n\t\t}\n\t} catch (e) {}\n}\n\n/**\n * Permission checks\n */\n\nfunction checkIfEditingIsAllowed(): boolean {\n\tif (readOnlyNotification.value?.visible) {\n\t\treturn false;\n\t}\n\n\tif (isReadOnlyRoute.value || isReadOnlyEnvironment.value) {\n\t\tconst messageContext = isReadOnlyRoute.value ? 'executions' : 'workflows';\n\t\treadOnlyNotification.value = toast.showMessage({\n\t\t\ttitle: i18n.baseText(\n\t\t\t\tisReadOnlyEnvironment.value\n\t\t\t\t\t? `readOnlyEnv.showMessage.${messageContext}.title`\n\t\t\t\t\t: 'readOnly.showMessage.executions.title',\n\t\t\t),\n\t\t\tmessage: i18n.baseText(\n\t\t\t\tisReadOnlyEnvironment.value\n\t\t\t\t\t? `readOnlyEnv.showMessage.${messageContext}.message`\n\t\t\t\t\t: 'readOnly.showMessage.executions.message',\n\t\t\t),\n\t\t\ttype: 'info',\n\t\t\tdangerouslyUseHTMLString: true,\n\t\t}) as unknown as { visible: boolean };\n\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n/**\n * Mouse events\n */\n\nfunction onClickPane(position: CanvasElement['position']) {\n\tlastClickPosition.value = [position.x, position.y];\n\tcanvasStore.newNodeInsertPosition = [position.x, position.y];\n}\n\n/**\n * Lifecycle\n */\n\nonMounted(async () => {\n\tawait initializeData();\n\tawait initializeView();\n\n\taddUndoRedoEventBindings();\n\taddPostMessageEventBindings();\n\taddKeyboardEventBindings();\n\taddUnloadEventBindings();\n});\n\nonBeforeUnmount(() => {\n\tremoveUnloadEventBindings();\n\tremoveKeyboardEventBindings();\n\tremovePostMessageEventBindings();\n\tremoveUndoRedoEventBindings();\n});\n</script>\n\n<template>\n\t<WorkflowCanvas\n\t\tv-if=\"editableWorkflow && editableWorkflowObject\"\n\t\t:workflow=\"editableWorkflow\"\n\t\t:workflow-object=\"editableWorkflowObject\"\n\t\t@update:node:position=\"onUpdateNodePosition\"\n\t\t@update:node:active=\"onSetNodeActive\"\n\t\t@update:node:selected=\"onSetNodeSelected\"\n\t\t@update:node:enabled=\"onToggleNodeDisabled\"\n\t\t@delete:node=\"onDeleteNode\"\n\t\t@create:connection=\"onCreateConnection\"\n\t\t@delete:connection=\"onDeleteConnection\"\n\t\t@click:pane=\"onClickPane\"\n\t>\n\t\t<div :class=\"$style.executionButtons\">\n\t\t\t<CanvasExecuteWorkflowButton @click=\"onRunWorkflow\" />\n\t\t</div>\n\t\t<Suspense>\n\t\t\t<NodeCreation\n\t\t\t\tv-if=\"!isReadOnlyRoute && !isReadOnlyEnvironment\"\n\t\t\t\t:create-node-active=\"uiStore.isCreateNodeActive\"\n\t\t\t\t:node-view-scale=\"1\"\n\t\t\t\t@toggle-node-creator=\"onToggleNodeCreator\"\n\t\t\t\t@add-nodes=\"onAddNodesAndConnections\"\n\t\t\t/>\n\t\t</Suspense>\n\t\t<Suspense>\n\t\t\t<NodeDetailsView\n\t\t\t\t:workflow-object=\"editableWorkflowObject\"\n\t\t\t\t:read-only=\"isReadOnlyRoute || isReadOnlyEnvironment\"\n\t\t\t\t:is-production-execution-preview=\"isProductionExecutionPreview\"\n\t\t\t\t:renaming=\"false\"\n\t\t\t\t@value-changed=\"onRenameNode\"\n\t\t\t\t@switch-selected-node=\"onSwitchActiveNode\"\n\t\t\t\t@open-connection-node-creator=\"onOpenConnectionNodeCreator\"\n\t\t\t/>\n\t\t\t<!--\n\t\t\t\t:renaming=\"renamingActive\"\n\t\t\t\t@stop-execution=\"stopExecution\"\n\t\t\t\t@save-keyboard-shortcut=\"onSaveKeyboardShortcut\"\n\t\t\t-->\n\t\t</Suspense>\n\t</WorkflowCanvas>\n</template>\n\n<style lang=\"scss\" module>\n.executionButtons {\n\tposition: absolute;\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tbottom: var(--spacing-l);\n\twidth: auto;\n\n\t@media (max-width: $breakpoint-2xs) {\n\t\tbottom: 150px;\n\t}\n\n\tbutton {\n\t\tdisplay: flex;\n\t\tjustify-content: center;\n\t\talign-items: center;\n\t\tmargin-left: 0.625rem;\n\n\t\t&:first-child {\n\t\t\tmargin: 0;\n\t\t}\n\t}\n}\n</style>\n"],"file":"assets/NodeView.v2-BTnhsVQt.js"}
|