n8n-editor-ui 1.43.0 → 1.43.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.
Files changed (147) hide show
  1. package/.turbo/turbo-build.log +72 -72
  2. package/dist/assets/{AuthView-wAV15F8m.js → AuthView-k9-4l8d2.js} +2 -2
  3. package/dist/assets/{AuthView-wAV15F8m.js.map → AuthView-k9-4l8d2.js.map} +1 -1
  4. package/dist/assets/{CanvasControls-gKuuF9YF.js → CanvasControls-4_78UsoA.js} +2 -2
  5. package/dist/assets/{CanvasControls-gKuuF9YF.js.map → CanvasControls-4_78UsoA.js.map} +1 -1
  6. package/dist/assets/{ChangePasswordView-lW3AftTZ.js → ChangePasswordView-WZx2sxAq.js} +2 -2
  7. package/dist/assets/{ChangePasswordView-lW3AftTZ.js.map → ChangePasswordView-WZx2sxAq.js.map} +1 -1
  8. package/dist/assets/{CollectionParameter-DTYD_Lcf.js → CollectionParameter-DDWzNH-Y.js} +2 -2
  9. package/dist/assets/CollectionParameter-DDWzNH-Y.js.map +1 -0
  10. package/dist/assets/{CredentialsView-R7OKepMF.js → CredentialsView-pP5cOmCw.js} +2 -2
  11. package/dist/assets/{CredentialsView-R7OKepMF.js.map → CredentialsView-pP5cOmCw.js.map} +1 -1
  12. package/dist/assets/{ExecutionsFilter-NfToJM9y.js → ExecutionsFilter-Zq0mjSZf.js} +2 -2
  13. package/dist/assets/{ExecutionsFilter-NfToJM9y.js.map → ExecutionsFilter-Zq0mjSZf.js.map} +1 -1
  14. package/dist/assets/{ExecutionsView-i3z4OWwK.js → ExecutionsView-2RUbEKrf.js} +2 -2
  15. package/dist/assets/{ExecutionsView-i3z4OWwK.js.map → ExecutionsView-2RUbEKrf.js.map} +1 -1
  16. package/dist/assets/{ForgotMyPasswordView-OicEjBTM.js → ForgotMyPasswordView-ZBwhNj_M.js} +2 -2
  17. package/dist/assets/{ForgotMyPasswordView-OicEjBTM.js.map → ForgotMyPasswordView-ZBwhNj_M.js.map} +1 -1
  18. package/dist/assets/{MainHeader-VEoGw9mF.js → MainHeader-__zJO-m7.js} +2 -2
  19. package/dist/assets/{MainHeader-VEoGw9mF.js.map → MainHeader-__zJO-m7.js.map} +1 -1
  20. package/dist/assets/{MainSidebar-9VtAlHw5.js → MainSidebar-7XGRE24x.js} +2 -2
  21. package/dist/assets/{MainSidebar-9VtAlHw5.js.map → MainSidebar-7XGRE24x.js.map} +1 -1
  22. package/dist/assets/{NodeCreation-yGH6whwu.js → NodeCreation-BmkaaGqL.js} +3 -3
  23. package/dist/assets/{NodeCreation-yGH6whwu.js.map → NodeCreation-BmkaaGqL.js.map} +1 -1
  24. package/dist/assets/{NodeCreator-uo45xC8F.js → NodeCreator-iBjoivu6.js} +2 -2
  25. package/dist/assets/{NodeCreator-uo45xC8F.js.map → NodeCreator-iBjoivu6.js.map} +1 -1
  26. package/dist/assets/{NodeList-mBvddp-7.js → NodeList-qt_5gC5-.js} +2 -2
  27. package/dist/assets/{NodeList-mBvddp-7.js.map → NodeList-qt_5gC5-.js.map} +1 -1
  28. package/dist/assets/NodeView-qN4Zuw87.js +9 -0
  29. package/dist/assets/NodeView-qN4Zuw87.js.map +1 -0
  30. package/dist/assets/{NodeView-XB-d5jgs.css → NodeView-sEzPscdT.css} +1 -1
  31. package/dist/assets/{ProjectCardBadge.vue_vue_type_script_setup_true_lang-YOVpN0pD.js → ProjectCardBadge.vue_vue_type_script_setup_true_lang-tfIcNjaC.js} +2 -2
  32. package/dist/assets/{ProjectCardBadge.vue_vue_type_script_setup_true_lang-YOVpN0pD.js.map → ProjectCardBadge.vue_vue_type_script_setup_true_lang-tfIcNjaC.js.map} +1 -1
  33. package/dist/assets/{ProjectSettings-ZDAhIwhQ.js → ProjectSettings-B-H5G2EN.js} +2 -2
  34. package/dist/assets/{ProjectSettings-ZDAhIwhQ.js.map → ProjectSettings-B-H5G2EN.js.map} +1 -1
  35. package/dist/assets/{ProjectTabs-L2yrOMy6.js → ProjectTabs-A5hdgqW2.js} +2 -2
  36. package/dist/assets/{ProjectTabs-L2yrOMy6.js.map → ProjectTabs-A5hdgqW2.js.map} +1 -1
  37. package/dist/assets/{PushConnectionTracker-GgAPUiGC.js → PushConnectionTracker-1875-61J.js} +2 -2
  38. package/dist/assets/{PushConnectionTracker-GgAPUiGC.js.map → PushConnectionTracker-1875-61J.js.map} +1 -1
  39. package/dist/assets/{ResourcesListLayout-S53Q3neu.js → ResourcesListLayout-zQLxB7dP.js} +2 -2
  40. package/dist/assets/{ResourcesListLayout-S53Q3neu.js.map → ResourcesListLayout-zQLxB7dP.js.map} +1 -1
  41. package/dist/assets/{RunDataAi-jJ9KfOCF.js → RunDataAi-sZalPI5G.js} +2 -2
  42. package/dist/assets/{RunDataAi-jJ9KfOCF.js.map → RunDataAi-sZalPI5G.js.map} +1 -1
  43. package/dist/assets/{RunDataJson-52-sD-ud.js → RunDataJson-Wjq8QCxZ.js} +3 -3
  44. package/dist/assets/{RunDataJson-52-sD-ud.js.map → RunDataJson-Wjq8QCxZ.js.map} +1 -1
  45. package/dist/assets/{RunDataJsonActions-Zjaa2Qdn.js → RunDataJsonActions-s5miC4iz.js} +2 -2
  46. package/dist/assets/{RunDataJsonActions-Zjaa2Qdn.js.map → RunDataJsonActions-s5miC4iz.js.map} +1 -1
  47. package/dist/assets/{RunDataSchema-iNj_tX9n.js → RunDataSchema-s4wg-kE7.js} +2 -2
  48. package/dist/assets/{RunDataSchema-iNj_tX9n.js.map → RunDataSchema-s4wg-kE7.js.map} +1 -1
  49. package/dist/assets/{RunDataSearch-6GGyQrwT.js → RunDataSearch-jtcvkqv3.js} +2 -2
  50. package/dist/assets/{RunDataSearch-6GGyQrwT.js.map → RunDataSearch-jtcvkqv3.js.map} +1 -1
  51. package/dist/assets/{RunDataTable-f5gLoK65.js → RunDataTable-ViMJNYSP.js} +2 -2
  52. package/dist/assets/{RunDataTable-f5gLoK65.js.map → RunDataTable-ViMJNYSP.js.map} +1 -1
  53. package/dist/assets/{SamlOnboarding--QQ0CjBZ.js → SamlOnboarding-ImP6fnp5.js} +2 -2
  54. package/dist/assets/{SamlOnboarding--QQ0CjBZ.js.map → SamlOnboarding-ImP6fnp5.js.map} +1 -1
  55. package/dist/assets/{SettingsApiView-XqezQtu_.js → SettingsApiView-mtjfmBn2.js} +2 -2
  56. package/dist/assets/{SettingsApiView-XqezQtu_.js.map → SettingsApiView-mtjfmBn2.js.map} +1 -1
  57. package/dist/assets/{SettingsCommunityNodesView-qmLS2FT2.js → SettingsCommunityNodesView-3ZbERy3i.js} +2 -2
  58. package/dist/assets/{SettingsCommunityNodesView-qmLS2FT2.js.map → SettingsCommunityNodesView-3ZbERy3i.js.map} +1 -1
  59. package/dist/assets/{SettingsExternalSecrets--1U82XVJ.js → SettingsExternalSecrets-RZSTXpBn.js} +2 -2
  60. package/dist/assets/{SettingsExternalSecrets--1U82XVJ.js.map → SettingsExternalSecrets-RZSTXpBn.js.map} +1 -1
  61. package/dist/assets/{SettingsFakeDoorView-7i_qMtlE.js → SettingsFakeDoorView-woDCBRrk.js} +2 -2
  62. package/dist/assets/{SettingsFakeDoorView-7i_qMtlE.js.map → SettingsFakeDoorView-woDCBRrk.js.map} +1 -1
  63. package/dist/assets/{SettingsLdapView-uwXk-BOB.js → SettingsLdapView-VGtviAVN.js} +2 -2
  64. package/dist/assets/{SettingsLdapView-uwXk-BOB.js.map → SettingsLdapView-VGtviAVN.js.map} +1 -1
  65. package/dist/assets/{SettingsLogStreamingView-9iFeBG5H.js → SettingsLogStreamingView--Mm-atCG.js} +2 -2
  66. package/dist/assets/{SettingsLogStreamingView-9iFeBG5H.js.map → SettingsLogStreamingView--Mm-atCG.js.map} +1 -1
  67. package/dist/assets/{SettingsPersonalView-wv1eEj4o.js → SettingsPersonalView-5sWpXI6Q.js} +2 -2
  68. package/dist/assets/{SettingsPersonalView-wv1eEj4o.js.map → SettingsPersonalView-5sWpXI6Q.js.map} +1 -1
  69. package/dist/assets/{SettingsSourceControl-Q_7vZyBx.js → SettingsSourceControl-XlFUiK_r.js} +2 -2
  70. package/dist/assets/{SettingsSourceControl-Q_7vZyBx.js.map → SettingsSourceControl-XlFUiK_r.js.map} +1 -1
  71. package/dist/assets/{SettingsSso-9-1iByXJ.js → SettingsSso-RaxUMYEI.js} +2 -2
  72. package/dist/assets/{SettingsSso-9-1iByXJ.js.map → SettingsSso-RaxUMYEI.js.map} +1 -1
  73. package/dist/assets/{SettingsUsageAndPlan-Es866y16.js → SettingsUsageAndPlan-hZIuBr2_.js} +2 -2
  74. package/dist/assets/{SettingsUsageAndPlan-Es866y16.js.map → SettingsUsageAndPlan-hZIuBr2_.js.map} +1 -1
  75. package/dist/assets/{SettingsUsersView-wmmQr7i0.js → SettingsUsersView-Y7yTA_F4.js} +2 -2
  76. package/dist/assets/{SettingsUsersView-wmmQr7i0.js.map → SettingsUsersView-Y7yTA_F4.js.map} +1 -1
  77. package/dist/assets/{SettingsView-oYe3uTRj.js → SettingsView-rKKZ6L11.js} +2 -2
  78. package/dist/assets/{SettingsView-oYe3uTRj.js.map → SettingsView-rKKZ6L11.js.map} +1 -1
  79. package/dist/assets/{SetupView-KGS1CEsN.js → SetupView-vgQT3oJU.js} +2 -2
  80. package/dist/assets/{SetupView-KGS1CEsN.js.map → SetupView-vgQT3oJU.js.map} +1 -1
  81. package/dist/assets/{SetupWorkflowCredentialsButton-Ccl5HCte.js → SetupWorkflowCredentialsButton-QGvaG01Z.js} +2 -2
  82. package/dist/assets/{SetupWorkflowCredentialsButton-Ccl5HCte.js.map → SetupWorkflowCredentialsButton-QGvaG01Z.js.map} +1 -1
  83. package/dist/assets/{SetupWorkflowFromTemplateView-_ayHH-IZ.js → SetupWorkflowFromTemplateView-8kV0zT9M.js} +2 -2
  84. package/dist/assets/{SetupWorkflowFromTemplateView-_ayHH-IZ.js.map → SetupWorkflowFromTemplateView-8kV0zT9M.js.map} +1 -1
  85. package/dist/assets/{SigninView-Gc6N_vLo.js → SigninView-9HcFtYYH.js} +2 -2
  86. package/dist/assets/{SigninView-Gc6N_vLo.js.map → SigninView-9HcFtYYH.js.map} +1 -1
  87. package/dist/assets/SignoutView-aFW_4GHN.js +2 -0
  88. package/dist/assets/SignoutView-aFW_4GHN.js.map +1 -0
  89. package/dist/assets/{SignupView-TUYaR1Nz.js → SignupView-pWu_Kk45.js} +2 -2
  90. package/dist/assets/{SignupView-TUYaR1Nz.js.map → SignupView-pWu_Kk45.js.map} +1 -1
  91. package/dist/assets/{TemplateDetails-s0HGsSP9.js → TemplateDetails-PaDbF87J.js} +2 -2
  92. package/dist/assets/{TemplateDetails-s0HGsSP9.js.map → TemplateDetails-PaDbF87J.js.map} +1 -1
  93. package/dist/assets/{TemplateList--L3zJ5wK.js → TemplateList-M4LBpjOe.js} +2 -2
  94. package/dist/assets/{TemplateList--L3zJ5wK.js.map → TemplateList-M4LBpjOe.js.map} +1 -1
  95. package/dist/assets/{TemplatesCollectionView-d1seBq10.js → TemplatesCollectionView-RBv7X4Gh.js} +2 -2
  96. package/dist/assets/{TemplatesCollectionView-d1seBq10.js.map → TemplatesCollectionView-RBv7X4Gh.js.map} +1 -1
  97. package/dist/assets/{TemplatesInfoCarousel-XG1W0SLa.js → TemplatesInfoCarousel-e2wgfGBn.js} +2 -2
  98. package/dist/assets/{TemplatesInfoCarousel-XG1W0SLa.js.map → TemplatesInfoCarousel-e2wgfGBn.js.map} +1 -1
  99. package/dist/assets/{TemplatesSearchView-OYEX_uZ1.js → TemplatesSearchView-FkqpvNK2.js} +2 -2
  100. package/dist/assets/{TemplatesSearchView-OYEX_uZ1.js.map → TemplatesSearchView-FkqpvNK2.js.map} +1 -1
  101. package/dist/assets/{TemplatesView-RFX1Nriq.js → TemplatesView-bbDzQ95P.js} +2 -2
  102. package/dist/assets/{TemplatesView-RFX1Nriq.js.map → TemplatesView-bbDzQ95P.js.map} +1 -1
  103. package/dist/assets/{TemplatesWorkflowView-t6Xqg5xY.js → TemplatesWorkflowView-7-rFNLp9.js} +2 -2
  104. package/dist/assets/{TemplatesWorkflowView-t6Xqg5xY.js.map → TemplatesWorkflowView-7-rFNLp9.js.map} +1 -1
  105. package/dist/assets/{VariablesView-ZV3cuGWP.js → VariablesView-qHyda1UV.js} +2 -2
  106. package/dist/assets/{VariablesView-ZV3cuGWP.js.map → VariablesView-qHyda1UV.js.map} +1 -1
  107. package/dist/assets/{WorkerView-PvV1tbob.js → WorkerView-B0yhM0J1.js} +2 -2
  108. package/dist/assets/{WorkerView-PvV1tbob.js.map → WorkerView-B0yhM0J1.js.map} +1 -1
  109. package/dist/assets/{WorkflowActivator-TncK9t4c.js → WorkflowActivator-VjkeCh0z.js} +2 -2
  110. package/dist/assets/{WorkflowActivator-TncK9t4c.js.map → WorkflowActivator-VjkeCh0z.js.map} +1 -1
  111. package/dist/assets/{WorkflowExecutionsInfoAccordion-AnHjUFE3.js → WorkflowExecutionsInfoAccordion-3GkCvE9Q.js} +2 -2
  112. package/dist/assets/{WorkflowExecutionsInfoAccordion-AnHjUFE3.js.map → WorkflowExecutionsInfoAccordion-3GkCvE9Q.js.map} +1 -1
  113. package/dist/assets/{WorkflowExecutionsLandingPage-oxT4cL0I.js → WorkflowExecutionsLandingPage-O_YbgvYB.js} +2 -2
  114. package/dist/assets/{WorkflowExecutionsLandingPage-oxT4cL0I.js.map → WorkflowExecutionsLandingPage-O_YbgvYB.js.map} +1 -1
  115. package/dist/assets/{WorkflowExecutionsPreview-S4t3V3mn.js → WorkflowExecutionsPreview-6bNa2avB.js} +2 -2
  116. package/dist/assets/{WorkflowExecutionsPreview-S4t3V3mn.js.map → WorkflowExecutionsPreview-6bNa2avB.js.map} +1 -1
  117. package/dist/assets/{WorkflowExecutionsView-2SiI_dZv.js → WorkflowExecutionsView-e12KrPNp.js} +2 -2
  118. package/dist/assets/{WorkflowExecutionsView-2SiI_dZv.js.map → WorkflowExecutionsView-e12KrPNp.js.map} +1 -1
  119. package/dist/assets/{WorkflowHistory-tlNmMBC4.js → WorkflowHistory-XyI7xi5R.js} +2 -2
  120. package/dist/assets/{WorkflowHistory-tlNmMBC4.js.map → WorkflowHistory-XyI7xi5R.js.map} +1 -1
  121. package/dist/assets/{WorkflowOnboardingView-sQP7Ib3w.js → WorkflowOnboardingView-wfo0sagy.js} +2 -2
  122. package/dist/assets/{WorkflowOnboardingView-sQP7Ib3w.js.map → WorkflowOnboardingView-wfo0sagy.js.map} +1 -1
  123. package/dist/assets/{WorkflowsView-77fg2wMF.js → WorkflowsView-zWdxjaUV.js} +2 -2
  124. package/dist/assets/{WorkflowsView-77fg2wMF.js.map → WorkflowsView-zWdxjaUV.js.map} +1 -1
  125. package/dist/assets/{cloud-k5hx0-AG.js → cloud-FHxD5S8r.js} +2 -2
  126. package/dist/assets/{cloud-k5hx0-AG.js.map → cloud-FHxD5S8r.js.map} +1 -1
  127. package/dist/assets/{collaboration.store-nJkMa2Yk.js → collaboration.store-aa4nebcL.js} +2 -2
  128. package/dist/assets/{collaboration.store-nJkMa2Yk.js.map → collaboration.store-aa4nebcL.js.map} +1 -1
  129. package/dist/assets/{index-OLvpAx8p.js → index-6ulnOLCO.js} +4 -4
  130. package/dist/assets/{index-OLvpAx8p.js.map → index-6ulnOLCO.js.map} +1 -1
  131. package/dist/assets/{templateActions-4mG5U0Gi.js → templateActions-9fUm8Xpc.js} +2 -2
  132. package/dist/assets/{templateActions-4mG5U0Gi.js.map → templateActions-9fUm8Xpc.js.map} +1 -1
  133. package/dist/assets/{useExecutionDebugging-PDsNeD99.js → useExecutionDebugging-QUE85fFt.js} +2 -2
  134. package/dist/assets/{useExecutionDebugging-PDsNeD99.js.map → useExecutionDebugging-QUE85fFt.js.map} +1 -1
  135. package/dist/assets/{useExecutionHelpers-z0jWdDj0.js → useExecutionHelpers-5nDBsYfy.js} +2 -2
  136. package/dist/assets/{useExecutionHelpers-z0jWdDj0.js.map → useExecutionHelpers-5nDBsYfy.js.map} +1 -1
  137. package/dist/assets/{usePushConnection-5HhKaz1I.js → usePushConnection-FzHJLOiR.js} +2 -2
  138. package/dist/assets/{usePushConnection-5HhKaz1I.js.map → usePushConnection-FzHJLOiR.js.map} +1 -1
  139. package/dist/assets/{useWorkflowActivate--rX-aMfx.js → useWorkflowActivate-rx_C76SX.js} +2 -2
  140. package/dist/assets/{useWorkflowActivate--rX-aMfx.js.map → useWorkflowActivate-rx_C76SX.js.map} +1 -1
  141. package/dist/index.html +1 -1
  142. package/package.json +1 -1
  143. package/dist/assets/CollectionParameter-DTYD_Lcf.js.map +0 -1
  144. package/dist/assets/NodeView-vh3Qdfdh.js +0 -9
  145. package/dist/assets/NodeView-vh3Qdfdh.js.map +0 -1
  146. package/dist/assets/SignoutView-zep-aWVN.js +0 -2
  147. package/dist/assets/SignoutView-zep-aWVN.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"mappings":"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","names":["ndvEventBus","createEventBus","position","ref","isOpen","target","actions","actionCallback","useContextMenu","onAction","uiStore","useUIStore","nodeTypesStore","useNodeTypesStore","workflowsStore","useWorkflowsStore","sourceControlStore","useSourceControlStore","i18n","useI18n","isReadOnly","computed","targetNodes","selectedNodes","node","currentTarget","canAddNodeOfType","nodeType","sameTypeNodes","n","canDuplicateNode","NOT_DUPLICATABE_NODE_TYPES","hasPinData","close","open","event","menuTarget","getMousePosition","nodes","onlyStickies","STICKY_NODE_TYPE","i18nOptions","selectionActions","menuActions","usePinnedData","singleNodeActions","_dispatchAction","action","watch","useCanvasMouseSelect","selectActive","selectBox","isTouchDevice","isCtrlKeyPressed","useDeviceSupport","canvasStore","useCanvasStore","isContextMenuOpen","_setSelectBoxStyle","styles","_showSelectBox","x","y","getMousePositionWithinNodeView","_updateSelectBox","selectionBox","_getSelectionBox","_hideSelectBox","_getNodesInSelection","returnNodes","_createSelectBox","mouseUpMouseSelect","_mouseMoveSelect","e","deselectAllNodes","nodeSelected","mouseDownMouseSelect","moveButtonPressed","mousePosition","relativeX","relativeY","nodeViewScale","nodeViewOffsetPosition","getRelativePosition","nodeDeselected","instance","onMounted","useUniqueNodeName","numberSuffixedNames","acc","uniqueNodeName","originalName","extraNames","canvasNames","nsn","unique","index","remainder","lastChar","match","_b","props","__props","emit","__emit","editName","newName","input","editable","onEdit","nextTick","onRename","externalHooks","useExternalHooks","ndvStore","useNDVStore","telemetry","useTelemetry","activeNode","isCommunityNode","isCommunityPackageName","packageName","_a","documentationUrl","utmParams","primaryDocUrl","_d","_c","NPM_PACKAGE_DOCS_BASE_URL","BUILTIN_NODES_DOCS_URL","options","COMMUNITY_NODES_INSTALLATION_DOCS_URL","onTabSelect","tab","NodeConnectionType","onTooltipClick","_sfc_main$p","defineComponent","router","useRouter","clipboard","useClipboard","workflowHelpers","useWorkflowHelpers","useToast","OPEN_URL_PANEL_TRIGGER_NODE_TYPES","PRODUCTION_ONLY_TRIGGER_NODE_TYPES","webhook","webhookData","CHAT_TRIGGER_NODE_TYPE","FORM_TRIGGER_NODE_TYPE","webhookUrl","method","_withScopeId","_pushScopeId","_popScopeId","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_7","_hoisted_8","_createElementVNode","_hoisted_11","_hoisted_12","visibleWebhookUrls","_ctx","_openBlock","isMinimized","_normalizeClass","_cache","$event","_component_font_awesome_icon","_createTextVNode","_toDisplayString","_createVNode","_withCtx","_createCommentVNode","_createElementBlock","_component_el_row","_component_el_col","showUrlFor","_component_n8n_radio_buttons","urlOptions","_Fragment","_renderList","_createBlock","_component_n8n_tooltip","getWebhookHttpMethod","_hoisted_9","copyWebhookUrl","getWebhookUrlDisplay","_hoisted_13","_hoisted_15","nodeHelpers","useNodeHelpers","debounce","useDebounce","possibleConnections","expandedGroups","shouldShowNodeInputIssues","nodeData","workflow","nodeInputIssues","issues","connectedNodes","connection","getINodesFromNames","getConnectionConfig","connectionType","c","isMultiConnection","connectionConfig","shouldShowConnectionTooltip","expandConnectionGroup","isExpanded","g","names","name","matchedNodeType","stringifiedIssues","NodeHelpers.nodeIssuesToString","hasInputIssues","isNodeInputConfiguration","getPossibleSubInputConnections","NodeHelpers.getNodeInputs","onNodeClick","nodeName","onPlusClick","connectionNodes","showNodeInputsIssues","__expose","_sfc_main$n","pinnedData","runWorkflow","stopCurrentExecution","useRunWorkflow","useMessage","mapStores","triggeredNode","MANUAL_TRIGGER_NODE_TYPE","WEBHOOK_NODE_TYPE","waitingOnWebhook","executedNode","error","nodeViewEventBus","shouldUnpinAndExecute","MODAL_CONFIRM","telemetryPayload","_resolveComponent","disabledHint","nodeRunning","disabled","buttonLabel","type","size","isListeningForEvents","isTriggerNode","$locale","_sfc_main$m","NodeTitle","NodeCredentials","ParameterInputList","NodeSettingsTabs","NodeWebhooks","NDVSubConnections","NodeExecuteButton","showMessage","useHistoryStore","useCredentialsStore","useWorkflowsEEStore","workflowNode","inputs","NodeHelpers.getConnectionTypes","shortNodeType","item","credential","nodeCredential","CUSTOM_NODES_DOCS_URL","MAIN_NODE_PANEL_WIDTH","newNode","oldNode","importCurlEventBus","parameters","parameter","parameterName","value","nameParts","lastNamePart","isArray","lastNameParts","removedNodeValue","remainingNodeValues","tempValue","get","removedArrayNodeValue","remainingArrayNodeValues","set","deepCopy","updateInformation","RenameNodeCommand","parameterData","newValue","nodeNameBefore","sendData","nodeParameters","NodeHelpers.getNodeParameters","oldNodeParameters","parameterPath","parameterPathArray","path","data","unset","key","SHOULD_CLEAR_NODE_OUTPUTS","nodeParameterValues","updatedParameter","prop","displayOptions","showCondition","hideCondition","hasValidOptions","isINodePropertyCollectionList","isINodePropertiesList","option","isINodePropertyOptionsList","displayParameter","foundNodeSettings","nodeSetting","_hoisted_10","_withModifiers","_component_NodeTitle","_component_NodeExecuteButton","outputPanelEditMode","onStopExecution","nodeValid","openPanel","pushRef","$style","_component_n8n_text","_component_i18n_t","onMissingNodeTextClick","_hoisted_6","onMissingNodeLearnMoreLinkClick","hasForeignCredential","_component_n8n_notice","_withDirectives","_component_NodeWebhooks","nodeValuesInitialized","parametersNoneSetting","_component_ParameterInputList","nodeValues","valueChanged","onParameterBlur","hiddenIssuesInputs","parametersSetting","nodeSettings","_component_NDVSubConnections","blockUI","_sfc_main$l","draggablePosition","activeElement","_sfc_render","$props","$setup","$data","$options","isDragging","_renderSlot","_Teleport","_normalizeStyle","draggingEl","_sfc_main$k","Draggable","onDragStart","onDragEnd","canMoveLeft","moveNodeDirection","direction","matchedDirectionNode","onKeyDown","matchingDirection","rootName","connectionGroups","tooltipPositionMapper","onBeforeUnmount","SIDE_MARGIN","SIDE_PANELS_MARGIN","MIN_PANEL_WIDTH","PANEL_WIDTH","PANEL_WIDTH_LARGE","initialMainPanelWidth","_sfc_main$i","PanelDragButton","NDVFloatingNodes","callDebounced","supportedDirections","hasInput","outputPanelRelativeLeft","panelMinLeft","currentRelativeLeftDelta","multiplier","minRelativeWidth","windowWidth","isBelowMinLeft","isMaxRight","width","relativeWidth","mainPanelRelativeWidth","relativeLeft","mainPanelRelativeLeft","mainPanelRelativeRight","isMinLeft","isInputless","positionByName","px","relativeDistance","storedPanelWidthData","useStorage","LOCAL_STORAGE_MAIN_PANEL_RELATIVE_WIDTH","parsedWidth","initialPosition","_component_NDVFloatingNodes","mainPanelStyles","relativeWidthToPx","mainPanelDimensions","onResizeDebounced","onResizeStart","onResizeEnd","hideInputAndOutput","isDraggable","canMoveRight","onDrag","sanitizeOptions","defaults","_sfc_main$h","sanitizeHtml","_sfc_main$g","VueJsonPretty","RunDataHtml","id","fileName","fileType","mimeType","isJSONData","isHTMLData","jsonParse","binaryUrl","fetchedData","binaryData","_component_VueJsonPretty","_component_RunDataHtml","_sfc_main$f","BinaryDataDisplayEmbed","workflowExecution","executionData","_component_BinaryDataDisplayEmbed","_component_n8n_button","toast","rootStore","useRootStore","displayCause","MAX_DISPLAY_DATA_SIZE","n8nVersion","baseUrl","instanceType","hasManyInputItems","nodeDefaultName","prepareRawMessages","returnData","errorMessage","getErrorMessage","message","parts","part","parsed","nodeVersionTag","latestNodeVersion","prepareDescription","description","getErrorDescription","interpolate","parameterDisplayName","addItemIndexSuffix","itemIndexSuffix","ITEM_INDEX_SUFFIX_TEXT","isSubNodeError","isNonEmptyString","fullPath","params","getParameterName","pathParts","currentParameterName","arrayMatch","currentParameter","copyErrorDetails","errorInfo","errorDetails","n8nDetails","_e","_f","copySuccess","locale","visible","RunDataTable","defineAsyncComponent","__vitePreload","RunDataJson","RunDataSchema","RunDataSearch","_sfc_main$c","BinaryDataDisplay","NodeErrorView","JsonEditor","RunDataPinButton","toRef","MAX_DISPLAY_ITEMS_AUTO_ALL","DATA_PINNING_DOCS_URL","DATA_EDITING_DOCS_URL","schemaView","isEmpty","HTML_NODE_TYPE","hints","runData","taskData","pinOrLiveData","offset","executionDataToJson","capitalize","branches","i","totalItemsCount","itemsCount","items","outputName","appendBranchWord","NODE_TYPES_EXCLUDED_FROM_OUTPUT_NAME_APPEND","parentNode","parentNodeData","prevNode","prevData","isEqual","newData","branchIndex","newSearch","NodeHelpers.getNodeOutputs","hint","location","whenToDisplay","executionHints","nodeHints","NodeHelpers.getNodeHints","itemIndex","pinDataDiscoveryFlag","LOCAL_STORAGE_PIN_DATA_DISCOVERY_NDV_FLAG","dataPinningEventBus","LOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG","origin","inputData","clearJsonKey","TEST_PIN_DATA","source","pageSize","maxPage","displayMode","previous","dataContainerRef","dataDisplay","itemsLabel","runIndex","outputIndex","json","searchInObject","rawInputData","outputTypes","outputs","fileExtension","url","saveAs","bufferString","blob","d","outputConfiguration","isObject","jsonItems","run","canPinData","_component_n8n_callout","dataPinningDocsUrl","_component_n8n_link","isReadOnlyRoute","binaryDataDisplayVisible","_component_BinaryDataDisplay","binaryDataDisplayData","closeBinaryDataDisplay","buttons","_component_n8n_icon_button","editMode","_vShow","_component_RunDataPinButton","readOnlyEnv","isControlledPinDataTooltip","pinDataDiscoveryTooltipVisible","maxRunIndex","_component_n8n_select","_component_n8n_option","canLinkRuns","linkedRuns","showIOSearch","search","_component_RunDataSearch","paneType","isPaneActive","activatePane","maxOutputIndex","dataCount","isArtificialRecoveredEventItem","unfilteredDataCount","isExecuting","_component_n8n_spinner","executingMessage","_component_JsonEditor","_component_n8n_info_tip","dataEditingDocsUrl","_component_NodeErrorView","hasNodeRun","hasRunError","isPaneTypeInput","$slots","noDataInBranchMessage","dataSizeInMB","showTooMuchData","jsonData","showIoSearchNoMatchContent","_Suspense","_component_RunDataTable","currentPageOffset","$emit","onDisplayModeChange","_component_RunDataJson","inputDataPage","_component_RunDataSchema","mappingEnabled","binaryDataEntry","isViewable","displayBinaryData","isDownloadable","downloadBinaryData","isSchemaView","_component_el_pagination","_component_n8n_block_ui","_sfc_main$b","date","time","convertToDisplayDateComponents","runMetadata","OUTPUT_TYPE","_sfc_main$a","RunData","RunInfo","RunDataAi","storeToRefs","isSubNodeType","useNodeType","resultData","updatedAt","runAt","runDataRef","outputMode","_component_RunData","isNodeRunning","onRunIndexChange","onLinkRun","onUnlinkRun","_createSlots","hasAiMetadata","onUpdateOutputMode","runTaskData","_component_RunInfo","args","_component_RunDataAi","_sfc_main$8","WireMeUp","toIgnore","START_NODE_TYPE","CRON_NODE_TYPE","INTERVAL_NODE_TYPE","output","executingNode","val","curr","prev","connectedInputs","inputIndex","truncated","mappedNode","isExecutingPrevious","connectedCurrentNodeOutputs","currentNodeDepth","parentNodes","truncate","getMultipleNodesText","isActiveNodeConfig","readOnly","showDraggableHintWithDelay","onNodeExecute","_component_WireMeUp","isMappingMode","_resolveDynamicComponent","_sfc_main$7","CopyInput","NodeIcon","hideContent","hideContentValue","getTriggerNodeServiceName","httpMethod","serviceName","VIEWS","WORKFLOW_SETTINGS_MODAL_KEY","_Transition","_component_n8n_pulse","_component_NodeIcon","isWebhookNode","webhookHttpMethod","_component_CopyInput","onTestLinkCopied","listeningHint","displayChatButton","header","_component_n8n_heading","activationHint","executionsHelp","_component_n8n_info_accordion","executionsHelpEventBus","onLinkClick","_sfc_main$6","NodeSettings","InputPanel","OutputPanel","NDVDraggablePanels","TriggerPanel","workflowActivate","useWorkflowActivate","settingsStore","useSettingsStore","deviceSupport","settingsEventBus","redrawRequired","runInputIndex","runOutputIndex","isLinkingEnabled","selectedInput","triggerWaitingWarningEnabled","mainPanelPosition","avgInputRowHeight","avgOutputRowHeight","isInputPaneActive","isOutputPaneActive","isPairedItemHoveringEnabled","activeNodeType","workflowRunning","showTriggerWaitingWarning","workflowRunData","parentNodeName","inputNodeName","inputNode","showTriggerPanel","override","isWebhookBasedNode","isPollingNode","hasOutputConnection","outgoingConnections","isExecutableTriggerNode","EXECUTABLE_TRIGGER_NODE_TYPES","isActiveStickyNode","maxOutputRun","outputRun","maxInputRun","inputRun","linked","inputPanelMargin","featureRequestUrl","BASE_NODE_SURVEY_URL","isWorkflowRunning","isExecutionWaitingForWebhook","blockUi","foreignCredentials","credentials","usedCredentials","foreignCredentialsArray","EnterpriseEditionFeature","setIsTooltipVisible","isTooltipVisible","onInputItemHover","onInputTableMounted","onWorkflowActivate","onOutputItemHover","onFeatureRequestClick","onPanelsInit","onLinkRunToOutput","trackLinking","pane","openSettings","onLinkRunToInput","nodeTypeSelected","nodeTypeName","onSwitchSelectedNode","onOpenConnectionNodeCreator","trackRunChange","onRunOutputIndexChange","onRunInputIndexChange","onOutputTableMounted","onInputNodeChange","activateInputPane","activateOutputPane","onSearch","_component_el_dialog","_component_n8n_icon","_component_OutputPanel","isProductionExecutionPreview","_component_TriggerPanel","_component_InputPanel","contextMenu","dropdown","onActionSelect","onVisibleChange","createAddInputEndpointSpec","connectionName","color","multiple","NODE_CONNECTION_TYPE_ALLOW_MULTIPLE","createDiamondOutputEndpointSpec","getEndpointLabelLength","length","nodeBase","endpoint","canvas","nodeTypeData","rootTypeIndexData","typeIndexData","sortedInputs","b","inputConfiguration","inputName","rootCategoryInputName","rootTypeIndex","typeIndex","inputsOfSameRootType","thisInputName","nonMainInputs","requiredNonMainInputs","optionalNonMainInputs","spacerIndexes","anchorPosition","NodeViewUtils.getAnchorPosition","scope","NodeViewUtils.getEndpointScope","newEndpointData","NodeViewUtils.getInputEndpointUUID","NodeViewUtils.getInputEndpointStyle","NodeViewUtils.getScope","NodeViewUtils.getInputNameOverlay","leftGroupItemsCount","rightGroupItemsCount","insertSpacerBetweenGroups","NODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS","minItemsCount","NODE_MIN_INPUT_ITEMS_COUNT","spacerIndex","maxLabelLength","outputConfigurations","endpointLabelLength","rootCategoryOutputName","outputsOfSameRootType","outputData","thisOutputName","NodeViewUtils.getOutputEndpointUUID","NodeViewUtils.getOutputEndpointStyle","overlaySpec","NodeViewUtils.getOutputNameOverlay","plusEndpointData","plusEndpoint","NO_OP_NODE_TYPE","createSupplementalConnectionType","_sfc_main$4","TitledList","FontAwesomeIcon","workflowResultDataNode","eventTriggerDescription","classes","otherOutputs","spacerCount","mainOutputs","nodeExecutionRunData","executionRunData","lastNodeExecuted","waitDate","WAIT_TIME_UNLIMITED","returnStyles","borderColor","SIMULATE_NODE_TYPE","SIMULATE_TRIGGER_NODE_TYPE","icon","iconNodeType","oldValue","shouldShowTriggerTooltip","dataItemsCount","nodeSubtitle","CUSTOM_API_CALL_KEY","EnableNodeToggleCommand","_hoisted_17","_hoisted_19","_hoisted_20","_hoisted_21","_directive_touch","_resolveDirective","isTouchActive","disablePointerEvents","_component_FontAwesomeIcon","hasIssues","hideNodeIssues","nodeIssues","waiting","showPinnedDataInfo","nodeExecutionStatus","workflowDataItems","_hoisted_14","showTriggerNodeTooltip","_hoisted_16","touchStart","showDisabledLinethrough","_hoisted_18","nodeTitle","_hoisted_22","_hoisted_23","executeNode","_sfc_main$3","colorPopoverTrigger","forceActions","setForceActions","content","property","isString","isNumber","edit","link","isOnboardingNote","QUICKSTART_NOTE_NAME","isWelcomeVideo","height","dX","dY","_component_n8n_sticky","defaultText","isActive","gridSize","onResize","_component_n8n_popover","onShowPopover","onHidePopover","_","showActions","SEQUENTIAL_BONUS","SEPARATOR_BONUS","CAMEL_BONUS","FIRST_LETTER_BONUS","LEADING_LETTER_PENALTY","MAX_LEADING_LETTER_PENALTY","UNMATCHED_LETTER_PENALTY","fuzzyMatchSimple","pattern","patternIdx","strIdx","patternChar","targetChar","fuzzyMatch","fuzzyMatchRecursive","patternCurIndex","targetCurrIndex","targetMatches","matches","maxMatches","nextMatch","recursionCount","recursionLimit","outScore","recursiveMatch","bestRecursiveMatches","bestRecursiveScore","firstMatch","recursiveMatches","recursiveResult","recursiveScore","matched","penalty","unmatched","currIdx","prevIdx","neighbor","getValue","obj","segments","result","sublimeSearch","filter","keys","results","accu","values","weight","v","itemMatch","a","transformNodeType","subcategory","createElement","uuidv4","CORE_NODES_CATEGORY","DEFAULT_SUBCATEGORY","subcategorizeItems","WHITE_LISTED_SUBCATEGORIES","AI_SUBCATEGORY","subcategories","category","sortNodeCreateElements","displayNameA","displayNameB","searchNodes","searchFilter","trimmedFilter","flattenCreateElements","groupItemsInSections","sections","filteredSections","section","itemsBySection","s","useNodeCreatorStore","defineStore","STORES","selectedView","TRIGGER_NODE_CREATOR_VIEW","mergedNodes","showScrim","openSource","allNodeCreatorNodes","setMergeNodes","setActions","setShowScrim","isVisible","setSelectedView","view","setOpenSource","nodeCreatorStore","containerCssVars","aiStore","useAIStore","aiAssistantChatOpen","title","style","onOptionSelected","getAiNodesBySubcategory","AIView","_nodes","templatesStore","useTemplatesStore","chainNodes","AI_CATEGORY_CHAINS","agentNodes","AI_CATEGORY_AGENTS","AI_NODE_CREATOR_VIEW","AI_OTHERS_NODE_CREATOR_VIEW","AINodesView","getAISubcategoryProperties","nodeConnectionType","AI_CATEGORY_DOCUMENT_LOADERS","AI_CATEGORY_LANGUAGE_MODELS","AI_CATEGORY_MEMORY","AI_CATEGORY_OUTPUTPARSER","AI_CATEGORY_RETRIEVERS","AI_CATEGORY_TEXT_SPLITTERS","AI_CATEGORY_TOOLS","AI_CATEGORY_EMBEDDING","AI_CATEGORY_VECTOR_STORES","AI_UNCATEGORIZED_CATEGORY","TriggerView","EMAIL_IMAP_NODE_TYPE","SCHEDULE_TRIGGER_NODE_TYPE","EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE","OTHER_TRIGGER_NODES_SUBCATEGORY","RegularView","REGULAR_NODE_CREATOR_VIEW","RSS_READ_NODE_TYPE","EMAIL_SEND_NODE_TYPE","TRANSFORM_DATA_SUBCATEGORY","SET_NODE_TYPE","CODE_NODE_TYPE","DATETIME_NODE_TYPE","FILTER_NODE_TYPE","REMOVE_DUPLICATES_NODE_TYPE","SPLIT_OUT_NODE_TYPE","LIMIT_NODE_TYPE","SUMMARIZE_NODE_TYPE","AGGREGATE_NODE_TYPE","MERGE_NODE_TYPE","MARKDOWN_NODE_TYPE","XML_NODE_TYPE","CRYPTO_NODE_TYPE","EXTRACT_FROM_FILE_NODE_TYPE","CONVERT_TO_FILE_NODE_TYPE","COMPRESSION_NODE_TYPE","EDIT_IMAGE_NODE_TYPE","FLOWS_CONTROL_SUBCATEGORY","IF_NODE_TYPE","SPLIT_IN_BATCHES_NODE_TYPE","FILES_SUBCATEGORY","HELPERS_SUBCATEGORY","HTTP_REQUEST_NODE_TYPE","KEYBOARD_ID_ATTR","WATCHED_KEYS","useKeyboardNavigation","selectableItems","activeItemId","keysHooks","getItemType","element","getElementId","refreshSelectableItems","resolve","cleanupSelectableItems","el","executeKeyHooks","keyboardKey","activeItem","hook","pressedKey","activeItemIndex","isArrowDown","isArrowUp","nextItemIndex","setActiveItem","previousIndex","setActiveItemId","itemId","setActiveItemIndex","attachKeydownEvent","detachKeydownEvent","registerKeyHook","getActiveItemIndex","useViewStacks","viewStacks","activeStackItems","stack","extendItemsWithUUID","searchBaseItems","searchBase","activeViewStack","flatBaselineItems","activeViewStackMode","globalSearchItemsDiff","allNodes","itemsBySubcategory","gotoCompatibleConnectionView","isOutput","nodesByConnectionType","relatedAIView","pushViewStack","AI_CODE_NODE_TYPE","displayNode","setStackBaselineItems","stackItems","itemsInSubcategory","matchedNodes","updateCurrentViewStack","uuid","newStackUuid","popViewStack","currentStack","matchedIndex","typedKey","resetViewStacks","useCanvasPanning","elementRef","moveLastPosition","panCanvas","offsetPosition","nodeViewOffsetPositionX","nodeViewOffsetPositionY","onMouseDown","MOUSE_EVENT_BUTTON","unref","onMouseMove","onMouseUp","MOUSE_EVENT_BUTTONS","onMouseMoveEnd","NodeCreation","CanvasControls","SetupWorkflowCredentialsButton","_sfc_main","NodeDetailsView","Node","Sticky","CanvasAddButton","KeyboardShortcutTooltip","ContextMenu","NextStepPopup","to","from","next","getNodeViewTab","MAIN_HEADER_TABS","confirmModal","PLACEHOLDER_EMPTY_WORKFLOW_ID","MODAL_CANCEL","nodeViewRootRef","nodeViewRef","dataSchema","useDataSchema","canvasPanning","useGlobalLinkActions","useTitleChange","useExecutionDebugging","currentTab","nodeViewNotInitialized","workflowChanged","isOpeningTemplate","previousDirtyState","containsTrigger","newScale","err","vm","info","useTagsStore","useUsersStore","useEnvironmentsStore","useExternalSecretsStore","useCollaborationStore","usePushConnectionStore","useExecutionsStore","useProjectsStore","NodeViewUtils.getBackgroundStyles","returnClasses","MANUAL_CHAT_TRIGGER_NODE_TYPE","userHasSeenAIAssistantExperiment","AI_ASSISTANT_LOCAL_STORAGE_KEY","experimentEnabled","NodeViewUtils.GRID_SIZE","NODE_CREATOR_OPEN_SOURCES","loadPromises","promises","ready","getAccountAge","ONBOARDING_PROMPT_TIMEBOX","onboardingResponse","promptTimeout","FIRST_ONBOARDING_PROMPT_TIMEOUT","ONBOARDING_CALL_SIGNUP_MODAL_KEY","sourceControlEventBus","historyBus","connectiontype","creatorview","WORKFLOW_LM_CHAT_MODAL_KEY","workflowData","TelemetryHelpers.generateNodesGraph","N8nAddInputEndpointType","n8nAddInputEndpoint","managedNode","endpoints","notice","saved","newNodeButton","lastConnectionInfo","executionId","nodeErrorFound","errorCheck","NodeViewUtils.getFixedNodesList","templateId","tryToParseNumber","selectedExecution","tags","tagIds","tag","ctrlModifier","shiftModifier","ctrlAltModifier","noModifierKeys","lastSelectedNode","connections","connectionsParent","siblingNode","lastCheckedNodePosition","nextSelectNode","ouputConnections","ouputConnection","nextStatePinned","pinnedDataForNode","dataToPin","checkNodes","sourceNodeName","margin","recordHistory","sourceNode","oldPosition","MoveNodeCommand","deleteCopiedNodes","isCut","workflowToCopy","execution","executedData","pushData","trackProps","plainTextData","importTags","nodeIdMap","UPDATE_WEBHOOK_ID_NODE_TYPES","newId","currInstanceId","nodeGraph","NodeViewUtils.getNewNodePosition","tagsEnabled","allTags","tagNames","workflowTags","notFound","creatingTagPromises","creationPromise","imported","dropData","DRAG_EVENT_DATA_KEY","insertNodePosition","NodeViewUtils.NODE_SIZE","setActive","deselectAllOthers","maxNodes","overrides","nodeVersion","newNodeData","credentialPerType","defaultCredential","selectedCredentials","selected","authentication","authDisplayOptions","displayOption","optionValue","showDetail","trackHistory","isAutoAdd","lastSelectedConnection","diffX","NodeViewUtils.getConnectorLengths","NodeViewUtils.MAX_X_TO_PUSH_DOWNSTREAM_NODES","NodeViewUtils.PUSH_NODES_OFFSET","yOffset","sourceNodeType","offsets","sourceNodeOutputs","sourceNodeOutputMainOutputs","sourceOutputIndex","lastSelectedNodeType","lastSelectedNodeWorkflow","lastSelectedInputs","scopedConnectionIndex","inputType","inputsTypes","pushOffset","localizedName","useSegment","trackProperties","sourceNodeOutputIndex","targetNodeName","targetNodeOuputIndex","nodeConnections","targetNodeOutputIndex","targetNode","connectionData","lastSelectedNodeOutputIndex","lastSelectedNodeEndpointUuid","targetEndpoint","lastSelectedEndpoint","newNodeElement","viableConnection","conn","targetOutputIndex","outputType","filterFound","overrideTargetEndpoint","isTarget","NodeViewUtils.resetConnectionAfterPull","endpointId","endpointElement","observer","mutations","mutation","isJSPlumbEndpointElement","newConnectionInfo","targetInfoType","targetNodeType","sourceInfo","targetInfo","tempEndpoint","NodeViewUtils.resetConnection","NodeViewUtils.moveBackInputLabelPosition","NodeViewUtils.hideOutputNameLabel","NodeViewUtils.addConnectionActionsOverlay","endpointArrow","NodeViewUtils.getOverlay","OVERLAY_ENDPOINT_ARROW_ID","getConnectorPaintStyleData","AddConnectionCommand","NodeViewUtils.addConnectionTestData","totalNodes","NodeViewUtils.showOrHideItemsLabel","NodeViewUtils.showOrHideMidpointArrow","overlay","NodeViewUtils.hideConnectionActions","NodeViewUtils.showConnectionActions","NodeViewUtils.resetInputLabelPosition","connectionInfo","mouse","getConnectionInfo","NodeViewUtils.showOutputNameLabel","RemoveConnectionCommand","removeCommand","scopedEndpoints","requiredType","filteredEndpoints","isSameNode","endpointType","intersectingEndpoints","isEndpointIntersect","NodeViewUtils.isElementIntersection","isNodeElementIntersect","aEndpointIntersect","NodeViewUtils.calculateElementIntersection","bEndpointIntersect","NodeViewUtils.showDropConnectionState","NodeViewUtils.showPullConnectionState","EVENT_CONNECTION_ABORT","INTERCEPT_BEFORE_DROP","EVENT_CONNECTION","EVENT_DRAG_MOVE","EVENT_CONNECTION_MOUSEOVER","EVENT_CONNECTION_MOUSEOUT","EVENT_CONNECTION_MOVED","EVENT_ENDPOINT_MOUSEOVER","EVENT_ENDPOINT_MOUSEOUT","EVENT_CONNECTION_DETACHED","EVENT_CONNECTION_DRAG","EVENT_PLUS_ENDPOINT_CLICK","EVENT_ADD_INPUT_ENDPOINT_CLICK","bind","elements","endpointInstance","N8nPlusEndpointType","TIME","currentProject","personalProject","homeProject","scopes","MODAL_CLOSE","workflowId","outputUuid","inputUuid","removeVisualConnection","sourceNodeOutput","sourceNodeOutputName","connectionInstance","outgoing","incoming","pinData","hasRun","NodeViewUtils.addClassesToOverlays","NodeViewUtils.OVERLAY_RUN_ITEMS_ID","sourceId","NodeViewUtils.getJSPlumbEndpoints","trackBulk","requiredNodeTypes","deleteAllowed","checkNode","waitForNewConnection","conn1","conn2","RemoveNodeCommand","tempName","currentName","promptResponsePromise","nameInput","promptResponse","nodeCredentialType","nodeCredentials","credentialOptions","credentialsId","credentialsForId","optionData","credentialsForName","AddNodeCommand","batchedConnectionData","outwardConnections","sourceIndex","targetData","nodeNameTable","newNodeNames","nodeTypesCount","oldName","createNodes","localized","newConnections","currentConnections","createNodeNames","connectionIndex","nodeSourceConnections","tempWorkflow","pinDataSuccess","exportNodeNames","pinDataForNode","connectionToKeep","typeConnections","projectId","ProjectTypes","nodeInfos","nodesToBeFetched","nodeVersions","classNames","NodeViewUtils.addConnectionOutputSuccess","createNodeActive","nodeCreatorView","mode","dragAndDrop","currentPosition","openDetail","nodePosition","lastAddedNode","newNodesOffset","fromNode","toNode","lastNodeInputs","nodeUi","callback","suspend","isDisabled","canvasAddButtonStyle","onCanvasAddButtonCLick","showCanvasAddButton","_component_Node","currentWorkflowObject","canOpenNDV","nodeDeselectedByName","nodeSelectedByName","onRunNode","onNodeMoved","onNodeRun","stickiesToRender","stickyData","_component_Sticky","GRID_SIZE","pullConnActive","renamingActive","redrawNode","stopExecution","onToggleNodeCreator","onAddNodes","_component_CanvasControls","_component_ContextMenu","isNextStepPopupVisible","isManualChatOnly","_component_KeyboardShortcutTooltip","runButtonText","stopExecutionInProgress","executionWaitingForWebhook","allTriggersDisabled"],"ignoreList":[],"sources":["../../src/event-bus/ndv.ts","../../src/composables/useContextMenu.ts","../../src/composables/useCanvasMouseSelect.ts","../../src/composables/useUniqueNodeName.ts","../../src/components/NodeTitle.vue","../../src/components/NodeSettingsTabs.vue","../../src/components/NodeWebhooks.vue","../../src/components/NDVSubConnections.vue","../../src/components/NodeExecuteButton.vue","../../src/components/NodeSettings.vue","../../src/components/Draggable.vue","../../src/components/PanelDragButton.vue","../../src/components/NDVFloatingNodes.vue","../../src/components/NDVDraggablePanels.vue","../../src/components/RunDataHtml.vue","../../src/components/BinaryDataDisplayEmbed.vue","../../src/components/BinaryDataDisplay.vue","../../src/components/Error/NodeErrorView.vue","../../src/components/RunDataPinButton.vue","../../src/components/RunData.vue","../../src/components/RunInfo.vue","../../src/components/OutputPanel.vue","../../src/components/WireMeUp.vue","../../src/components/InputPanel.vue","../../src/components/TriggerPanel.vue","../../src/components/NodeDetailsView.vue","../../src/components/ContextMenu/ContextMenu.vue","../../src/mixins/nodeBase.ts","../../src/components/Node.vue","../../src/components/Sticky.vue","../../src/utils/sortUtils.ts","../../src/components/Node/NodeCreator/utils.ts","../../src/stores/nodeCreator.store.ts","../../src/views/CanvasAddButton.vue","../../src/components/AIAssistantChat/NextStepPopup.vue","../../src/components/Node/NodeCreator/viewsData.ts","../../src/components/Node/NodeCreator/composables/useKeyboardNavigation.ts","../../src/components/Node/NodeCreator/composables/useViewStacks.ts","../../src/composables/useCanvasPanning.ts","../../src/views/NodeView.vue"],"sourcesContent":["import { createEventBus } from 'n8n-design-system/utils';\n\nexport const ndvEventBus = createEventBus();\n","import type { ActionDropdownItem, XYPosition } from '@/Interface';\nimport { NOT_DUPLICATABE_NODE_TYPES, STICKY_NODE_TYPE } from '@/constants';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport type { INode, INodeTypeDescription } from 'n8n-workflow';\nimport { computed, ref, watch } from 'vue';\nimport { getMousePosition } from '../utils/nodeViewUtils';\nimport { useI18n } from './useI18n';\nimport { usePinnedData } from './usePinnedData';\n\nexport type ContextMenuTarget =\n\t| { source: 'canvas' }\n\t| { source: 'node-right-click'; node: INode }\n\t| { source: 'node-button'; node: INode };\nexport type ContextMenuActionCallback = (action: ContextMenuAction, targets: INode[]) => void;\nexport type ContextMenuAction =\n\t| 'open'\n\t| 'copy'\n\t| 'toggle_activation'\n\t| 'duplicate'\n\t| 'execute'\n\t| 'rename'\n\t| 'toggle_pin'\n\t| 'delete'\n\t| 'select_all'\n\t| 'deselect_all'\n\t| 'add_node'\n\t| 'add_sticky'\n\t| 'change_color';\n\nconst position = ref<XYPosition>([0, 0]);\nconst isOpen = ref(false);\nconst target = ref<ContextMenuTarget>({ source: 'canvas' });\nconst actions = ref<ActionDropdownItem[]>([]);\nconst actionCallback = ref<ContextMenuActionCallback>(() => {});\n\nexport const useContextMenu = (onAction: ContextMenuActionCallback = () => {}) => {\n\tconst uiStore = useUIStore();\n\tconst nodeTypesStore = useNodeTypesStore();\n\tconst workflowsStore = useWorkflowsStore();\n\tconst sourceControlStore = useSourceControlStore();\n\n\tconst i18n = useI18n();\n\n\tconst isReadOnly = computed(\n\t\t() => sourceControlStore.preferences.branchReadOnly || uiStore.isReadOnlyView,\n\t);\n\n\tconst targetNodes = computed(() => {\n\t\tif (!isOpen.value) return [];\n\t\tconst selectedNodes = uiStore.selectedNodes.map((node) =>\n\t\t\tworkflowsStore.getNodeByName(node.name),\n\t\t) as INode[];\n\t\tconst currentTarget = target.value;\n\t\tif (currentTarget.source === 'canvas') {\n\t\t\treturn selectedNodes;\n\t\t} else if (currentTarget.source === 'node-right-click') {\n\t\t\tconst isNodeInSelection = selectedNodes.some((node) => node.name === currentTarget.node.name);\n\t\t\treturn isNodeInSelection ? selectedNodes : [currentTarget.node];\n\t\t}\n\n\t\treturn [currentTarget.node];\n\t});\n\n\tconst canAddNodeOfType = (nodeType: INodeTypeDescription) => {\n\t\tconst sameTypeNodes = workflowsStore.allNodes.filter((n) => n.type === nodeType.name);\n\t\treturn nodeType.maxNodes === undefined || sameTypeNodes.length < nodeType.maxNodes;\n\t};\n\n\tconst canDuplicateNode = (node: INode): boolean => {\n\t\tconst nodeType = nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\t\tif (!nodeType) return false;\n\t\tif (NOT_DUPLICATABE_NODE_TYPES.includes(nodeType.name)) return false;\n\n\t\treturn canAddNodeOfType(nodeType);\n\t};\n\n\tconst hasPinData = (node: INode): boolean => {\n\t\treturn !!workflowsStore.pinDataByNodeName(node.name);\n\t};\n\tconst close = () => {\n\t\ttarget.value = { source: 'canvas' };\n\t\tisOpen.value = false;\n\t\tactions.value = [];\n\t\tposition.value = [0, 0];\n\t};\n\n\tconst open = (event: MouseEvent, menuTarget: ContextMenuTarget = { source: 'canvas' }) => {\n\t\tevent.stopPropagation();\n\n\t\tif (isOpen.value && menuTarget.source === target.value.source) {\n\t\t\t// Close context menu, let browser open native context menu\n\t\t\tclose();\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\n\t\tactionCallback.value = onAction;\n\t\ttarget.value = menuTarget;\n\t\tposition.value = getMousePosition(event);\n\t\tisOpen.value = true;\n\n\t\tconst nodes = targetNodes.value;\n\t\tconst onlyStickies = nodes.every((node) => node.type === STICKY_NODE_TYPE);\n\t\tconst i18nOptions = {\n\t\t\tadjustToNumber: nodes.length,\n\t\t\tinterpolate: {\n\t\t\t\tsubject: onlyStickies\n\t\t\t\t\t? i18n.baseText('contextMenu.sticky', { adjustToNumber: nodes.length })\n\t\t\t\t\t: i18n.baseText('contextMenu.node', { adjustToNumber: nodes.length }),\n\t\t\t},\n\t\t};\n\n\t\tconst selectionActions = [\n\t\t\t{\n\t\t\t\tid: 'select_all',\n\t\t\t\tdivided: true,\n\t\t\t\tlabel: i18n.baseText('contextMenu.selectAll'),\n\t\t\t\tshortcut: { metaKey: true, keys: ['A'] },\n\t\t\t\tdisabled: nodes.length === workflowsStore.allNodes.length,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'deselect_all',\n\t\t\t\tlabel: i18n.baseText('contextMenu.deselectAll'),\n\t\t\t\tdisabled: nodes.length === 0,\n\t\t\t},\n\t\t];\n\n\t\tif (nodes.length === 0) {\n\t\t\tactions.value = [\n\t\t\t\t{\n\t\t\t\t\tid: 'add_node',\n\t\t\t\t\tshortcut: { keys: ['Tab'] },\n\t\t\t\t\tlabel: i18n.baseText('contextMenu.addNode'),\n\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'add_sticky',\n\t\t\t\t\tshortcut: { shiftKey: true, keys: ['s'] },\n\t\t\t\t\tlabel: i18n.baseText('contextMenu.addSticky'),\n\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t},\n\t\t\t\t...selectionActions,\n\t\t\t];\n\t\t} else {\n\t\t\tconst menuActions: ActionDropdownItem[] = [\n\t\t\t\t!onlyStickies && {\n\t\t\t\t\tid: 'toggle_activation',\n\t\t\t\t\tlabel: nodes.every((node) => node.disabled)\n\t\t\t\t\t\t? i18n.baseText('contextMenu.activate', i18nOptions)\n\t\t\t\t\t\t: i18n.baseText('contextMenu.deactivate', i18nOptions),\n\t\t\t\t\tshortcut: { keys: ['D'] },\n\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t},\n\t\t\t\t!onlyStickies && {\n\t\t\t\t\tid: 'toggle_pin',\n\t\t\t\t\tlabel: nodes.every((node) => hasPinData(node))\n\t\t\t\t\t\t? i18n.baseText('contextMenu.unpin', i18nOptions)\n\t\t\t\t\t\t: i18n.baseText('contextMenu.pin', i18nOptions),\n\t\t\t\t\tshortcut: { keys: ['p'] },\n\t\t\t\t\tdisabled: isReadOnly.value || !nodes.every((n) => usePinnedData(n).canPinNode(true)),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'copy',\n\t\t\t\t\tlabel: i18n.baseText('contextMenu.copy', i18nOptions),\n\t\t\t\t\tshortcut: { metaKey: true, keys: ['C'] },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'duplicate',\n\t\t\t\t\tlabel: i18n.baseText('contextMenu.duplicate', i18nOptions),\n\t\t\t\t\tshortcut: { metaKey: true, keys: ['D'] },\n\t\t\t\t\tdisabled: isReadOnly.value || !nodes.every(canDuplicateNode),\n\t\t\t\t},\n\t\t\t\t...selectionActions,\n\t\t\t\t{\n\t\t\t\t\tid: 'delete',\n\t\t\t\t\tdivided: true,\n\t\t\t\t\tlabel: i18n.baseText('contextMenu.delete', i18nOptions),\n\t\t\t\t\tshortcut: { keys: ['Del'] },\n\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t},\n\t\t\t].filter(Boolean) as ActionDropdownItem[];\n\n\t\t\tif (nodes.length === 1) {\n\t\t\t\tconst singleNodeActions = onlyStickies\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: 'open',\n\t\t\t\t\t\t\t\tlabel: i18n.baseText('contextMenu.editSticky'),\n\t\t\t\t\t\t\t\tshortcut: { keys: ['↵'] },\n\t\t\t\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: 'change_color',\n\t\t\t\t\t\t\t\tlabel: i18n.baseText('contextMenu.changeColor'),\n\t\t\t\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: 'open',\n\t\t\t\t\t\t\t\tlabel: i18n.baseText('contextMenu.open'),\n\t\t\t\t\t\t\t\tshortcut: { keys: ['↵'] },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: 'execute',\n\t\t\t\t\t\t\t\tlabel: i18n.baseText('contextMenu.test'),\n\t\t\t\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: 'rename',\n\t\t\t\t\t\t\t\tlabel: i18n.baseText('contextMenu.rename'),\n\t\t\t\t\t\t\t\tshortcut: { keys: ['F2'] },\n\t\t\t\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t];\n\t\t\t\t// Add actions only available for a single node\n\t\t\t\tmenuActions.unshift(...singleNodeActions);\n\t\t\t}\n\n\t\t\tactions.value = menuActions;\n\t\t}\n\t};\n\n\tconst _dispatchAction = (action: ContextMenuAction) => {\n\t\tactionCallback.value(action, targetNodes.value);\n\t};\n\n\twatch(\n\t\t() => uiStore.nodeViewOffsetPosition,\n\t\t() => {\n\t\t\tclose();\n\t\t},\n\t);\n\n\treturn {\n\t\tisOpen,\n\t\tposition,\n\t\ttarget,\n\t\tactions,\n\t\ttargetNodes,\n\t\topen,\n\t\tclose,\n\t\t_dispatchAction,\n\t};\n};\n","import type { INodeUi, XYPosition } from '@/Interface';\n\nimport { useDeviceSupport } from 'n8n-design-system';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { getMousePosition, getRelativePosition } from '@/utils/nodeViewUtils';\nimport { ref, onMounted, computed } from 'vue';\nimport { useCanvasStore } from '@/stores/canvas.store';\nimport { useContextMenu } from './useContextMenu';\n\ninterface ExtendedHTMLSpanElement extends HTMLSpanElement {\n\tx: number;\n\ty: number;\n}\n\nexport default function useCanvasMouseSelect() {\n\tconst selectActive = ref(false);\n\tconst selectBox = ref(document.createElement('span') as ExtendedHTMLSpanElement);\n\n\tconst { isTouchDevice, isCtrlKeyPressed } = useDeviceSupport();\n\tconst uiStore = useUIStore();\n\tconst canvasStore = useCanvasStore();\n\tconst workflowsStore = useWorkflowsStore();\n\tconst { isOpen: isContextMenuOpen } = useContextMenu();\n\n\tfunction _setSelectBoxStyle(styles: Record<string, string>) {\n\t\tObject.assign(selectBox.value.style, styles);\n\t}\n\n\tfunction _showSelectBox(event: MouseEvent) {\n\t\tconst [x, y] = getMousePositionWithinNodeView(event);\n\t\tselectBox.value = Object.assign(selectBox.value, { x, y });\n\n\t\t_setSelectBoxStyle({\n\t\t\tleft: selectBox.value.x + 'px',\n\t\t\ttop: selectBox.value.y + 'px',\n\t\t\tvisibility: 'visible',\n\t\t});\n\t\tselectActive.value = true;\n\t}\n\n\tfunction _updateSelectBox(event: MouseEvent) {\n\t\tconst selectionBox = _getSelectionBox(event);\n\n\t\t_setSelectBoxStyle({\n\t\t\tleft: selectionBox.x + 'px',\n\t\t\ttop: selectionBox.y + 'px',\n\t\t\twidth: selectionBox.width + 'px',\n\t\t\theight: selectionBox.height + 'px',\n\t\t});\n\t}\n\n\tfunction _hideSelectBox() {\n\t\tselectBox.value.x = 0;\n\t\tselectBox.value.y = 0;\n\n\t\t_setSelectBoxStyle({\n\t\t\tvisibility: 'hidden',\n\t\t\tleft: '0px',\n\t\t\ttop: '0px',\n\t\t\twidth: '0px',\n\t\t\theight: '0px',\n\t\t});\n\t\tselectActive.value = false;\n\t}\n\n\tfunction _getSelectionBox(event: MouseEvent) {\n\t\tconst [x, y] = getMousePositionWithinNodeView(event);\n\t\treturn {\n\t\t\tx: Math.min(x, selectBox.value.x),\n\t\t\ty: Math.min(y, selectBox.value.y),\n\t\t\twidth: Math.abs(x - selectBox.value.x),\n\t\t\theight: Math.abs(y - selectBox.value.y),\n\t\t};\n\t}\n\n\tfunction _getNodesInSelection(event: MouseEvent): INodeUi[] {\n\t\tconst returnNodes: INodeUi[] = [];\n\t\tconst selectionBox = _getSelectionBox(event);\n\n\t\t// Go through all nodes and check if they are selected\n\t\tworkflowsStore.allNodes.forEach((node: INodeUi) => {\n\t\t\t// TODO: Currently always uses the top left corner for checking. Should probably use the center instead\n\t\t\tif (\n\t\t\t\tnode.position[0] < selectionBox.x ||\n\t\t\t\tnode.position[0] > selectionBox.x + selectionBox.width\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tnode.position[1] < selectionBox.y ||\n\t\t\t\tnode.position[1] > selectionBox.y + selectionBox.height\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturnNodes.push(node);\n\t\t});\n\n\t\treturn returnNodes;\n\t}\n\n\tfunction _createSelectBox() {\n\t\tselectBox.value.id = 'select-box';\n\t\t_setSelectBoxStyle({\n\t\t\tmargin: '0px auto',\n\t\t\tborder: '2px dotted #FF0000',\n\t\t\t// Positioned absolutely within #node-view. This is consistent with how nodes are positioned.\n\t\t\tposition: 'absolute',\n\t\t\tzIndex: '100',\n\t\t\tvisibility: 'hidden',\n\t\t});\n\n\t\tselectBox.value.addEventListener('mouseup', mouseUpMouseSelect);\n\n\t\tconst nodeViewEl = document.querySelector('#node-view') as HTMLDivElement;\n\t\tnodeViewEl.appendChild(selectBox.value);\n\t}\n\n\tfunction _mouseMoveSelect(e: MouseEvent) {\n\t\tif (e.buttons === 0) {\n\t\t\t// Mouse button is not pressed anymore so stop selection mode\n\t\t\t// Happens normally when mouse leave the view pressed and then\n\t\t\t// comes back unpressed.\n\t\t\tmouseUpMouseSelect(e);\n\t\t\treturn;\n\t\t}\n\n\t\t_updateSelectBox(e);\n\t}\n\n\tfunction mouseUpMouseSelect(e: MouseEvent) {\n\t\t// Ignore right-click\n\t\tif (e.button === 2 || isContextMenuOpen.value) return;\n\n\t\tif (!selectActive.value) {\n\t\t\tif (isTouchDevice && e.target instanceof HTMLElement) {\n\t\t\t\tif (e.target && e.target.id.includes('node-view')) {\n\t\t\t\t\t// Deselect all nodes\n\t\t\t\t\tdeselectAllNodes();\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If it is not active return directly.\n\t\t\t// Else normal node dragging will not work.\n\t\t\treturn;\n\t\t}\n\t\tdocument.removeEventListener('mousemove', _mouseMoveSelect);\n\n\t\t// Deselect all nodes\n\t\tdeselectAllNodes();\n\n\t\t// Select the nodes which are in the selection box\n\t\tconst selectedNodes = _getNodesInSelection(e);\n\t\tselectedNodes.forEach((node) => {\n\t\t\tnodeSelected(node);\n\t\t});\n\n\t\tif (selectedNodes.length === 1) {\n\t\t\tuiStore.lastSelectedNode = selectedNodes[0].name;\n\t\t}\n\n\t\t_hideSelectBox();\n\t}\n\tfunction mouseDownMouseSelect(e: MouseEvent, moveButtonPressed: boolean) {\n\t\tif (isCtrlKeyPressed(e) || moveButtonPressed || e.button === 2) {\n\t\t\t// We only care about it when the ctrl key is not pressed at the same time.\n\t\t\t// So we exit when it is pressed.\n\t\t\treturn;\n\t\t}\n\n\t\tif (uiStore.isActionActive('dragActive')) {\n\t\t\t// If a node does currently get dragged we do not activate the selection\n\t\t\treturn;\n\t\t}\n\t\t_showSelectBox(e);\n\n\t\t// Leave like this.\n\t\t// Do not add an anonymous function because then remove would not work anymore\n\t\tdocument.addEventListener('mousemove', _mouseMoveSelect);\n\t}\n\n\tfunction getMousePositionWithinNodeView(event: MouseEvent | TouchEvent): XYPosition {\n\t\tconst mousePosition = getMousePosition(event);\n\n\t\tconst [relativeX, relativeY] = canvasStore.canvasPositionFromPagePosition(mousePosition);\n\t\tconst nodeViewScale = canvasStore.nodeViewScale;\n\t\tconst nodeViewOffsetPosition = uiStore.nodeViewOffsetPosition;\n\n\t\treturn getRelativePosition(relativeX, relativeY, nodeViewScale, nodeViewOffsetPosition);\n\t}\n\n\tfunction nodeDeselected(node: INodeUi) {\n\t\tuiStore.removeNodeFromSelection(node);\n\t\tinstance.value.removeFromDragSelection(instance.value.getManagedElement(node?.id));\n\t}\n\n\tfunction nodeSelected(node: INodeUi) {\n\t\tuiStore.addSelectedNode(node);\n\t\tinstance.value.addToDragSelection(instance.value.getManagedElement(node?.id));\n\t}\n\n\tfunction deselectAllNodes() {\n\t\tinstance.value.clearDragSelection();\n\t\tuiStore.resetSelectedNodes();\n\t\tuiStore.lastSelectedNode = null;\n\t\tuiStore.lastSelectedNodeOutputIndex = null;\n\n\t\tcanvasStore.lastSelectedConnection = null;\n\t\tcanvasStore.newNodeInsertPosition = null;\n\t}\n\n\tconst instance = computed(() => canvasStore.jsPlumbInstance);\n\n\tonMounted(() => {\n\t\t_createSelectBox();\n\t});\n\n\treturn {\n\t\tselectActive,\n\t\tgetMousePositionWithinNodeView,\n\t\tmouseUpMouseSelect,\n\t\tmouseDownMouseSelect,\n\t\tnodeDeselected,\n\t\tnodeSelected,\n\t\tdeselectAllNodes,\n\t};\n}\n","import { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\n\nexport function useUniqueNodeName() {\n\t/**\n\t * All in-store node name defaults ending with a number, e.g.\n\t * `AWS S3`, `Magento 2`, `MSG91`, `S3`, `SIGNL4`, `sms77`\n\t */\n\tfunction numberSuffixedNames() {\n\t\treturn useNodeTypesStore().allNodeTypes.reduce<string[]>((acc, nodeType) => {\n\t\t\tif (typeof nodeType.defaults.name !== 'string') {\n\t\t\t\tthrow new Error('Expected node name default to be a string');\n\t\t\t}\n\n\t\t\tif (/\\d$/.test(nodeType.defaults.name)) acc.push(nodeType.defaults.name);\n\n\t\t\treturn acc;\n\t\t}, []);\n\t}\n\n\t/**\n\t * Create a unique node name from an original name, based on the names of\n\t * all nodes on canvas and any extra names that cannot be used.\n\t */\n\tfunction uniqueNodeName(originalName: string, extraNames: string[] = []) {\n\t\tconst { canvasNames } = useWorkflowsStore();\n\n\t\tconst isUnique = !canvasNames.has(originalName) && !extraNames.includes(originalName);\n\n\t\tif (isUnique) return originalName;\n\n\t\tconst nsn = numberSuffixedNames().find((nsn) => originalName.startsWith(nsn));\n\n\t\t// edge case, number suffix as part of name: S3 -> S31 -> S32\n\n\t\tif (nsn) {\n\t\t\tlet unique = '';\n\t\t\tlet index = 1;\n\n\t\t\tconst remainder = originalName.split(nsn).pop();\n\n\t\t\tconst lastChar = remainder?.[remainder.length - 1];\n\n\t\t\tif (lastChar && Number.isInteger(Number(lastChar))) {\n\t\t\t\tindex = parseInt(lastChar, 10);\n\t\t\t\toriginalName = originalName.slice(0, -1);\n\t\t\t}\n\n\t\t\tunique = originalName;\n\n\t\t\twhile (canvasNames.has(unique) || extraNames.includes(unique)) {\n\t\t\t\tunique = originalName + index++;\n\t\t\t}\n\n\t\t\treturn unique;\n\t\t}\n\n\t\t// edge case, all-number name: 123 -> 123-1 -> 123-2\n\n\t\tif (/^\\d+-?\\d*$/.test(originalName)) {\n\t\t\tlet unique = '';\n\t\t\tlet index = 1;\n\n\t\t\tconst match = originalName.match(/(?<base>\\d+)-?(?<suffix>\\d*)/);\n\n\t\t\tif (!match?.groups) {\n\t\t\t\tthrow new Error('Failed to find match for unique name');\n\t\t\t}\n\n\t\t\tif (match?.groups?.suffix !== '') {\n\t\t\t\tindex = parseInt(match.groups.suffix, 10);\n\t\t\t}\n\n\t\t\tunique = match.groups.base;\n\n\t\t\twhile (canvasNames.has(unique) || extraNames.includes(unique)) {\n\t\t\t\tunique = match.groups.base + '-' + index++;\n\t\t\t}\n\n\t\t\treturn unique;\n\t\t}\n\n\t\t// normal case: A -> A1 -> A2\n\n\t\tlet unique = '';\n\t\tlet index = 1;\n\n\t\tconst match = originalName.match(/(?<base>.*\\D+)(?<suffix>\\d*)/);\n\n\t\tif (!match?.groups) {\n\t\t\tthrow new Error('Failed to find match for unique name');\n\t\t}\n\n\t\tif (match?.groups?.suffix !== '') {\n\t\t\tindex = parseInt(match.groups.suffix, 10);\n\t\t}\n\n\t\tunique = match.groups.base;\n\n\t\twhile (canvasNames.has(unique) || extraNames.includes(unique)) {\n\t\t\tunique = match.groups.base + index++;\n\t\t}\n\n\t\treturn unique;\n\t}\n\n\treturn { uniqueNodeName };\n}\n","<template>\n\t<span :class=\"$style.container\" data-test-id=\"node-title-container\" @click=\"onEdit\">\n\t\t<span :class=\"$style.iconWrapper\">\n\t\t\t<NodeIcon :node-type=\"nodeType\" :size=\"18\" />\n\t\t</span>\n\t\t<n8n-popover placement=\"right\" width=\"200\" :visible=\"editName\" :disabled=\"!editable\">\n\t\t\t<div\n\t\t\t\t:class=\"$style.editContainer\"\n\t\t\t\t@keydown.enter=\"onRename\"\n\t\t\t\t@keydown.stop\n\t\t\t\t@keydown.esc=\"editName = false\"\n\t\t\t>\n\t\t\t\t<n8n-text :bold=\"true\" color=\"text-base\" tag=\"div\">{{\n\t\t\t\t\t$locale.baseText('ndv.title.renameNode')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-input ref=\"input\" v-model=\"newName\" size=\"small\" data-test-id=\"node-rename-input\" />\n\t\t\t\t<div :class=\"$style.editButtons\">\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t:label=\"$locale.baseText('ndv.title.cancel')\"\n\t\t\t\t\t\t@click=\"editName = false\"\n\t\t\t\t\t/>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t:label=\"$locale.baseText('ndv.title.rename')\"\n\t\t\t\t\t\t@click=\"onRename\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<template #reference>\n\t\t\t\t<div :class=\"{ [$style.title]: true, [$style.hoverable]: editable }\">\n\t\t\t\t\t{{ modelValue }}\n\t\t\t\t\t<div :class=\"$style.editIconContainer\">\n\t\t\t\t\t\t<font-awesome-icon v-if=\"editable\" :class=\"$style.editIcon\" icon=\"pencil-alt\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t</n8n-popover>\n\t</span>\n</template>\n\n<script setup lang=\"ts\">\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport { computed, nextTick, ref } from 'vue';\n\ntype Props = {\n\tmodelValue: string;\n\tnodeType?: INodeTypeDescription;\n\treadOnly?: boolean;\n};\n\nconst props = withDefaults(defineProps<Props>(), {\n\tmodelValue: '',\n\tnodeType: undefined,\n\treadOnly: false,\n});\nconst emit = defineEmits<{\n\t(event: 'update:model-value', value: string): void;\n}>();\nconst editName = ref(false);\nconst newName = ref('');\nconst input = ref<HTMLInputElement>();\n\nconst editable = computed(() => !props.readOnly && window === window.parent);\n\nasync function onEdit() {\n\tnewName.value = props.modelValue;\n\teditName.value = true;\n\tawait nextTick();\n\tif (input.value) {\n\t\tinput.value.focus();\n\t}\n}\n\nfunction onRename() {\n\tif (newName.value.trim() !== '') {\n\t\temit('update:model-value', newName.value.trim());\n\t}\n\n\teditName.value = false;\n}\n</script>\n\n<style lang=\"scss\" module>\n.container {\n\tfont-weight: var(--font-weight-bold);\n\tdisplay: flex;\n\tfont-size: var(--font-size-m);\n\tline-height: var(--font-line-height-compact);\n\toverflow-wrap: anywhere;\n\tpadding-right: var(--spacing-s);\n\toverflow: hidden;\n}\n\n.title {\n\tmax-height: 100px;\n\tdisplay: -webkit-box;\n\t-webkit-line-clamp: 5;\n\t-webkit-box-orient: vertical;\n\tcolor: var(--color-text-dark);\n}\n\n.hoverable {\n\t&:hover {\n\t\tcursor: pointer;\n\t\t.editIcon {\n\t\t\tdisplay: inline-block;\n\t\t}\n\t}\n}\n\n.iconWrapper {\n\tdisplay: inline-flex;\n\tmargin-right: var(--spacing-2xs);\n}\n\n.editIcon {\n\tdisplay: none;\n\tfont-size: var(--font-size-xs);\n\tcolor: var(--color-text-base);\n\tposition: absolute;\n\tbottom: 0;\n}\n\n.editIconContainer {\n\tdisplay: inline-block;\n\tposition: relative;\n\twidth: 0;\n}\n\n.editButtons {\n\ttext-align: right;\n\tmargin-top: var(--spacing-s);\n\n\t> * {\n\t\tmargin-left: var(--spacing-4xs);\n\t}\n}\n\n.editContainer {\n\ttext-align: left;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-4xs);\n\t}\n}\n</style>\n","<template>\n\t<N8nTabs\n\t\t:options=\"options\"\n\t\t:model-value=\"modelValue\"\n\t\t@update:model-value=\"onTabSelect\"\n\t\t@tooltip-click=\"onTooltipClick\"\n\t/>\n</template>\n\n<script setup lang=\"ts\">\nimport type { ITab } from '@/Interface';\nimport {\n\tBUILTIN_NODES_DOCS_URL,\n\tCOMMUNITY_NODES_INSTALLATION_DOCS_URL,\n\tNPM_PACKAGE_DOCS_BASE_URL,\n} from '@/constants';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport { NodeConnectionType } from 'n8n-workflow';\nimport { computed } from 'vue';\n\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { useI18n } from '@/composables/useI18n';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport { isCommunityPackageName } from '@/utils/nodeTypesUtils';\n\ntype Tab = 'settings' | 'params';\ntype Props = {\n\tmodelValue?: Tab;\n\tnodeType?: INodeTypeDescription;\n\tpushRef?: string;\n};\n\nconst props = withDefaults(defineProps<Props>(), {\n\tmodelValue: 'params',\n\tnodeType: undefined,\n\tpushRef: '',\n});\nconst emit = defineEmits<{\n\t(event: 'update:model-value', tab: Tab): void;\n}>();\n\nconst externalHooks = useExternalHooks();\nconst ndvStore = useNDVStore();\nconst workflowsStore = useWorkflowsStore();\nconst i18n = useI18n();\nconst telemetry = useTelemetry();\n\nconst activeNode = computed(() => ndvStore.activeNode);\n\nconst isCommunityNode = computed(() => {\n\tconst nodeType = props.nodeType;\n\tif (nodeType) {\n\t\treturn isCommunityPackageName(nodeType.name);\n\t}\n\treturn false;\n});\n\nconst packageName = computed(() => props.nodeType?.name.split('.')[0] ?? '');\n\nconst documentationUrl = computed(() => {\n\tconst nodeType = props.nodeType;\n\n\tif (!nodeType) {\n\t\treturn '';\n\t}\n\n\tif (nodeType.documentationUrl && nodeType.documentationUrl.startsWith('http')) {\n\t\treturn nodeType.documentationUrl;\n\t}\n\n\tconst utmParams = new URLSearchParams({\n\t\tutm_source: 'n8n_app',\n\t\tutm_medium: 'node_settings_modal-credential_link',\n\t\tutm_campaign: nodeType.name,\n\t});\n\n\t// Built-in node documentation available via its codex entry\n\tconst primaryDocUrl = nodeType.codex?.resources?.primaryDocumentation?.[0]?.url;\n\tif (primaryDocUrl) {\n\t\treturn `${primaryDocUrl}?${utmParams.toString()}`;\n\t}\n\n\tif (isCommunityNode.value) {\n\t\treturn `${NPM_PACKAGE_DOCS_BASE_URL}${packageName.value}`;\n\t}\n\n\t// Fallback to the root of the node documentation\n\treturn `${BUILTIN_NODES_DOCS_URL}?${utmParams.toString()}`;\n});\n\nconst options = computed<ITab[]>(() => {\n\tconst options: ITab[] = [\n\t\t{\n\t\t\tlabel: i18n.baseText('nodeSettings.parameters'),\n\t\t\tvalue: 'params',\n\t\t},\n\t\t{\n\t\t\tlabel: i18n.baseText('nodeSettings.settings'),\n\t\t\tvalue: 'settings',\n\t\t},\n\t];\n\n\tif (isCommunityNode.value) {\n\t\toptions.push({\n\t\t\ticon: 'cube',\n\t\t\tvalue: 'communityNode',\n\t\t\talign: 'right',\n\t\t\ttooltip: i18n.baseText('generic.communityNode.tooltip', {\n\t\t\t\tinterpolate: {\n\t\t\t\t\tdocUrl: COMMUNITY_NODES_INSTALLATION_DOCS_URL,\n\t\t\t\t\tpackageName: packageName.value,\n\t\t\t\t},\n\t\t\t}),\n\t\t});\n\t}\n\n\tif (documentationUrl.value) {\n\t\toptions.push({\n\t\t\tlabel: i18n.baseText('nodeSettings.docs'),\n\t\t\tvalue: 'docs',\n\t\t\thref: documentationUrl.value,\n\t\t\talign: 'right',\n\t\t});\n\t}\n\n\treturn options;\n});\n\nfunction onTabSelect(tab: string) {\n\tif (tab === 'docs' && props.nodeType) {\n\t\tvoid externalHooks.run('dataDisplay.onDocumentationUrlClick', {\n\t\t\tnodeType: props.nodeType,\n\t\t\tdocumentationUrl: documentationUrl.value,\n\t\t});\n\n\t\ttelemetry.track('User clicked ndv link', {\n\t\t\tnode_type: activeNode.value?.type,\n\t\t\tworkflow_id: workflowsStore.workflowId,\n\t\t\tpush_ref: props.pushRef,\n\t\t\tpane: NodeConnectionType.Main,\n\t\t\ttype: 'docs',\n\t\t});\n\t}\n\n\tif (tab === 'settings' && props.nodeType) {\n\t\ttelemetry.track('User viewed node settings', {\n\t\t\tnode_type: props.nodeType.name,\n\t\t\tworkflow_id: workflowsStore.workflowId,\n\t\t});\n\t}\n\n\tif (tab === 'settings' || tab === 'params') {\n\t\temit('update:model-value', tab);\n\t}\n}\n\nfunction onTooltipClick(tab: string, event: MouseEvent) {\n\tif (tab === 'communityNode' && (event.target as Element).localName === 'a') {\n\t\ttelemetry.track('user clicked cnr docs link', { source: 'node details view' });\n\t}\n}\n</script>\n\n<style lang=\"scss\">\n#communityNode > div {\n\tcursor: auto;\n\tpadding-right: 0;\n\tpadding-left: 0;\n\n\t&:hover {\n\t\tcolor: unset;\n\t}\n}\n</style>\n","<template>\n\t<div v-if=\"webhooksNode.length && visibleWebhookUrls.length > 0\" class=\"webhooks\">\n\t\t<div\n\t\t\tclass=\"clickable headline\"\n\t\t\t:class=\"{ expanded: !isMinimized }\"\n\t\t\t:title=\"isMinimized ? baseText.clickToDisplay : baseText.clickToHide\"\n\t\t\t@click=\"isMinimized = !isMinimized\"\n\t\t>\n\t\t\t<font-awesome-icon icon=\"angle-right\" class=\"minimize-button minimize-icon\" />\n\t\t\t{{ baseText.toggleTitle }}\n\t\t</div>\n\t\t<el-collapse-transition>\n\t\t\t<div v-if=\"!isMinimized\" class=\"node-webhooks\">\n\t\t\t\t<div v-if=\"!isProductionOnly\" class=\"url-selection\">\n\t\t\t\t\t<el-row>\n\t\t\t\t\t\t<el-col :span=\"24\">\n\t\t\t\t\t\t\t<n8n-radio-buttons v-model=\"showUrlFor\" :options=\"urlOptions\" />\n\t\t\t\t\t\t</el-col>\n\t\t\t\t\t</el-row>\n\t\t\t\t</div>\n\n\t\t\t\t<n8n-tooltip\n\t\t\t\t\tv-for=\"(webhook, index) in visibleWebhookUrls\"\n\t\t\t\t\t:key=\"index\"\n\t\t\t\t\tclass=\"item\"\n\t\t\t\t\t:content=\"baseText.clickToCopy\"\n\t\t\t\t\tplacement=\"left\"\n\t\t\t\t>\n\t\t\t\t\t<div v-if=\"isWebhookMethodVisible(webhook)\" class=\"webhook-wrapper\">\n\t\t\t\t\t\t<div class=\"http-field\">\n\t\t\t\t\t\t\t<div class=\"http-method\">{{ getWebhookHttpMethod(webhook) }}<br /></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"url-field\">\n\t\t\t\t\t\t\t<div class=\"webhook-url left-ellipsis clickable\" @click=\"copyWebhookUrl(webhook)\">\n\t\t\t\t\t\t\t\t{{ getWebhookUrlDisplay(webhook) }}<br />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-else class=\"webhook-wrapper\">\n\t\t\t\t\t\t<div class=\"url-field-full-width\">\n\t\t\t\t\t\t\t<div class=\"webhook-url left-ellipsis clickable\" @click=\"copyWebhookUrl(webhook)\">\n\t\t\t\t\t\t\t\t{{ getWebhookUrlDisplay(webhook) }}<br />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</div>\n\t\t</el-collapse-transition>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { INodeTypeDescription, IWebhookDescription } from 'n8n-workflow';\nimport { defineComponent } from 'vue';\n\nimport { useToast } from '@/composables/useToast';\nimport {\n\tCHAT_TRIGGER_NODE_TYPE,\n\tFORM_TRIGGER_NODE_TYPE,\n\tOPEN_URL_PANEL_TRIGGER_NODE_TYPES,\n\tPRODUCTION_ONLY_TRIGGER_NODE_TYPES,\n} from '@/constants';\nimport { useClipboard } from '@/composables/useClipboard';\nimport { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';\nimport { useRouter } from 'vue-router';\n\nexport default defineComponent({\n\tname: 'NodeWebhooks',\n\tprops: [\n\t\t'node', // NodeUi\n\t\t'nodeType', // INodeTypeDescription\n\t],\n\tsetup() {\n\t\tconst router = useRouter();\n\t\tconst clipboard = useClipboard();\n\t\tconst workflowHelpers = useWorkflowHelpers({ router });\n\t\treturn {\n\t\t\tclipboard,\n\t\t\tworkflowHelpers,\n\t\t\t...useToast(),\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisMinimized: this.nodeType && !OPEN_URL_PANEL_TRIGGER_NODE_TYPES.includes(this.nodeType.name),\n\t\t\tshowUrlFor: 'test',\n\t\t};\n\t},\n\tcomputed: {\n\t\tisProductionOnly(): boolean {\n\t\t\treturn this.nodeType && PRODUCTION_ONLY_TRIGGER_NODE_TYPES.includes(this.nodeType.name);\n\t\t},\n\t\turlOptions(): Array<{ label: string; value: string }> {\n\t\t\treturn [\n\t\t\t\t...(this.isProductionOnly ? [] : [{ label: this.baseText.testUrl, value: 'test' }]),\n\t\t\t\t{\n\t\t\t\t\tlabel: this.baseText.productionUrl,\n\t\t\t\t\tvalue: 'production',\n\t\t\t\t},\n\t\t\t];\n\t\t},\n\t\tvisibleWebhookUrls(): IWebhookDescription[] {\n\t\t\treturn this.webhooksNode.filter((webhook) => {\n\t\t\t\tif (typeof webhook.ndvHideUrl === 'string') {\n\t\t\t\t\treturn !this.workflowHelpers.getWebhookExpressionValue(webhook, 'ndvHideUrl');\n\t\t\t\t}\n\n\t\t\t\treturn !webhook.ndvHideUrl;\n\t\t\t});\n\t\t},\n\t\twebhooksNode(): IWebhookDescription[] {\n\t\t\tif (this.nodeType === null || this.nodeType.webhooks === undefined) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn (this.nodeType as INodeTypeDescription).webhooks!.filter(\n\t\t\t\t(webhookData) => webhookData.restartWebhook !== true,\n\t\t\t);\n\t\t},\n\t\tbaseText() {\n\t\t\tconst nodeType = this.nodeType.name;\n\t\t\tswitch (nodeType) {\n\t\t\t\tcase CHAT_TRIGGER_NODE_TYPE:\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttoggleTitle: this.$locale.baseText('nodeWebhooks.webhookUrls.chatTrigger'),\n\t\t\t\t\t\tclickToDisplay: this.$locale.baseText(\n\t\t\t\t\t\t\t'nodeWebhooks.clickToDisplayWebhookUrls.formTrigger',\n\t\t\t\t\t\t),\n\t\t\t\t\t\tclickToHide: this.$locale.baseText('nodeWebhooks.clickToHideWebhookUrls.chatTrigger'),\n\t\t\t\t\t\tclickToCopy: this.$locale.baseText('nodeWebhooks.clickToCopyWebhookUrls.chatTrigger'),\n\t\t\t\t\t\ttestUrl: this.$locale.baseText('nodeWebhooks.testUrl'),\n\t\t\t\t\t\tproductionUrl: this.$locale.baseText('nodeWebhooks.productionUrl'),\n\t\t\t\t\t\tcopyTitle: this.$locale.baseText('nodeWebhooks.showMessage.title.chatTrigger'),\n\t\t\t\t\t\tcopyMessage: this.$locale.baseText('nodeWebhooks.showMessage.message.chatTrigger'),\n\t\t\t\t\t};\n\n\t\t\t\tcase FORM_TRIGGER_NODE_TYPE:\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttoggleTitle: this.$locale.baseText('nodeWebhooks.webhookUrls.formTrigger'),\n\t\t\t\t\t\tclickToDisplay: this.$locale.baseText(\n\t\t\t\t\t\t\t'nodeWebhooks.clickToDisplayWebhookUrls.formTrigger',\n\t\t\t\t\t\t),\n\t\t\t\t\t\tclickToHide: this.$locale.baseText('nodeWebhooks.clickToHideWebhookUrls.formTrigger'),\n\t\t\t\t\t\tclickToCopy: this.$locale.baseText('nodeWebhooks.clickToCopyWebhookUrls.formTrigger'),\n\t\t\t\t\t\ttestUrl: this.$locale.baseText('nodeWebhooks.testUrl'),\n\t\t\t\t\t\tproductionUrl: this.$locale.baseText('nodeWebhooks.productionUrl'),\n\t\t\t\t\t\tcopyTitle: this.$locale.baseText('nodeWebhooks.showMessage.title.formTrigger'),\n\t\t\t\t\t\tcopyMessage: this.$locale.baseText('nodeWebhooks.showMessage.message.formTrigger'),\n\t\t\t\t\t};\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttoggleTitle: this.$locale.baseText('nodeWebhooks.webhookUrls'),\n\t\t\t\t\t\tclickToDisplay: this.$locale.baseText('nodeWebhooks.clickToDisplayWebhookUrls'),\n\t\t\t\t\t\tclickToHide: this.$locale.baseText('nodeWebhooks.clickToHideWebhookUrls'),\n\t\t\t\t\t\tclickToCopy: this.$locale.baseText('nodeWebhooks.clickToCopyWebhookUrls'),\n\t\t\t\t\t\ttestUrl: this.$locale.baseText('nodeWebhooks.testUrl'),\n\t\t\t\t\t\tproductionUrl: this.$locale.baseText('nodeWebhooks.productionUrl'),\n\t\t\t\t\t\tcopyTitle: this.$locale.baseText('nodeWebhooks.showMessage.title'),\n\t\t\t\t\t\tcopyMessage: undefined,\n\t\t\t\t\t};\n\t\t\t}\n\t\t},\n\t},\n\twatch: {\n\t\tnode() {\n\t\t\tthis.isMinimized = !OPEN_URL_PANEL_TRIGGER_NODE_TYPES.includes(this.nodeType.name);\n\t\t},\n\t},\n\tmethods: {\n\t\tcopyWebhookUrl(webhookData: IWebhookDescription): void {\n\t\t\tconst webhookUrl = this.getWebhookUrlDisplay(webhookData);\n\t\t\tvoid this.clipboard.copy(webhookUrl);\n\n\t\t\tthis.showMessage({\n\t\t\t\ttitle: this.baseText.copyTitle,\n\t\t\t\tmessage: this.baseText.copyMessage,\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t\tthis.$telemetry.track('User copied webhook URL', {\n\t\t\t\tpane: 'parameters',\n\t\t\t\ttype: `${this.showUrlFor} url`,\n\t\t\t});\n\t\t},\n\t\tgetWebhookUrlDisplay(webhookData: IWebhookDescription): string {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.workflowHelpers.getWebhookUrl(\n\t\t\t\t\twebhookData,\n\t\t\t\t\tthis.node,\n\t\t\t\t\tthis.isProductionOnly ? 'production' : this.showUrlFor,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn '';\n\t\t},\n\t\tisWebhookMethodVisible(webhook: IWebhookDescription): boolean {\n\t\t\ttry {\n\t\t\t\tconst method = this.workflowHelpers.getWebhookExpressionValue(webhook, 'httpMethod', false);\n\t\t\t\tif (Array.isArray(method) && method.length !== 1) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} catch (error) {}\n\n\t\t\tif (typeof webhook.ndvHideMethod === 'string') {\n\t\t\t\treturn !this.workflowHelpers.getWebhookExpressionValue(webhook, 'ndvHideMethod');\n\t\t\t}\n\n\t\t\treturn !webhook.ndvHideMethod;\n\t\t},\n\n\t\tgetWebhookHttpMethod(webhook: IWebhookDescription): string {\n\t\t\tconst method = this.workflowHelpers.getWebhookExpressionValue(webhook, 'httpMethod', false);\n\t\t\tif (Array.isArray(method)) {\n\t\t\t\treturn method[0];\n\t\t\t}\n\t\t\treturn method;\n\t\t},\n\t},\n});\n</script>\n\n<style scoped lang=\"scss\">\n.webhooks {\n\tpadding-bottom: var(--spacing-xs);\n\tmargin: var(--spacing-xs) 0;\n\tborder-bottom: 1px solid var(--color-text-lighter);\n\n\t.headline {\n\t\tcolor: $color-primary;\n\t\tfont-weight: 600;\n\t\tfont-size: var(--font-size-2xs);\n\t}\n}\n\n.http-field {\n\tposition: absolute;\n\twidth: 50px;\n\tdisplay: inline-block;\n\ttop: calc(50% - 8px);\n}\n\n.http-method {\n\tbackground-color: var(--color-foreground-xdark);\n\twidth: 40px;\n\theight: 16px;\n\tline-height: 16px;\n\tmargin-left: 5px;\n\ttext-align: center;\n\tborder-radius: 2px;\n\tfont-size: var(--font-size-2xs);\n\tfont-weight: var(--font-weight-bold);\n\tcolor: var(--color-foreground-xlight);\n}\n\n.minimize-icon {\n\tfont-size: 1.3em;\n\tmargin-right: 0.5em;\n}\n\n.mode-selection-headline {\n\tline-height: 1.8em;\n}\n\n.node-webhooks {\n\tmargin-left: 1em;\n}\n\n.url-field {\n\tdisplay: inline-block;\n\twidth: calc(100% - 60px);\n\tmargin-left: 55px;\n}\n.url-field-full-width {\n\tdisplay: inline-block;\n\tmargin: 5px 10px;\n}\n\n.url-selection {\n\tmargin-top: var(--spacing-xs);\n}\n\n.minimize-button {\n\tdisplay: inline-block;\n\t-webkit-transition-duration: 0.5s;\n\t-moz-transition-duration: 0.5s;\n\t-o-transition-duration: 0.5s;\n\ttransition-duration: 0.5s;\n\n\t-webkit-transition-property: -webkit-transform;\n\t-moz-transition-property: -moz-transform;\n\t-o-transition-property: -o-transform;\n\ttransition-property: transform;\n}\n.expanded .minimize-button {\n\t-webkit-transform: rotate(90deg);\n\t-moz-transform: rotate(90deg);\n\t-o-transform: rotate(90deg);\n\ttransform: rotate(90deg);\n}\n\n.webhook-url {\n\tposition: relative;\n\ttop: 0;\n\twidth: 100%;\n\tfont-size: var(--font-size-2xs);\n\twhite-space: normal;\n\toverflow: visible;\n\ttext-overflow: initial;\n\tcolor: var(--color-text-dark);\n\ttext-align: left;\n\tdirection: ltr;\n\tword-break: break-all;\n}\n\n.webhook-wrapper {\n\tline-height: 1.5;\n\tposition: relative;\n\tmargin-top: var(--spacing-xs);\n\tbackground-color: var(--color-foreground-xlight);\n\tborder-radius: 3px;\n}\n</style>\n","<template>\n\t<div :class=\"$style.container\">\n\t\t<div\n\t\t\t:class=\"$style.connections\"\n\t\t\t:style=\"`--possible-connections: ${possibleConnections.length}`\"\n\t\t>\n\t\t\t<div\n\t\t\t\tv-for=\"connection in possibleConnections\"\n\t\t\t\t:key=\"connection.type\"\n\t\t\t\t:data-test-id=\"`subnode-connection-group-${connection.type}`\"\n\t\t\t>\n\t\t\t\t<div :class=\"$style.connectionType\">\n\t\t\t\t\t<span\n\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t[$style.connectionLabel]: true,\n\t\t\t\t\t\t\t[$style.hasIssues]: hasInputIssues(connection.type),\n\t\t\t\t\t\t}\"\n\t\t\t\t\t\tv-text=\"`${connection.displayName}${connection.required ? ' *' : ''}`\"\n\t\t\t\t\t/>\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-on-click-outside=\"() => expandConnectionGroup(connection.type, false)\"\n\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t[$style.connectedNodesWrapper]: true,\n\t\t\t\t\t\t\t[$style.connectedNodesWrapperExpanded]: expandedGroups.includes(connection.type),\n\t\t\t\t\t\t}\"\n\t\t\t\t\t\t:style=\"`--nodes-length: ${connectedNodes[connection.type].length}`\"\n\t\t\t\t\t\t@click=\"expandConnectionGroup(connection.type, true)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"\n\t\t\t\t\t\t\t\tconnectedNodes[connection.type].length >= 1 ? connection.maxConnections !== 1 : true\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t\t[$style.plusButton]: true,\n\t\t\t\t\t\t\t\t[$style.hasIssues]: hasInputIssues(connection.type),\n\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t@click=\"onPlusClick(connection.type)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<n8n-tooltip\n\t\t\t\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t\t\t\t:teleported=\"true\"\n\t\t\t\t\t\t\t\t:offset=\"10\"\n\t\t\t\t\t\t\t\t:show-after=\"300\"\n\t\t\t\t\t\t\t\t:disabled=\"\n\t\t\t\t\t\t\t\t\tshouldShowConnectionTooltip(connection.type) &&\n\t\t\t\t\t\t\t\t\tconnectedNodes[connection.type].length >= 1\n\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t\t\tAdd {{ connection.displayName }}\n\t\t\t\t\t\t\t\t\t<template v-if=\"hasInputIssues(connection.type)\">\n\t\t\t\t\t\t\t\t\t\t<TitledList\n\t\t\t\t\t\t\t\t\t\t\t:title=\"`${$locale.baseText('node.issues')}:`\"\n\t\t\t\t\t\t\t\t\t\t\t:items=\"nodeInputIssues[connection.type]\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t<n8n-icon-button\n\t\t\t\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\t\t\t\ticon=\"plus\"\n\t\t\t\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\t\t\t\t:data-test-id=\"`add-subnode-${connection.type}`\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"connectedNodes[connection.type].length > 0\"\n\t\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t\t[$style.connectedNodes]: true,\n\t\t\t\t\t\t\t\t[$style.connectedNodesMultiple]: connectedNodes[connection.type].length > 1,\n\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tv-for=\"(node, index) in connectedNodes[connection.type]\"\n\t\t\t\t\t\t\t\t:key=\"node.node.name\"\n\t\t\t\t\t\t\t\t:class=\"{ [$style.nodeWrapper]: true, [$style.hasIssues]: node.issues }\"\n\t\t\t\t\t\t\t\tdata-test-id=\"floating-subnode\"\n\t\t\t\t\t\t\t\t:data-node-name=\"node.node.name\"\n\t\t\t\t\t\t\t\t:style=\"`--node-index: ${index}`\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<n8n-tooltip\n\t\t\t\t\t\t\t\t\t:key=\"node.node.name\"\n\t\t\t\t\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t\t\t\t\t:teleported=\"true\"\n\t\t\t\t\t\t\t\t\t:offset=\"10\"\n\t\t\t\t\t\t\t\t\t:show-after=\"300\"\n\t\t\t\t\t\t\t\t\t:disabled=\"shouldShowConnectionTooltip(connection.type)\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t\t\t\t{{ node.node.name }}\n\t\t\t\t\t\t\t\t\t\t<template v-if=\"node.issues\">\n\t\t\t\t\t\t\t\t\t\t\t<TitledList\n\t\t\t\t\t\t\t\t\t\t\t\t:title=\"`${$locale.baseText('node.issues')}:`\"\n\t\t\t\t\t\t\t\t\t\t\t\t:items=\"node.issues\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t\t</template>\n\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t:class=\"$style.connectedNode\"\n\t\t\t\t\t\t\t\t\t\t@click=\"onNodeClick(node.node.name, connection.type)\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<NodeIcon\n\t\t\t\t\t\t\t\t\t\t\t:node-type=\"node.nodeType\"\n\t\t\t\t\t\t\t\t\t\t\t:node-name=\"node.node.name\"\n\t\t\t\t\t\t\t\t\t\t\ttooltip-position=\"top\"\n\t\t\t\t\t\t\t\t\t\t\t:size=\"20\"\n\t\t\t\t\t\t\t\t\t\t\tcircle\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { INodeUi } from '@/Interface';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { computed, ref, watch } from 'vue';\nimport { NodeHelpers } from 'n8n-workflow';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport TitledList from '@/components/TitledList.vue';\nimport type { ConnectionTypes, INodeInputConfiguration, INodeTypeDescription } from 'n8n-workflow';\nimport { useDebounce } from '@/composables/useDebounce';\n\ninterface Props {\n\trootNode: INodeUi;\n}\n\nconst props = defineProps<Props>();\nconst workflowsStore = useWorkflowsStore();\nconst nodeTypesStore = useNodeTypesStore();\nconst nodeHelpers = useNodeHelpers();\nconst { debounce } = useDebounce();\nconst emit = defineEmits(['switchSelectedNode', 'openConnectionNodeCreator']);\n\ninterface NodeConfig {\n\tnode: INodeUi;\n\tnodeType: INodeTypeDescription;\n\tissues: string[];\n}\n\nconst possibleConnections = ref<INodeInputConfiguration[]>([]);\n\nconst expandedGroups = ref<ConnectionTypes[]>([]);\nconst shouldShowNodeInputIssues = ref(false);\n\nconst nodeType = computed(() =>\n\tnodeTypesStore.getNodeType(props.rootNode.type, props.rootNode.typeVersion),\n);\n\nconst nodeData = computed(() => workflowsStore.getNodeByName(props.rootNode.name));\n\nconst workflow = computed(() => workflowsStore.getCurrentWorkflow());\n\nconst nodeInputIssues = computed(() => {\n\tconst issues = nodeHelpers.getNodeIssues(nodeType.value, props.rootNode, workflow.value, [\n\t\t'typeUnknown',\n\t\t'parameters',\n\t\t'credentials',\n\t\t'execution',\n\t]);\n\treturn issues?.input ?? {};\n});\n\nconst connectedNodes = computed<Record<ConnectionTypes, NodeConfig[]>>(() => {\n\treturn possibleConnections.value.reduce(\n\t\t(acc, connection) => {\n\t\t\tconst nodes = getINodesFromNames(\n\t\t\t\tworkflow.value.getParentNodes(props.rootNode.name, connection.type),\n\t\t\t);\n\t\t\treturn { ...acc, [connection.type]: nodes };\n\t\t},\n\t\t{} as Record<ConnectionTypes, NodeConfig[]>,\n\t);\n});\n\nfunction getConnectionConfig(connectionType: ConnectionTypes) {\n\treturn possibleConnections.value.find((c) => c.type === connectionType);\n}\n\nfunction isMultiConnection(connectionType: ConnectionTypes) {\n\tconst connectionConfig = getConnectionConfig(connectionType);\n\treturn connectionConfig?.maxConnections !== 1;\n}\n\nfunction shouldShowConnectionTooltip(connectionType: ConnectionTypes) {\n\treturn isMultiConnection(connectionType) && !expandedGroups.value.includes(connectionType);\n}\n\nfunction expandConnectionGroup(connectionType: ConnectionTypes, isExpanded: boolean) {\n\t// If the connection is a single connection, we don't need to expand the group\n\tif (!isMultiConnection(connectionType)) {\n\t\treturn;\n\t}\n\n\tif (isExpanded) {\n\t\texpandedGroups.value = [...expandedGroups.value, connectionType];\n\t} else {\n\t\texpandedGroups.value = expandedGroups.value.filter((g) => g !== connectionType);\n\t}\n}\n\nfunction getINodesFromNames(names: string[]): NodeConfig[] {\n\treturn names\n\t\t.map((name) => {\n\t\t\tconst node = workflowsStore.getNodeByName(name);\n\t\t\tif (node) {\n\t\t\t\tconst matchedNodeType = nodeTypesStore.getNodeType(node.type);\n\t\t\t\tif (matchedNodeType) {\n\t\t\t\t\tconst issues = nodeHelpers.getNodeIssues(matchedNodeType, node, workflow.value);\n\t\t\t\t\tconst stringifiedIssues = issues ? NodeHelpers.nodeIssuesToString(issues, node) : '';\n\t\t\t\t\treturn { node, nodeType: matchedNodeType, issues: stringifiedIssues };\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t})\n\t\t.filter((n): n is NodeConfig => n !== null);\n}\n\nfunction hasInputIssues(connectionType: ConnectionTypes) {\n\treturn (\n\t\tshouldShowNodeInputIssues.value && (nodeInputIssues.value[connectionType] ?? []).length > 0\n\t);\n}\n\nfunction isNodeInputConfiguration(\n\tconnectionConfig: ConnectionTypes | INodeInputConfiguration,\n): connectionConfig is INodeInputConfiguration {\n\tif (typeof connectionConfig === 'string') return false;\n\n\treturn 'type' in connectionConfig;\n}\n\nfunction getPossibleSubInputConnections(): INodeInputConfiguration[] {\n\tif (!nodeType.value || !props.rootNode) return [];\n\n\tconst inputs = NodeHelpers.getNodeInputs(workflow.value, props.rootNode, nodeType.value);\n\n\tconst nonMainInputs = inputs.filter((input): input is INodeInputConfiguration => {\n\t\tif (!isNodeInputConfiguration(input)) return false;\n\n\t\treturn input.type !== 'main';\n\t});\n\n\treturn nonMainInputs;\n}\n\nfunction onNodeClick(nodeName: string, connectionType: ConnectionTypes) {\n\tif (isMultiConnection(connectionType) && !expandedGroups.value.includes(connectionType)) {\n\t\texpandConnectionGroup(connectionType, true);\n\t\treturn;\n\t}\n\n\temit('switchSelectedNode', nodeName);\n}\n\nfunction onPlusClick(connectionType: ConnectionTypes) {\n\tconst connectionNodes = connectedNodes.value[connectionType];\n\tif (\n\t\tisMultiConnection(connectionType) &&\n\t\t!expandedGroups.value.includes(connectionType) &&\n\t\tconnectionNodes.length >= 1\n\t) {\n\t\texpandConnectionGroup(connectionType, true);\n\t\treturn;\n\t}\n\n\temit('openConnectionNodeCreator', props.rootNode.name, connectionType);\n}\n\nfunction showNodeInputsIssues() {\n\tshouldShowNodeInputIssues.value = false;\n\t// Reset animation\n\tsetTimeout(() => {\n\t\tshouldShowNodeInputIssues.value = true;\n\t}, 0);\n}\n\nwatch(\n\tnodeData,\n\tdebounce(\n\t\t() =>\n\t\t\tsetTimeout(() => {\n\t\t\t\texpandedGroups.value = [];\n\t\t\t\tpossibleConnections.value = getPossibleSubInputConnections();\n\t\t\t}, 0),\n\t\t{ debounceTime: 1000 },\n\t),\n\t{ immediate: true },\n);\n\ndefineExpose({\n\tshowNodeInputsIssues,\n});\n</script>\n\n<style lang=\"scss\" module>\n@keyframes horizontal-shake {\n\t0% {\n\t\ttransform: translateX(0);\n\t}\n\t25% {\n\t\ttransform: translateX(5px);\n\t}\n\t50% {\n\t\ttransform: translateX(-5px);\n\t}\n\t75% {\n\t\ttransform: translateX(5px);\n\t}\n\t100% {\n\t\ttransform: translateX(0);\n\t}\n}\n.container {\n\t--node-size: 45px;\n\t--plus-button-size: 30px;\n\t--animation-duration: 150ms;\n\t--collapsed-offset: 10px;\n\tpadding-top: calc(var(--node-size) + var(--spacing-3xs));\n}\n.connections {\n\t// Make sure container has matching height if there's no connections\n\t// since the plus button is absolutely positioned\n\tmin-height: calc(var(--node-size) + var(--spacing-m));\n\tposition: absolute;\n\tbottom: calc((var(--node-size) / 2) * -1);\n\tleft: 0;\n\tright: 0;\n\tuser-select: none;\n\tjustify-content: space-between;\n\tdisplay: grid;\n\tgrid-template-columns: repeat(var(--possible-connections), 1fr);\n}\n.connectionType {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\ttransition: all calc((var(--animation-duration) - 50ms)) ease;\n}\n.connectionLabel {\n\tmargin-bottom: var(--spacing-2xs);\n\tfont-size: var(--font-size-2xs);\n\tuser-select: none;\n\ttext-wrap: nowrap;\n\n\t&.hasIssues {\n\t\tcolor: var(--color-danger);\n\t}\n}\n.connectedNodesWrapper {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: space-between;\n\tposition: relative;\n}\n.plusButton {\n\ttransition: all var(--animation-duration) ease;\n\tposition: absolute;\n\ttop: var(--spacing-2xs);\n\n\t&.hasIssues {\n\t\tanimation: horizontal-shake 500ms;\n\t\tbutton {\n\t\t\t--button-font-color: var(--color-danger);\n\t\t\t--button-border-color: var(--color-danger);\n\t\t}\n\t}\n\n\t&:not(:last-child) {\n\t\tz-index: 1;\n\t\tright: 100%;\n\t\tmargin-right: calc((var(--plus-button-size) * -1) * 0.9);\n\t\tpointer-events: none;\n\n\t\t.connectedNodesWrapperExpanded & {\n\t\t\t// left: 100%;\n\t\t\tmargin-right: var(--spacing-2xs);\n\t\t\topacity: 1;\n\t\t\tpointer-events: all;\n\t\t}\n\t}\n}\n\n.connectedNodesMultiple {\n\ttransition: all var(--animation-duration) ease;\n}\n.connectedNodesWrapperExpanded {\n\tz-index: 1;\n}\n// Hide all other connection groups when one is expanded\n.connections:has(.connectedNodesWrapperExpanded)\n\t.connectionType:not(:has(.connectedNodesWrapperExpanded)) {\n\topacity: 0;\n\tpointer-events: none;\n\tvisibility: hidden;\n}\n.connectedNode {\n\tborder: var(--border-base);\n\tbackground-color: var(--color-canvas-node-background);\n\tborder-radius: 100%;\n\tpadding: var(--spacing-xs);\n\tcursor: pointer;\n\tpointer-events: all;\n\ttransition: all var(--animation-duration) ease;\n\tposition: relative;\n\tdisplay: flex;\n\tjustify-self: center;\n\talign-self: center;\n}\n.connectedNodes {\n\tdisplay: flex;\n\tjustify-content: center;\n\tmargin-right: calc(\n\t\t(var(--nodes-length) - 1) * (-1 * (var(--node-size) - var(--collapsed-offset)))\n\t);\n\t.connectedNodesWrapperExpanded & {\n\t\tmargin-right: 0;\n\t\t// Negative margin to offset the absolutely positioned plus button\n\t\t// when the nodes are expanded to center the nodes\n\t\tmargin-right: calc((var(--spacing-2xs) + var(--plus-button-size)) * -1);\n\t}\n}\n.nodeWrapper {\n\ttransition: all var(--animation-duration) ease;\n\ttransform-origin: center;\n\tz-index: 1;\n\t.connectedNodesWrapperExpanded &:not(:first-child) {\n\t\tmargin-left: var(--spacing-2xs);\n\t}\n\t&.hasIssues {\n\t\t.connectedNode {\n\t\t\tborder-width: calc(var(--border-width-base) * 2);\n\t\t\tborder-color: var(--color-danger);\n\t\t}\n\t}\n\n\t&:not(:first-child) {\n\t\ttransform: translateX(\n\t\t\tcalc(var(--node-index) * (-1 * (var(--node-size) - var(--collapsed-offset))))\n\t\t);\n\t}\n\n\t.connectedNodesWrapperExpanded & {\n\t\ttransform: translateX(0);\n\t}\n}\n</style>\n","<template>\n\t<div>\n\t\t<n8n-tooltip placement=\"bottom\" :disabled=\"!disabledHint\">\n\t\t\t<template #content>\n\t\t\t\t<div>{{ disabledHint }}</div>\n\t\t\t</template>\n\t\t\t<div>\n\t\t\t\t<n8n-button\n\t\t\t\t\tv-bind=\"$attrs\"\n\t\t\t\t\t:loading=\"nodeRunning && !isListeningForEvents && !isListeningForWorkflowEvents\"\n\t\t\t\t\t:disabled=\"disabled || !!disabledHint\"\n\t\t\t\t\t:label=\"buttonLabel\"\n\t\t\t\t\t:type=\"type\"\n\t\t\t\t\t:size=\"size\"\n\t\t\t\t\t:icon=\"!isListeningForEvents && !hideIcon ? 'flask' : undefined\"\n\t\t\t\t\t:transparent-background=\"transparent\"\n\t\t\t\t\t:title=\"!isTriggerNode ? $locale.baseText('ndv.execute.testNode.description') : ''\"\n\t\t\t\t\t@click=\"onClick\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</n8n-tooltip>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport {\n\tWEBHOOK_NODE_TYPE,\n\tMANUAL_TRIGGER_NODE_TYPE,\n\tMODAL_CONFIRM,\n\tFORM_TRIGGER_NODE_TYPE,\n\tCHAT_TRIGGER_NODE_TYPE,\n} from '@/constants';\nimport type { INodeUi } from '@/Interface';\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useMessage } from '@/composables/useMessage';\nimport { useToast } from '@/composables/useToast';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { nodeViewEventBus } from '@/event-bus';\nimport { usePinnedData } from '@/composables/usePinnedData';\nimport { useRunWorkflow } from '@/composables/useRunWorkflow';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useRouter } from 'vue-router';\n\nexport default defineComponent({\n\tinheritAttrs: false,\n\tprops: {\n\t\tnodeName: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tlabel: {\n\t\t\ttype: String,\n\t\t},\n\t\ttype: {\n\t\t\ttype: String,\n\t\t},\n\t\tsize: {\n\t\t\ttype: String,\n\t\t},\n\t\ttransparent: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\ttelemetrySource: {\n\t\t\ttype: String,\n\t\t},\n\t\thideIcon: {\n\t\t\ttype: Boolean,\n\t\t},\n\t},\n\temits: ['stopExecution', 'execute'],\n\tsetup(props) {\n\t\tconst router = useRouter();\n\t\tconst workflowsStore = useWorkflowsStore();\n\t\tconst node = workflowsStore.getNodeByName(props.nodeName);\n\t\tconst pinnedData = usePinnedData(node);\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst { runWorkflow, stopCurrentExecution } = useRunWorkflow({ router });\n\n\t\treturn {\n\t\t\texternalHooks,\n\t\t\tpinnedData,\n\t\t\trunWorkflow,\n\t\t\tstopCurrentExecution,\n\t\t\t...useToast(),\n\t\t\t...useMessage(),\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useWorkflowsStore, useUIStore),\n\t\tnode(): INodeUi | null {\n\t\t\treturn this.workflowsStore.getNodeByName(this.nodeName);\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.nodeTypesStore.getNodeType(this.node.type, this.node.typeVersion);\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tnodeRunning(): boolean {\n\t\t\tconst triggeredNode = this.workflowsStore.executedNode;\n\t\t\treturn (\n\t\t\t\tthis.workflowRunning &&\n\t\t\t\t(this.workflowsStore.isNodeExecuting(this.node?.name ?? '') ||\n\t\t\t\t\ttriggeredNode === this.node?.name)\n\t\t\t);\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\tif (!this.node) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn this.nodeTypesStore.isTriggerNode(this.node.type);\n\t\t},\n\t\tisManualTriggerNode(): boolean {\n\t\t\treturn Boolean(this.nodeType && this.nodeType.name === MANUAL_TRIGGER_NODE_TYPE);\n\t\t},\n\t\tisChatNode(): boolean {\n\t\t\treturn Boolean(this.nodeType && this.nodeType.name === CHAT_TRIGGER_NODE_TYPE);\n\t\t},\n\t\tisChatChild(): boolean {\n\t\t\treturn this.workflowsStore.checkIfNodeHasChatParent(this.nodeName);\n\t\t},\n\t\tisFormTriggerNode(): boolean {\n\t\t\treturn Boolean(this.nodeType && this.nodeType.name === FORM_TRIGGER_NODE_TYPE);\n\t\t},\n\t\tisPollingTypeNode(): boolean {\n\t\t\treturn !!this.nodeType?.polling;\n\t\t},\n\t\tisScheduleTrigger(): boolean {\n\t\t\treturn !!this.nodeType?.group.includes('schedule');\n\t\t},\n\t\tisWebhookNode(): boolean {\n\t\t\treturn Boolean(this.nodeType && this.nodeType.name === WEBHOOK_NODE_TYPE);\n\t\t},\n\t\tisListeningForEvents(): boolean {\n\t\t\tconst waitingOnWebhook = this.workflowsStore.executionWaitingForWebhook;\n\t\t\tconst executedNode = this.workflowsStore.executedNode;\n\n\t\t\treturn (\n\t\t\t\t!!this.node &&\n\t\t\t\t!this.node.disabled &&\n\t\t\t\tthis.isTriggerNode &&\n\t\t\t\twaitingOnWebhook &&\n\t\t\t\t(!executedNode || executedNode === this.nodeName)\n\t\t\t);\n\t\t},\n\t\tisListeningForWorkflowEvents(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.nodeRunning &&\n\t\t\t\tthis.isTriggerNode &&\n\t\t\t\t!this.isScheduleTrigger &&\n\t\t\t\t!this.isManualTriggerNode\n\t\t\t);\n\t\t},\n\t\thasIssues(): boolean {\n\t\t\treturn Boolean(\n\t\t\t\tthis.node?.issues && (this.node.issues.parameters || this.node.issues.credentials),\n\t\t\t);\n\t\t},\n\t\tdisabledHint(): string {\n\t\t\tif (this.isListeningForEvents) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tif (this.isTriggerNode && this.node?.disabled) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.nodeIsDisabled');\n\t\t\t}\n\n\t\t\tif (this.isTriggerNode && this.hasIssues) {\n\t\t\t\tconst activeNode = this.ndvStore.activeNode;\n\t\t\t\tif (activeNode && activeNode.name !== this.nodeName) {\n\t\t\t\t\treturn this.$locale.baseText('ndv.execute.fixPrevious');\n\t\t\t\t}\n\n\t\t\t\treturn this.$locale.baseText('ndv.execute.requiredFieldsMissing');\n\t\t\t}\n\n\t\t\tif (this.workflowRunning && !this.nodeRunning) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.workflowAlreadyRunning');\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tbuttonLabel(): string {\n\t\t\tif (this.isListeningForEvents || this.isListeningForWorkflowEvents) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.stopListening');\n\t\t\t}\n\n\t\t\tif (this.label) {\n\t\t\t\treturn this.label;\n\t\t\t}\n\n\t\t\tif (this.isChatNode) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.testChat');\n\t\t\t}\n\n\t\t\tif (this.isWebhookNode) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.listenForTestEvent');\n\t\t\t}\n\n\t\t\tif (this.isFormTriggerNode) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.testStep');\n\t\t\t}\n\n\t\t\tif (this.isPollingTypeNode || this.nodeType?.mockManualExecution) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.fetchEvent');\n\t\t\t}\n\n\t\t\treturn this.$locale.baseText('ndv.execute.testNode');\n\t\t},\n\t},\n\tmethods: {\n\t\tasync stopWaitingForWebhook() {\n\t\t\ttry {\n\t\t\t\tawait this.workflowsStore.removeTestWebhook(this.workflowsStore.workflowId);\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(error, this.$locale.baseText('ndv.execute.stopWaitingForWebhook.error'));\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\n\t\tasync onClick() {\n\t\t\t// Show chat if it's a chat node or a child of a chat node with no input data\n\t\t\tif (this.isChatNode || (this.isChatChild && this.ndvStore.isNDVDataEmpty('input'))) {\n\t\t\t\tthis.ndvStore.setActiveNodeName(null);\n\t\t\t\tnodeViewEventBus.emit('openChat');\n\t\t\t} else if (this.isListeningForEvents) {\n\t\t\t\tawait this.stopWaitingForWebhook();\n\t\t\t} else if (this.isListeningForWorkflowEvents) {\n\t\t\t\tawait this.stopCurrentExecution();\n\t\t\t\tthis.$emit('stopExecution');\n\t\t\t} else {\n\t\t\t\tlet shouldUnpinAndExecute = false;\n\t\t\t\tif (this.pinnedData.hasData.value) {\n\t\t\t\t\tconst confirmResult = await this.confirm(\n\t\t\t\t\t\tthis.$locale.baseText('ndv.pinData.unpinAndExecute.description'),\n\t\t\t\t\t\tthis.$locale.baseText('ndv.pinData.unpinAndExecute.title'),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText('ndv.pinData.unpinAndExecute.confirm'),\n\t\t\t\t\t\t\tcancelButtonText: this.$locale.baseText('ndv.pinData.unpinAndExecute.cancel'),\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tshouldUnpinAndExecute = confirmResult === MODAL_CONFIRM;\n\n\t\t\t\t\tif (shouldUnpinAndExecute && this.node) {\n\t\t\t\t\t\tthis.pinnedData.unsetData('unpin-and-execute-modal');\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!this.pinnedData.hasData.value || shouldUnpinAndExecute) {\n\t\t\t\t\tconst telemetryPayload = {\n\t\t\t\t\t\tnode_type: this.nodeType ? this.nodeType.name : null,\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\tsource: this.telemetrySource,\n\t\t\t\t\t\tpush_ref: this.ndvStore.pushRef,\n\t\t\t\t\t};\n\t\t\t\t\tthis.$telemetry.track('User clicked execute node button', telemetryPayload);\n\t\t\t\t\tawait this.externalHooks.run('nodeExecuteButton.onClick', telemetryPayload);\n\n\t\t\t\t\tawait this.runWorkflow({\n\t\t\t\t\t\tdestinationNode: this.nodeName,\n\t\t\t\t\t\tsource: 'RunData.ExecuteNodeButton',\n\t\t\t\t\t});\n\t\t\t\t\tthis.$emit('execute');\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n","<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'node-settings': true,\n\t\t\tdragging: dragging,\n\t\t}\"\n\t\t@keydown.stop\n\t>\n\t\t<div :class=\"$style.header\">\n\t\t\t<div class=\"header-side-menu\">\n\t\t\t\t<NodeTitle\n\t\t\t\t\tv-if=\"node\"\n\t\t\t\t\tclass=\"node-name\"\n\t\t\t\t\t:model-value=\"node.name\"\n\t\t\t\t\t:node-type=\"nodeType\"\n\t\t\t\t\t:read-only=\"isReadOnly\"\n\t\t\t\t\t@update:model-value=\"nameChanged\"\n\t\t\t\t></NodeTitle>\n\t\t\t\t<div v-if=\"isExecutable\">\n\t\t\t\t\t<NodeExecuteButton\n\t\t\t\t\t\tv-if=\"!blockUI && node && nodeValid\"\n\t\t\t\t\t\tdata-test-id=\"node-execute-button\"\n\t\t\t\t\t\t:node-name=\"node.name\"\n\t\t\t\t\t\t:disabled=\"outputPanelEditMode.enabled && !isTriggerNode\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\ttelemetry-source=\"parameters\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\t@stop-execution=\"onStopExecution\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<NodeSettingsTabs\n\t\t\t\tv-if=\"node && nodeValid\"\n\t\t\t\t:model-value=\"openPanel\"\n\t\t\t\t:node-type=\"nodeType\"\n\t\t\t\t:push-ref=\"pushRef\"\n\t\t\t\t@update:model-value=\"onTabSelect\"\n\t\t\t/>\n\t\t</div>\n\t\t<div v-if=\"node && !nodeValid\" class=\"node-is-not-valid\">\n\t\t\t<p :class=\"$style.warningIcon\">\n\t\t\t\t<font-awesome-icon icon=\"exclamation-triangle\" />\n\t\t\t</p>\n\t\t\t<div class=\"missingNodeTitleContainer mt-s mb-xs\">\n\t\t\t\t<n8n-text size=\"large\" color=\"text-dark\" bold>\n\t\t\t\t\t{{ $locale.baseText('nodeSettings.communityNodeUnknown.title') }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t\t<div v-if=\"isCommunityNode\" :class=\"$style.descriptionContainer\">\n\t\t\t\t<div class=\"mb-l\">\n\t\t\t\t\t<i18n-t\n\t\t\t\t\t\tkeypath=\"nodeSettings.communityNodeUnknown.description\"\n\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t@click=\"onMissingNodeTextClick\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #action>\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t:href=\"`https://www.npmjs.com/package/${node.type.split('.')[0]}`\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t>{{ node.type.split('.')[0] }}</a\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</i18n-t>\n\t\t\t\t</div>\n\t\t\t\t<n8n-link\n\t\t\t\t\t:to=\"COMMUNITY_NODES_INSTALLATION_DOCS_URL\"\n\t\t\t\t\t@click=\"onMissingNodeLearnMoreLinkClick\"\n\t\t\t\t>\n\t\t\t\t\t{{ $locale.baseText('nodeSettings.communityNodeUnknown.installLink.text') }}\n\t\t\t\t</n8n-link>\n\t\t\t</div>\n\t\t\t<i18n-t v-else keypath=\"nodeSettings.nodeTypeUnknown.description\" tag=\"span\">\n\t\t\t\t<template #action>\n\t\t\t\t\t<a\n\t\t\t\t\t\t:href=\"CUSTOM_NODES_DOCS_URL\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\tv-text=\"$locale.baseText('nodeSettings.nodeTypeUnknown.description.customNode')\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t</i18n-t>\n\t\t</div>\n\t\t<div v-if=\"node && nodeValid\" class=\"node-parameters-wrapper\" data-test-id=\"node-parameters\">\n\t\t\t<n8n-notice\n\t\t\t\tv-if=\"hasForeignCredential\"\n\t\t\t\t:content=\"\n\t\t\t\t\t$locale.baseText('nodeSettings.hasForeignCredential', {\n\t\t\t\t\t\tinterpolate: { owner: credentialOwnerName },\n\t\t\t\t\t})\n\t\t\t\t\"\n\t\t\t/>\n\t\t\t<div v-show=\"openPanel === 'params'\">\n\t\t\t\t<NodeWebhooks :node=\"node\" :node-type=\"nodeType\" />\n\n\t\t\t\t<ParameterInputList\n\t\t\t\t\tv-if=\"nodeValuesInitialized\"\n\t\t\t\t\t:parameters=\"parametersNoneSetting\"\n\t\t\t\t\t:hide-delete=\"true\"\n\t\t\t\t\t:node-values=\"nodeValues\"\n\t\t\t\t\t:is-read-only=\"isReadOnly\"\n\t\t\t\t\t:hidden-issues-inputs=\"hiddenIssuesInputs\"\n\t\t\t\t\tpath=\"parameters\"\n\t\t\t\t\t@value-changed=\"valueChanged\"\n\t\t\t\t\t@activate=\"onWorkflowActivate\"\n\t\t\t\t\t@parameter-blur=\"onParameterBlur\"\n\t\t\t\t>\n\t\t\t\t\t<NodeCredentials\n\t\t\t\t\t\t:node=\"node\"\n\t\t\t\t\t\t:readonly=\"isReadOnly\"\n\t\t\t\t\t\t:show-all=\"true\"\n\t\t\t\t\t\t:hide-issues=\"hiddenIssuesInputs.includes('credentials')\"\n\t\t\t\t\t\t@credential-selected=\"credentialSelected\"\n\t\t\t\t\t\t@value-changed=\"valueChanged\"\n\t\t\t\t\t\t@blur=\"onParameterBlur\"\n\t\t\t\t\t/>\n\t\t\t\t</ParameterInputList>\n\t\t\t\t<div v-if=\"parametersNoneSetting.length === 0\" class=\"no-parameters\">\n\t\t\t\t\t<n8n-text>\n\t\t\t\t\t\t{{ $locale.baseText('nodeSettings.thisNodeDoesNotHaveAnyParameters') }}\n\t\t\t\t\t</n8n-text>\n\t\t\t\t</div>\n\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"nodeHelpers.isCustomApiCallSelected(nodeValues)\"\n\t\t\t\t\tclass=\"parameter-item parameter-notice\"\n\t\t\t\t\tdata-test-id=\"node-parameters-http-notice\"\n\t\t\t\t>\n\t\t\t\t\t<n8n-notice\n\t\t\t\t\t\t:content=\"\n\t\t\t\t\t\t\t$locale.baseText('nodeSettings.useTheHttpRequestNode', {\n\t\t\t\t\t\t\t\tinterpolate: { nodeTypeDisplayName: nodeType?.displayName ?? '' },\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-show=\"openPanel === 'settings'\">\n\t\t\t\t<ParameterInputList\n\t\t\t\t\t:parameters=\"parametersSetting\"\n\t\t\t\t\t:node-values=\"nodeValues\"\n\t\t\t\t\t:is-read-only=\"isReadOnly\"\n\t\t\t\t\t:hidden-issues-inputs=\"hiddenIssuesInputs\"\n\t\t\t\t\tpath=\"parameters\"\n\t\t\t\t\t@value-changed=\"valueChanged\"\n\t\t\t\t\t@parameter-blur=\"onParameterBlur\"\n\t\t\t\t/>\n\t\t\t\t<ParameterInputList\n\t\t\t\t\t:parameters=\"nodeSettings\"\n\t\t\t\t\t:hide-delete=\"true\"\n\t\t\t\t\t:node-values=\"nodeValues\"\n\t\t\t\t\t:is-read-only=\"isReadOnly\"\n\t\t\t\t\t:hidden-issues-inputs=\"hiddenIssuesInputs\"\n\t\t\t\t\tpath=\"\"\n\t\t\t\t\t@value-changed=\"valueChanged\"\n\t\t\t\t\t@parameter-blur=\"onParameterBlur\"\n\t\t\t\t/>\n\t\t\t\t<div class=\"node-version\" data-test-id=\"node-version\">\n\t\t\t\t\t{{\n\t\t\t\t\t\t$locale.baseText('nodeSettings.nodeVersion', {\n\t\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\t\tnode: nodeType?.displayName as string,\n\t\t\t\t\t\t\t\tversion: (node.typeVersion ?? latestVersion).toString(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t}}\n\t\t\t\t\t<span>({{ nodeVersionTag }})</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<NDVSubConnections\n\t\t\tv-if=\"node\"\n\t\t\tref=\"subConnections\"\n\t\t\t:root-node=\"node\"\n\t\t\t@switch-selected-node=\"onSwitchSelectedNode\"\n\t\t\t@open-connection-node-creator=\"onOpenConnectionNodeCreator\"\n\t\t/>\n\t\t<n8n-block-ui :show=\"blockUI\" />\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport type {\n\tINodeTypeDescription,\n\tINodeParameters,\n\tINodeProperties,\n\tNodeParameterValue,\n\tConnectionTypes,\n\tNodeParameterValueType,\n} from 'n8n-workflow';\nimport {\n\tNodeHelpers,\n\tNodeConnectionType,\n\tdeepCopy,\n\tisINodePropertyCollectionList,\n\tisINodePropertiesList,\n\tisINodePropertyOptionsList,\n\tdisplayParameter,\n} from 'n8n-workflow';\nimport type {\n\tINodeUi,\n\tINodeUpdatePropertiesInformation,\n\tIUpdateInformation,\n\tIUsedCredential,\n} from '@/Interface';\n\nimport {\n\tCOMMUNITY_NODES_INSTALLATION_DOCS_URL,\n\tCUSTOM_NODES_DOCS_URL,\n\tMAIN_NODE_PANEL_WIDTH,\n\tSHOULD_CLEAR_NODE_OUTPUTS,\n} from '@/constants';\n\nimport NodeTitle from '@/components/NodeTitle.vue';\nimport ParameterInputList from '@/components/ParameterInputList.vue';\nimport NodeCredentials from '@/components/NodeCredentials.vue';\nimport NodeSettingsTabs from '@/components/NodeSettingsTabs.vue';\nimport NodeWebhooks from '@/components/NodeWebhooks.vue';\nimport NDVSubConnections from '@/components/NDVSubConnections.vue';\nimport { get, set, unset } from 'lodash-es';\n\nimport NodeExecuteButton from './NodeExecuteButton.vue';\nimport { isCommunityPackageName } from '@/utils/nodeTypesUtils';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useHistoryStore } from '@/stores/history.store';\nimport { RenameNodeCommand } from '@/models/history';\nimport useWorkflowsEEStore from '@/stores/workflows.ee.store';\nimport { useCredentialsStore } from '@/stores/credentials.store';\nimport type { EventBus } from 'n8n-design-system';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\nimport { importCurlEventBus } from '@/event-bus';\nimport { useToast } from '@/composables/useToast';\n\nexport default defineComponent({\n\tname: 'NodeSettings',\n\tcomponents: {\n\t\tNodeTitle,\n\t\tNodeCredentials,\n\t\tParameterInputList,\n\t\tNodeSettingsTabs,\n\t\tNodeWebhooks,\n\t\tNDVSubConnections,\n\t\tNodeExecuteButton,\n\t},\n\tsetup() {\n\t\tconst nodeHelpers = useNodeHelpers();\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst { showMessage } = useToast();\n\n\t\treturn {\n\t\t\texternalHooks,\n\t\t\tnodeHelpers,\n\t\t\tshowMessage,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(\n\t\t\tuseHistoryStore,\n\t\t\tuseNodeTypesStore,\n\t\t\tuseNDVStore,\n\t\t\tuseUIStore,\n\t\t\tuseCredentialsStore,\n\t\t\tuseWorkflowsStore,\n\t\t\tuseWorkflowsEEStore,\n\t\t),\n\t\tisReadOnly(): boolean {\n\t\t\treturn this.readOnly || this.hasForeignCredential;\n\t\t},\n\t\tisExecutable(): boolean {\n\t\t\tif (this.nodeType && this.node) {\n\t\t\t\tconst workflow = this.workflowsStore.getCurrentWorkflow();\n\t\t\t\tconst workflowNode = workflow.getNode(this.node.name);\n\t\t\t\tconst inputs = NodeHelpers.getNodeInputs(workflow, workflowNode!, this.nodeType);\n\t\t\t\tconst inputNames = NodeHelpers.getConnectionTypes(inputs);\n\n\t\t\t\tif (!inputNames.includes(NodeConnectionType.Main) && !this.isTriggerNode) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this.executable || this.hasForeignCredential;\n\t\t},\n\t\tnodeTypeName(): string {\n\t\t\tif (this.nodeType) {\n\t\t\t\tconst shortNodeType = this.$locale.shortNodeType(this.nodeType.name);\n\n\t\t\t\treturn this.$locale.headerText({\n\t\t\t\t\tkey: `headers.${shortNodeType}.displayName`,\n\t\t\t\t\tfallback: this.nodeType.name,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tnodeTypeVersions(): number[] {\n\t\t\tif (!this.node) return [];\n\t\t\treturn this.nodeTypesStore.getNodeVersions(this.node.type);\n\t\t},\n\t\tlatestVersion(): number {\n\t\t\treturn Math.max(...this.nodeTypeVersions);\n\t\t},\n\t\tisLatestNodeVersion(): boolean {\n\t\t\treturn !this.node?.typeVersion || this.latestVersion === this.node.typeVersion;\n\t\t},\n\t\tnodeVersionTag(): string {\n\t\t\tif (!this.nodeType || this.nodeType.hidden) {\n\t\t\t\treturn this.$locale.baseText('nodeSettings.deprecated');\n\t\t\t}\n\n\t\t\tif (this.isLatestNodeVersion) {\n\t\t\t\treturn this.$locale.baseText('nodeSettings.latest');\n\t\t\t}\n\n\t\t\treturn this.$locale.baseText('nodeSettings.latestVersion', {\n\t\t\t\tinterpolate: { version: this.latestVersion.toString() },\n\t\t\t});\n\t\t},\n\t\tnodeTypeDescription(): string {\n\t\t\tif (this.nodeType?.description) {\n\t\t\t\tconst shortNodeType = this.$locale.shortNodeType(this.nodeType.name);\n\n\t\t\t\treturn this.$locale.headerText({\n\t\t\t\t\tkey: `headers.${shortNodeType}.description`,\n\t\t\t\t\tfallback: this.nodeType.description,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn this.$locale.baseText('nodeSettings.noDescriptionFound');\n\t\t\t}\n\t\t},\n\t\theaderStyle(): object {\n\t\t\tif (!this.node) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t'background-color': this.node.color,\n\t\t\t};\n\t\t},\n\t\tnode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tparametersSetting(): INodeProperties[] {\n\t\t\treturn this.parameters.filter((item) => {\n\t\t\t\treturn item.isNodeSetting;\n\t\t\t});\n\t\t},\n\t\tparametersNoneSetting(): INodeProperties[] {\n\t\t\treturn this.parameters.filter((item) => {\n\t\t\t\treturn !item.isNodeSetting;\n\t\t\t});\n\t\t},\n\t\tparameters(): INodeProperties[] {\n\t\t\tif (this.nodeType === null) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn this.nodeType?.properties ?? [];\n\t\t},\n\t\toutputPanelEditMode(): { enabled: boolean; value: string } {\n\t\t\treturn this.ndvStore.outputPanelEditMode;\n\t\t},\n\t\tisCommunityNode(): boolean {\n\t\t\treturn !!this.node && isCommunityPackageName(this.node.type);\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\treturn !!this.node && this.nodeTypesStore.isTriggerNode(this.node.type);\n\t\t},\n\t\tworkflowOwnerName(): string {\n\t\t\treturn this.workflowsEEStore.getWorkflowOwnerName(`${this.workflowsStore.workflowId}`);\n\t\t},\n\t\thasForeignCredential(): boolean {\n\t\t\treturn this.foreignCredentials.length > 0;\n\t\t},\n\t\tusedCredentials(): IUsedCredential[] {\n\t\t\treturn Object.values(this.workflowsStore.usedCredentials).filter((credential) => {\n\t\t\t\treturn Object.values(this.node?.credentials || []).find((nodeCredential) => {\n\t\t\t\t\treturn nodeCredential.id === credential.id;\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\tcredentialOwnerName(): string {\n\t\t\tconst credential = this.usedCredentials\n\t\t\t\t? Object.values(this.usedCredentials).find((credential) => {\n\t\t\t\t\t\treturn credential.id === this.foreignCredentials[0];\n\t\t\t\t\t})\n\t\t\t\t: undefined;\n\n\t\t\treturn this.credentialsStore.getCredentialOwnerName(credential);\n\t\t},\n\t},\n\tprops: {\n\t\teventBus: {\n\t\t\ttype: Object as PropType<EventBus>,\n\t\t},\n\t\tdragging: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tpushRef: {\n\t\t\ttype: String,\n\t\t},\n\t\tnodeType: {\n\t\t\ttype: Object as PropType<INodeTypeDescription | null>,\n\t\t},\n\t\treadOnly: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tforeignCredentials: {\n\t\t\ttype: Array as PropType<string[]>,\n\t\t\tdefault: () => [],\n\t\t},\n\t\tblockUI: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\texecutable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tnodeValid: true,\n\t\t\tnodeColor: null,\n\t\t\topenPanel: 'params' as 'params' | 'settings',\n\t\t\tnodeValues: {\n\t\t\t\tcolor: '#ff0000',\n\t\t\t\talwaysOutputData: false,\n\t\t\t\texecuteOnce: false,\n\t\t\t\tnotesInFlow: false,\n\t\t\t\tonError: 'stopWorkflow',\n\t\t\t\tretryOnFail: false,\n\t\t\t\tmaxTries: 3,\n\t\t\t\twaitBetweenTries: 1000,\n\t\t\t\tnotes: '',\n\t\t\t\tparameters: {},\n\t\t\t} as INodeParameters,\n\t\t\tnodeValuesInitialized: false, // Used to prevent nodeValues from being overwritten by defaults on reopening ndv\n\n\t\t\tnodeSettings: [] as INodeProperties[],\n\t\t\tCOMMUNITY_NODES_INSTALLATION_DOCS_URL,\n\t\t\tCUSTOM_NODES_DOCS_URL,\n\t\t\tMAIN_NODE_PANEL_WIDTH,\n\t\t\thiddenIssuesInputs: [] as string[],\n\t\t};\n\t},\n\twatch: {\n\t\tnode(newNode, oldNode) {\n\t\t\tthis.setNodeValues();\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.populateHiddenIssuesSet();\n\t\tthis.populateSettings();\n\t\tthis.setNodeValues();\n\t\tthis.eventBus?.on('openSettings', this.openSettings);\n\n\t\tthis.nodeHelpers.updateNodeParameterIssues(this.node as INodeUi, this.nodeType);\n\t\timportCurlEventBus.on('setHttpNodeParameters', this.setHttpNodeParameters);\n\t},\n\tbeforeUnmount() {\n\t\tthis.eventBus?.off('openSettings', this.openSettings);\n\t\timportCurlEventBus.off('setHttpNodeParameters', this.setHttpNodeParameters);\n\t},\n\tmethods: {\n\t\tsetHttpNodeParameters(parameters: NodeParameterValueType) {\n\t\t\ttry {\n\t\t\t\tthis.valueChanged({\n\t\t\t\t\tnode: this.node?.name,\n\t\t\t\t\tname: 'parameters',\n\t\t\t\t\tvalue: parameters,\n\t\t\t\t});\n\t\t\t} catch {}\n\t\t},\n\t\tonSwitchSelectedNode(node: string) {\n\t\t\tthis.$emit('switchSelectedNode', node);\n\t\t},\n\t\tonOpenConnectionNodeCreator(node: string, connectionType: ConnectionTypes) {\n\t\t\tthis.$emit('openConnectionNodeCreator', node, connectionType);\n\t\t},\n\t\tpopulateHiddenIssuesSet() {\n\t\t\tif (!this.node || !this.workflowsStore.isNodePristine(this.node.name)) return;\n\n\t\t\tthis.hiddenIssuesInputs.push('credentials');\n\t\t\tthis.parametersNoneSetting.forEach((parameter) => {\n\t\t\t\tthis.hiddenIssuesInputs.push(parameter.name);\n\t\t\t});\n\n\t\t\tthis.workflowsStore.setNodePristine(this.node.name, false);\n\t\t},\n\t\tpopulateSettings() {\n\t\t\tif (this.isExecutable && !this.isTriggerNode) {\n\t\t\t\tthis.nodeSettings.push(\n\t\t\t\t\t...([\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.alwaysOutputData.displayName'),\n\t\t\t\t\t\t\tname: 'alwaysOutputData',\n\t\t\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\t\t\tdefault: false,\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.alwaysOutputData.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.executeOnce.displayName'),\n\t\t\t\t\t\t\tname: 'executeOnce',\n\t\t\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\t\t\tdefault: false,\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.executeOnce.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.retryOnFail.displayName'),\n\t\t\t\t\t\t\tname: 'retryOnFail',\n\t\t\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\t\t\tdefault: false,\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.retryOnFail.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.maxTries.displayName'),\n\t\t\t\t\t\t\tname: 'maxTries',\n\t\t\t\t\t\t\ttype: 'number',\n\t\t\t\t\t\t\ttypeOptions: {\n\t\t\t\t\t\t\t\tminValue: 2,\n\t\t\t\t\t\t\t\tmaxValue: 5,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tdefault: 3,\n\t\t\t\t\t\t\tdisplayOptions: {\n\t\t\t\t\t\t\t\tshow: {\n\t\t\t\t\t\t\t\t\tretryOnFail: [true],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.maxTries.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.waitBetweenTries.displayName'),\n\t\t\t\t\t\t\tname: 'waitBetweenTries',\n\t\t\t\t\t\t\ttype: 'number',\n\t\t\t\t\t\t\ttypeOptions: {\n\t\t\t\t\t\t\t\tminValue: 0,\n\t\t\t\t\t\t\t\tmaxValue: 5000,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tdefault: 1000,\n\t\t\t\t\t\t\tdisplayOptions: {\n\t\t\t\t\t\t\t\tshow: {\n\t\t\t\t\t\t\t\t\tretryOnFail: [true],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.waitBetweenTries.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.onError.displayName'),\n\t\t\t\t\t\t\tname: 'onError',\n\t\t\t\t\t\t\ttype: 'options',\n\t\t\t\t\t\t\toptions: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.stopWorkflow.displayName',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tvalue: 'stopWorkflow',\n\t\t\t\t\t\t\t\t\tdescription: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.stopWorkflow.description',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.continueRegularOutput.displayName',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tvalue: 'continueRegularOutput',\n\t\t\t\t\t\t\t\t\tdescription: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.continueRegularOutput.description',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.continueErrorOutput.displayName',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tvalue: 'continueErrorOutput',\n\t\t\t\t\t\t\t\t\tdescription: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.continueErrorOutput.description',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdefault: 'stopWorkflow',\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.onError.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t] as INodeProperties[]),\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.nodeSettings.push(\n\t\t\t\t...([\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.notes.displayName'),\n\t\t\t\t\t\tname: 'notes',\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\ttypeOptions: {\n\t\t\t\t\t\t\trows: 5,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdefault: '',\n\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.notes.description'),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.notesInFlow.displayName'),\n\t\t\t\t\t\tname: 'notesInFlow',\n\t\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\t\tdefault: false,\n\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.notesInFlow.description'),\n\t\t\t\t\t},\n\t\t\t\t] as INodeProperties[]),\n\t\t\t);\n\t\t},\n\t\tonParameterBlur(parameterName: string) {\n\t\t\tthis.hiddenIssuesInputs = this.hiddenIssuesInputs.filter((name) => name !== parameterName);\n\t\t},\n\t\tonWorkflowActivate() {\n\t\t\tthis.hiddenIssuesInputs = [];\n\t\t\tthis.$emit('activate');\n\t\t},\n\t\tonNodeExecute() {\n\t\t\tthis.hiddenIssuesInputs = [];\n\t\t\t(this.$refs.subConnections as InstanceType<typeof NDVSubConnections>)?.showNodeInputsIssues();\n\t\t\tthis.$emit('execute');\n\t\t},\n\t\tsetValue(name: string, value: NodeParameterValue) {\n\t\t\tconst nameParts = name.split('.');\n\t\t\tlet lastNamePart: string | undefined = nameParts.pop();\n\n\t\t\tlet isArray = false;\n\t\t\tif (lastNamePart !== undefined && lastNamePart.includes('[')) {\n\t\t\t\t// It includes an index so we have to extract it\n\t\t\t\tconst lastNameParts = lastNamePart.match(/(.*)\\[(\\d+)\\]$/);\n\t\t\t\tif (lastNameParts) {\n\t\t\t\t\tnameParts.push(lastNameParts[1]);\n\t\t\t\t\tlastNamePart = lastNameParts[2];\n\t\t\t\t\tisArray = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set the value so that everything updates correctly in the UI\n\t\t\tif (nameParts.length === 0) {\n\t\t\t\t// Data is on top level\n\t\t\t\tif (value === null) {\n\t\t\t\t\t// Property should be deleted\n\t\t\t\t\tif (lastNamePart) {\n\t\t\t\t\t\tconst { [lastNamePart]: removedNodeValue, ...remainingNodeValues } = this.nodeValues;\n\t\t\t\t\t\tthis.nodeValues = remainingNodeValues;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Value should be set\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\t[lastNamePart as string]: value,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Data is on lower level\n\t\t\t\tif (value === null) {\n\t\t\t\t\t// Property should be deleted\n\t\t\t\t\tlet tempValue = get(this.nodeValues, nameParts.join('.')) as\n\t\t\t\t\t\t| INodeParameters\n\t\t\t\t\t\t| INodeParameters[];\n\n\t\t\t\t\tif (lastNamePart && !Array.isArray(tempValue)) {\n\t\t\t\t\t\tconst { [lastNamePart]: removedNodeValue, ...remainingNodeValues } = tempValue;\n\t\t\t\t\t\ttempValue = remainingNodeValues;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (isArray && Array.isArray(tempValue) && tempValue.length === 0) {\n\t\t\t\t\t\t// If a value from an array got delete and no values are left\n\t\t\t\t\t\t// delete also the parent\n\t\t\t\t\t\tlastNamePart = nameParts.pop();\n\t\t\t\t\t\ttempValue = get(this.nodeValues, nameParts.join('.')) as INodeParameters;\n\t\t\t\t\t\tif (lastNamePart) {\n\t\t\t\t\t\t\tconst { [lastNamePart]: removedArrayNodeValue, ...remainingArrayNodeValues } =\n\t\t\t\t\t\t\t\ttempValue;\n\t\t\t\t\t\t\ttempValue = remainingArrayNodeValues;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Value should be set\n\t\t\t\t\tif (typeof value === 'object') {\n\t\t\t\t\t\tset(\n\t\t\t\t\t\t\tget(this.nodeValues, nameParts.join('.')) as Record<string, unknown>,\n\t\t\t\t\t\t\tlastNamePart as string,\n\t\t\t\t\t\t\tdeepCopy(value),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tset(\n\t\t\t\t\t\t\tget(this.nodeValues, nameParts.join('.')) as Record<string, unknown>,\n\t\t\t\t\t\t\tlastNamePart as string,\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.nodeValues = { ...this.nodeValues };\n\t\t},\n\t\tcredentialSelected(updateInformation: INodeUpdatePropertiesInformation) {\n\t\t\t// Update the values on the node\n\t\t\tthis.workflowsStore.updateNodeProperties(updateInformation);\n\n\t\t\tconst node = this.workflowsStore.getNodeByName(updateInformation.name);\n\n\t\t\tif (node) {\n\t\t\t\t// Update the issues\n\t\t\t\tthis.nodeHelpers.updateNodeCredentialIssues(node);\n\t\t\t}\n\n\t\t\tvoid this.externalHooks.run('nodeSettings.credentialSelected', { updateInformation });\n\t\t},\n\t\tnameChanged(name: string) {\n\t\t\tif (this.node) {\n\t\t\t\tthis.historyStore.pushCommandToUndo(new RenameNodeCommand(this.node.name, name));\n\t\t\t}\n\t\t\t// @ts-ignore\n\t\t\tthis.valueChanged({\n\t\t\t\tvalue: name,\n\t\t\t\tname: 'name',\n\t\t\t});\n\t\t},\n\t\tvalueChanged(parameterData: IUpdateInformation) {\n\t\t\tlet newValue: NodeParameterValue;\n\n\t\t\tif (parameterData.hasOwnProperty('value')) {\n\t\t\t\t// New value is given\n\t\t\t\tnewValue = parameterData.value as string | number;\n\t\t\t} else {\n\t\t\t\t// Get new value from nodeData where it is set already\n\t\t\t\tnewValue = get(this.nodeValues, parameterData.name) as NodeParameterValue;\n\t\t\t}\n\t\t\t// Save the node name before we commit the change because\n\t\t\t// we need the old name to rename the node properly\n\t\t\tconst nodeNameBefore = parameterData.node || this.node?.name;\n\n\t\t\tif (!nodeNameBefore) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeNameBefore);\n\n\t\t\tif (node === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (parameterData.name === 'onError') {\n\t\t\t\t// If that parameter changes, we need to redraw the connections, as the error output may need to be added or removed\n\t\t\t\tthis.$emit('redrawRequired');\n\t\t\t}\n\n\t\t\tif (parameterData.name === 'name') {\n\t\t\t\t// Name of node changed so we have to set also the new node name as active\n\n\t\t\t\t// Update happens in NodeView so emit event\n\t\t\t\tconst sendData = {\n\t\t\t\t\tvalue: newValue,\n\t\t\t\t\toldValue: nodeNameBefore,\n\t\t\t\t\tname: parameterData.name,\n\t\t\t\t};\n\t\t\t\tthis.$emit('valueChanged', sendData);\n\t\t\t} else if (parameterData.name === 'parameters') {\n\t\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\t\t\t\tif (!nodeType) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Get only the parameters which are different to the defaults\n\t\t\t\tlet nodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\tnodeType.properties,\n\t\t\t\t\tnode.parameters,\n\t\t\t\t\tfalse,\n\t\t\t\t\tfalse,\n\t\t\t\t\tnode,\n\t\t\t\t);\n\n\t\t\t\tconst oldNodeParameters = Object.assign({}, nodeParameters);\n\n\t\t\t\t// Copy the data because it is the data of vuex so make sure that\n\t\t\t\t// we do not edit it directly\n\t\t\t\tnodeParameters = deepCopy(nodeParameters);\n\n\t\t\t\tif (parameterData.value && typeof parameterData.value === 'object') {\n\t\t\t\t\tfor (const parameterName of Object.keys(parameterData.value)) {\n\t\t\t\t\t\t//@ts-ignore\n\t\t\t\t\t\tnewValue = parameterData.value[parameterName];\n\n\t\t\t\t\t\t// Remove the 'parameters.' from the beginning to just have the\n\t\t\t\t\t\t// actual parameter name\n\t\t\t\t\t\tconst parameterPath = parameterName.split('.').slice(1).join('.');\n\n\t\t\t\t\t\t// Check if the path is supposed to change an array and if so get\n\t\t\t\t\t\t// the needed data like path and index\n\t\t\t\t\t\tconst parameterPathArray = parameterPath.match(/(.*)\\[(\\d+)\\]$/);\n\n\t\t\t\t\t\t// Apply the new value\n\t\t\t\t\t\t//@ts-ignore\n\t\t\t\t\t\tif (parameterData[parameterName] === undefined && parameterPathArray !== null) {\n\t\t\t\t\t\t\t// Delete array item\n\t\t\t\t\t\t\tconst path = parameterPathArray[1];\n\t\t\t\t\t\t\tconst index = parameterPathArray[2];\n\t\t\t\t\t\t\tconst data = get(nodeParameters, path);\n\n\t\t\t\t\t\t\tif (Array.isArray(data)) {\n\t\t\t\t\t\t\t\tdata.splice(parseInt(index, 10), 1);\n\t\t\t\t\t\t\t\tset(nodeParameters as object, path, data);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (newValue === undefined) {\n\t\t\t\t\t\t\t\tunset(nodeParameters as object, parameterPath);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tset(nodeParameters as object, parameterPath, newValue);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvoid this.externalHooks.run('nodeSettings.valueChanged', {\n\t\t\t\t\t\t\tparameterPath,\n\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\tparameters: this.parameters,\n\t\t\t\t\t\t\toldNodeParameters,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Get the parameters with the now new defaults according to the\n\t\t\t\t// from the user actually defined parameters\n\t\t\t\tnodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\tnodeType.properties,\n\t\t\t\t\tnodeParameters as INodeParameters,\n\t\t\t\t\ttrue,\n\t\t\t\t\tfalse,\n\t\t\t\t\tnode,\n\t\t\t\t);\n\n\t\t\t\tfor (const key of Object.keys(nodeParameters as object)) {\n\t\t\t\t\tif (nodeParameters && nodeParameters[key] !== null && nodeParameters[key] !== undefined) {\n\t\t\t\t\t\tthis.setValue(`parameters.${key}`, nodeParameters[key] as string);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (nodeParameters) {\n\t\t\t\t\tconst updateInformation: IUpdateInformation = {\n\t\t\t\t\t\tname: node.name,\n\t\t\t\t\t\tvalue: nodeParameters,\n\t\t\t\t\t};\n\n\t\t\t\t\tthis.workflowsStore.setNodeParameters(updateInformation);\n\n\t\t\t\t\tthis.nodeHelpers.updateNodeParameterIssuesByName(node.name);\n\t\t\t\t\tthis.nodeHelpers.updateNodeCredentialIssuesByName(node.name);\n\t\t\t\t}\n\t\t\t} else if (parameterData.name.startsWith('parameters.')) {\n\t\t\t\t// A node parameter changed\n\n\t\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\t\t\t\tif (!nodeType) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tparameterData.type &&\n\t\t\t\t\tthis.workflowsStore.nodeHasOutputConnection(node.name) &&\n\t\t\t\t\tSHOULD_CLEAR_NODE_OUTPUTS[nodeType.name]?.eventTypes.includes(parameterData.type) &&\n\t\t\t\t\tSHOULD_CLEAR_NODE_OUTPUTS[nodeType.name]?.parameterPaths.includes(parameterData.name)\n\t\t\t\t) {\n\t\t\t\t\tthis.workflowsStore.removeAllNodeConnection(node, { preserveInputConnections: true });\n\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\ttype: 'warning',\n\t\t\t\t\t\ttitle: this.$locale.baseText('nodeSettings.outputCleared.title'),\n\t\t\t\t\t\tmessage: this.$locale.baseText('nodeSettings.outputCleared.message'),\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Get only the parameters which are different to the defaults\n\t\t\t\tlet nodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\tnodeType.properties,\n\t\t\t\t\tnode.parameters,\n\t\t\t\t\tfalse,\n\t\t\t\t\tfalse,\n\t\t\t\t\tnode,\n\t\t\t\t);\n\t\t\t\tconst oldNodeParameters = Object.assign({}, nodeParameters);\n\n\t\t\t\t// Copy the data because it is the data of vuex so make sure that\n\t\t\t\t// we do not edit it directly\n\t\t\t\tnodeParameters = deepCopy(nodeParameters);\n\n\t\t\t\t// Remove the 'parameters.' from the beginning to just have the\n\t\t\t\t// actual parameter name\n\t\t\t\tconst parameterPath = parameterData.name.split('.').slice(1).join('.');\n\n\t\t\t\t// Check if the path is supposed to change an array and if so get\n\t\t\t\t// the needed data like path and index\n\t\t\t\tconst parameterPathArray = parameterPath.match(/(.*)\\[(\\d+)\\]$/);\n\n\t\t\t\t// Apply the new value\n\t\t\t\tif (parameterData.value === undefined && parameterPathArray !== null) {\n\t\t\t\t\t// Delete array item\n\t\t\t\t\tconst path = parameterPathArray[1];\n\t\t\t\t\tconst index = parameterPathArray[2];\n\t\t\t\t\tconst data = get(nodeParameters, path);\n\n\t\t\t\t\tif (Array.isArray(data)) {\n\t\t\t\t\t\tdata.splice(parseInt(index, 10), 1);\n\t\t\t\t\t\tset(nodeParameters as object, path, data);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (newValue === undefined) {\n\t\t\t\t\t\tunset(nodeParameters as object, parameterPath);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tset(nodeParameters as object, parameterPath, newValue);\n\t\t\t\t\t}\n\t\t\t\t\t// If value is updated, remove parameter values that have invalid options\n\t\t\t\t\t// so getNodeParameters checks don't fail\n\t\t\t\t\tthis.removeMismatchedOptionValues(nodeType, nodeParameters, {\n\t\t\t\t\t\tname: parameterPath,\n\t\t\t\t\t\tvalue: newValue,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Get the parameters with the now new defaults according to the\n\t\t\t\t// from the user actually defined parameters\n\t\t\t\tnodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\tnodeType.properties,\n\t\t\t\t\tnodeParameters as INodeParameters,\n\t\t\t\t\ttrue,\n\t\t\t\t\tfalse,\n\t\t\t\t\tnode,\n\t\t\t\t);\n\n\t\t\t\tfor (const key of Object.keys(nodeParameters as object)) {\n\t\t\t\t\tif (nodeParameters && nodeParameters[key] !== null && nodeParameters[key] !== undefined) {\n\t\t\t\t\t\tthis.setValue(`parameters.${key}`, nodeParameters[key] as string);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Update the data in vuex\n\t\t\t\tconst updateInformation: IUpdateInformation = {\n\t\t\t\t\tname: node.name,\n\t\t\t\t\tvalue: nodeParameters,\n\t\t\t\t};\n\n\t\t\t\tthis.workflowsStore.setNodeParameters(updateInformation);\n\n\t\t\t\tvoid this.externalHooks.run('nodeSettings.valueChanged', {\n\t\t\t\t\tparameterPath,\n\t\t\t\t\tnewValue,\n\t\t\t\t\tparameters: this.parameters,\n\t\t\t\t\toldNodeParameters,\n\t\t\t\t});\n\n\t\t\t\tthis.nodeHelpers.updateNodeParameterIssuesByName(node.name);\n\t\t\t\tthis.nodeHelpers.updateNodeCredentialIssuesByName(node.name);\n\t\t\t\tthis.$telemetry.trackNodeParametersValuesChange(nodeType.name, parameterData);\n\t\t\t} else {\n\t\t\t\t// A property on the node itself changed\n\n\t\t\t\t// Update data in settings\n\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t[parameterData.name]: newValue,\n\t\t\t\t};\n\n\t\t\t\t// Update data in vuex\n\t\t\t\tconst updateInformation = {\n\t\t\t\t\tname: node.name,\n\t\t\t\t\tkey: parameterData.name,\n\t\t\t\t\tvalue: newValue,\n\t\t\t\t};\n\n\t\t\t\tthis.workflowsStore.setNodeValue(updateInformation);\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * Removes node values that are not valid options for the given parameter.\n\t\t * This can happen when there are multiple node parameters with the same name\n\t\t * but different options and display conditions\n\t\t * @param nodeType The node type description\n\t\t * @param nodeParameterValues Current node parameter values\n\t\t * @param updatedParameter The parameter that was updated. Will be used to determine which parameters to remove based on their display conditions and option values\n\t\t */\n\t\tremoveMismatchedOptionValues(\n\t\t\tnodeType: INodeTypeDescription,\n\t\t\tnodeParameterValues: INodeParameters | null,\n\t\t\tupdatedParameter: { name: string; value: NodeParameterValue },\n\t\t) {\n\t\t\tnodeType.properties.forEach((prop) => {\n\t\t\t\tconst displayOptions = prop.displayOptions;\n\t\t\t\t// Not processing parameters that are not set or don't have options\n\t\t\t\tif (!nodeParameterValues?.hasOwnProperty(prop.name) || !displayOptions || !prop.options) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Only process the parameters that depend on the updated parameter\n\t\t\t\tconst showCondition = displayOptions.show?.[updatedParameter.name];\n\t\t\t\tconst hideCondition = displayOptions.hide?.[updatedParameter.name];\n\t\t\t\tif (showCondition === undefined && hideCondition === undefined) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet hasValidOptions = true;\n\n\t\t\t\t// Every value should be a possible option\n\t\t\t\tif (isINodePropertyCollectionList(prop.options) || isINodePropertiesList(prop.options)) {\n\t\t\t\t\thasValidOptions = Object.keys(nodeParameterValues).every(\n\t\t\t\t\t\t(key) => (prop.options ?? []).find((option) => option.name === key) !== undefined,\n\t\t\t\t\t);\n\t\t\t\t} else if (isINodePropertyOptionsList(prop.options)) {\n\t\t\t\t\thasValidOptions = !!prop.options.find(\n\t\t\t\t\t\t(option) => option.value === nodeParameterValues[prop.name],\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (!hasValidOptions && displayParameter(nodeParameterValues, prop, this.node)) {\n\t\t\t\t\tunset(nodeParameterValues as object, prop.name);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\t/**\n\t\t * Sets the values of the active node in the internal settings variables\n\t\t */\n\t\tsetNodeValues() {\n\t\t\t// No node selected\n\t\t\tif (!this.node) {\n\t\t\t\tthis.nodeValuesInitialized = true;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.nodeType !== null) {\n\t\t\t\tthis.nodeValid = true;\n\n\t\t\t\tconst foundNodeSettings = [];\n\t\t\t\tif (this.node.color) {\n\t\t\t\t\tfoundNodeSettings.push('color');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tcolor: this.node.color,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.notes) {\n\t\t\t\t\tfoundNodeSettings.push('notes');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tnotes: this.node.notes,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.alwaysOutputData) {\n\t\t\t\t\tfoundNodeSettings.push('alwaysOutputData');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\talwaysOutputData: this.node.alwaysOutputData,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.executeOnce) {\n\t\t\t\t\tfoundNodeSettings.push('executeOnce');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\texecuteOnce: this.node.executeOnce,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.continueOnFail) {\n\t\t\t\t\tfoundNodeSettings.push('onError');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tonError: 'continueRegularOutput',\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.onError) {\n\t\t\t\t\tfoundNodeSettings.push('onError');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tonError: this.node.onError,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.notesInFlow) {\n\t\t\t\t\tfoundNodeSettings.push('notesInFlow');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tnotesInFlow: this.node.notesInFlow,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.retryOnFail) {\n\t\t\t\t\tfoundNodeSettings.push('retryOnFail');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tretryOnFail: this.node.retryOnFail,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.maxTries) {\n\t\t\t\t\tfoundNodeSettings.push('maxTries');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tmaxTries: this.node.maxTries,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.waitBetweenTries) {\n\t\t\t\t\tfoundNodeSettings.push('waitBetweenTries');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\twaitBetweenTries: this.node.waitBetweenTries,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Set default node settings\n\t\t\t\tfor (const nodeSetting of this.nodeSettings) {\n\t\t\t\t\tif (!foundNodeSettings.includes(nodeSetting.name)) {\n\t\t\t\t\t\t// Set default value\n\t\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\t\t[nodeSetting.name]: nodeSetting.default,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\tparameters: deepCopy(this.node.parameters),\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tthis.nodeValid = false;\n\t\t\t}\n\n\t\t\tthis.nodeValuesInitialized = true;\n\t\t},\n\t\tonMissingNodeTextClick(event: MouseEvent) {\n\t\t\tif ((event.target as Element).localName === 'a') {\n\t\t\t\tthis.$telemetry.track('user clicked cnr browse button', {\n\t\t\t\t\tsource: 'cnr missing node modal',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonMissingNodeLearnMoreLinkClick() {\n\t\t\tthis.$telemetry.track('user clicked cnr docs link', {\n\t\t\t\tsource: 'missing node modal source',\n\t\t\t\tpackage_name: this.node?.type.split('.')[0],\n\t\t\t\tnode_type: this.node?.type,\n\t\t\t});\n\t\t},\n\t\tonStopExecution() {\n\t\t\tthis.$emit('stopExecution');\n\t\t},\n\t\topenSettings() {\n\t\t\tthis.openPanel = 'settings';\n\t\t},\n\t\tonTabSelect(tab: 'params' | 'settings') {\n\t\t\tthis.openPanel = tab;\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.header {\n\tbackground-color: var(--color-background-base);\n}\n\n.warningIcon {\n\tcolor: var(--color-text-lighter);\n\tfont-size: var(--font-size-2xl);\n}\n\n.descriptionContainer {\n\tdisplay: flex;\n\tflex-direction: column;\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.node-settings {\n\tdisplay: flex;\n\tflex-direction: column;\n\toverflow: hidden;\n\tbackground-color: var(--color-background-xlight);\n\theight: 100%;\n\twidth: 100%;\n\n\t.no-parameters {\n\t\tmargin-top: var(--spacing-xs);\n\t}\n\n\t.header-side-menu {\n\t\tpadding: var(--spacing-s) var(--spacing-s) var(--spacing-s) var(--spacing-s);\n\t\tfont-size: var(--font-size-l);\n\t\tdisplay: flex;\n\n\t\t.node-name {\n\t\t\tpadding-top: var(--spacing-5xs);\n\t\t\tflex-grow: 1;\n\t\t}\n\t}\n\n\t.node-is-not-valid {\n\t\theight: 75%;\n\t\tpadding: 10px;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\ttext-align: center;\n\t\tline-height: var(--font-line-height-regular);\n\t}\n\n\t.node-parameters-wrapper {\n\t\toverflow-y: auto;\n\t\tpadding: 0 var(--spacing-m) var(--spacing-l) var(--spacing-m);\n\t\tflex-grow: 1;\n\t}\n\n\t&.dragging {\n\t\tborder-color: var(--color-primary);\n\t\tbox-shadow: 0px 6px 16px rgba(255, 74, 51, 0.15);\n\t}\n}\n\n.parameter-content {\n\tfont-size: 0.9em;\n\tmargin-right: -15px;\n\tmargin-left: -15px;\n\tinput {\n\t\twidth: calc(100% - 35px);\n\t\tpadding: 5px;\n\t}\n\tselect {\n\t\twidth: calc(100% - 20px);\n\t\tpadding: 5px;\n\t}\n\n\t&:before {\n\t\tdisplay: table;\n\t\tcontent: ' ';\n\t\tposition: relative;\n\t\tbox-sizing: border-box;\n\t\tclear: both;\n\t}\n}\n\n.parameter-wrapper {\n\tpadding: 0 1em;\n}\n\n.color-reset-button-wrapper {\n\tposition: relative;\n}\n.color-reset-button {\n\tposition: absolute;\n\tright: 7px;\n\ttop: -25px;\n}\n\n.node-version {\n\tborder-top: var(--border-base);\n\tfont-size: var(--font-size-xs);\n\tfont-size: var(--font-size-2xs);\n\tpadding: var(--spacing-xs) 0 var(--spacing-2xs) 0;\n\tcolor: var(--color-text-light);\n}\n\n.parameter-value {\n\tinput.expression {\n\t\tborder-style: dashed;\n\t\tborder-color: #ff9600;\n\t\tdisplay: inline-block;\n\t\tposition: relative;\n\t\twidth: 100%;\n\t\tbox-sizing: border-box;\n\t\tbackground-color: #793300;\n\t}\n}\n</style>\n","<template>\n\t<component\n\t\t:is=\"tag\"\n\t\tref=\"wrapper\"\n\t\t:class=\"{ [$style.dragging]: isDragging }\"\n\t\t@mousedown=\"onDragStart\"\n\t>\n\t\t<slot :is-dragging=\"isDragging\"></slot>\n\n\t\t<Teleport to=\"body\">\n\t\t\t<div v-show=\"isDragging\" ref=\"draggable\" :class=\"$style.draggable\" :style=\"draggableStyle\">\n\t\t\t\t<slot name=\"preview\" :can-drop=\"canDrop\" :el=\"draggingEl\"></slot>\n\t\t\t</div>\n\t\t</Teleport>\n\t</component>\n</template>\n\n<script lang=\"ts\">\nimport type { XYPosition } from '@/Interface';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { mapStores } from 'pinia';\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n\tname: 'Draggable',\n\tprops: {\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\ttype: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tdata: {\n\t\t\ttype: String,\n\t\t},\n\t\ttag: {\n\t\t\ttype: String,\n\t\t\tdefault: 'div',\n\t\t},\n\t\ttargetDataKey: {\n\t\t\ttype: String,\n\t\t},\n\t},\n\tdata() {\n\t\tconst draggablePosition = {\n\t\t\tx: -100,\n\t\t\ty: -100,\n\t\t};\n\n\t\treturn {\n\t\t\tisDragging: false,\n\t\t\tdraggablePosition,\n\t\t\tdraggingEl: null as null | HTMLElement,\n\t\t\tdraggableStyle: {\n\t\t\t\ttransform: `translate(${draggablePosition.x}px, ${draggablePosition.y}px)`,\n\t\t\t},\n\t\t\tanimationFrameId: 0,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNDVStore),\n\t\tcanDrop(): boolean {\n\t\t\treturn this.ndvStore.canDraggableDrop;\n\t\t},\n\t\tstickyPosition(): XYPosition | null {\n\t\t\treturn this.ndvStore.draggableStickyPos;\n\t\t},\n\t},\n\tmethods: {\n\t\tsetDraggableStyle() {\n\t\t\tthis.draggableStyle = {\n\t\t\t\ttransform: `translate(${this.draggablePosition.x}px, ${this.draggablePosition.y}px)`,\n\t\t\t};\n\t\t},\n\t\tonDragStart(e: MouseEvent) {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.draggingEl = e.target as HTMLElement;\n\t\t\tif (this.targetDataKey && this.draggingEl.dataset?.target !== this.targetDataKey) {\n\t\t\t\tthis.draggingEl = this.draggingEl.closest(\n\t\t\t\t\t`[data-target=\"${this.targetDataKey}\"]`,\n\t\t\t\t) as HTMLElement;\n\t\t\t}\n\n\t\t\tif (this.targetDataKey && this.draggingEl?.dataset?.target !== this.targetDataKey) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\n\t\t\tthis.isDragging = false;\n\t\t\tthis.draggablePosition = { x: e.pageX, y: e.pageY };\n\t\t\tthis.setDraggableStyle();\n\n\t\t\twindow.addEventListener('mousemove', this.onDrag);\n\t\t\twindow.addEventListener('mouseup', this.onDragEnd);\n\n\t\t\t// blur so that any focused inputs update value\n\t\t\tconst activeElement = document.activeElement as HTMLElement;\n\t\t\tif (activeElement) {\n\t\t\t\tactiveElement.blur();\n\t\t\t}\n\t\t},\n\t\tonDrag(e: MouseEvent) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this.isDragging) {\n\t\t\t\tthis.isDragging = true;\n\n\t\t\t\tconst data =\n\t\t\t\t\tthis.targetDataKey && this.draggingEl ? this.draggingEl.dataset.value : this.data || '';\n\t\t\t\tthis.ndvStore.draggableStartDragging({\n\t\t\t\t\ttype: this.type,\n\t\t\t\t\tdata: data || '',\n\t\t\t\t\tdimensions: this.draggingEl?.getBoundingClientRect() ?? null,\n\t\t\t\t});\n\n\t\t\t\tthis.$emit('dragstart', this.draggingEl);\n\t\t\t\tdocument.body.style.cursor = 'grabbing';\n\t\t\t}\n\n\t\t\tthis.animationFrameId = window.requestAnimationFrame(() => {\n\t\t\t\tif (this.canDrop && this.stickyPosition) {\n\t\t\t\t\tthis.draggablePosition = { x: this.stickyPosition[0], y: this.stickyPosition[1] };\n\t\t\t\t} else {\n\t\t\t\t\tthis.draggablePosition = { x: e.pageX, y: e.pageY };\n\t\t\t\t}\n\t\t\t\tthis.setDraggableStyle();\n\t\t\t\tthis.$emit('drag', this.draggablePosition);\n\t\t\t});\n\t\t},\n\t\tonDragEnd() {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdocument.body.style.cursor = 'unset';\n\t\t\twindow.removeEventListener('mousemove', this.onDrag);\n\t\t\twindow.removeEventListener('mouseup', this.onDragEnd);\n\t\t\twindow.cancelAnimationFrame(this.animationFrameId);\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.$emit('dragend', this.draggingEl);\n\t\t\t\tthis.isDragging = false;\n\t\t\t\tthis.draggingEl = null;\n\t\t\t\tthis.ndvStore.draggableStopDragging();\n\t\t\t}, 0);\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.dragging {\n\tvisibility: visible;\n\tcursor: grabbing;\n}\n\n.draggable {\n\tposition: fixed;\n\tz-index: 9999999;\n\ttop: 0;\n\tleft: 0;\n}\n\n.draggable-data-transfer {\n\twidth: 0;\n\theight: 0;\n}\n</style>\n","<template>\n\t<Draggable\n\t\ttype=\"panel-resize\"\n\t\t:class=\"$style.dragContainer\"\n\t\t@drag=\"onDrag\"\n\t\t@dragstart=\"onDragStart\"\n\t\t@dragend=\"onDragEnd\"\n\t>\n\t\t<template #default=\"{ isDragging }\">\n\t\t\t<div :class=\"{ [$style.dragButton]: true }\">\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"canMoveLeft\"\n\t\t\t\t\t:class=\"{ [$style.leftArrow]: true, [$style.visible]: isDragging }\"\n\t\t\t\t>\n\t\t\t\t\t<font-awesome-icon icon=\"arrow-left\" />\n\t\t\t\t</span>\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"canMoveRight\"\n\t\t\t\t\t:class=\"{ [$style.rightArrow]: true, [$style.visible]: isDragging }\"\n\t\t\t\t>\n\t\t\t\t\t<font-awesome-icon icon=\"arrow-right\" />\n\t\t\t\t</span>\n\t\t\t\t<div :class=\"$style.grid\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\t</Draggable>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport Draggable from './Draggable.vue';\n\nexport default defineComponent({\n\tcomponents: {\n\t\tDraggable,\n\t},\n\tprops: {\n\t\tcanMoveRight: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tcanMoveLeft: {\n\t\t\ttype: Boolean,\n\t\t},\n\t},\n\tmethods: {\n\t\tonDrag(e: { x: number; y: number }) {\n\t\t\tthis.$emit('drag', e);\n\t\t},\n\t\tonDragStart() {\n\t\t\tthis.$emit('dragstart');\n\t\t},\n\t\tonDragEnd() {\n\t\t\tthis.$emit('dragend');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.dragContainer {\n\tpointer-events: all;\n}\n.dragButton {\n\tbackground-color: var(--color-background-base);\n\twidth: 64px;\n\theight: 21px;\n\tborder-top-left-radius: var(--border-radius-base);\n\tborder-top-right-radius: var(--border-radius-base);\n\tcursor: grab;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\toverflow: visible;\n\tposition: relative;\n\tz-index: 3;\n\n\t&:hover {\n\t\t.leftArrow,\n\t\t.rightArrow {\n\t\t\tvisibility: visible;\n\t\t}\n\t}\n}\n\n.visible {\n\tvisibility: visible !important;\n}\n\n.arrow {\n\tposition: absolute;\n\tcolor: var(--color-background-xlight);\n\tfont-size: var(--font-size-3xs);\n\tvisibility: hidden;\n\ttop: 0;\n}\n\n.leftArrow {\n\tcomposes: arrow;\n\tleft: -16px;\n}\n\n.rightArrow {\n\tcomposes: arrow;\n\tright: -16px;\n}\n\n.grid {\n\t> div {\n\t\tdisplay: flex;\n\n\t\t&:first-child {\n\t\t\t> div {\n\t\t\t\tmargin-bottom: 2px;\n\t\t\t}\n\t\t}\n\n\t\t> div {\n\t\t\theight: 2px;\n\t\t\twidth: 2px;\n\t\t\tborder-radius: 50%;\n\t\t\tbackground-color: var(--color-foreground-xdark);\n\t\t\tmargin-right: 4px;\n\n\t\t\t&:last-child {\n\t\t\t\tmargin-right: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n</style>\n","<template>\n\t<aside :class=\"$style.floatingNodes\">\n\t\t<ul\n\t\t\tv-for=\"connectionGroup in connectionGroups\"\n\t\t\t:key=\"connectionGroup\"\n\t\t\t:class=\"[$style.nodesList, $style[connectionGroup]]\"\n\t\t>\n\t\t\t<template v-for=\"{ node, nodeType } in connectedNodes[connectionGroup]\">\n\t\t\t\t<n8n-tooltip\n\t\t\t\t\tv-if=\"node && nodeType\"\n\t\t\t\t\t:key=\"node.name\"\n\t\t\t\t\t:placement=\"tooltipPositionMapper[connectionGroup]\"\n\t\t\t\t\t:teleported=\"false\"\n\t\t\t\t\t:offset=\"60\"\n\t\t\t\t>\n\t\t\t\t\t<template #content>{{ node.name }}</template>\n\n\t\t\t\t\t<li\n\t\t\t\t\t\t:class=\"$style.connectedNode\"\n\t\t\t\t\t\tdata-test-id=\"floating-node\"\n\t\t\t\t\t\t:data-node-name=\"node.name\"\n\t\t\t\t\t\t:data-node-placement=\"connectionGroup\"\n\t\t\t\t\t\t@click=\"$emit('switchSelectedNode', node.name)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<NodeIcon\n\t\t\t\t\t\t\t:node-type=\"nodeType\"\n\t\t\t\t\t\t\t:node-name=\"node.name\"\n\t\t\t\t\t\t\t:tooltip-position=\"tooltipPositionMapper[connectionGroup]\"\n\t\t\t\t\t\t\t:size=\"35\"\n\t\t\t\t\t\t\tcircle\n\t\t\t\t\t\t/>\n\t\t\t\t\t</li>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</template>\n\t\t</ul>\n\t</aside>\n</template>\n\n<script setup lang=\"ts\">\nimport type { INodeUi } from '@/Interface';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { computed, onMounted, onBeforeUnmount } from 'vue';\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport type { INodeTypeDescription } from 'n8n-workflow';\n\ninterface Props {\n\trootNode: INodeUi;\n}\nconst enum FloatingNodePosition {\n\ttop = 'outputSub',\n\tright = 'outputMain',\n\tleft = 'inputMain',\n}\nconst props = defineProps<Props>();\nconst workflowsStore = useWorkflowsStore();\nconst nodeTypesStore = useNodeTypesStore();\nconst workflow = workflowsStore.getCurrentWorkflow();\nconst emit = defineEmits(['switchSelectedNode']);\n\ninterface NodeConfig {\n\tnode: INodeUi;\n\tnodeType: INodeTypeDescription;\n}\nfunction moveNodeDirection(direction: FloatingNodePosition) {\n\tconst matchedDirectionNode = connectedNodes.value[direction][0];\n\tif (matchedDirectionNode) {\n\t\temit('switchSelectedNode', matchedDirectionNode.node.name);\n\t}\n}\n\nfunction onKeyDown(e: KeyboardEvent) {\n\tif (e.shiftKey && e.altKey && (e.ctrlKey || e.metaKey)) {\n\t\t/* eslint-disable @typescript-eslint/naming-convention */\n\t\tconst mapper = {\n\t\t\tArrowUp: FloatingNodePosition.top,\n\t\t\tArrowRight: FloatingNodePosition.right,\n\t\t\tArrowLeft: FloatingNodePosition.left,\n\t\t};\n\t\t/* eslint-enable @typescript-eslint/naming-convention */\n\n\t\tconst matchingDirection = mapper[e.key as keyof typeof mapper] || null;\n\t\tif (matchingDirection) {\n\t\t\tmoveNodeDirection(matchingDirection);\n\t\t}\n\t}\n}\nfunction getINodesFromNames(names: string[]): NodeConfig[] {\n\treturn names\n\t\t.map((name) => {\n\t\t\tconst node = workflowsStore.getNodeByName(name);\n\t\t\tif (node) {\n\t\t\t\tconst nodeType = nodeTypesStore.getNodeType(node.type);\n\t\t\t\tif (nodeType) {\n\t\t\t\t\treturn { node, nodeType };\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t})\n\t\t.filter((n): n is NodeConfig => n !== null);\n}\nconst connectedNodes = computed<\n\tRecord<FloatingNodePosition, Array<{ node: INodeUi; nodeType: INodeTypeDescription }>>\n>(() => {\n\tconst rootName = props.rootNode.name;\n\treturn {\n\t\t[FloatingNodePosition.top]: getINodesFromNames(\n\t\t\tworkflow.getChildNodes(rootName, 'ALL_NON_MAIN'),\n\t\t),\n\t\t[FloatingNodePosition.right]: getINodesFromNames(workflow.getChildNodes(rootName, 'main', 1)),\n\t\t[FloatingNodePosition.left]: getINodesFromNames(workflow.getParentNodes(rootName, 'main', 1)),\n\t};\n});\n\nconst connectionGroups = [\n\tFloatingNodePosition.top,\n\tFloatingNodePosition.right,\n\tFloatingNodePosition.left,\n];\nconst tooltipPositionMapper = {\n\t[FloatingNodePosition.top]: 'bottom',\n\t[FloatingNodePosition.right]: 'left',\n\t[FloatingNodePosition.left]: 'right',\n};\n\nonMounted(() => {\n\tdocument.addEventListener('keydown', onKeyDown, true);\n});\n\nonBeforeUnmount(() => {\n\tdocument.removeEventListener('keydown', onKeyDown, true);\n});\ndefineExpose({\n\tmoveNodeDirection,\n});\n</script>\n\n<style lang=\"scss\" module>\n.floatingNodes {\n\tposition: fixed;\n\tbottom: 0;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n\tz-index: 10;\n\tpointer-events: none;\n}\n.floatingNodes {\n\tright: 0;\n}\n\n.nodesList {\n\tlist-style: none;\n\tpadding: 0;\n\tposition: absolute;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-direction: column;\n\twidth: min-content;\n\tmargin: auto;\n\ttransform-origin: center;\n\tgap: var(--spacing-s);\n\ttransition: transform 0.2s ease-in-out;\n\n\t&.inputSub,\n\t&.outputSub {\n\t\tright: 0;\n\t\tleft: 0;\n\t\tflex-direction: row;\n\t}\n\t&.outputSub {\n\t\ttop: 0;\n\t}\n\t&.inputSub {\n\t\tbottom: 0;\n\t}\n\t&.outputMain,\n\t&.inputMain {\n\t\ttop: 0;\n\t\tbottom: 0;\n\t}\n\t&.outputMain {\n\t\tright: 0;\n\t}\n\t&.inputMain {\n\t\tleft: 0;\n\t}\n\n\t&.outputMain {\n\t\ttransform: translateX(50%);\n\t}\n\t&.outputSub {\n\t\ttransform: translateY(-50%);\n\t}\n\t&.inputMain {\n\t\ttransform: translateX(-50%);\n\t}\n\t&.inputSub {\n\t\ttransform: translateY(50%);\n\t}\n}\n.connectedNode {\n\tborder: var(--border-base);\n\tbackground-color: var(--color-canvas-node-background);\n\tborder-radius: 100%;\n\tpadding: var(--spacing-s);\n\tcursor: pointer;\n\tpointer-events: all;\n\ttransition: transform 0.2s cubic-bezier(0.19, 1, 0.22, 1);\n\tposition: relative;\n\ttransform: scale(0.8);\n\tdisplay: flex;\n\tjustify-self: center;\n\talign-self: center;\n\n\t&::after {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\ttop: -35%;\n\t\tright: -30%;\n\t\tbottom: -35%;\n\t\tleft: -30%;\n\t\tz-index: -1;\n\t}\n\t.outputMain &,\n\t.inputMain & {\n\t\tborder-radius: var(--border-radius-large);\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\t.outputMain & {\n\t\t&:hover {\n\t\t\ttransform: scale(1.2) translateX(-50%);\n\t\t}\n\t}\n\t.outputSub & {\n\t\t&:hover {\n\t\t\ttransform: scale(1.2) translateY(50%);\n\t\t}\n\t}\n\t.inputMain & {\n\t\t&:hover {\n\t\t\ttransform: scale(1.2) translateX(50%);\n\t\t}\n\t}\n\t.inputSub & {\n\t\t&:hover {\n\t\t\ttransform: scale(1.2) translateY(-50%);\n\t\t}\n\t}\n}\n</style>\n","<template>\n\t<div>\n\t\t<NDVFloatingNodes\n\t\t\tv-if=\"activeNode\"\n\t\t\t:root-node=\"activeNode\"\n\t\t\t@switch-selected-node=\"onSwitchSelectedNode\"\n\t\t/>\n\t\t<div v-if=\"!hideInputAndOutput\" :class=\"$style.inputPanel\" :style=\"inputPanelStyles\">\n\t\t\t<slot name=\"input\"></slot>\n\t\t</div>\n\t\t<div v-if=\"!hideInputAndOutput\" :class=\"$style.outputPanel\" :style=\"outputPanelStyles\">\n\t\t\t<slot name=\"output\"></slot>\n\t\t</div>\n\t\t<div :class=\"$style.mainPanel\" :style=\"mainPanelStyles\">\n\t\t\t<n8n-resize-wrapper\n\t\t\t\t:is-resizing-enabled=\"currentNodePaneType !== 'unknown'\"\n\t\t\t\t:width=\"relativeWidthToPx(mainPanelDimensions.relativeWidth)\"\n\t\t\t\t:min-width=\"MIN_PANEL_WIDTH\"\n\t\t\t\t:grid-size=\"20\"\n\t\t\t\t:supported-directions=\"supportedResizeDirections\"\n\t\t\t\t@resize=\"onResizeDebounced\"\n\t\t\t\t@resizestart=\"onResizeStart\"\n\t\t\t\t@resizeend=\"onResizeEnd\"\n\t\t\t>\n\t\t\t\t<div :class=\"$style.dragButtonContainer\">\n\t\t\t\t\t<PanelDragButton\n\t\t\t\t\t\tv-if=\"!hideInputAndOutput && isDraggable\"\n\t\t\t\t\t\t:class=\"{ [$style.draggable]: true, [$style.visible]: isDragging }\"\n\t\t\t\t\t\t:can-move-left=\"canMoveLeft\"\n\t\t\t\t\t\t:can-move-right=\"canMoveRight\"\n\t\t\t\t\t\t@dragstart=\"onDragStart\"\n\t\t\t\t\t\t@drag=\"onDrag\"\n\t\t\t\t\t\t@dragend=\"onDragEnd\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div :class=\"{ [$style.mainPanelInner]: true, [$style.dragging]: isDragging }\">\n\t\t\t\t\t<slot name=\"main\" />\n\t\t\t\t</div>\n\t\t\t</n8n-resize-wrapper>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { PropType } from 'vue';\nimport { mapStores } from 'pinia';\nimport { get } from 'lodash-es';\nimport { useStorage } from '@/composables/useStorage';\n\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport PanelDragButton from './PanelDragButton.vue';\n\nimport { LOCAL_STORAGE_MAIN_PANEL_RELATIVE_WIDTH, MAIN_NODE_PANEL_WIDTH } from '@/constants';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { ndvEventBus } from '@/event-bus';\nimport NDVFloatingNodes from '@/components/NDVFloatingNodes.vue';\nimport { useDebounce } from '@/composables/useDebounce';\n\nconst SIDE_MARGIN = 24;\nconst SIDE_PANELS_MARGIN = 80;\nconst MIN_PANEL_WIDTH = 280;\nconst PANEL_WIDTH = 320;\nconst PANEL_WIDTH_LARGE = 420;\n\nconst initialMainPanelWidth: { [key: string]: number } = {\n\tregular: MAIN_NODE_PANEL_WIDTH,\n\tdragless: MAIN_NODE_PANEL_WIDTH,\n\tunknown: MAIN_NODE_PANEL_WIDTH,\n\tinputless: MAIN_NODE_PANEL_WIDTH,\n\twide: MAIN_NODE_PANEL_WIDTH * 2,\n};\n\nexport default defineComponent({\n\tname: 'NDVDraggablePanels',\n\tcomponents: {\n\t\tPanelDragButton,\n\t\tNDVFloatingNodes,\n\t},\n\tprops: {\n\t\tisDraggable: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\thideInputAndOutput: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tposition: {\n\t\t\ttype: Number,\n\t\t},\n\t\tnodeType: {\n\t\t\ttype: Object as PropType<INodeTypeDescription | null>,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t},\n\tsetup() {\n\t\tconst { callDebounced } = useDebounce();\n\n\t\treturn { callDebounced };\n\t},\n\tdata(): {\n\t\twindowWidth: number;\n\t\tisDragging: boolean;\n\t\tMIN_PANEL_WIDTH: number;\n\t\tinitialized: boolean;\n\t} {\n\t\treturn {\n\t\t\twindowWidth: 1,\n\t\t\tisDragging: false,\n\t\t\tMIN_PANEL_WIDTH,\n\t\t\tinitialized: false,\n\t\t};\n\t},\n\tmounted() {\n\t\tthis.setTotalWidth();\n\n\t\t/*\n\t\t\tOnly set(or restore) initial position if `mainPanelDimensions`\n\t\t\tis at the default state({relativeLeft:1, relativeRight: 1, relativeWidth: 1}) to make sure we use store values if they are set\n\t\t*/\n\t\tif (\n\t\t\tthis.mainPanelDimensions.relativeLeft === 1 &&\n\t\t\tthis.mainPanelDimensions.relativeRight === 1\n\t\t) {\n\t\t\tthis.setMainPanelWidth();\n\t\t\tthis.setPositions(this.getInitialLeftPosition(this.mainPanelDimensions.relativeWidth));\n\t\t\tthis.restorePositionData();\n\t\t}\n\n\t\twindow.addEventListener('resize', this.setTotalWidth);\n\t\tthis.$emit('init', { position: this.mainPanelDimensions.relativeLeft });\n\t\tsetTimeout(() => {\n\t\t\tthis.initialized = true;\n\t\t}, 0);\n\n\t\tndvEventBus.on('setPositionByName', this.setPositionByName);\n\t},\n\tbeforeUnmount() {\n\t\twindow.removeEventListener('resize', this.setTotalWidth);\n\t\tndvEventBus.off('setPositionByName', this.setPositionByName);\n\t},\n\tcomputed: {\n\t\t...mapStores(useNDVStore),\n\t\tmainPanelDimensions(): {\n\t\t\trelativeWidth: number;\n\t\t\trelativeLeft: number;\n\t\t\trelativeRight: number;\n\t\t} {\n\t\t\treturn this.ndvStore.getMainPanelDimensions(this.currentNodePaneType);\n\t\t},\n\t\tactiveNode() {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tsupportedResizeDirections(): string[] {\n\t\t\tconst supportedDirections = ['right'];\n\n\t\t\tif (this.isDraggable) supportedDirections.push('left');\n\t\t\treturn supportedDirections;\n\t\t},\n\t\tcurrentNodePaneType(): string {\n\t\t\tif (!this.hasInputSlot) return 'inputless';\n\t\t\tif (!this.isDraggable) return 'dragless';\n\t\t\tif (this.nodeType === null) return 'unknown';\n\t\t\treturn get(this, 'nodeType.parameterPane') || 'regular';\n\t\t},\n\t\thasInputSlot(): boolean {\n\t\t\treturn this.$slots.input !== undefined;\n\t\t},\n\t\tinputPanelMargin(): number {\n\t\t\treturn this.pxToRelativeWidth(SIDE_PANELS_MARGIN);\n\t\t},\n\t\tminWindowWidth(): number {\n\t\t\treturn 2 * (SIDE_MARGIN + SIDE_PANELS_MARGIN) + MIN_PANEL_WIDTH;\n\t\t},\n\t\tminimumLeftPosition(): number {\n\t\t\tif (this.windowWidth < this.minWindowWidth) return this.pxToRelativeWidth(1);\n\n\t\t\tif (!this.hasInputSlot) return this.pxToRelativeWidth(SIDE_MARGIN);\n\t\t\treturn this.pxToRelativeWidth(SIDE_MARGIN + 20) + this.inputPanelMargin;\n\t\t},\n\t\tmaximumRightPosition(): number {\n\t\t\tif (this.windowWidth < this.minWindowWidth) return this.pxToRelativeWidth(1);\n\n\t\t\treturn this.pxToRelativeWidth(SIDE_MARGIN + 20) + this.inputPanelMargin;\n\t\t},\n\t\tcanMoveLeft(): boolean {\n\t\t\treturn this.mainPanelDimensions.relativeLeft > this.minimumLeftPosition;\n\t\t},\n\t\tcanMoveRight(): boolean {\n\t\t\treturn this.mainPanelDimensions.relativeRight > this.maximumRightPosition;\n\t\t},\n\t\tmainPanelStyles(): { left: string; right: string } {\n\t\t\treturn {\n\t\t\t\tleft: `${this.relativeWidthToPx(this.mainPanelDimensions.relativeLeft)}px`,\n\t\t\t\tright: `${this.relativeWidthToPx(this.mainPanelDimensions.relativeRight)}px`,\n\t\t\t};\n\t\t},\n\t\tinputPanelStyles(): { right: string } {\n\t\t\treturn {\n\t\t\t\tright: `${this.relativeWidthToPx(this.calculatedPositions.inputPanelRelativeRight)}px`,\n\t\t\t};\n\t\t},\n\t\toutputPanelStyles(): { left: string; transform: string } {\n\t\t\treturn {\n\t\t\t\tleft: `${this.relativeWidthToPx(this.calculatedPositions.outputPanelRelativeLeft)}px`,\n\t\t\t\ttransform: `translateX(-${this.relativeWidthToPx(this.outputPanelRelativeTranslate)}px)`,\n\t\t\t};\n\t\t},\n\t\tcalculatedPositions(): { inputPanelRelativeRight: number; outputPanelRelativeLeft: number } {\n\t\t\tconst hasInput = this.$slots.input !== undefined;\n\t\t\tconst outputPanelRelativeLeft =\n\t\t\t\tthis.mainPanelDimensions.relativeLeft + this.mainPanelDimensions.relativeWidth;\n\n\t\t\tconst inputPanelRelativeRight = hasInput\n\t\t\t\t? 1 - outputPanelRelativeLeft + this.mainPanelDimensions.relativeWidth\n\t\t\t\t: 1 - this.pxToRelativeWidth(SIDE_MARGIN);\n\n\t\t\treturn {\n\t\t\t\tinputPanelRelativeRight,\n\t\t\t\toutputPanelRelativeLeft,\n\t\t\t};\n\t\t},\n\t\toutputPanelRelativeTranslate(): number {\n\t\t\tconst panelMinLeft = 1 - this.pxToRelativeWidth(MIN_PANEL_WIDTH + SIDE_MARGIN);\n\t\t\tconst currentRelativeLeftDelta =\n\t\t\t\tthis.calculatedPositions.outputPanelRelativeLeft - panelMinLeft;\n\t\t\treturn currentRelativeLeftDelta > 0 ? currentRelativeLeftDelta : 0;\n\t\t},\n\t\thasDoubleWidth(): boolean {\n\t\t\treturn get(this, 'nodeType.parameterPane') === 'wide';\n\t\t},\n\t\tfixedPanelWidth(): number {\n\t\t\tconst multiplier = this.hasDoubleWidth ? 2 : 1;\n\n\t\t\tif (this.windowWidth > 1700) {\n\t\t\t\treturn PANEL_WIDTH_LARGE * multiplier;\n\t\t\t}\n\n\t\t\treturn PANEL_WIDTH * multiplier;\n\t\t},\n\t\tisBelowMinWidthMainPanel(): boolean {\n\t\t\tconst minRelativeWidth = this.pxToRelativeWidth(MIN_PANEL_WIDTH);\n\t\t\treturn this.mainPanelDimensions.relativeWidth < minRelativeWidth;\n\t\t},\n\t},\n\twatch: {\n\t\twindowWidth(windowWidth) {\n\t\t\tconst minRelativeWidth = this.pxToRelativeWidth(MIN_PANEL_WIDTH);\n\t\t\t// Prevent the panel resizing below MIN_PANEL_WIDTH whhile maintaing position\n\t\t\tif (this.isBelowMinWidthMainPanel) {\n\t\t\t\tthis.setMainPanelWidth(minRelativeWidth);\n\t\t\t}\n\n\t\t\tconst isBelowMinLeft = this.minimumLeftPosition > this.mainPanelDimensions.relativeLeft;\n\t\t\tconst isMaxRight = this.maximumRightPosition > this.mainPanelDimensions.relativeRight;\n\n\t\t\t// When user is resizing from non-supported view(sub ~488px) we need to refit the panels\n\t\t\tif (windowWidth > this.minWindowWidth && isBelowMinLeft && isMaxRight) {\n\t\t\t\tthis.setMainPanelWidth(minRelativeWidth);\n\t\t\t\tthis.setPositions(this.getInitialLeftPosition(this.mainPanelDimensions.relativeWidth));\n\t\t\t}\n\n\t\t\tthis.setPositions(this.mainPanelDimensions.relativeLeft);\n\t\t},\n\t},\n\tmethods: {\n\t\tonSwitchSelectedNode(node: string) {\n\t\t\tthis.$emit('switchSelectedNode', node);\n\t\t},\n\t\tgetInitialLeftPosition(width: number) {\n\t\t\tif (this.currentNodePaneType === 'dragless')\n\t\t\t\treturn this.pxToRelativeWidth(SIDE_MARGIN + 1 + this.fixedPanelWidth);\n\n\t\t\treturn this.hasInputSlot ? 0.5 - width / 2 : this.minimumLeftPosition;\n\t\t},\n\t\tsetMainPanelWidth(relativeWidth?: number) {\n\t\t\tconst mainPanelRelativeWidth =\n\t\t\t\trelativeWidth || this.pxToRelativeWidth(initialMainPanelWidth[this.currentNodePaneType]);\n\n\t\t\tthis.ndvStore.setMainPanelDimensions({\n\t\t\t\tpanelType: this.currentNodePaneType,\n\t\t\t\tdimensions: {\n\t\t\t\t\trelativeWidth: mainPanelRelativeWidth,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tsetPositions(relativeLeft: number) {\n\t\t\tconst mainPanelRelativeLeft =\n\t\t\t\trelativeLeft || 1 - this.calculatedPositions.inputPanelRelativeRight;\n\t\t\tconst mainPanelRelativeRight =\n\t\t\t\t1 - mainPanelRelativeLeft - this.mainPanelDimensions.relativeWidth;\n\n\t\t\tconst isMaxRight = this.maximumRightPosition > mainPanelRelativeRight;\n\t\t\tconst isMinLeft = this.minimumLeftPosition > mainPanelRelativeLeft;\n\t\t\tconst isInputless = this.currentNodePaneType === 'inputless';\n\n\t\t\tif (isMinLeft) {\n\t\t\t\tthis.ndvStore.setMainPanelDimensions({\n\t\t\t\t\tpanelType: this.currentNodePaneType,\n\t\t\t\t\tdimensions: {\n\t\t\t\t\t\trelativeLeft: this.minimumLeftPosition,\n\t\t\t\t\t\trelativeRight: 1 - this.mainPanelDimensions.relativeWidth - this.minimumLeftPosition,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (isMaxRight) {\n\t\t\t\tthis.ndvStore.setMainPanelDimensions({\n\t\t\t\t\tpanelType: this.currentNodePaneType,\n\t\t\t\t\tdimensions: {\n\t\t\t\t\t\trelativeLeft: 1 - this.mainPanelDimensions.relativeWidth - this.maximumRightPosition,\n\t\t\t\t\t\trelativeRight: this.maximumRightPosition,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.ndvStore.setMainPanelDimensions({\n\t\t\t\tpanelType: this.currentNodePaneType,\n\t\t\t\tdimensions: {\n\t\t\t\t\trelativeLeft: isInputless ? this.minimumLeftPosition : mainPanelRelativeLeft,\n\t\t\t\t\trelativeRight: mainPanelRelativeRight,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tsetPositionByName(position: 'minLeft' | 'maxRight' | 'initial') {\n\t\t\tconst positionByName: Record<string, number> = {\n\t\t\t\tminLeft: this.minimumLeftPosition,\n\t\t\t\tmaxRight: this.maximumRightPosition,\n\t\t\t\tinitial: this.getInitialLeftPosition(this.mainPanelDimensions.relativeWidth),\n\t\t\t};\n\n\t\t\tthis.setPositions(positionByName[position]);\n\t\t},\n\t\tpxToRelativeWidth(px: number) {\n\t\t\treturn px / this.windowWidth;\n\t\t},\n\t\trelativeWidthToPx(relativeWidth: number) {\n\t\t\treturn relativeWidth * this.windowWidth;\n\t\t},\n\t\tonResizeStart() {\n\t\t\tthis.setTotalWidth();\n\t\t},\n\t\tonResizeEnd() {\n\t\t\tthis.storePositionData();\n\t\t},\n\t\tonResizeDebounced(data: { direction: string; x: number; width: number }) {\n\t\t\tif (this.initialized) {\n\t\t\t\tvoid this.callDebounced(this.onResize, { debounceTime: 10, trailing: true }, data);\n\t\t\t}\n\t\t},\n\t\tonResize({ direction, x, width }: { direction: string; x: number; width: number }) {\n\t\t\tconst relativeDistance = this.pxToRelativeWidth(x);\n\t\t\tconst relativeWidth = this.pxToRelativeWidth(width);\n\n\t\t\tif (direction === 'left' && relativeDistance <= this.minimumLeftPosition) return;\n\t\t\tif (direction === 'right' && 1 - relativeDistance <= this.maximumRightPosition) return;\n\t\t\tif (width <= MIN_PANEL_WIDTH) return;\n\n\t\t\tthis.setMainPanelWidth(relativeWidth);\n\t\t\tthis.setPositions(\n\t\t\t\tdirection === 'left' ? relativeDistance : this.mainPanelDimensions.relativeLeft,\n\t\t\t);\n\t\t},\n\t\trestorePositionData() {\n\t\t\tconst storedPanelWidthData = useStorage(\n\t\t\t\t`${LOCAL_STORAGE_MAIN_PANEL_RELATIVE_WIDTH}_${this.currentNodePaneType}`,\n\t\t\t).value;\n\n\t\t\tif (storedPanelWidthData) {\n\t\t\t\tconst parsedWidth = parseFloat(storedPanelWidthData);\n\t\t\t\tthis.setMainPanelWidth(parsedWidth);\n\t\t\t\tconst initialPosition = this.getInitialLeftPosition(parsedWidth);\n\n\t\t\t\tthis.setPositions(initialPosition);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tstorePositionData() {\n\t\t\tuseStorage(`${LOCAL_STORAGE_MAIN_PANEL_RELATIVE_WIDTH}_${this.currentNodePaneType}`).value =\n\t\t\t\tthis.mainPanelDimensions.relativeWidth.toString();\n\t\t},\n\t\tonDragStart() {\n\t\t\tthis.isDragging = true;\n\t\t\tthis.$emit('dragstart', { position: this.mainPanelDimensions.relativeLeft });\n\t\t},\n\t\tonDrag(e: { x: number; y: number }) {\n\t\t\tconst relativeLeft = this.pxToRelativeWidth(e.x) - this.mainPanelDimensions.relativeWidth / 2;\n\n\t\t\tthis.setPositions(relativeLeft);\n\t\t},\n\t\tonDragEnd() {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.isDragging = false;\n\t\t\t\tthis.$emit('dragend', {\n\t\t\t\t\twindowWidth: this.windowWidth,\n\t\t\t\t\tposition: this.mainPanelDimensions.relativeLeft,\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\tthis.storePositionData();\n\t\t},\n\t\tsetTotalWidth() {\n\t\t\tthis.windowWidth = window.innerWidth;\n\t\t},\n\t\tclose() {\n\t\t\tthis.$emit('close');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.dataPanel {\n\tposition: absolute;\n\theight: calc(100% - 2 * var(--spacing-l));\n\tposition: absolute;\n\ttop: var(--spacing-l);\n\tz-index: 0;\n\tmin-width: 280px;\n}\n\n.inputPanel {\n\tcomposes: dataPanel;\n\tleft: var(--spacing-l);\n\n\t> * {\n\t\tborder-radius: var(--border-radius-large) 0 0 var(--border-radius-large);\n\t}\n}\n\n.outputPanel {\n\tcomposes: dataPanel;\n\tright: var(--spacing-l);\n\n\t> * {\n\t\tborder-radius: 0 var(--border-radius-large) var(--border-radius-large) 0;\n\t}\n}\n\n.mainPanel {\n\tposition: absolute;\n\theight: 100%;\n\n\t&:hover {\n\t\t.draggable {\n\t\t\tvisibility: visible;\n\t\t}\n\t}\n}\n\n.mainPanelInner {\n\theight: 100%;\n\tborder: var(--border-base);\n\tborder-radius: var(--border-radius-large);\n\tbox-shadow: 0 4px 16px rgb(50 61 85 / 10%);\n\toverflow: hidden;\n\n\t&.dragging {\n\t\tborder-color: var(--color-primary);\n\t\tbox-shadow: 0px 6px 16px rgba(255, 74, 51, 0.15);\n\t}\n}\n\n.draggable {\n\tvisibility: hidden;\n}\n\n.double-width {\n\tleft: 90%;\n}\n\n.dragButtonContainer {\n\tposition: absolute;\n\ttop: -12px;\n\twidth: 100%;\n\theight: 12px;\n\tdisplay: flex;\n\tjustify-content: center;\n\tpointer-events: none;\n\n\t.draggable {\n\t\tpointer-events: all;\n\t}\n\t&:hover .draggable {\n\t\tvisibility: visible;\n\t}\n}\n\n.visible {\n\tvisibility: visible;\n}\n</style>\n","<template>\n\t<iframe class=\"__html-display\" :srcdoc=\"sanitizedHtml\" />\n</template>\n\n<script lang=\"ts\">\nimport sanitizeHtml, { defaults, type IOptions as SanitizeOptions } from 'sanitize-html';\n\nconst sanitizeOptions: SanitizeOptions = {\n\tallowVulnerableTags: false,\n\tenforceHtmlBoundary: false,\n\tdisallowedTagsMode: 'discard',\n\tallowedTags: [...defaults.allowedTags, 'style', 'img', 'title'],\n\tallowedAttributes: {\n\t\t...defaults.allowedAttributes,\n\t\t'*': ['class', 'style'],\n\t},\n\ttransformTags: {\n\t\thead: '',\n\t},\n};\n\nexport default {\n\tname: 'RunDataHtml',\n\tprops: {\n\t\tinputHtml: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tcomputed: {\n\t\tsanitizedHtml() {\n\t\t\treturn sanitizeHtml(this.inputHtml, sanitizeOptions);\n\t\t},\n\t},\n};\n</script>\n\n<style lang=\"scss\">\n.__html-display {\n\twidth: 100%;\n\theight: 100%;\n}\n</style>\n","<template>\n\t<span>\n\t\t<div v-if=\"isLoading\">Loading binary data...</div>\n\t\t<div v-else-if=\"error\">Error loading binary data</div>\n\t\t<span v-else>\n\t\t\t<video v-if=\"binaryData.fileType === 'video'\" controls autoplay>\n\t\t\t\t<source :src=\"embedSource\" :type=\"binaryData.mimeType\" />\n\t\t\t\t{{ $locale.baseText('binaryDataDisplay.yourBrowserDoesNotSupport') }}\n\t\t\t</video>\n\t\t\t<audio v-else-if=\"binaryData.fileType === 'audio'\" controls autoplay>\n\t\t\t\t<source :src=\"embedSource\" :type=\"binaryData.mimeType\" />\n\t\t\t\t{{ $locale.baseText('binaryDataDisplay.yourBrowserDoesNotSupport') }}\n\t\t\t</audio>\n\t\t\t<VueJsonPretty\n\t\t\t\tv-else-if=\"binaryData.fileType === 'json'\"\n\t\t\t\t:data=\"data\"\n\t\t\t\t:deep=\"3\"\n\t\t\t\t:show-length=\"true\"\n\t\t\t/>\n\t\t\t<RunDataHtml v-else-if=\"binaryData.fileType === 'html'\" :input-html=\"data\" />\n\t\t\t<embed v-else :src=\"embedSource\" class=\"binary-data\" :class=\"embedClass()\" />\n\t\t</span>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport type { IBinaryData } from 'n8n-workflow';\nimport { jsonParse } from 'n8n-workflow';\nimport type { PropType } from 'vue';\nimport VueJsonPretty from 'vue-json-pretty';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport RunDataHtml from '@/components/RunDataHtml.vue';\n\nexport default defineComponent({\n\tname: 'BinaryDataDisplayEmbed',\n\tcomponents: {\n\t\tVueJsonPretty,\n\t\tRunDataHtml,\n\t},\n\tprops: {\n\t\tbinaryData: {\n\t\t\ttype: Object as PropType<IBinaryData>,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisLoading: true,\n\t\t\tembedSource: '',\n\t\t\terror: false,\n\t\t\tdata: '',\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useWorkflowsStore),\n\t},\n\tasync mounted() {\n\t\tconst { id, data, fileName, fileType, mimeType } = this.binaryData;\n\t\tconst isJSONData = fileType === 'json';\n\t\tconst isHTMLData = fileType === 'html';\n\n\t\tif (!id) {\n\t\t\tif (isJSONData || isHTMLData) {\n\t\t\t\tthis.data = jsonParse(atob(data));\n\t\t\t} else {\n\t\t\t\tthis.embedSource = 'data:' + mimeType + ';base64,' + data;\n\t\t\t}\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tconst binaryUrl = this.workflowsStore.getBinaryUrl(id, 'view', fileName, mimeType);\n\t\t\t\tif (isJSONData || isHTMLData) {\n\t\t\t\t\tconst fetchedData = await fetch(binaryUrl, { credentials: 'include' });\n\t\t\t\t\tthis.data = await (isJSONData ? fetchedData.json() : fetchedData.text());\n\t\t\t\t} else {\n\t\t\t\t\tthis.embedSource = binaryUrl;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tthis.error = true;\n\t\t\t}\n\t\t}\n\n\t\tthis.isLoading = false;\n\t},\n\tmethods: {\n\t\tembedClass(): string[] {\n\t\t\tconst { fileType } = this.binaryData;\n\t\t\treturn [fileType ?? 'other'];\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\">\n.binary-data {\n\tbackground-color: var(--color-foreground-xlight);\n\n\t&.image {\n\t\tmax-height: calc(100% - 1em);\n\t\tmax-width: calc(100% - 1em);\n\t}\n\n\t&.other,\n\t&.pdf {\n\t\theight: calc(100% - 1em);\n\t\twidth: calc(100% - 1em);\n\t}\n}\n</style>\n","<template>\n\t<div v-if=\"windowVisible\" :class=\"['binary-data-window', binaryData?.fileType]\">\n\t\t<n8n-button\n\t\t\tsize=\"small\"\n\t\t\tclass=\"binary-data-window-back\"\n\t\t\t:title=\"$locale.baseText('binaryDataDisplay.backToOverviewPage')\"\n\t\t\ticon=\"arrow-left\"\n\t\t\t:label=\"$locale.baseText('binaryDataDisplay.backToList')\"\n\t\t\t@click.stop=\"closeWindow\"\n\t\t/>\n\n\t\t<div class=\"binary-data-window-wrapper\">\n\t\t\t<div v-if=\"!binaryData\">\n\t\t\t\t{{ $locale.baseText('binaryDataDisplay.noDataFoundToDisplay') }}\n\t\t\t</div>\n\t\t\t<BinaryDataDisplayEmbed v-else :binary-data=\"binaryData\" />\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport type { IBinaryData, IRunData } from 'n8n-workflow';\n\nimport BinaryDataDisplayEmbed from '@/components/BinaryDataDisplayEmbed.vue';\n\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\n\nexport default defineComponent({\n\tname: 'BinaryDataDisplay',\n\n\tcomponents: {\n\t\tBinaryDataDisplayEmbed,\n\t},\n\tprops: [\n\t\t'displayData', // IBinaryData\n\t\t'windowVisible', // boolean\n\t],\n\tsetup() {\n\t\tconst nodeHelpers = useNodeHelpers();\n\n\t\treturn {\n\t\t\tnodeHelpers,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useWorkflowsStore),\n\t\tbinaryData(): IBinaryData | null {\n\t\t\tconst binaryData = this.nodeHelpers.getBinaryData(\n\t\t\t\tthis.workflowRunData,\n\t\t\t\tthis.displayData.node,\n\t\t\t\tthis.displayData.runIndex,\n\t\t\t\tthis.displayData.outputIndex,\n\t\t\t);\n\n\t\t\tif (binaryData.length === 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.displayData.index >= binaryData.length ||\n\t\t\t\tbinaryData[this.displayData.index][this.displayData.key] === undefined\n\t\t\t) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst binaryDataItem: IBinaryData = binaryData[this.displayData.index][this.displayData.key];\n\n\t\t\treturn binaryDataItem;\n\t\t},\n\n\t\tworkflowRunData(): IRunData | null {\n\t\t\tconst workflowExecution = this.workflowsStore.getWorkflowExecution;\n\t\t\tif (workflowExecution === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst executionData = workflowExecution.data;\n\t\t\treturn executionData ? executionData.resultData.runData : null;\n\t\t},\n\t},\n\tmethods: {\n\t\tcloseWindow() {\n\t\t\t// Handle the close externally as the visible parameter is an external prop\n\t\t\t// and is so not allowed to be changed here.\n\t\t\tthis.$emit('close');\n\t\t\treturn false;\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\">\n.binary-data-window {\n\tposition: absolute;\n\ttop: 50px;\n\tleft: 0;\n\tz-index: 10;\n\twidth: 100%;\n\theight: calc(100% - 50px);\n\tbackground-color: var(--color-run-data-background);\n\toverflow: hidden;\n\ttext-align: center;\n\n\t&.json {\n\t\toverflow: auto;\n\t}\n\n\t.binary-data-window-wrapper {\n\t\tmargin-top: 0.5em;\n\t\tpadding: 0 1em;\n\t\theight: calc(100% - 50px);\n\n\t\t.el-row,\n\t\t.el-col {\n\t\t\theight: 100%;\n\t\t}\n\t}\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { useI18n } from '@/composables/useI18n';\nimport { computed } from 'vue';\nimport { useClipboard } from '@/composables/useClipboard';\nimport { useToast } from '@/composables/useToast';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport type {\n\tIDataObject,\n\tINodeProperties,\n\tINodePropertyCollection,\n\tINodePropertyOptions,\n\tNodeApiError,\n\tNodeError,\n\tNodeOperationError,\n} from 'n8n-workflow';\nimport { sanitizeHtml } from '@/utils/htmlUtils';\nimport { MAX_DISPLAY_DATA_SIZE } from '@/constants';\nimport type { BaseTextKey } from '@/plugins/i18n';\n\ntype Props = {\n\terror: NodeError | NodeApiError | NodeOperationError;\n};\n\nconst props = defineProps<Props>();\nconst clipboard = useClipboard();\nconst toast = useToast();\nconst i18n = useI18n();\n\nconst nodeTypesStore = useNodeTypesStore();\nconst ndvStore = useNDVStore();\nconst rootStore = useRootStore();\n\nconst displayCause = computed(() => {\n\treturn JSON.stringify(props.error.cause ?? '').length < MAX_DISPLAY_DATA_SIZE;\n});\n\nconst parameters = computed<INodeProperties[]>(() => {\n\tconst node = ndvStore.activeNode;\n\tif (!node) {\n\t\treturn [];\n\t}\n\tconst nodeType = nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\n\tif (nodeType === null) {\n\t\treturn [];\n\t}\n\n\treturn nodeType.properties;\n});\n\nconst n8nVersion = computed(() => {\n\tconst baseUrl = rootStore.urlBaseEditor;\n\tlet instanceType = 'Self Hosted';\n\n\tif (baseUrl.includes('n8n.cloud')) {\n\t\tinstanceType = 'Cloud';\n\t}\n\n\treturn rootStore.versionCli + ` (${instanceType})`;\n});\n\nconst hasManyInputItems = computed(() => {\n\treturn ndvStore.ndvInputData.length > 1;\n});\n\nconst nodeDefaultName = computed(() => {\n\tconst node = props.error?.node;\n\tif (!node) {\n\t\treturn 'Node';\n\t}\n\n\tconst nodeType = nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\treturn nodeType?.defaults?.name || node.name;\n});\n\nconst prepareRawMessages = computed(() => {\n\tconst returnData: Array<string | IDataObject> = [];\n\tif (!props.error.messages?.length) {\n\t\treturn [];\n\t}\n\tconst errorMessage = getErrorMessage();\n\n\tArray.from(new Set(props.error.messages)).forEach((message) => {\n\t\tconst isParsable = /^\\d{3} - \\{/.test(message);\n\t\tconst parts = isParsable ? message.split(' - ').map((part) => part.trim()) : [];\n\n\t\t//try to parse the message as JSON\n\t\tfor (const part of parts) {\n\t\t\ttry {\n\t\t\t\tconst parsed = JSON.parse(part);\n\t\t\t\tif (typeof parsed === 'object') {\n\t\t\t\t\treturnData.push(parsed);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch (error) {}\n\t\t}\n\t\t//if message is the same as error message, do not include it\n\t\tif (message === errorMessage) return;\n\t\treturnData.push(message);\n\t});\n\treturn returnData;\n});\n\nfunction nodeVersionTag(nodeType: NodeError['node']): string {\n\tif (!nodeType || ('hidden' in nodeType && nodeType.hidden)) {\n\t\treturn i18n.baseText('nodeSettings.deprecated');\n\t}\n\n\tconst latestNodeVersion = Math.max(...nodeTypesStore.getNodeVersions(nodeType.type));\n\n\tif (latestNodeVersion === nodeType.typeVersion) {\n\t\treturn i18n.baseText('nodeSettings.latest');\n\t}\n\n\treturn i18n.baseText('nodeSettings.latestVersion', {\n\t\tinterpolate: { version: latestNodeVersion.toString() },\n\t});\n}\n\nfunction prepareDescription(description: string): string {\n\treturn sanitizeHtml(description.replace(/`(.*?)`/g, '<code>$1</code>'));\n}\n\nfunction getErrorDescription(): string {\n\tconst isSubNodeError =\n\t\tprops.error.name === 'NodeOperationError' &&\n\t\t(props.error as NodeOperationError).functionality === 'configuration-node';\n\n\tif (isSubNodeError) {\n\t\treturn prepareDescription(\n\t\t\tprops.error.description +\n\t\t\t\ti18n.baseText('pushConnection.executionError.openNode', {\n\t\t\t\t\tinterpolate: { node: props.error.node.name },\n\t\t\t\t}),\n\t\t);\n\t}\n\n\tif (props.error.context?.descriptionKey) {\n\t\tconst interpolate = {\n\t\t\tnodeCause: props.error.context.nodeCause as string,\n\t\t\trunIndex: (props.error.context.runIndex as string) ?? '0',\n\t\t\titemIndex: (props.error.context.itemIndex as string) ?? '0',\n\t\t};\n\t\treturn prepareDescription(\n\t\t\ti18n.baseText(\n\t\t\t\t`nodeErrorView.description.${props.error.context.descriptionKey as string}` as BaseTextKey,\n\t\t\t\t{ interpolate },\n\t\t\t),\n\t\t);\n\t}\n\n\tif (!props.error.context?.descriptionTemplate) {\n\t\treturn prepareDescription(props.error.description ?? '');\n\t}\n\n\tconst parameterName = parameterDisplayName(props.error.context.parameter as string);\n\treturn prepareDescription(\n\t\t(props.error.context.descriptionTemplate as string).replace(/%%PARAMETER%%/g, parameterName),\n\t);\n}\n\nfunction addItemIndexSuffix(message: string): string {\n\tlet itemIndexSuffix = '';\n\n\tconst ITEM_INDEX_SUFFIX_TEXT = '[item ';\n\n\tif (\n\t\thasManyInputItems.value &&\n\t\t!message.includes(ITEM_INDEX_SUFFIX_TEXT) &&\n\t\tprops.error?.context?.itemIndex !== undefined\n\t) {\n\t\titemIndexSuffix = ` [item ${props.error.context.itemIndex}]`;\n\t}\n\n\treturn message + itemIndexSuffix;\n}\n\nfunction getErrorMessage(): string {\n\tlet message = '';\n\n\tconst isSubNodeError =\n\t\tprops.error.name === 'NodeOperationError' &&\n\t\t(props.error as NodeOperationError).functionality === 'configuration-node';\n\tconst isNonEmptyString = (value?: unknown): value is string =>\n\t\t!!value && typeof value === 'string';\n\n\tif (isSubNodeError) {\n\t\tmessage = i18n.baseText('nodeErrorView.errorSubNode', {\n\t\t\tinterpolate: { node: props.error.node.name },\n\t\t});\n\t} else if (\n\t\tisNonEmptyString(props.error.message) &&\n\t\t(props.error.message === props.error.description || !props.error.context?.messageTemplate)\n\t) {\n\t\tmessage = props.error.message;\n\t} else if (\n\t\tisNonEmptyString(props.error.context?.messageTemplate) &&\n\t\tisNonEmptyString(props.error.context?.parameter)\n\t) {\n\t\tconst parameterName = parameterDisplayName(props.error.context.parameter);\n\t\tmessage = props.error.context.messageTemplate.replace(/%%PARAMETER%%/g, parameterName);\n\t} else if (Array.isArray(props.error.messages) && props.error.messages.length > 0) {\n\t\tmessage = props.error.messages[0];\n\t}\n\n\treturn addItemIndexSuffix(message);\n}\n\nfunction parameterDisplayName(path: string, fullPath = true) {\n\ttry {\n\t\tconst params = getParameterName(parameters.value, path.split('.'));\n\t\tif (!params.length) {\n\t\t\tthrow new Error();\n\t\t}\n\n\t\tif (!fullPath) {\n\t\t\treturn params.pop()!.displayName;\n\t\t}\n\t\treturn params.map((parameter) => parameter.displayName).join(' > ');\n\t} catch (error) {\n\t\treturn `Could not find parameter \"${path}\"`;\n\t}\n}\n\nfunction getParameterName(\n\tparams: Array<INodePropertyOptions | INodeProperties | INodePropertyCollection>,\n\tpathParts: string[],\n): Array<INodeProperties | INodePropertyCollection> {\n\tlet currentParameterName = pathParts.shift();\n\n\tif (currentParameterName === undefined) {\n\t\treturn [];\n\t}\n\n\tconst arrayMatch = currentParameterName.match(/(.*)\\[([\\d])\\]$/);\n\tif (arrayMatch !== null && arrayMatch.length > 0) {\n\t\tcurrentParameterName = arrayMatch[1];\n\t}\n\tconst currentParameter = params.find(\n\t\t(parameter) => parameter.name === currentParameterName,\n\t) as unknown as INodeProperties | INodePropertyCollection;\n\n\tif (currentParameter === undefined) {\n\t\tthrow new Error(`Could not find parameter \"${currentParameterName}\"`);\n\t}\n\n\tif (pathParts.length === 0) {\n\t\treturn [currentParameter];\n\t}\n\n\tif (currentParameter.hasOwnProperty('options')) {\n\t\treturn [\n\t\t\tcurrentParameter,\n\t\t\t...getParameterName((currentParameter as INodeProperties).options!, pathParts),\n\t\t];\n\t}\n\n\tif (currentParameter.hasOwnProperty('values')) {\n\t\treturn [\n\t\t\tcurrentParameter,\n\t\t\t...getParameterName((currentParameter as INodePropertyCollection).values, pathParts),\n\t\t];\n\t}\n\n\t// We can not resolve any deeper so lets stop here and at least return hopefully something useful\n\treturn [currentParameter];\n}\n\nfunction copyErrorDetails() {\n\tconst error = props.error;\n\n\tconst errorInfo: IDataObject = {\n\t\terrorMessage: getErrorMessage(),\n\t};\n\tif (error.description) {\n\t\terrorInfo.errorDescription = error.description;\n\t}\n\n\t//add error details\n\tconst errorDetails: IDataObject = {};\n\n\tif (error?.messages?.length) {\n\t\terrorDetails.rawErrorMessage = error.messages;\n\t}\n\n\tif ('httpCode' in error && error.httpCode) {\n\t\terrorDetails.httpCode = error.httpCode;\n\t}\n\n\tif (error.context && error.context.data) {\n\t\terrorDetails.errorData = error.context.data;\n\t}\n\n\tif (error.extra) {\n\t\terrorDetails.errorExtra = error.extra;\n\t}\n\n\terrorInfo.errorDetails = errorDetails;\n\n\t//add n8n details\n\tconst n8nDetails: IDataObject = {};\n\n\tif (error.node) {\n\t\tn8nDetails.nodeName = error.node.name;\n\t\tn8nDetails.nodeType = error.node.type;\n\t\tn8nDetails.nodeVersion = error.node.typeVersion;\n\n\t\tif (error.node?.parameters?.resource) {\n\t\t\tn8nDetails.resource = error.node.parameters.resource;\n\t\t}\n\t\tif (error?.node?.parameters?.operation) {\n\t\t\tn8nDetails.operation = error.node.parameters.operation;\n\t\t}\n\t}\n\n\tif (error.context) {\n\t\tif (error.context.itemIndex !== undefined) {\n\t\t\tn8nDetails.itemIndex = error.context.itemIndex;\n\t\t}\n\n\t\tif (error.context.runIndex !== undefined) {\n\t\t\tn8nDetails.runIndex = error.context.runIndex;\n\t\t}\n\n\t\tif (error.context.parameter !== undefined) {\n\t\t\tn8nDetails.parameter = error.context.parameter;\n\t\t}\n\n\t\tif (error.context.causeDetailed) {\n\t\t\tn8nDetails.causeDetailed = error.context.causeDetailed;\n\t\t}\n\t}\n\n\tif (error.timestamp) {\n\t\tn8nDetails.time = new Date(error.timestamp).toLocaleString();\n\t}\n\n\tn8nDetails.n8nVersion = n8nVersion.value;\n\n\tn8nDetails.binaryDataMode = rootStore.binaryDataMode;\n\n\tif (error.cause) {\n\t\tn8nDetails.cause = error.cause;\n\t}\n\n\tn8nDetails.stackTrace = error.stack?.split('\\n');\n\n\terrorInfo.n8nDetails = n8nDetails;\n\n\tvoid clipboard.copy(JSON.stringify(errorInfo, null, 2));\n\tcopySuccess();\n}\n\nfunction copySuccess() {\n\ttoast.showMessage({\n\t\ttitle: i18n.baseText('nodeErrorView.showMessage.title'),\n\t\ttype: 'info',\n\t});\n}\n</script>\n\n<template>\n\t<div class=\"node-error-view\">\n\t\t<div class=\"node-error-view__header\">\n\t\t\t<div class=\"node-error-view__header-message\" data-test-id=\"node-error-message\">\n\t\t\t\t<div>\n\t\t\t\t\t{{ getErrorMessage() }}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tv-if=\"error.description || error.context?.descriptionKey\"\n\t\t\t\tdata-test-id=\"node-error-description\"\n\t\t\t\tclass=\"node-error-view__header-description\"\n\t\t\t\tv-html=\"getErrorDescription()\"\n\t\t\t></div>\n\t\t</div>\n\n\t\t<div class=\"node-error-view__info\">\n\t\t\t<div class=\"node-error-view__info-header\">\n\t\t\t\t<p class=\"node-error-view__info-title\">\n\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.title') }}\n\t\t\t\t</p>\n\t\t\t\t<n8n-tooltip\n\t\t\t\t\tclass=\"item\"\n\t\t\t\t\t:content=\"i18n.baseText('nodeErrorView.copyToClipboard.tooltip')\"\n\t\t\t\t\tplacement=\"left\"\n\t\t\t\t>\n\t\t\t\t\t<div class=\"copy-button\">\n\t\t\t\t\t\t<n8n-icon-button\n\t\t\t\t\t\t\ticon=\"copy\"\n\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\tsize=\"mini\"\n\t\t\t\t\t\t\ttext=\"true\"\n\t\t\t\t\t\t\ttransparent-background=\"transparent\"\n\t\t\t\t\t\t\t@click=\"copyErrorDetails\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</div>\n\n\t\t\t<div class=\"node-error-view__info-content\">\n\t\t\t\t<details\n\t\t\t\t\tv-if=\"\n\t\t\t\t\t\t('httpCode' in error && error.httpCode) ||\n\t\t\t\t\t\tprepareRawMessages.length ||\n\t\t\t\t\t\terror?.context?.data ||\n\t\t\t\t\t\terror.extra\n\t\t\t\t\t\"\n\t\t\t\t\tclass=\"node-error-view__details\"\n\t\t\t\t>\n\t\t\t\t\t<summary class=\"node-error-view__details-summary\">\n\t\t\t\t\t\t<font-awesome-icon class=\"node-error-view__details-icon\" icon=\"angle-right\" />\n\t\t\t\t\t\t{{\n\t\t\t\t\t\t\ti18n.baseText('nodeErrorView.details.from', {\n\t\t\t\t\t\t\t\tinterpolate: { node: `${nodeDefaultName}` },\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}}\n\t\t\t\t\t</summary>\n\t\t\t\t\t<div class=\"node-error-view__details-content\">\n\t\t\t\t\t\t<div v-if=\"'httpCode' in error && error.httpCode\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.errorCode') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<code>{{ error.httpCode }}</code>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div v-if=\"prepareRawMessages.length\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.rawMessages') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<div v-for=\"(msg, index) in prepareRawMessages\" :key=\"index\">\n\t\t\t\t\t\t\t\t\t<pre><code>{{ msg }}</code></pre>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div v-if=\"error?.context?.data\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.errorData') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<pre><code>{{ error.context.data }}</code></pre>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div v-if=\"error.extra\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.errorExtra') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<pre><code>{{ error.extra }}</code></pre>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div v-if=\"error.context && error.context.request\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.request') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<pre><code>{{ error.context.request }}</code></pre>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</details>\n\n\t\t\t\t<details class=\"node-error-view__details\">\n\t\t\t\t\t<summary class=\"node-error-view__details-summary\">\n\t\t\t\t\t\t<font-awesome-icon class=\"node-error-view__details-icon\" icon=\"angle-right\" />\n\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.info') }}\n\t\t\t\t\t</summary>\n\t\t\t\t\t<div class=\"node-error-view__details-content\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"error.context && error.context.itemIndex !== undefined\"\n\t\t\t\t\t\t\tclass=\"node-error-view__details-row\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.itemIndex') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<code>{{ error.context.itemIndex }}</code>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"error.context && error.context.runIndex !== undefined\"\n\t\t\t\t\t\t\tclass=\"node-error-view__details-row\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.runIndex') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<code>{{ error.context.runIndex }}</code>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"error.context && error.context.parameter !== undefined\"\n\t\t\t\t\t\t\tclass=\"node-error-view__details-row\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.inParameter') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<code>{{ parameterDisplayName(`${error.context.parameter}`) }}</code>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div v-if=\"error.node && error.node.type\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.nodeType') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<code>{{ error.node.type }}</code>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div v-if=\"error.node && error.node.typeVersion\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.nodeVersion') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<code>\n\t\t\t\t\t\t\t\t\t<span>{{ error.node.typeVersion + ' ' }}</span>\n\t\t\t\t\t\t\t\t\t<span>({{ nodeVersionTag(error.node) }})</span>\n\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.n8nVersion') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<code>{{ n8nVersion }}</code>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div v-if=\"error.timestamp\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.time') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<code>{{ new Date(error.timestamp).toLocaleString() }}</code>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div v-if=\"error.cause && displayCause\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.errorCause') }}\n\t\t\t\t\t\t\t</p>\n\n\t\t\t\t\t\t\t<pre class=\"node-error-view__details-value\"><code>{{ error.cause }}</code></pre>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"error.context && error.context.causeDetailed\"\n\t\t\t\t\t\t\tclass=\"node-error-view__details-row\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.causeDetailed') }}\n\t\t\t\t\t\t\t</p>\n\n\t\t\t\t\t\t\t<pre\n\t\t\t\t\t\t\t\tclass=\"node-error-view__details-value\"\n\t\t\t\t\t\t\t><code>{{ error.context.causeDetailed }}</code></pre>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div v-if=\"error.stack\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.stackTrace') }}\n\t\t\t\t\t\t\t</p>\n\n\t\t\t\t\t\t\t<pre class=\"node-error-view__details-value\"><code>{{ error.stack }}</code></pre>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</details>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\">\n.node-error-view {\n\t&__header {\n\t\tmax-width: 960px;\n\t\tmargin: 0 auto var(--spacing-s) auto;\n\t\tpadding-bottom: var(--spacing-3xs);\n\t\tbackground-color: var(--color-background-xlight);\n\t\tborder: 1px solid var(--color-foreground-base);\n\t\tborder-radius: var(--border-radius-large);\n\t}\n\n\t&__header-title {\n\t\tpadding: var(--spacing-2xs) var(--spacing-s);\n\t\tborder-bottom: 1px solid var(--color-danger-tint-1);\n\t\tfont-size: var(--font-size-3xs);\n\t\tfont-weight: var(--font-weight-bold);\n\t\tbackground-color: var(--color-danger-tint-2);\n\t\tborder-radius: var(--border-radius-large) var(--border-radius-large) 0 0;\n\t\tcolor: var(--color-danger);\n\t}\n\n\t&__header-message {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\talign-items: center;\n\t\tgap: var(--spacing-xs);\n\t\tpadding: var(--spacing-xs) var(--spacing-s) var(--spacing-3xs) var(--spacing-s);\n\t\tcolor: var(--color-ndv-output-error-message);\n\t\tfont-weight: var(--font-weight-bold);\n\t\tfont-size: var(--font-size-s);\n\t}\n\n\t&__header-description {\n\t\tpadding: 0 var(--spacing-s) var(--spacing-3xs) var(--spacing-s);\n\t\tfont-size: var(--font-size-xs);\n\n\t\tul {\n\t\t\tpadding: var(--spacing-s) 0;\n\t\t\tpadding-left: var(--spacing-l);\n\t\t}\n\n\t\tcode {\n\t\t\tfont-size: var(--font-size-xs);\n\t\t\tcolor: var(--color-text-base);\n\t\t\tbackground: var(--color-background-base);\n\t\t\tpadding: var(--spacing-5xs);\n\t\t\tborder-radius: var(--border-radius-base);\n\t\t}\n\t}\n\n\t&__debugging {\n\t\tfont-size: var(--font-size-s);\n\n\t\tul,\n\t\tol,\n\t\tdl {\n\t\t\tpadding-left: var(--spacing-s);\n\t\t\tmargin-top: var(--spacing-2xs);\n\t\t\tmargin-bottom: var(--spacing-2xs);\n\t\t}\n\n\t\tpre {\n\t\t\tpadding: var(--spacing-s);\n\t\t\twidth: 100%;\n\t\t\toverflow: auto;\n\t\t\tbackground: var(--color-background-light);\n\t\t\tcode {\n\t\t\t\tfont-size: var(--font-size-s);\n\t\t\t}\n\t\t}\n\t}\n\n\t&__feedback-toolbar {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tmargin-top: var(--spacing-s);\n\t\tpadding-top: var(--spacing-3xs);\n\t\tborder-top: 1px solid var(--color-foreground-base);\n\t}\n\n\t&__feedback-button {\n\t\twidth: var(--spacing-2xl);\n\t\theight: var(--spacing-2xl);\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tcursor: pointer;\n\t\t&:hover {\n\t\t\tcolor: var(--color-primary);\n\t\t}\n\t}\n\n\t&__info {\n\t\tmax-width: 960px;\n\t\tmargin: 0 auto;\n\t\tborder: 1px solid var(--color-foreground-base);\n\t\tborder-radius: var(--border-radius-large);\n\t}\n\n\t&__info-header {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\t\tpadding: var(--spacing-3xs) var(--spacing-3xs) var(--spacing-3xs) var(--spacing-s);\n\t\tborder-bottom: 1px solid var(--color-foreground-base);\n\t}\n\n\t&__info-title {\n\t\tfont-size: var(--font-size-2xs);\n\t\tfont-weight: var(--font-weight-bold);\n\t\tcolor: var(--color-text-dark);\n\t}\n\n\t&__info-content {\n\t\tpadding: var(--spacing-2xs) var(--spacing-s);\n\t}\n\n\t&__details:not(:last-child) {\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n\n\t&__details[open] {\n\t\t.node-error-view__details {\n\t\t\t&-icon {\n\t\t\t\ttransform: rotate(90deg);\n\t\t\t\ttransition: transform 0.3s ease;\n\t\t\t}\n\t\t}\n\t}\n\n\t&__details-summary {\n\t\tpadding: var(--spacing-5xs) 0;\n\t\tfont-size: var(--font-size-2xs);\n\t\tcolor: var(--color-text-dark);\n\t\tcursor: pointer;\n\t\tlist-style-type: none;\n\t\toutline: none;\n\t}\n\n\t&__details-content {\n\t\tpadding: var(--spacing-2xs) var(--spacing-s);\n\t}\n\n\t&__details-row {\n\t\tdisplay: flex;\n\t\tpadding: var(--spacing-4xs) 0;\n\t}\n\n\t&__details-row:not(:first-child) {\n\t\tborder-top: 1px solid var(--color-foreground-base);\n\t}\n\n\t&__details-icon {\n\t\tmargin-right: var(--spacing-xs);\n\t}\n\n\t&__details-label {\n\t\tflex-grow: 0;\n\t\tflex-shrink: 0;\n\t\twidth: 120px;\n\t\tcolor: var(--color-text);\n\t\tfont-size: var(--font-size-2xs);\n\t}\n\n\t&__details-value {\n\t\tflex: 1;\n\t\toverflow: hidden;\n\t\tmargin-right: auto;\n\t\tcolor: var(--color-text);\n\t\tfont-size: var(--font-size-2xs);\n\t\tword-wrap: break-word;\n\n\t\tcode {\n\t\t\tcolor: var(--color-json-string);\n\t\t\twhite-space: normal;\n\t\t\tword-wrap: break-word;\n\t\t}\n\t}\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { useI18n } from '@/composables/useI18n';\nimport type { usePinnedData } from '@/composables/usePinnedData';\n\nconst locale = useI18n();\n\ntype Props = {\n\ttooltipContentsVisibility: {\n\t\tbinaryDataTooltipContent: boolean;\n\t\tpinDataDiscoveryTooltipContent: boolean;\n\t};\n\tdataPinningDocsUrl: string;\n\tpinnedData: ReturnType<typeof usePinnedData>;\n\tdisabled: boolean;\n};\n\nconst props = defineProps<Props>();\n\nconst emit = defineEmits<{\n\t(event: 'togglePinData'): void;\n}>();\n\nconst visible = computed(() =>\n\tprops.tooltipContentsVisibility.pinDataDiscoveryTooltipContent ? true : undefined,\n);\n</script>\n\n<template>\n\t<n8n-tooltip placement=\"bottom-end\" :visible=\"visible\">\n\t\t<template #content>\n\t\t\t<div v-if=\"props.tooltipContentsVisibility.binaryDataTooltipContent\">\n\t\t\t\t{{ locale.baseText('ndv.pinData.pin.binary') }}\n\t\t\t</div>\n\t\t\t<div v-else-if=\"props.tooltipContentsVisibility.pinDataDiscoveryTooltipContent\">\n\t\t\t\t{{ locale.baseText('node.discovery.pinData.ndv') }}\n\t\t\t</div>\n\t\t\t<div v-else>\n\t\t\t\t<strong>{{ locale.baseText('ndv.pinData.pin.title') }}</strong>\n\t\t\t\t<n8n-text size=\"small\" tag=\"p\">\n\t\t\t\t\t{{ locale.baseText('ndv.pinData.pin.description') }}\n\n\t\t\t\t\t<n8n-link :to=\"props.dataPinningDocsUrl\" size=\"small\">\n\t\t\t\t\t\t{{ locale.baseText('ndv.pinData.pin.link') }}\n\t\t\t\t\t</n8n-link>\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t</template>\n\t\t<n8n-icon-button\n\t\t\t:class=\"$style.pinDataButton\"\n\t\t\ttype=\"tertiary\"\n\t\t\t:active=\"props.pinnedData.hasData.value\"\n\t\t\ticon=\"thumbtack\"\n\t\t\t:disabled=\"props.disabled\"\n\t\t\tdata-test-id=\"ndv-pin-data\"\n\t\t\t@click=\"emit('togglePinData')\"\n\t\t/>\n\t</n8n-tooltip>\n</template>\n\n<style lang=\"scss\" module>\n.pinDataButton {\n\tmargin-left: var(--spacing-2xs);\n\tsvg {\n\t\ttransition: transform 0.3s ease;\n\t}\n}\n</style>\n","<template>\n\t<div :class=\"['run-data', $style.container]\" @mouseover=\"activatePane\">\n\t\t<n8n-callout\n\t\t\tv-if=\"\n\t\t\t\tcanPinData && pinnedData.hasData.value && !editMode.enabled && !isProductionExecutionPreview\n\t\t\t\"\n\t\t\ttheme=\"secondary\"\n\t\t\ticon=\"thumbtack\"\n\t\t\t:class=\"$style.pinnedDataCallout\"\n\t\t>\n\t\t\t{{ $locale.baseText('runData.pindata.thisDataIsPinned') }}\n\t\t\t<span v-if=\"!isReadOnlyRoute && !readOnlyEnv\" class=\"ml-4xs\">\n\t\t\t\t<n8n-link\n\t\t\t\t\ttheme=\"secondary\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tunderline\n\t\t\t\t\tbold\n\t\t\t\t\t@click.stop=\"onTogglePinData({ source: 'banner-link' })\"\n\t\t\t\t>\n\t\t\t\t\t{{ $locale.baseText('runData.pindata.unpin') }}\n\t\t\t\t</n8n-link>\n\t\t\t</span>\n\t\t\t<template #trailingContent>\n\t\t\t\t<n8n-link\n\t\t\t\t\t:to=\"dataPinningDocsUrl\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\ttheme=\"secondary\"\n\t\t\t\t\tbold\n\t\t\t\t\tunderline\n\t\t\t\t\t@click=\"onClickDataPinningDocsLink\"\n\t\t\t\t>\n\t\t\t\t\t{{ $locale.baseText('runData.pindata.learnMore') }}\n\t\t\t\t</n8n-link>\n\t\t\t</template>\n\t\t</n8n-callout>\n\n\t\t<BinaryDataDisplay\n\t\t\t:window-visible=\"binaryDataDisplayVisible\"\n\t\t\t:display-data=\"binaryDataDisplayData\"\n\t\t\t@close=\"closeBinaryDataDisplay\"\n\t\t/>\n\n\t\t<div :class=\"$style.header\">\n\t\t\t<slot name=\"header\"></slot>\n\n\t\t\t<div\n\t\t\t\tv-show=\"!hasRunError\"\n\t\t\t\t:class=\"$style.displayModes\"\n\t\t\t\tdata-test-id=\"run-data-pane-header\"\n\t\t\t\t@click.stop\n\t\t\t>\n\t\t\t\t<n8n-radio-buttons\n\t\t\t\t\tv-show=\"\n\t\t\t\t\t\thasNodeRun && (inputData.length || binaryData.length || search) && !editMode.enabled\n\t\t\t\t\t\"\n\t\t\t\t\t:model-value=\"displayMode\"\n\t\t\t\t\t:options=\"buttons\"\n\t\t\t\t\tdata-test-id=\"ndv-run-data-display-mode\"\n\t\t\t\t\t@update:model-value=\"onDisplayModeChange\"\n\t\t\t\t/>\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tv-if=\"canPinData && !isReadOnlyRoute && !readOnlyEnv\"\n\t\t\t\t\tv-show=\"!editMode.enabled\"\n\t\t\t\t\t:title=\"$locale.baseText('runData.editOutput')\"\n\t\t\t\t\t:circle=\"false\"\n\t\t\t\t\t:disabled=\"node?.disabled\"\n\t\t\t\t\tclass=\"ml-2xs\"\n\t\t\t\t\ticon=\"pencil-alt\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\tdata-test-id=\"ndv-edit-pinned-data\"\n\t\t\t\t\t@click=\"enterEditMode({ origin: 'editIconButton' })\"\n\t\t\t\t/>\n\n\t\t\t\t<RunDataPinButton\n\t\t\t\t\tv-if=\"(canPinData || !!binaryData?.length) && rawInputData.length && !editMode.enabled\"\n\t\t\t\t\t:disabled=\"\n\t\t\t\t\t\t(!rawInputData.length && !pinnedData.hasData.value) ||\n\t\t\t\t\t\tisReadOnlyRoute ||\n\t\t\t\t\t\treadOnlyEnv ||\n\t\t\t\t\t\t!!binaryData?.length\n\t\t\t\t\t\"\n\t\t\t\t\t:tooltip-contents-visibility=\"{\n\t\t\t\t\t\tbinaryDataTooltipContent: !!binaryData?.length,\n\t\t\t\t\t\tpinDataDiscoveryTooltipContent:\n\t\t\t\t\t\t\tisControlledPinDataTooltip && pinDataDiscoveryTooltipVisible,\n\t\t\t\t\t}\"\n\t\t\t\t\t:data-pinning-docs-url=\"dataPinningDocsUrl\"\n\t\t\t\t\t:pinned-data=\"pinnedData\"\n\t\t\t\t\t@toggle-pin-data=\"onTogglePinData({ source: 'pin-icon-click' })\"\n\t\t\t\t/>\n\n\t\t\t\t<div v-show=\"editMode.enabled\" :class=\"$style.editModeActions\">\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\t:label=\"$locale.baseText('runData.editor.cancel')\"\n\t\t\t\t\t\t@click=\"onClickCancelEdit\"\n\t\t\t\t\t/>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\tclass=\"ml-2xs\"\n\t\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t\t:label=\"$locale.baseText('runData.editor.save')\"\n\t\t\t\t\t\t@click=\"onClickSaveEdit\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div\n\t\t\tv-if=\"maxRunIndex > 0\"\n\t\t\tv-show=\"!editMode.enabled\"\n\t\t\t:class=\"$style.runSelector\"\n\t\t\tdata-test-id=\"run-selector\"\n\t\t>\n\t\t\t<div :class=\"$style.runSelectorWrapper\">\n\t\t\t\t<n8n-select\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t:model-value=\"runIndex\"\n\t\t\t\t\tteleported\n\t\t\t\t\t@update:model-value=\"onRunIndexChange\"\n\t\t\t\t\t@click.stop\n\t\t\t\t>\n\t\t\t\t\t<template #prepend>{{ $locale.baseText('ndv.output.run') }}</template>\n\t\t\t\t\t<n8n-option\n\t\t\t\t\t\tv-for=\"option in maxRunIndex + 1\"\n\t\t\t\t\t\t:key=\"option\"\n\t\t\t\t\t\t:label=\"getRunLabel(option)\"\n\t\t\t\t\t\t:value=\"option - 1\"\n\t\t\t\t\t></n8n-option>\n\t\t\t\t</n8n-select>\n\t\t\t\t<n8n-tooltip v-if=\"canLinkRuns\" placement=\"right\">\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t{{ $locale.baseText(linkedRuns ? 'runData.unlinking.hint' : 'runData.linking.hint') }}\n\t\t\t\t\t</template>\n\t\t\t\t\t<n8n-icon-button\n\t\t\t\t\t\tclass=\"linkRun\"\n\t\t\t\t\t\t:icon=\"linkedRuns ? 'unlink' : 'link'\"\n\t\t\t\t\t\ttext\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t@click=\"toggleLinkRuns\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-tooltip>\n\t\t\t\t<slot name=\"run-info\"></slot>\n\t\t\t</div>\n\t\t\t<RunDataSearch\n\t\t\t\tv-if=\"showIOSearch\"\n\t\t\t\tv-model=\"search\"\n\t\t\t\t:pane-type=\"paneType\"\n\t\t\t\t:is-area-active=\"isPaneActive\"\n\t\t\t\t@focus=\"activatePane\"\n\t\t\t/>\n\t\t</div>\n\t\t<slot name=\"before-data\" />\n\n\t\t<n8n-callout\n\t\t\tv-for=\"hint in getNodeHints()\"\n\t\t\t:key=\"hint.message\"\n\t\t\t:class=\"$style.hintCallout\"\n\t\t\t:theme=\"hint.type || 'info'\"\n\t\t>\n\t\t\t<n8n-text size=\"small\" v-html=\"hint.message\"></n8n-text>\n\t\t</n8n-callout>\n\n\t\t<div\n\t\t\tv-if=\"maxOutputIndex > 0 && branches.length > 1\"\n\t\t\t:class=\"$style.tabs\"\n\t\t\tdata-test-id=\"branches\"\n\t\t>\n\t\t\t<n8n-tabs\n\t\t\t\t:model-value=\"currentOutputIndex\"\n\t\t\t\t:options=\"branches\"\n\t\t\t\t@update:model-value=\"onBranchChange\"\n\t\t\t/>\n\t\t\t<RunDataSearch\n\t\t\t\tv-if=\"showIOSearch\"\n\t\t\t\tv-model=\"search\"\n\t\t\t\t:pane-type=\"paneType\"\n\t\t\t\t:is-area-active=\"isPaneActive\"\n\t\t\t\t@focus=\"activatePane\"\n\t\t\t/>\n\t\t</div>\n\n\t\t<div\n\t\t\tv-else-if=\"\n\t\t\t\t!hasRunError &&\n\t\t\t\thasNodeRun &&\n\t\t\t\t((dataCount > 0 && maxRunIndex === 0) || search) &&\n\t\t\t\t!isArtificialRecoveredEventItem\n\t\t\t\"\n\t\t\tv-show=\"!editMode.enabled && !hasRunError\"\n\t\t\t:class=\"$style.itemsCount\"\n\t\t\tdata-test-id=\"ndv-items-count\"\n\t\t>\n\t\t\t<n8n-text v-if=\"search\">\n\t\t\t\t{{\n\t\t\t\t\t$locale.baseText('ndv.search.items', {\n\t\t\t\t\t\tadjustToNumber: unfilteredDataCount,\n\t\t\t\t\t\tinterpolate: { matched: dataCount, total: unfilteredDataCount },\n\t\t\t\t\t})\n\t\t\t\t}}\n\t\t\t</n8n-text>\n\t\t\t<n8n-text v-else>\n\t\t\t\t{{\n\t\t\t\t\t$locale.baseText('ndv.output.items', {\n\t\t\t\t\t\tadjustToNumber: dataCount,\n\t\t\t\t\t\tinterpolate: { count: dataCount },\n\t\t\t\t\t})\n\t\t\t\t}}\n\t\t\t</n8n-text>\n\t\t\t<RunDataSearch\n\t\t\t\tv-if=\"showIOSearch\"\n\t\t\t\tv-model=\"search\"\n\t\t\t\t:pane-type=\"paneType\"\n\t\t\t\t:is-area-active=\"isPaneActive\"\n\t\t\t\t@focus=\"activatePane\"\n\t\t\t/>\n\t\t</div>\n\n\t\t<div ref=\"dataContainer\" :class=\"$style.dataContainer\" data-test-id=\"ndv-data-container\">\n\t\t\t<div v-if=\"isExecuting\" :class=\"$style.center\" data-test-id=\"ndv-executing\">\n\t\t\t\t<div :class=\"$style.spinner\"><n8n-spinner type=\"ring\" /></div>\n\t\t\t\t<n8n-text>{{ executingMessage }}</n8n-text>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"editMode.enabled\" :class=\"$style.editMode\">\n\t\t\t\t<div :class=\"[$style.editModeBody, 'ignore-key-press']\">\n\t\t\t\t\t<JsonEditor\n\t\t\t\t\t\t:model-value=\"editMode.value\"\n\t\t\t\t\t\t:fill-parent=\"true\"\n\t\t\t\t\t\t@update:model-value=\"ndvStore.setOutputPanelEditModeValue($event)\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div :class=\"$style.editModeFooter\">\n\t\t\t\t\t<n8n-info-tip :bold=\"false\" :class=\"$style.editModeFooterInfotip\">\n\t\t\t\t\t\t{{ $locale.baseText('runData.editor.copyDataInfo') }}\n\t\t\t\t\t\t<n8n-link :to=\"dataEditingDocsUrl\" size=\"small\">\n\t\t\t\t\t\t\t{{ $locale.baseText('generic.learnMore') }}\n\t\t\t\t\t\t</n8n-link>\n\t\t\t\t\t</n8n-info-tip>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-else-if=\"paneType === 'output' && hasSubworkflowExecutionError\"\n\t\t\t\t:class=\"$style.stretchVertically\"\n\t\t\t>\n\t\t\t\t<NodeErrorView :error=\"subworkflowExecutionError\" :class=\"$style.errorDisplay\" />\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"!hasNodeRun\" :class=\"$style.center\">\n\t\t\t\t<slot name=\"node-not-run\"></slot>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"paneType === 'input' && node?.disabled\" :class=\"$style.center\">\n\t\t\t\t<n8n-text>\n\t\t\t\t\t{{ $locale.baseText('ndv.input.disabled', { interpolate: { nodeName: node.name } }) }}\n\t\t\t\t\t<n8n-link @click=\"enableNode\">\n\t\t\t\t\t\t{{ $locale.baseText('ndv.input.disabled.cta') }}\n\t\t\t\t\t</n8n-link>\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"hasNodeRun && isArtificialRecoveredEventItem\" :class=\"$style.center\">\n\t\t\t\t<slot name=\"recovered-artificial-output-data\"></slot>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"hasNodeRun && hasRunError\" :class=\"$style.stretchVertically\">\n\t\t\t\t<n8n-text v-if=\"isPaneTypeInput\" :class=\"$style.center\" size=\"large\" tag=\"p\" bold>\n\t\t\t\t\t{{\n\t\t\t\t\t\t$locale.baseText('nodeErrorView.inputPanel.previousNodeError.title', {\n\t\t\t\t\t\t\tinterpolate: { nodeName: node?.name ?? '' },\n\t\t\t\t\t\t})\n\t\t\t\t\t}}\n\t\t\t\t</n8n-text>\n\t\t\t\t<slot v-else-if=\"$slots['content']\" name=\"content\"></slot>\n\t\t\t\t<NodeErrorView\n\t\t\t\t\tv-else-if=\"hasRunError\"\n\t\t\t\t\t:error=\"workflowRunErrorAsNodeError\"\n\t\t\t\t\t:class=\"$style.dataDisplay\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-else-if=\"\n\t\t\t\t\thasNodeRun && (!unfilteredDataCount || (search && !dataCount)) && branches.length > 1\n\t\t\t\t\"\n\t\t\t\t:class=\"$style.center\"\n\t\t\t>\n\t\t\t\t<div v-if=\"search\">\n\t\t\t\t\t<n8n-text tag=\"h3\" size=\"large\">{{\n\t\t\t\t\t\t$locale.baseText('ndv.search.noMatch.title')\n\t\t\t\t\t}}</n8n-text>\n\t\t\t\t\t<n8n-text>\n\t\t\t\t\t\t<i18n-t keypath=\"ndv.search.noMatch.description\" tag=\"span\">\n\t\t\t\t\t\t\t<template #link>\n\t\t\t\t\t\t\t\t<a href=\"#\" @click=\"onSearchClear\">\n\t\t\t\t\t\t\t\t\t{{ $locale.baseText('ndv.search.noMatch.description.link') }}\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</i18n-t>\n\t\t\t\t\t</n8n-text>\n\t\t\t\t</div>\n\t\t\t\t<n8n-text v-else>\n\t\t\t\t\t{{ noDataInBranchMessage }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"hasNodeRun && !inputData.length && !search\" :class=\"$style.center\">\n\t\t\t\t<slot name=\"no-output-data\">xxx</slot>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"hasNodeRun && !showData\" :class=\"$style.center\">\n\t\t\t\t<n8n-text :bold=\"true\" color=\"text-dark\" size=\"large\">{{ tooMuchDataTitle }}</n8n-text>\n\t\t\t\t<n8n-text align=\"center\" tag=\"div\"\n\t\t\t\t\t><span\n\t\t\t\t\t\tv-html=\"\n\t\t\t\t\t\t\t$locale.baseText('ndv.output.tooMuchData.message', {\n\t\t\t\t\t\t\t\tinterpolate: { size: dataSizeInMB },\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\"\n\t\t\t\t\t></span\n\t\t\t\t></n8n-text>\n\n\t\t\t\t<n8n-button\n\t\t\t\t\toutline\n\t\t\t\t\t:label=\"$locale.baseText('ndv.output.tooMuchData.showDataAnyway')\"\n\t\t\t\t\t@click=\"showTooMuchData\"\n\t\t\t\t/>\n\n\t\t\t\t<n8n-button\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t:label=\"$locale.baseText('runData.downloadBinaryData')\"\n\t\t\t\t\t@click=\"downloadJsonData()\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<!-- V-else slot named content which only renders if $slots.content is passed and hasNodeRun -->\n\t\t\t<slot v-else-if=\"hasNodeRun && $slots['content']\" name=\"content\"></slot>\n\n\t\t\t<div\n\t\t\t\tv-else-if=\"\n\t\t\t\t\thasNodeRun &&\n\t\t\t\t\tdisplayMode === 'table' &&\n\t\t\t\t\tbinaryData.length > 0 &&\n\t\t\t\t\tinputData.length === 1 &&\n\t\t\t\t\tObject.keys(jsonData[0] || {}).length === 0\n\t\t\t\t\"\n\t\t\t\t:class=\"$style.center\"\n\t\t\t>\n\t\t\t\t<n8n-text>\n\t\t\t\t\t{{ $locale.baseText('runData.switchToBinary.info') }}\n\t\t\t\t\t<a @click=\"switchToBinary\">\n\t\t\t\t\t\t{{ $locale.baseText('runData.switchToBinary.binary') }}\n\t\t\t\t\t</a>\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"showIoSearchNoMatchContent\" :class=\"$style.center\">\n\t\t\t\t<n8n-text tag=\"h3\" size=\"large\">{{\n\t\t\t\t\t$locale.baseText('ndv.search.noMatch.title')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-text>\n\t\t\t\t\t<i18n-t keypath=\"ndv.search.noMatch.description\" tag=\"span\">\n\t\t\t\t\t\t<template #link>\n\t\t\t\t\t\t\t<a href=\"#\" @click=\"onSearchClear\">\n\t\t\t\t\t\t\t\t{{ $locale.baseText('ndv.search.noMatch.description.link') }}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</i18n-t>\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\n\t\t\t<Suspense v-else-if=\"hasNodeRun && displayMode === 'table'\">\n\t\t\t\t<RunDataTable\n\t\t\t\t\t:node=\"node\"\n\t\t\t\t\t:input-data=\"inputDataPage\"\n\t\t\t\t\t:mapping-enabled=\"mappingEnabled\"\n\t\t\t\t\t:distance-from-active=\"distanceFromActive\"\n\t\t\t\t\t:run-index=\"runIndex\"\n\t\t\t\t\t:page-offset=\"currentPageOffset\"\n\t\t\t\t\t:total-runs=\"maxRunIndex\"\n\t\t\t\t\t:has-default-hover-state=\"paneType === 'input' && !search\"\n\t\t\t\t\t:search=\"search\"\n\t\t\t\t\t@mounted=\"$emit('tableMounted', $event)\"\n\t\t\t\t\t@active-row-changed=\"onItemHover\"\n\t\t\t\t\t@display-mode-change=\"onDisplayModeChange\"\n\t\t\t\t/>\n\t\t\t</Suspense>\n\n\t\t\t<Suspense v-else-if=\"hasNodeRun && displayMode === 'json' && node\">\n\t\t\t\t<RunDataJson\n\t\t\t\t\t:pane-type=\"paneType\"\n\t\t\t\t\t:edit-mode=\"editMode\"\n\t\t\t\t\t:push-ref=\"pushRef\"\n\t\t\t\t\t:node=\"node\"\n\t\t\t\t\t:input-data=\"inputDataPage\"\n\t\t\t\t\t:mapping-enabled=\"mappingEnabled\"\n\t\t\t\t\t:distance-from-active=\"distanceFromActive\"\n\t\t\t\t\t:run-index=\"runIndex\"\n\t\t\t\t\t:total-runs=\"maxRunIndex\"\n\t\t\t\t\t:search=\"search\"\n\t\t\t\t/>\n\t\t\t</Suspense>\n\n\t\t\t<Suspense v-else-if=\"hasNodeRun && isPaneTypeOutput && displayMode === 'html'\">\n\t\t\t\t<RunDataHtml :input-html=\"inputHtml\" />\n\t\t\t</Suspense>\n\n\t\t\t<Suspense v-else-if=\"hasNodeRun && isSchemaView\">\n\t\t\t\t<RunDataSchema\n\t\t\t\t\t:data=\"jsonData\"\n\t\t\t\t\t:mapping-enabled=\"mappingEnabled\"\n\t\t\t\t\t:distance-from-active=\"distanceFromActive\"\n\t\t\t\t\t:node=\"node\"\n\t\t\t\t\t:pane-type=\"paneType\"\n\t\t\t\t\t:run-index=\"runIndex\"\n\t\t\t\t\t:total-runs=\"maxRunIndex\"\n\t\t\t\t\t:search=\"search\"\n\t\t\t\t/>\n\t\t\t</Suspense>\n\n\t\t\t<div v-else-if=\"displayMode === 'binary' && binaryData.length === 0\" :class=\"$style.center\">\n\t\t\t\t<n8n-text align=\"center\" tag=\"div\">{{\n\t\t\t\t\t$locale.baseText('runData.noBinaryDataFound')\n\t\t\t\t}}</n8n-text>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"displayMode === 'binary'\" :class=\"$style.dataDisplay\">\n\t\t\t\t<div v-for=\"(binaryDataEntry, index) in binaryData\" :key=\"index\">\n\t\t\t\t\t<div v-if=\"binaryData.length > 1\" :class=\"$style.binaryIndex\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t{{ index + 1 }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div :class=\"$style.binaryRow\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-for=\"(binaryData, key) in binaryDataEntry\"\n\t\t\t\t\t\t\t:key=\"index + '_' + key\"\n\t\t\t\t\t\t\t:class=\"$style.binaryCell\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div :data-test-id=\"'ndv-binary-data_' + index\">\n\t\t\t\t\t\t\t\t<div :class=\"$style.binaryHeader\">\n\t\t\t\t\t\t\t\t\t{{ key }}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-if=\"binaryData.fileName\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ $locale.baseText('runData.fileName') }}:\n\t\t\t\t\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div :class=\"$style.binaryValue\">{{ binaryData.fileName }}</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-if=\"binaryData.directory\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ $locale.baseText('runData.directory') }}:\n\t\t\t\t\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div :class=\"$style.binaryValue\">{{ binaryData.directory }}</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-if=\"binaryData.fileExtension\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ $locale.baseText('runData.fileExtension') }}:</n8n-text\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div :class=\"$style.binaryValue\">{{ binaryData.fileExtension }}</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-if=\"binaryData.mimeType\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ $locale.baseText('runData.mimeType') }}:\n\t\t\t\t\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div :class=\"$style.binaryValue\">{{ binaryData.mimeType }}</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-if=\"binaryData.fileSize\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ $locale.baseText('runData.fileSize') }}:\n\t\t\t\t\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div :class=\"$style.binaryValue\">{{ binaryData.fileSize }}</div>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div :class=\"$style.binaryButtonContainer\">\n\t\t\t\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\t\t\t\tv-if=\"isViewable(index, key)\"\n\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\t:label=\"$locale.baseText('runData.showBinaryData')\"\n\t\t\t\t\t\t\t\t\t\tdata-test-id=\"ndv-view-binary-data\"\n\t\t\t\t\t\t\t\t\t\t@click=\"displayBinaryData(index, key)\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\t\t\t\tv-if=\"isDownloadable(index, key)\"\n\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t:label=\"$locale.baseText('runData.downloadBinaryData')\"\n\t\t\t\t\t\t\t\t\t\tdata-test-id=\"ndv-download-binary-data\"\n\t\t\t\t\t\t\t\t\t\t@click=\"downloadBinaryData(index, key)\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div\n\t\t\tv-if=\"\n\t\t\t\thasNodeRun &&\n\t\t\t\t!hasRunError &&\n\t\t\t\tbinaryData.length === 0 &&\n\t\t\t\tdataCount > pageSize &&\n\t\t\t\t!isSchemaView &&\n\t\t\t\t!isArtificialRecoveredEventItem\n\t\t\t\"\n\t\t\tv-show=\"!editMode.enabled\"\n\t\t\t:class=\"$style.pagination\"\n\t\t\tdata-test-id=\"ndv-data-pagination\"\n\t\t>\n\t\t\t<el-pagination\n\t\t\t\tbackground\n\t\t\t\t:hide-on-single-page=\"true\"\n\t\t\t\t:current-page=\"currentPage\"\n\t\t\t\t:pager-count=\"5\"\n\t\t\t\t:page-size=\"pageSize\"\n\t\t\t\tlayout=\"prev, pager, next\"\n\t\t\t\t:total=\"dataCount\"\n\t\t\t\t@update:current-page=\"onCurrentPageChange\"\n\t\t\t>\n\t\t\t</el-pagination>\n\n\t\t\t<div :class=\"$style.pageSizeSelector\">\n\t\t\t\t<n8n-select\n\t\t\t\t\tsize=\"mini\"\n\t\t\t\t\t:model-value=\"pageSize\"\n\t\t\t\t\tteleported\n\t\t\t\t\t@update:model-value=\"onPageSizeChange\"\n\t\t\t\t>\n\t\t\t\t\t<template #prepend>{{ $locale.baseText('ndv.output.pageSize') }}</template>\n\t\t\t\t\t<n8n-option v-for=\"size in pageSizes\" :key=\"size\" :label=\"size\" :value=\"size\">\n\t\t\t\t\t</n8n-option>\n\t\t\t\t\t<n8n-option :label=\"$locale.baseText('ndv.output.all')\" :value=\"dataCount\"> </n8n-option>\n\t\t\t\t</n8n-select>\n\t\t\t</div>\n\t\t</div>\n\t\t<n8n-block-ui :show=\"blockUI\" :class=\"$style.uiBlocker\" />\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineAsyncComponent, defineComponent, toRef } from 'vue';\nimport type { PropType } from 'vue';\nimport { mapStores } from 'pinia';\nimport { useStorage } from '@/composables/useStorage';\nimport { saveAs } from 'file-saver';\nimport type {\n\tConnectionTypes,\n\tIBinaryData,\n\tIBinaryKeyData,\n\tIDataObject,\n\tINodeExecutionData,\n\tINodeOutputConfiguration,\n\tINodeTypeDescription,\n\tIRunData,\n\tIRunExecutionData,\n\tNodeHint,\n\tNodeError,\n} from 'n8n-workflow';\nimport { NodeHelpers, NodeConnectionType } from 'n8n-workflow';\n\nimport type {\n\tIExecutionResponse,\n\tINodeUi,\n\tINodeUpdatePropertiesInformation,\n\tIRunDataDisplayMode,\n\tITab,\n\tNodePanelType,\n} from '@/Interface';\n\nimport {\n\tDATA_PINNING_DOCS_URL,\n\tDATA_EDITING_DOCS_URL,\n\tNODE_TYPES_EXCLUDED_FROM_OUTPUT_NAME_APPEND,\n\tLOCAL_STORAGE_PIN_DATA_DISCOVERY_NDV_FLAG,\n\tLOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG,\n\tMAX_DISPLAY_DATA_SIZE,\n\tMAX_DISPLAY_ITEMS_AUTO_ALL,\n\tTEST_PIN_DATA,\n\tHTML_NODE_TYPE,\n} from '@/constants';\n\nimport BinaryDataDisplay from '@/components/BinaryDataDisplay.vue';\nimport NodeErrorView from '@/components/Error/NodeErrorView.vue';\nimport JsonEditor from '@/components/JsonEditor/JsonEditor.vue';\n\nimport type { PinDataSource, UnpinDataSource } from '@/composables/usePinnedData';\nimport { usePinnedData } from '@/composables/usePinnedData';\nimport { dataPinningEventBus } from '@/event-bus';\nimport { clearJsonKey, isEmpty } from '@/utils/typesUtils';\nimport { executionDataToJson } from '@/utils/nodeTypesUtils';\nimport { searchInObject } from '@/utils/objectUtils';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\nimport { useToast } from '@/composables/useToast';\nimport { isEqual, isObject } from 'lodash-es';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport RunDataPinButton from '@/components/RunDataPinButton.vue';\n\nconst RunDataTable = defineAsyncComponent(\n\tasync () => await import('@/components/RunDataTable.vue'),\n);\nconst RunDataJson = defineAsyncComponent(async () => await import('@/components/RunDataJson.vue'));\nconst RunDataSchema = defineAsyncComponent(\n\tasync () => await import('@/components/RunDataSchema.vue'),\n);\nconst RunDataHtml = defineAsyncComponent(async () => await import('@/components/RunDataHtml.vue'));\nconst RunDataSearch = defineAsyncComponent(\n\tasync () => await import('@/components/RunDataSearch.vue'),\n);\n\nexport type EnterEditModeArgs = {\n\torigin: 'editIconButton' | 'insertTestDataLink';\n};\n\nexport default defineComponent({\n\tname: 'RunData',\n\tcomponents: {\n\t\tBinaryDataDisplay,\n\t\tNodeErrorView,\n\t\tJsonEditor,\n\t\tRunDataTable,\n\t\tRunDataJson,\n\t\tRunDataSchema,\n\t\tRunDataHtml,\n\t\tRunDataSearch,\n\t\tRunDataPinButton,\n\t},\n\tprops: {\n\t\tnode: {\n\t\t\ttype: Object as PropType<INodeUi>,\n\t\t\trequired: true,\n\t\t},\n\t\trunIndex: {\n\t\t\ttype: Number,\n\t\t\trequired: true,\n\t\t},\n\t\tlinkedRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tcanLinkRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\ttooMuchDataTitle: {\n\t\t\ttype: String,\n\t\t},\n\t\tnoDataInBranchMessage: {\n\t\t\ttype: String,\n\t\t},\n\t\tisExecuting: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\texecutingMessage: {\n\t\t\ttype: String,\n\t\t},\n\t\tpushRef: {\n\t\t\ttype: String,\n\t\t},\n\t\tpaneType: {\n\t\t\ttype: String as PropType<NodePanelType>,\n\t\t\trequired: true,\n\t\t},\n\t\toverrideOutputs: {\n\t\t\ttype: Array as PropType<number[]>,\n\t\t},\n\t\tmappingEnabled: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tdistanceFromActive: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\t\tblockUI: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisProductionExecutionPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisPaneActive: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tsetup(props) {\n\t\tconst ndvStore = useNDVStore();\n\t\tconst nodeHelpers = useNodeHelpers();\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst node = toRef(props, 'node');\n\t\tconst pinnedData = usePinnedData(node, {\n\t\t\trunIndex: props.runIndex,\n\t\t\tdisplayMode: ndvStore.getPanelDisplayMode(props.paneType),\n\t\t});\n\n\t\treturn {\n\t\t\t...useToast(),\n\t\t\texternalHooks,\n\t\t\tnodeHelpers,\n\t\t\tpinnedData,\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tconnectionType: NodeConnectionType.Main as ConnectionTypes,\n\t\t\tbinaryDataPreviewActive: false,\n\t\t\tdataSize: 0,\n\t\t\tshowData: false,\n\t\t\toutputIndex: 0,\n\t\t\tbinaryDataDisplayVisible: false,\n\t\t\tbinaryDataDisplayData: null as IBinaryData | null,\n\n\t\t\tMAX_DISPLAY_DATA_SIZE,\n\t\t\tMAX_DISPLAY_ITEMS_AUTO_ALL,\n\t\t\tcurrentPage: 1,\n\t\t\tpageSize: 10,\n\t\t\tpageSizes: [10, 25, 50, 100],\n\n\t\t\tpinDataDiscoveryTooltipVisible: false,\n\t\t\tisControlledPinDataTooltip: false,\n\t\t\tsearch: '',\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(\n\t\t\tuseNodeTypesStore,\n\t\t\tuseNDVStore,\n\t\t\tuseWorkflowsStore,\n\t\t\tuseSourceControlStore,\n\t\t\tuseRootStore,\n\t\t),\n\t\tisReadOnlyRoute() {\n\t\t\treturn this.$route?.meta?.readOnlyCanvas === true;\n\t\t},\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tdataPinningDocsUrl(): string {\n\t\t\treturn DATA_PINNING_DOCS_URL;\n\t\t},\n\t\tdataEditingDocsUrl(): string {\n\t\t\treturn DATA_EDITING_DOCS_URL;\n\t\t},\n\t\tdisplayMode(): IRunDataDisplayMode {\n\t\t\treturn this.ndvStore.getPanelDisplayMode(this.paneType);\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.nodeTypesStore.getNodeType(this.node.type, this.node.typeVersion);\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tisSchemaView(): boolean {\n\t\t\treturn this.displayMode === 'schema';\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\tif (this.node === null) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn this.nodeTypesStore.isTriggerNode(this.node.type);\n\t\t},\n\t\tcanPinData(): boolean {\n\t\t\tif (this.node === null) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst canPinNode = usePinnedData(this.node).canPinNode(false);\n\n\t\t\treturn (\n\t\t\t\tcanPinNode &&\n\t\t\t\t!this.isPaneTypeInput &&\n\t\t\t\tthis.pinnedData.isValidNodeType.value &&\n\t\t\t\t!(this.binaryData && this.binaryData.length > 0)\n\t\t\t);\n\t\t},\n\t\tbuttons(): Array<{ label: string; value: string }> {\n\t\t\tconst defaults = [\n\t\t\t\t{ label: this.$locale.baseText('runData.table'), value: 'table' },\n\t\t\t\t{ label: this.$locale.baseText('runData.json'), value: 'json' },\n\t\t\t];\n\n\t\t\tif (this.binaryData.length) {\n\t\t\t\tdefaults.push({ label: this.$locale.baseText('runData.binary'), value: 'binary' });\n\t\t\t}\n\n\t\t\tconst schemaView = { label: this.$locale.baseText('runData.schema'), value: 'schema' };\n\t\t\tif (this.isPaneTypeInput && !isEmpty(this.jsonData)) {\n\t\t\t\tdefaults.unshift(schemaView);\n\t\t\t} else {\n\t\t\t\tdefaults.push(schemaView);\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.isPaneTypeOutput &&\n\t\t\t\tthis.activeNode?.type === HTML_NODE_TYPE &&\n\t\t\t\tthis.activeNode.parameters.operation === 'generateHtmlTemplate'\n\t\t\t) {\n\t\t\t\tdefaults.unshift({ label: 'HTML', value: 'html' });\n\t\t\t}\n\n\t\t\treturn defaults;\n\t\t},\n\t\thasNodeRun(): boolean {\n\t\t\treturn Boolean(\n\t\t\t\t!this.isExecuting &&\n\t\t\t\t\tthis.node &&\n\t\t\t\t\t((this.workflowRunData && this.workflowRunData.hasOwnProperty(this.node.name)) ||\n\t\t\t\t\t\tthis.pinnedData.hasData.value),\n\t\t\t);\n\t\t},\n\t\tisArtificialRecoveredEventItem(): boolean {\n\t\t\treturn !!this.rawInputData?.[0]?.json?.isArtificialRecoveredEventItem;\n\t\t},\n\t\tsubworkflowExecutionError(): NodeError {\n\t\t\treturn {\n\t\t\t\tnode: this.node,\n\t\t\t\tmessages: [this.workflowsStore.subWorkflowExecutionError?.message ?? ''],\n\t\t\t} as NodeError;\n\t\t},\n\t\thasSubworkflowExecutionError(): boolean {\n\t\t\treturn Boolean(this.workflowsStore.subWorkflowExecutionError);\n\t\t},\n\t\tworkflowRunErrorAsNodeError(): NodeError {\n\t\t\treturn this.workflowRunData?.[this.node?.name]?.[this.runIndex]?.error as NodeError;\n\t\t},\n\t\thasRunError(): boolean {\n\t\t\treturn Boolean(this.node && this.workflowRunErrorAsNodeError);\n\t\t},\n\t\texecutionHints(): NodeHint[] {\n\t\t\tif (this.hasNodeRun) {\n\t\t\t\tconst hints = this.node && this.workflowRunData?.[this.node.name]?.[this.runIndex]?.hints;\n\n\t\t\t\tif (hints) return hints;\n\t\t\t}\n\n\t\t\treturn [];\n\t\t},\n\t\tworkflowExecution(): IExecutionResponse | null {\n\t\t\treturn this.workflowsStore.getWorkflowExecution;\n\t\t},\n\t\tworkflowRunData(): IRunData | null {\n\t\t\tif (this.workflowExecution === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst executionData: IRunExecutionData | undefined = this.workflowExecution.data;\n\t\t\tif (executionData?.resultData) {\n\t\t\t\treturn executionData.resultData.runData;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tdataCount(): number {\n\t\t\treturn this.getDataCount(this.runIndex, this.currentOutputIndex);\n\t\t},\n\t\tunfilteredDataCount(): number {\n\t\t\treturn this.pinnedData.data.value\n\t\t\t\t? this.pinnedData.data.value.length\n\t\t\t\t: this.rawInputData.length;\n\t\t},\n\t\tdataSizeInMB(): string {\n\t\t\treturn (this.dataSize / 1024 / 1000).toLocaleString();\n\t\t},\n\t\tmaxOutputIndex(): number {\n\t\t\tif (this.node === null || this.runIndex === undefined) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst runData: IRunData | null = this.workflowRunData;\n\n\t\t\tif (runData === null || !runData.hasOwnProperty(this.node.name)) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[this.node.name].length < this.runIndex) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[this.node.name][this.runIndex]) {\n\t\t\t\tconst taskData = runData[this.node.name][this.runIndex].data;\n\t\t\t\tif (taskData?.main) {\n\t\t\t\t\treturn taskData.main.length - 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t},\n\t\tcurrentPageOffset(): number {\n\t\t\treturn this.pageSize * (this.currentPage - 1);\n\t\t},\n\t\tmaxRunIndex(): number {\n\t\t\tif (this.node === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst runData: IRunData | null = this.workflowRunData;\n\n\t\t\tif (runData === null || !runData.hasOwnProperty(this.node.name)) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[this.node.name].length) {\n\t\t\t\treturn runData[this.node.name].length - 1;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t},\n\t\trawInputData(): INodeExecutionData[] {\n\t\t\treturn this.getRawInputData(this.runIndex, this.currentOutputIndex, this.connectionType);\n\t\t},\n\t\tinputData(): INodeExecutionData[] {\n\t\t\tconst pinOrLiveData = this.getPinDataOrLiveData(this.rawInputData);\n\t\t\treturn this.getFilteredData(pinOrLiveData);\n\t\t},\n\t\tinputDataPage(): INodeExecutionData[] {\n\t\t\tconst offset = this.pageSize * (this.currentPage - 1);\n\t\t\treturn this.inputData.slice(offset, offset + this.pageSize);\n\t\t},\n\t\tjsonData(): IDataObject[] {\n\t\t\treturn executionDataToJson(this.inputData);\n\t\t},\n\t\tbinaryData(): IBinaryKeyData[] {\n\t\t\tif (!this.node) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tconst binaryData = this.nodeHelpers.getBinaryData(\n\t\t\t\tthis.workflowRunData,\n\t\t\t\tthis.node.name,\n\t\t\t\tthis.runIndex,\n\t\t\t\tthis.currentOutputIndex,\n\t\t\t);\n\t\t\treturn binaryData.filter((data) => Boolean(data && Object.keys(data).length));\n\t\t},\n\t\tinputHtml(): string {\n\t\t\treturn String(this.inputData[0]?.json?.html ?? '');\n\t\t},\n\t\tcurrentOutputIndex(): number {\n\t\t\tif (this.overrideOutputs?.length && !this.overrideOutputs.includes(this.outputIndex)) {\n\t\t\t\treturn this.overrideOutputs[0];\n\t\t\t}\n\n\t\t\treturn this.outputIndex;\n\t\t},\n\t\tbranches(): ITab[] {\n\t\t\tconst capitalize = (name: string) => name.charAt(0).toLocaleUpperCase() + name.slice(1);\n\n\t\t\tconst branches: ITab[] = [];\n\n\t\t\tfor (let i = 0; i <= this.maxOutputIndex; i++) {\n\t\t\t\tif (this.overrideOutputs && !this.overrideOutputs.includes(i)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst totalItemsCount = this.getRawInputData(this.runIndex, i).length;\n\t\t\t\tconst itemsCount = this.getDataCount(this.runIndex, i);\n\t\t\t\tconst items = this.search\n\t\t\t\t\t? this.$locale.baseText('ndv.search.items', {\n\t\t\t\t\t\t\tadjustToNumber: totalItemsCount,\n\t\t\t\t\t\t\tinterpolate: { matched: itemsCount, total: totalItemsCount },\n\t\t\t\t\t\t})\n\t\t\t\t\t: this.$locale.baseText('ndv.output.items', {\n\t\t\t\t\t\t\tadjustToNumber: itemsCount,\n\t\t\t\t\t\t\tinterpolate: { count: itemsCount },\n\t\t\t\t\t\t});\n\t\t\t\tlet outputName = this.getOutputName(i);\n\n\t\t\t\tif (`${outputName}` === `${i}`) {\n\t\t\t\t\toutputName = `${this.$locale.baseText('ndv.output')} ${outputName}`;\n\t\t\t\t} else {\n\t\t\t\t\tconst appendBranchWord = NODE_TYPES_EXCLUDED_FROM_OUTPUT_NAME_APPEND.includes(\n\t\t\t\t\t\tthis.node?.type,\n\t\t\t\t\t)\n\t\t\t\t\t\t? ''\n\t\t\t\t\t\t: ` ${this.$locale.baseText('ndv.output.branch')}`;\n\t\t\t\t\toutputName = capitalize(`${this.getOutputName(i)}${appendBranchWord}`);\n\t\t\t\t}\n\t\t\t\tbranches.push({\n\t\t\t\t\tlabel:\n\t\t\t\t\t\t(this.search && itemsCount) || totalItemsCount\n\t\t\t\t\t\t\t? `${outputName} (${items})`\n\t\t\t\t\t\t\t: outputName,\n\t\t\t\t\tvalue: i,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn branches;\n\t\t},\n\t\teditMode(): { enabled: boolean; value: string } {\n\t\t\treturn this.isPaneTypeInput\n\t\t\t\t? { enabled: false, value: '' }\n\t\t\t\t: this.ndvStore.outputPanelEditMode;\n\t\t},\n\t\tisPaneTypeInput(): boolean {\n\t\t\treturn this.paneType === 'input';\n\t\t},\n\t\tisPaneTypeOutput(): boolean {\n\t\t\treturn this.paneType === 'output';\n\t\t},\n\t\treadOnlyEnv(): boolean {\n\t\t\treturn this.sourceControlStore.preferences.branchReadOnly;\n\t\t},\n\t\tshowIOSearch(): boolean {\n\t\t\treturn this.hasNodeRun && !this.hasRunError;\n\t\t},\n\t\tshowIoSearchNoMatchContent(): boolean {\n\t\t\treturn this.hasNodeRun && !this.inputData.length && !!this.search;\n\t\t},\n\t\tparentNodeOutputData(): INodeExecutionData[] {\n\t\t\tconst workflow = this.workflowsStore.getCurrentWorkflow();\n\n\t\t\tconst parentNode = workflow.getParentNodesByDepth(this.node.name)[0];\n\t\t\tlet parentNodeData: INodeExecutionData[] = [];\n\n\t\t\tif (parentNode?.name) {\n\t\t\t\tparentNodeData = this.nodeHelpers.getNodeInputData(\n\t\t\t\t\tworkflow.getNode(parentNode?.name),\n\t\t\t\t\tthis.runIndex,\n\t\t\t\t\tthis.outputIndex,\n\t\t\t\t\t'input',\n\t\t\t\t\tthis.connectionType,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn parentNodeData;\n\t\t},\n\t},\n\twatch: {\n\t\tnode(newNode: INodeUi, prevNode: INodeUi) {\n\t\t\tif (newNode.id === prevNode.id) return;\n\t\t\tthis.init();\n\t\t},\n\t\thasNodeRun() {\n\t\t\tif (this.paneType === 'output') this.setDisplayMode();\n\t\t},\n\t\tinputDataPage: {\n\t\t\thandler(data: INodeExecutionData[]) {\n\t\t\t\tif (this.paneType && data) {\n\t\t\t\t\tthis.ndvStore.setNDVPanelDataIsEmpty({\n\t\t\t\t\t\tpanel: this.paneType as 'input' | 'output',\n\t\t\t\t\t\tisEmpty: data.every((item) => isEmpty(item.json)),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t\timmediate: true,\n\t\t\tdeep: true,\n\t\t},\n\t\tjsonData(data: IDataObject[], prevData: IDataObject[]) {\n\t\t\tif (isEqual(data, prevData)) return;\n\t\t\tthis.refreshDataSize();\n\t\t\tthis.showPinDataDiscoveryTooltip(data);\n\t\t},\n\t\tbinaryData(newData: IBinaryKeyData[], prevData: IBinaryKeyData[]) {\n\t\t\tif (newData.length && !prevData.length && this.displayMode !== 'binary') {\n\t\t\t\tthis.switchToBinary();\n\t\t\t} else if (!newData.length && this.displayMode === 'binary') {\n\t\t\t\tthis.onDisplayModeChange('table');\n\t\t\t}\n\t\t},\n\t\tcurrentOutputIndex(branchIndex: number) {\n\t\t\tthis.ndvStore.setNDVBranchIndex({\n\t\t\t\tpane: this.paneType as 'input' | 'output',\n\t\t\t\tbranchIndex,\n\t\t\t});\n\t\t},\n\t\tsearch(newSearch: string) {\n\t\t\tthis.$emit('search', newSearch);\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.init();\n\n\t\tif (!this.isPaneTypeInput) {\n\t\t\tthis.showPinDataDiscoveryTooltip(this.jsonData);\n\t\t}\n\t\tthis.ndvStore.setNDVBranchIndex({\n\t\t\tpane: this.paneType as 'input' | 'output',\n\t\t\tbranchIndex: this.currentOutputIndex,\n\t\t});\n\n\t\tif (this.paneType === 'output') {\n\t\t\tthis.setDisplayMode();\n\t\t\tthis.activatePane();\n\t\t}\n\n\t\tif (this.hasRunError) {\n\t\t\tconst error = this.workflowRunData?.[this.node.name]?.[this.runIndex]?.error;\n\t\t\tconst errorsToTrack = ['unknown error'];\n\n\t\t\tif (error && errorsToTrack.some((e) => error.message.toLowerCase().includes(e))) {\n\t\t\t\tthis.$telemetry.track(\n\t\t\t\t\t`User encountered an error: \"${error.message}\"`,\n\t\t\t\t\t{\n\t\t\t\t\t\tnode: this.node.type,\n\t\t\t\t\t\terrorMessage: error.message,\n\t\t\t\t\t\tnodeVersion: this.node.typeVersion,\n\t\t\t\t\t\tn8nVersion: this.rootStore.versionCli,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\twithPostHog: true,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t},\n\tbeforeUnmount() {\n\t\tthis.hidePinDataDiscoveryTooltip();\n\t},\n\tmethods: {\n\t\tgetResolvedNodeOutputs() {\n\t\t\tif (this.node && this.nodeType) {\n\t\t\t\tconst workflow = this.workflowsStore.getCurrentWorkflow();\n\t\t\t\tconst workflowNode = workflow.getNode(this.node.name);\n\n\t\t\t\tif (workflowNode) {\n\t\t\t\t\tconst outputs = NodeHelpers.getNodeOutputs(workflow, workflowNode, this.nodeType);\n\t\t\t\t\treturn outputs;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn [];\n\t\t},\n\t\tshouldHintBeDisplayed(hint: NodeHint): boolean {\n\t\t\tconst { location, whenToDisplay } = hint;\n\n\t\t\tif (location) {\n\t\t\t\tif (location === 'ndv' && !['input', 'output'].includes(this.paneType)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (location === 'inputPane' && this.paneType !== 'input') {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif (location === 'outputPane' && this.paneType !== 'output') {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (whenToDisplay === 'afterExecution' && !this.hasNodeRun) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (whenToDisplay === 'beforeExecution' && this.hasNodeRun) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\t\tgetNodeHints(): NodeHint[] {\n\t\t\tif (this.node && this.nodeType) {\n\t\t\t\tconst workflow = this.workflowsStore.getCurrentWorkflow();\n\t\t\t\tconst workflowNode = workflow.getNode(this.node.name);\n\n\t\t\t\tif (workflowNode) {\n\t\t\t\t\tconst executionHints = this.executionHints;\n\t\t\t\t\tconst nodeHints = NodeHelpers.getNodeHints(workflow, workflowNode, this.nodeType, {\n\t\t\t\t\t\trunExecutionData: this.workflowExecution?.data ?? null,\n\t\t\t\t\t\trunIndex: this.runIndex,\n\t\t\t\t\t\tconnectionInputData: this.parentNodeOutputData,\n\t\t\t\t\t});\n\n\t\t\t\t\treturn executionHints.concat(nodeHints).filter(this.shouldHintBeDisplayed);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn [];\n\t\t},\n\t\tonItemHover(itemIndex: number | null) {\n\t\t\tif (itemIndex === null) {\n\t\t\t\tthis.$emit('itemHover', null);\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.$emit('itemHover', {\n\t\t\t\toutputIndex: this.currentOutputIndex,\n\t\t\t\titemIndex,\n\t\t\t});\n\t\t},\n\t\tonClickDataPinningDocsLink() {\n\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tpane: 'output',\n\t\t\t\ttype: 'data-pinning-docs',\n\t\t\t});\n\t\t},\n\t\tshowPinDataDiscoveryTooltip(value: IDataObject[]) {\n\t\t\tif (!this.isTriggerNode) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst pinDataDiscoveryFlag = useStorage(LOCAL_STORAGE_PIN_DATA_DISCOVERY_NDV_FLAG).value;\n\n\t\t\tif (value && value.length > 0 && !this.isReadOnlyRoute && !pinDataDiscoveryFlag) {\n\t\t\t\tthis.pinDataDiscoveryComplete();\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.isControlledPinDataTooltip = true;\n\t\t\t\t\tthis.pinDataDiscoveryTooltipVisible = true;\n\t\t\t\t\tdataPinningEventBus.emit('data-pinning-discovery', { isTooltipVisible: true });\n\t\t\t\t}, 500); // Wait for NDV to open\n\t\t\t}\n\t\t},\n\t\thidePinDataDiscoveryTooltip() {\n\t\t\tif (this.pinDataDiscoveryTooltipVisible) {\n\t\t\t\tthis.isControlledPinDataTooltip = false;\n\t\t\t\tthis.pinDataDiscoveryTooltipVisible = false;\n\t\t\t\tdataPinningEventBus.emit('data-pinning-discovery', { isTooltipVisible: false });\n\t\t\t}\n\t\t},\n\t\tpinDataDiscoveryComplete() {\n\t\t\tuseStorage(LOCAL_STORAGE_PIN_DATA_DISCOVERY_NDV_FLAG).value = 'true';\n\t\t\tuseStorage(LOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG).value = 'true';\n\t\t},\n\t\tenterEditMode({ origin }: EnterEditModeArgs) {\n\t\t\tconst inputData = this.pinnedData.data.value\n\t\t\t\t? clearJsonKey(this.pinnedData.data.value)\n\t\t\t\t: executionDataToJson(this.rawInputData);\n\n\t\t\tconst inputDataLength = Array.isArray(inputData)\n\t\t\t\t? inputData.length\n\t\t\t\t: Object.keys(inputData ?? {}).length;\n\n\t\t\tconst data = inputDataLength > 0 ? inputData : TEST_PIN_DATA;\n\n\t\t\tthis.ndvStore.setOutputPanelEditModeEnabled(true);\n\t\t\tthis.ndvStore.setOutputPanelEditModeValue(JSON.stringify(data, null, 2));\n\n\t\t\tthis.$telemetry.track('User opened ndv edit state', {\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tclick_type: origin === 'editIconButton' ? 'button' : 'link',\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\trun_index: this.runIndex,\n\t\t\t\tis_output_present: this.hasNodeRun || this.pinnedData.hasData.value,\n\t\t\t\tview: !this.hasNodeRun && !this.pinnedData.hasData.value ? 'undefined' : this.displayMode,\n\t\t\t\tis_data_pinned: this.pinnedData.hasData.value,\n\t\t\t});\n\t\t},\n\t\tonClickCancelEdit() {\n\t\t\tthis.ndvStore.setOutputPanelEditModeEnabled(false);\n\t\t\tthis.ndvStore.setOutputPanelEditModeValue('');\n\t\t\tthis.onExitEditMode({ type: 'cancel' });\n\t\t},\n\t\tonClickSaveEdit() {\n\t\t\tif (!this.node) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst { value } = this.editMode;\n\n\t\t\tthis.clearAllStickyNotifications();\n\n\t\t\ttry {\n\t\t\t\tthis.pinnedData.setData(clearJsonKey(value) as INodeExecutionData[], 'save-edit');\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(error);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.ndvStore.setOutputPanelEditModeEnabled(false);\n\n\t\t\tthis.onExitEditMode({ type: 'save' });\n\t\t},\n\t\tonExitEditMode({ type }: { type: 'save' | 'cancel' }) {\n\t\t\tthis.$telemetry.track('User closed ndv edit state', {\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\trun_index: this.runIndex,\n\t\t\t\tview: this.displayMode,\n\t\t\t\ttype,\n\t\t\t});\n\t\t},\n\t\tasync onTogglePinData({ source }: { source: PinDataSource | UnpinDataSource }) {\n\t\t\tif (!this.node) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (source === 'pin-icon-click') {\n\t\t\t\tconst telemetryPayload = {\n\t\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\t\trun_index: this.runIndex,\n\t\t\t\t\tview: !this.hasNodeRun && !this.pinnedData.hasData.value ? 'none' : this.displayMode,\n\t\t\t\t};\n\n\t\t\t\tvoid this.externalHooks.run('runData.onTogglePinData', telemetryPayload);\n\t\t\t\tthis.$telemetry.track('User clicked pin data icon', telemetryPayload);\n\t\t\t}\n\n\t\t\tthis.nodeHelpers.updateNodeParameterIssues(this.node);\n\n\t\t\tif (this.pinnedData.hasData.value) {\n\t\t\t\tthis.pinnedData.unsetData(source);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tthis.pinnedData.setData(this.rawInputData, 'pin-icon-click');\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(error);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.maxRunIndex > 0) {\n\t\t\t\tthis.showToast({\n\t\t\t\t\ttitle: this.$locale.baseText('ndv.pinData.pin.multipleRuns.title', {\n\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\tindex: `${this.runIndex}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\tmessage: this.$locale.baseText('ndv.pinData.pin.multipleRuns.description'),\n\t\t\t\t\ttype: 'success',\n\t\t\t\t\tduration: 2000,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.hidePinDataDiscoveryTooltip();\n\t\t\tthis.pinDataDiscoveryComplete();\n\t\t},\n\t\tswitchToBinary() {\n\t\t\tthis.onDisplayModeChange('binary');\n\t\t},\n\t\tonBranchChange(value: number) {\n\t\t\tthis.outputIndex = value;\n\n\t\t\tthis.$telemetry.track('User changed ndv branch', {\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tbranch_index: value,\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tnode_type_input_selection: this.nodeType ? this.nodeType.name : '',\n\t\t\t\tpane: this.paneType,\n\t\t\t});\n\t\t},\n\t\tshowTooMuchData() {\n\t\t\tthis.showData = true;\n\t\t\tthis.$telemetry.track('User clicked ndv button', {\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tpane: this.paneType,\n\t\t\t\ttype: 'showTooMuchData',\n\t\t\t});\n\t\t},\n\t\ttoggleLinkRuns() {\n\t\t\tthis.linkedRuns ? this.unlinkRun() : this.linkRun();\n\t\t},\n\t\tlinkRun() {\n\t\t\tthis.$emit('linkRun');\n\t\t},\n\t\tunlinkRun() {\n\t\t\tthis.$emit('unlinkRun');\n\t\t},\n\t\tonCurrentPageChange(value: number) {\n\t\t\tthis.currentPage = value;\n\t\t\tthis.$telemetry.track('User changed ndv page', {\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tpane: this.paneType,\n\t\t\t\tpage_selected: this.currentPage,\n\t\t\t\tpage_size: this.pageSize,\n\t\t\t\titems_total: this.dataCount,\n\t\t\t});\n\t\t},\n\t\tonPageSizeChange(pageSize: number) {\n\t\t\tthis.pageSize = pageSize;\n\t\t\tconst maxPage = Math.ceil(this.dataCount / this.pageSize);\n\t\t\tif (maxPage < this.currentPage) {\n\t\t\t\tthis.currentPage = maxPage;\n\t\t\t}\n\n\t\t\tthis.$telemetry.track('User changed ndv page size', {\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tpane: this.paneType,\n\t\t\t\tpage_selected: this.currentPage,\n\t\t\t\tpage_size: this.pageSize,\n\t\t\t\titems_total: this.dataCount,\n\t\t\t});\n\t\t},\n\t\tonDisplayModeChange(displayMode: IRunDataDisplayMode) {\n\t\t\tconst previous = this.displayMode;\n\t\t\tthis.ndvStore.setPanelDisplayMode({ pane: this.paneType, mode: displayMode });\n\n\t\t\tconst dataContainerRef = this.$refs.dataContainer as Element | undefined;\n\t\t\tif (dataContainerRef) {\n\t\t\t\tconst dataDisplay = dataContainerRef.children[0];\n\n\t\t\t\tif (dataDisplay) {\n\t\t\t\t\tdataDisplay.scrollTo(0, 0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.closeBinaryDataDisplay();\n\t\t\tvoid this.externalHooks.run('runData.displayModeChanged', {\n\t\t\t\tnewValue: displayMode,\n\t\t\t\toldValue: previous,\n\t\t\t});\n\t\t\tif (this.activeNode) {\n\t\t\t\tthis.$telemetry.track('User changed ndv item view', {\n\t\t\t\t\tprevious_view: previous,\n\t\t\t\t\tnew_view: displayMode,\n\t\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\t\tpane: this.paneType,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tgetRunLabel(option: number) {\n\t\t\tlet itemsCount = 0;\n\t\t\tfor (let i = 0; i <= this.maxOutputIndex; i++) {\n\t\t\t\titemsCount += this.getPinDataOrLiveData(this.getRawInputData(option - 1, i)).length;\n\t\t\t}\n\t\t\tconst items = this.$locale.baseText('ndv.output.items', {\n\t\t\t\tadjustToNumber: itemsCount,\n\t\t\t\tinterpolate: { count: itemsCount },\n\t\t\t});\n\t\t\tconst itemsLabel = itemsCount > 0 ? ` (${items})` : '';\n\t\t\treturn option + this.$locale.baseText('ndv.output.of') + (this.maxRunIndex + 1) + itemsLabel;\n\t\t},\n\t\tgetRawInputData(\n\t\t\trunIndex: number,\n\t\t\toutputIndex: number,\n\t\t\tconnectionType: ConnectionTypes = NodeConnectionType.Main,\n\t\t): INodeExecutionData[] {\n\t\t\tlet inputData: INodeExecutionData[] = [];\n\n\t\t\tif (this.node) {\n\t\t\t\tinputData = this.nodeHelpers.getNodeInputData(\n\t\t\t\t\tthis.node,\n\t\t\t\t\trunIndex,\n\t\t\t\t\toutputIndex,\n\t\t\t\t\tthis.paneType,\n\t\t\t\t\tconnectionType,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (inputData.length === 0 || !Array.isArray(inputData)) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn inputData;\n\t\t},\n\t\tgetPinDataOrLiveData(inputData: INodeExecutionData[]): INodeExecutionData[] {\n\t\t\tif (this.pinnedData.data.value && !this.isProductionExecutionPreview) {\n\t\t\t\treturn Array.isArray(this.pinnedData.data.value)\n\t\t\t\t\t? this.pinnedData.data.value.map((value) => ({\n\t\t\t\t\t\t\tjson: value,\n\t\t\t\t\t\t}))\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tjson: this.pinnedData.data.value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t];\n\t\t\t}\n\t\t\treturn inputData;\n\t\t},\n\t\tgetFilteredData(inputData: INodeExecutionData[]): INodeExecutionData[] {\n\t\t\tif (!this.search) {\n\t\t\t\treturn inputData;\n\t\t\t}\n\n\t\t\tthis.currentPage = 1;\n\t\t\treturn inputData.filter(({ json }) => searchInObject(json, this.search));\n\t\t},\n\t\tgetDataCount(\n\t\t\trunIndex: number,\n\t\t\toutputIndex: number,\n\t\t\tconnectionType: ConnectionTypes = NodeConnectionType.Main,\n\t\t) {\n\t\t\tif (!this.node) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (this.workflowRunData?.[this.node.name]?.[runIndex]?.hasOwnProperty('error')) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tconst rawInputData = this.getRawInputData(runIndex, outputIndex, connectionType);\n\t\t\tconst pinOrLiveData = this.getPinDataOrLiveData(rawInputData);\n\t\t\treturn this.getFilteredData(pinOrLiveData).length;\n\t\t},\n\t\tinit() {\n\t\t\t// Reset the selected output index every time another node gets selected\n\t\t\tthis.outputIndex = 0;\n\t\t\tthis.refreshDataSize();\n\t\t\tthis.closeBinaryDataDisplay();\n\t\t\tlet outputTypes: ConnectionTypes[] = [];\n\t\t\tif (this.nodeType !== null && this.node !== null) {\n\t\t\t\tconst outputs = this.getResolvedNodeOutputs();\n\t\t\t\toutputTypes = NodeHelpers.getConnectionTypes(outputs);\n\t\t\t}\n\t\t\tthis.connectionType = outputTypes.length === 0 ? NodeConnectionType.Main : outputTypes[0];\n\t\t\tif (this.binaryData.length > 0) {\n\t\t\t\tthis.ndvStore.setPanelDisplayMode({\n\t\t\t\t\tpane: this.paneType as 'input' | 'output',\n\t\t\t\t\tmode: 'binary',\n\t\t\t\t});\n\t\t\t} else if (this.displayMode === 'binary') {\n\t\t\t\tthis.ndvStore.setPanelDisplayMode({\n\t\t\t\t\tpane: this.paneType as 'input' | 'output',\n\t\t\t\t\tmode: 'table',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tcloseBinaryDataDisplay() {\n\t\t\tthis.binaryDataDisplayVisible = false;\n\t\t\tthis.binaryDataDisplayData = null;\n\t\t},\n\t\tclearExecutionData() {\n\t\t\tthis.workflowsStore.setWorkflowExecutionData(null);\n\t\t\tthis.nodeHelpers.updateNodesExecutionIssues();\n\t\t},\n\t\tisViewable(index: number, key: string | number): boolean {\n\t\t\tconst { fileType } = this.binaryData[index][key];\n\t\t\treturn (\n\t\t\t\t!!fileType && ['image', 'audio', 'video', 'text', 'json', 'pdf', 'html'].includes(fileType)\n\t\t\t);\n\t\t},\n\t\tisDownloadable(index: number, key: string | number): boolean {\n\t\t\tconst { mimeType, fileName } = this.binaryData[index][key];\n\t\t\treturn !!(mimeType && fileName);\n\t\t},\n\t\tasync downloadBinaryData(index: number, key: string | number) {\n\t\t\tconst { id, data, fileName, fileExtension, mimeType } = this.binaryData[index][key];\n\n\t\t\tif (id) {\n\t\t\t\tconst url = this.workflowsStore.getBinaryUrl(id, 'download', fileName ?? '', mimeType);\n\t\t\t\tsaveAs(url, [fileName, fileExtension].join('.'));\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\tconst bufferString = 'data:' + mimeType + ';base64,' + data;\n\t\t\t\tconst blob = await fetch(bufferString).then(async (d) => await d.blob());\n\t\t\t\tsaveAs(blob, fileName);\n\t\t\t}\n\t\t},\n\t\tasync downloadJsonData() {\n\t\t\tconst fileName = this.node.name.replace(/[^\\w\\d]/g, '_');\n\t\t\tconst blob = new Blob([JSON.stringify(this.rawInputData, null, 2)], {\n\t\t\t\ttype: 'application/json',\n\t\t\t});\n\n\t\t\tsaveAs(blob, `${fileName}.json`);\n\t\t},\n\t\tdisplayBinaryData(index: number, key: string | number) {\n\t\t\tconst { data, mimeType } = this.binaryData[index][key];\n\t\t\tthis.binaryDataDisplayVisible = true;\n\n\t\t\tthis.binaryDataDisplayData = {\n\t\t\t\tnode: this.node.name,\n\t\t\t\trunIndex: this.runIndex,\n\t\t\t\toutputIndex: this.currentOutputIndex,\n\t\t\t\tindex,\n\t\t\t\tkey,\n\t\t\t\tdata,\n\t\t\t\tmimeType,\n\t\t\t};\n\t\t},\n\t\tgetOutputName(outputIndex: number) {\n\t\t\tif (this.node === null) {\n\t\t\t\treturn outputIndex + 1;\n\t\t\t}\n\n\t\t\tconst nodeType = this.nodeType;\n\t\t\tconst outputs = this.getResolvedNodeOutputs();\n\t\t\tconst outputConfiguration = outputs?.[outputIndex] as INodeOutputConfiguration;\n\n\t\t\tif (outputConfiguration && isObject(outputConfiguration)) {\n\t\t\t\treturn outputConfiguration?.displayName;\n\t\t\t}\n\t\t\tif (!nodeType?.outputNames || nodeType.outputNames.length <= outputIndex) {\n\t\t\t\treturn outputIndex + 1;\n\t\t\t}\n\n\t\t\treturn nodeType.outputNames[outputIndex];\n\t\t},\n\t\trefreshDataSize() {\n\t\t\t// Hide by default the data from being displayed\n\t\t\tthis.showData = false;\n\t\t\tconst jsonItems = this.inputDataPage.map((item) => item.json);\n\t\t\tthis.dataSize = JSON.stringify(jsonItems).length;\n\t\t\tif (this.dataSize < this.MAX_DISPLAY_DATA_SIZE) {\n\t\t\t\t// Data is reasonable small (< 200kb) so display it directly\n\t\t\t\tthis.showData = true;\n\t\t\t}\n\t\t},\n\t\tonRunIndexChange(run: number) {\n\t\t\tthis.$emit('runChange', run);\n\t\t},\n\t\tenableNode() {\n\t\t\tif (this.node) {\n\t\t\t\tconst updateInformation = {\n\t\t\t\t\tname: this.node.name,\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tdisabled: !this.node.disabled,\n\t\t\t\t\t} as IDataObject,\n\t\t\t\t} as INodeUpdatePropertiesInformation;\n\n\t\t\t\tthis.workflowsStore.updateNodeProperties(updateInformation);\n\t\t\t}\n\t\t},\n\t\tsetDisplayMode() {\n\t\t\tif (!this.activeNode) return;\n\n\t\t\tconst shouldDisplayHtml =\n\t\t\t\tthis.activeNode.type === HTML_NODE_TYPE &&\n\t\t\t\tthis.activeNode.parameters.operation === 'generateHtmlTemplate';\n\n\t\t\tif (shouldDisplayHtml) {\n\t\t\t\tthis.ndvStore.setPanelDisplayMode({\n\t\t\t\t\tpane: 'output',\n\t\t\t\t\tmode: 'html',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tactivatePane() {\n\t\t\tthis.$emit('activatePane');\n\t\t},\n\t\tonSearchClear() {\n\t\t\tthis.search = '';\n\t\t\tdocument.dispatchEvent(new KeyboardEvent('keyup', { key: '/' }));\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.infoIcon {\n\tcolor: var(--color-foreground-dark);\n}\n\n.center {\n\tdisplay: flex;\n\theight: 100%;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: var(--spacing-s) var(--spacing-s) var(--spacing-xl) var(--spacing-s);\n\ttext-align: center;\n\n\t> * {\n\t\tmax-width: 316px;\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n}\n\n.container {\n\tposition: relative;\n\twidth: 100%;\n\theight: 100%;\n\tbackground-color: var(--color-run-data-background);\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n.pinnedDataCallout {\n\tborder-radius: inherit;\n\tborder-bottom-right-radius: 0;\n\tborder-top: 0;\n\tborder-left: 0;\n\tborder-right: 0;\n}\n\n.header {\n\tdisplay: flex;\n\talign-items: center;\n\tmargin-bottom: var(--spacing-s);\n\tpadding: var(--spacing-s) var(--spacing-s) 0 var(--spacing-s);\n\tposition: relative;\n\toverflow-x: auto;\n\toverflow-y: hidden;\n\tmin-height: calc(30px + var(--spacing-s));\n\n\t> *:first-child {\n\t\tflex-grow: 1;\n\t}\n}\n\n.dataContainer {\n\tposition: relative;\n\toverflow-y: auto;\n\theight: 100%;\n\n\t&:hover {\n\t\t.actions-group {\n\t\t\topacity: 1;\n\t\t}\n\t}\n}\n\n.dataDisplay {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tpadding: 0 var(--spacing-s) var(--spacing-3xl) var(--spacing-s);\n\tright: 0;\n\toverflow-y: auto;\n\tline-height: var(--font-line-height-xloose);\n\tword-break: normal;\n\theight: 100%;\n}\n\n.tabs {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n\tmargin-bottom: var(--spacing-s);\n}\n\n.itemsCount {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n\tmargin-left: var(--spacing-s);\n\tmargin-bottom: var(--spacing-s);\n}\n\n.runSelector {\n\tpadding-left: var(--spacing-s);\n\tpadding-bottom: var(--spacing-s);\n\tdisplay: flex;\n\twidth: 100%;\n\talign-items: center;\n\tjustify-content: space-between;\n}\n\n.runSelectorWrapper {\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.pagination {\n\twidth: 100%;\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tbottom: 0;\n\tpadding: 5px;\n\toverflow-y: hidden;\n}\n\n.pageSizeSelector {\n\ttext-transform: capitalize;\n\tmax-width: 150px;\n\tflex: 0 1 auto;\n}\n\n.binaryIndex {\n\tdisplay: block;\n\tpadding: var(--spacing-2xs);\n\tfont-size: var(--font-size-2xs);\n\n\t> * {\n\t\tdisplay: inline-block;\n\t\twidth: 30px;\n\t\theight: 30px;\n\t\tline-height: 30px;\n\t\tborder-radius: var(--border-radius-base);\n\t\ttext-align: center;\n\t\tbackground-color: var(--color-foreground-xdark);\n\t\tfont-weight: var(--font-weight-bold);\n\t\tcolor: var(--color-text-xlight);\n\t}\n}\n\n.binaryRow {\n\tdisplay: inline-flex;\n\tfont-size: var(--font-size-2xs);\n}\n\n.binaryCell {\n\tdisplay: inline-block;\n\twidth: 300px;\n\toverflow: hidden;\n\tbackground-color: var(--color-foreground-xlight);\n\tmargin-right: var(--spacing-s);\n\tmargin-bottom: var(--spacing-s);\n\tborder-radius: var(--border-radius-base);\n\tborder: var(--border-base);\n\tpadding: var(--spacing-s);\n}\n\n.binaryHeader {\n\tcolor: $color-primary;\n\tfont-weight: var(--font-weight-bold);\n\tfont-size: 1.2em;\n\tpadding-bottom: var(--spacing-2xs);\n\tmargin-bottom: var(--spacing-2xs);\n\tborder-bottom: 1px solid var(--color-text-light);\n}\n\n.binaryButtonContainer {\n\tmargin-top: 1.5em;\n\tdisplay: flex;\n\tflex-direction: row;\n\tjustify-content: center;\n\n\t> * {\n\t\tflex-grow: 0;\n\t\tmargin-right: var(--spacing-3xs);\n\t}\n}\n\n.binaryValue {\n\twhite-space: initial;\n\tword-wrap: break-word;\n}\n\n.displayModes {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n\tflex-grow: 1;\n}\n.tooltipContain {\n\tmax-width: 240px;\n}\n\n.spinner {\n\t* {\n\t\tcolor: var(--color-primary);\n\t\tmin-height: 40px;\n\t\tmin-width: 40px;\n\t}\n\n\tdisplay: flex;\n\tjustify-content: center;\n\tmargin-bottom: var(--spacing-s);\n}\n\n.editMode {\n\theight: 100%;\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: stretch;\n\tpadding-left: var(--spacing-s);\n\tpadding-right: var(--spacing-s);\n}\n\n.editModeBody {\n\tflex: 1 1 auto;\n\tmax-height: 100%;\n\twidth: 100%;\n\toverflow: auto;\n}\n\n.editModeFooter {\n\tflex: 0 1 auto;\n\tdisplay: flex;\n\twidth: 100%;\n\tjustify-content: space-between;\n\talign-items: center;\n\tpadding-top: var(--spacing-s);\n\tpadding-bottom: var(--spacing-s);\n}\n\n.editModeFooterInfotip {\n\tdisplay: flex;\n\tflex: 1;\n\twidth: 100%;\n}\n\n.editModeActions {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n\talign-items: center;\n\tmargin-left: var(--spacing-s);\n}\n\n.stretchVertically {\n\theight: 100%;\n}\n\n.uiBlocker {\n\tborder-top-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n}\n\n.hintCallout {\n\tmargin-bottom: var(--spacing-xs);\n\tmargin-left: var(--spacing-s);\n\tmargin-right: var(--spacing-s);\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.run-data {\n\t.code-node-editor {\n\t\theight: 100%;\n\t}\n}\n</style>\n\n<style lang=\"scss\" scoped>\n:deep(.highlight) {\n\tbackground-color: #f7dc55;\n\tcolor: black;\n\tborder-radius: var(--border-radius-base);\n\tpadding: 0 1px;\n\tfont-weight: normal;\n\tfont-style: normal;\n}\n</style>\n","<template>\n\t<n8n-info-tip\n\t\tv-if=\"hasStaleData\"\n\t\ttheme=\"warning\"\n\t\ttype=\"tooltip\"\n\t\ttooltip-placement=\"right\"\n\t\tdata-test-id=\"node-run-info-stale\"\n\t>\n\t\t<span\n\t\t\tv-html=\"\n\t\t\t\t$locale.baseText(\n\t\t\t\t\thasPinData\n\t\t\t\t\t\t? 'ndv.output.staleDataWarning.pinData'\n\t\t\t\t\t\t: 'ndv.output.staleDataWarning.regular',\n\t\t\t\t)\n\t\t\t\"\n\t\t></span>\n\t</n8n-info-tip>\n\t<n8n-info-tip\n\t\tv-else-if=\"runMetadata\"\n\t\ttype=\"tooltip\"\n\t\t:theme=\"theme\"\n\t\t:data-test-id=\"`node-run-info-${theme}`\"\n\t\ttooltip-placement=\"right\"\n\t>\n\t\t<div>\n\t\t\t<n8n-text :bold=\"true\" size=\"small\"\n\t\t\t\t>{{\n\t\t\t\t\trunTaskData.error\n\t\t\t\t\t\t? $locale.baseText('runData.executionStatus.failed')\n\t\t\t\t\t\t: $locale.baseText('runData.executionStatus.success')\n\t\t\t\t}} </n8n-text\n\t\t\t><br />\n\t\t\t<n8n-text :bold=\"true\" size=\"small\">{{\n\t\t\t\t$locale.baseText('runData.startTime') + ':'\n\t\t\t}}</n8n-text>\n\t\t\t{{ runMetadata.startTime }}<br />\n\t\t\t<n8n-text :bold=\"true\" size=\"small\">{{\n\t\t\t\t$locale.baseText('runData.executionTime') + ':'\n\t\t\t}}</n8n-text>\n\t\t\t{{ runMetadata.executionTime }} {{ $locale.baseText('runData.ms') }}\n\t\t</div>\n\t</n8n-info-tip>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { ITaskData } from 'n8n-workflow';\nimport { convertToDisplayDateComponents } from '@/utils/formatters/dateFormatter';\n\nexport default defineComponent({\n\tprops: {\n\t\ttaskData: {}, // ITaskData\n\t\thasStaleData: Boolean,\n\t\thasPinData: Boolean,\n\t},\n\n\tcomputed: {\n\t\ttheme(): string {\n\t\t\treturn this.runTaskData?.error ? 'danger' : 'success';\n\t\t},\n\t\trunTaskData(): ITaskData {\n\t\t\treturn this.taskData as ITaskData;\n\t\t},\n\t\trunMetadata(): { executionTime: number; startTime: string } | null {\n\t\t\tif (!this.runTaskData) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst { date, time } = convertToDisplayDateComponents(this.runTaskData.startTime);\n\t\t\treturn {\n\t\t\t\texecutionTime: this.runTaskData.executionTime,\n\t\t\t\tstartTime: `${date} at ${time}`,\n\t\t\t};\n\t\t},\n\t},\n});\n</script>\n","<template>\n\t<RunData\n\t\tv-if=\"node\"\n\t\tref=\"runData\"\n\t\t:node=\"node\"\n\t\t:run-index=\"runIndex\"\n\t\t:linked-runs=\"linkedRuns\"\n\t\t:can-link-runs=\"canLinkRuns\"\n\t\t:too-much-data-title=\"$locale.baseText('ndv.output.tooMuchData.title')\"\n\t\t:no-data-in-branch-message=\"$locale.baseText('ndv.output.noOutputDataInBranch')\"\n\t\t:is-executing=\"isNodeRunning\"\n\t\t:executing-message=\"$locale.baseText('ndv.output.executing')\"\n\t\t:push-ref=\"pushRef\"\n\t\t:block-u-i=\"blockUI\"\n\t\t:is-production-execution-preview=\"isProductionExecutionPreview\"\n\t\t:is-pane-active=\"isPaneActive\"\n\t\tpane-type=\"output\"\n\t\t:data-output-type=\"outputMode\"\n\t\t@activate-pane=\"activatePane\"\n\t\t@run-change=\"onRunIndexChange\"\n\t\t@link-run=\"onLinkRun\"\n\t\t@unlink-run=\"onUnlinkRun\"\n\t\t@table-mounted=\"$emit('tableMounted', $event)\"\n\t\t@item-hover=\"$emit('itemHover', $event)\"\n\t\t@search=\"$emit('search', $event)\"\n\t>\n\t\t<template #header>\n\t\t\t<div :class=\"$style.titleSection\">\n\t\t\t\t<template v-if=\"hasAiMetadata\">\n\t\t\t\t\t<n8n-radio-buttons\n\t\t\t\t\t\tv-model=\"outputMode\"\n\t\t\t\t\t\t:options=\"outputTypes\"\n\t\t\t\t\t\t@update:model-value=\"onUpdateOutputMode\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t\t<span v-else :class=\"$style.title\">\n\t\t\t\t\t{{ $locale.baseText(outputPanelEditMode.enabled ? 'ndv.output.edit' : 'ndv.output') }}\n\t\t\t\t</span>\n\t\t\t\t<RunInfo\n\t\t\t\t\tv-if=\"hasNodeRun && !pinnedData.hasData.value && runsCount === 1\"\n\t\t\t\t\tv-show=\"!outputPanelEditMode.enabled\"\n\t\t\t\t\t:task-data=\"runTaskData\"\n\t\t\t\t\t:has-stale-data=\"staleData\"\n\t\t\t\t\t:has-pin-data=\"pinnedData.hasData.value\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template #node-not-run>\n\t\t\t<n8n-text v-if=\"workflowRunning && !isTriggerNode\" data-test-id=\"ndv-output-waiting\">{{\n\t\t\t\t$locale.baseText('ndv.output.waitingToRun')\n\t\t\t}}</n8n-text>\n\t\t\t<n8n-text v-if=\"!workflowRunning\" data-test-id=\"ndv-output-run-node-hint\">\n\t\t\t\t<template v-if=\"isSubNodeType\">\n\t\t\t\t\t{{ $locale.baseText('ndv.output.runNodeHintSubNode') }}\n\t\t\t\t</template>\n\t\t\t\t<template v-else>\n\t\t\t\t\t{{ $locale.baseText('ndv.output.runNodeHint') }}\n\t\t\t\t\t<span v-if=\"canPinData\" @click=\"insertTestData\">\n\t\t\t\t\t\t<br />\n\t\t\t\t\t\t{{ $locale.baseText('generic.or') }}\n\t\t\t\t\t\t<n8n-text tag=\"a\" size=\"medium\" color=\"primary\">\n\t\t\t\t\t\t\t{{ $locale.baseText('ndv.output.insertTestData') }}\n\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t</span>\n\t\t\t\t</template>\n\t\t\t</n8n-text>\n\t\t</template>\n\n\t\t<template #no-output-data>\n\t\t\t<n8n-text :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t$locale.baseText('ndv.output.noOutputData.title')\n\t\t\t}}</n8n-text>\n\t\t\t<n8n-text>\n\t\t\t\t{{ $locale.baseText('ndv.output.noOutputData.message') }}\n\t\t\t\t<a @click=\"openSettings\">{{\n\t\t\t\t\t$locale.baseText('ndv.output.noOutputData.message.settings')\n\t\t\t\t}}</a>\n\t\t\t\t{{ $locale.baseText('ndv.output.noOutputData.message.settingsOption') }}\n\t\t\t</n8n-text>\n\t\t</template>\n\n\t\t<template v-if=\"outputMode === 'logs' && node\" #content>\n\t\t\t<RunDataAi :node=\"node\" :run-index=\"runIndex\" />\n\t\t</template>\n\t\t<template #recovered-artificial-output-data>\n\t\t\t<div :class=\"$style.recoveredOutputData\">\n\t\t\t\t<n8n-text tag=\"div\" :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t\t$locale.baseText('executionDetails.executionFailed.recoveredNodeTitle')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-text>\n\t\t\t\t\t{{ $locale.baseText('executionDetails.executionFailed.recoveredNodeMessage') }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template v-if=\"!pinnedData.hasData.value && runsCount > 1\" #run-info>\n\t\t\t<RunInfo :task-data=\"runTaskData\" />\n\t\t</template>\n\t</RunData>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { IExecutionResponse, INodeUi } from '@/Interface';\nimport type { INodeTypeDescription, IRunData, IRunExecutionData, ITaskData } from 'n8n-workflow';\nimport RunData from './RunData.vue';\nimport RunInfo from './RunInfo.vue';\nimport { mapStores, storeToRefs } from 'pinia';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport RunDataAi from './RunDataAi/RunDataAi.vue';\nimport { ndvEventBus } from '@/event-bus';\nimport { useNodeType } from '@/composables/useNodeType';\nimport { usePinnedData } from '@/composables/usePinnedData';\n\ntype RunDataRef = InstanceType<typeof RunData>;\n\nconst OUTPUT_TYPE = {\n\tREGULAR: 'regular',\n\tLOGS: 'logs',\n} as const;\n\ntype OutputTypeKey = keyof typeof OUTPUT_TYPE;\ntype OutputType = (typeof OUTPUT_TYPE)[OutputTypeKey];\n\nexport default defineComponent({\n\tname: 'OutputPanel',\n\tcomponents: { RunData, RunInfo, RunDataAi },\n\tprops: {\n\t\trunIndex: {\n\t\t\ttype: Number,\n\t\t\trequired: true,\n\t\t},\n\t\tisReadOnly: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tlinkedRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tcanLinkRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tpushRef: {\n\t\t\ttype: String,\n\t\t},\n\t\tblockUI: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisProductionExecutionPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisPaneActive: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tsetup(props) {\n\t\tconst ndvStore = useNDVStore();\n\t\tconst { activeNode } = storeToRefs(ndvStore);\n\t\tconst { isSubNodeType } = useNodeType({\n\t\t\tnode: activeNode,\n\t\t});\n\t\tconst pinnedData = usePinnedData(activeNode, {\n\t\t\trunIndex: props.runIndex,\n\t\t\tdisplayMode: ndvStore.getPanelDisplayMode('output'),\n\t\t});\n\n\t\treturn {\n\t\t\tpinnedData,\n\t\t\tisSubNodeType,\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\toutputMode: 'regular',\n\t\t\toutputTypes: [\n\t\t\t\t{ label: this.$locale.baseText('ndv.output.outType.regular'), value: OUTPUT_TYPE.REGULAR },\n\t\t\t\t{ label: this.$locale.baseText('ndv.output.outType.logs'), value: OUTPUT_TYPE.LOGS },\n\t\t\t],\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useUIStore, useWorkflowsStore),\n\t\tnode(): INodeUi | undefined {\n\t\t\treturn this.ndvStore.activeNode ?? undefined;\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.nodeTypesStore.getNodeType(this.node.type, this.node.typeVersion);\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\treturn !!this.node && this.nodeTypesStore.isTriggerNode(this.node.type);\n\t\t},\n\t\thasAiMetadata(): boolean {\n\t\t\tif (this.node) {\n\t\t\t\tconst resultData = this.workflowsStore.getWorkflowResultDataByNodeName(this.node.name);\n\n\t\t\t\tif (!resultData || !Array.isArray(resultData) || resultData.length === 0) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn !!resultData[resultData.length - 1].metadata;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tisPollingTypeNode(): boolean {\n\t\t\treturn !!this.nodeType?.polling;\n\t\t},\n\t\tisScheduleTrigger(): boolean {\n\t\t\treturn !!(this.nodeType && this.nodeType.group.includes('schedule'));\n\t\t},\n\t\tisNodeRunning(): boolean {\n\t\t\treturn !!this.node && this.workflowsStore.isNodeExecuting(this.node.name);\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tworkflowExecution(): IExecutionResponse | null {\n\t\t\treturn this.workflowsStore.getWorkflowExecution;\n\t\t},\n\t\tworkflowRunData(): IRunData | null {\n\t\t\tif (this.workflowExecution === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst executionData: IRunExecutionData | undefined = this.workflowExecution.data;\n\t\t\tif (!executionData?.resultData?.runData) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn executionData.resultData.runData;\n\t\t},\n\t\thasNodeRun(): boolean {\n\t\t\tif (this.workflowsStore.subWorkflowExecutionError) return true;\n\n\t\t\treturn Boolean(\n\t\t\t\tthis.node && this.workflowRunData && this.workflowRunData.hasOwnProperty(this.node.name),\n\t\t\t);\n\t\t},\n\t\trunTaskData(): ITaskData | null {\n\t\t\tif (!this.node || this.workflowExecution === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst runData = this.workflowRunData;\n\n\t\t\tif (runData === null || !runData.hasOwnProperty(this.node.name)) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (runData[this.node.name].length <= this.runIndex) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn runData[this.node.name][this.runIndex];\n\t\t},\n\t\trunsCount(): number {\n\t\t\tif (this.node === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst runData: IRunData | null = this.workflowRunData;\n\n\t\t\tif (runData === null || (this.node && !runData.hasOwnProperty(this.node.name))) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (this.node && runData[this.node.name].length) {\n\t\t\t\treturn runData[this.node.name].length;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t},\n\t\tstaleData(): boolean {\n\t\t\tif (!this.node) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst updatedAt = this.workflowsStore.getParametersLastUpdate(this.node.name);\n\t\t\tif (!updatedAt || !this.runTaskData) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst runAt = this.runTaskData.startTime;\n\t\t\treturn updatedAt > runAt;\n\t\t},\n\t\toutputPanelEditMode(): { enabled: boolean; value: string } {\n\t\t\treturn this.ndvStore.outputPanelEditMode;\n\t\t},\n\t\tcanPinData(): boolean {\n\t\t\treturn this.pinnedData.isValidNodeType.value && !this.isReadOnly;\n\t\t},\n\t},\n\tmethods: {\n\t\tinsertTestData() {\n\t\t\tconst runDataRef = this.$refs.runData as RunDataRef | undefined;\n\t\t\tif (runDataRef) {\n\t\t\t\trunDataRef.enterEditMode({\n\t\t\t\t\torigin: 'insertTestDataLink',\n\t\t\t\t});\n\n\t\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\t\tnode_type: this.node?.type,\n\t\t\t\t\tpane: 'output',\n\t\t\t\t\ttype: 'insert-test-data',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonLinkRun() {\n\t\t\tthis.$emit('linkRun');\n\t\t},\n\t\tonUnlinkRun() {\n\t\t\tthis.$emit('unlinkRun');\n\t\t},\n\t\topenSettings() {\n\t\t\tthis.$emit('openSettings');\n\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\tnode_type: this.node?.type,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tpane: 'output',\n\t\t\t\ttype: 'settings',\n\t\t\t});\n\t\t},\n\t\tonRunIndexChange(run: number) {\n\t\t\tthis.$emit('runChange', run);\n\t\t},\n\t\tonUpdateOutputMode(outputMode: OutputType) {\n\t\t\tif (outputMode === OUTPUT_TYPE.LOGS) {\n\t\t\t\tndvEventBus.emit('setPositionByName', 'minLeft');\n\t\t\t} else {\n\t\t\t\tndvEventBus.emit('setPositionByName', 'initial');\n\t\t\t}\n\t\t},\n\t\tactivatePane() {\n\t\t\tthis.$emit('activatePane');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n// The items count and displayModes are rendered in the RunData component\n// this is a workaround to hide it in the output panel(for ai type) to not add unnecessary one-time props\n:global([data-output-type='logs'] [class*='itemsCount']),\n:global([data-output-type='logs'] [class*='displayModes']) {\n\tdisplay: none;\n}\n.outputTypeSelect {\n\tmargin-bottom: var(--spacing-4xs);\n\twidth: fit-content;\n}\n.titleSection {\n\tdisplay: flex;\n\talign-items: center;\n\n\t> * {\n\t\tmargin-right: var(--spacing-2xs);\n\t}\n}\n\n.title {\n\ttext-transform: uppercase;\n\tcolor: var(--color-text-light);\n\tletter-spacing: 3px;\n\tfont-weight: var(--font-weight-bold);\n\tfont-size: var(--font-size-s);\n}\n\n.noOutputData {\n\tmax-width: 180px;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-m);\n\t}\n\n\t> * {\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n}\n\n.recoveredOutputData {\n\tmargin: auto;\n\tmax-width: 250px;\n\ttext-align: center;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-m);\n\t}\n}\n</style>\n","<template>\n\t<svg\n\t\twidth=\"112\"\n\t\theight=\"80\"\n\t\tviewBox=\"0 0 112 80\"\n\t\tfill=\"none\"\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\txmlns:xlink=\"http://www.w3.org/1999/xlink\"\n\t>\n\t\t<mask\n\t\t\tid=\"mask0_489_46042\"\n\t\t\tstyle=\"mask-type: alpha\"\n\t\t\tmaskUnits=\"userSpaceOnUse\"\n\t\t\tx=\"0\"\n\t\t\ty=\"0\"\n\t\t\twidth=\"112\"\n\t\t\theight=\"80\"\n\t\t>\n\t\t\t<rect width=\"112\" height=\"80\" fill=\"url(#paint0_linear_489_46042)\" />\n\t\t</mask>\n\t\t<g mask=\"url(#mask0_489_46042)\">\n\t\t\t<rect x=\"-0.5\" width=\"112\" height=\"80\" fill=\"url(#pattern0)\" fill-opacity=\"0.6\" />\n\t\t</g>\n\t\t<defs>\n\t\t\t<pattern id=\"pattern0\" patternContentUnits=\"objectBoundingBox\" width=\"1\" height=\"1\">\n\t\t\t\t<use xlink:href=\"#image0_489_46042\" transform=\"scale(0.00357143 0.005)\" />\n\t\t\t</pattern>\n\t\t\t<linearGradient\n\t\t\t\tid=\"paint0_linear_489_46042\"\n\t\t\t\tx1=\"90.5\"\n\t\t\t\ty1=\"40.4494\"\n\t\t\t\tx2=\"112.5\"\n\t\t\t\ty2=\"40.4494\"\n\t\t\t\tgradientUnits=\"userSpaceOnUse\"\n\t\t\t>\n\t\t\t\t<stop />\n\t\t\t\t<stop offset=\"1\" stop-color=\"white\" stop-opacity=\"0\" />\n\t\t\t</linearGradient>\n\t\t\t<image\n\t\t\t\tid=\"image0_489_46042\"\n\t\t\t\twidth=\"280\"\n\t\t\t\theight=\"200\"\n\t\t\t\txlink:href=\"data:image/png;base64,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\"\n\t\t\t/>\n\t\t</defs>\n\t</svg>\n</template>\n","<template>\n\t<RunData\n\t\tv-if=\"currentNode\"\n\t\t:node=\"currentNode\"\n\t\t:run-index=\"runIndex\"\n\t\t:linked-runs=\"linkedRuns\"\n\t\t:can-link-runs=\"!mappedNode && canLinkRuns\"\n\t\t:too-much-data-title=\"$locale.baseText('ndv.input.tooMuchData.title')\"\n\t\t:no-data-in-branch-message=\"$locale.baseText('ndv.input.noOutputDataInBranch')\"\n\t\t:is-executing=\"isExecutingPrevious\"\n\t\t:executing-message=\"$locale.baseText('ndv.input.executingPrevious')\"\n\t\t:push-ref=\"pushRef\"\n\t\t:override-outputs=\"connectedCurrentNodeOutputs\"\n\t\t:mapping-enabled=\"isMappingEnabled\"\n\t\t:distance-from-active=\"currentNodeDepth\"\n\t\t:is-production-execution-preview=\"isProductionExecutionPreview\"\n\t\t:is-pane-active=\"isPaneActive\"\n\t\tpane-type=\"input\"\n\t\tdata-test-id=\"ndv-input-panel\"\n\t\t@activate-pane=\"activatePane\"\n\t\t@item-hover=\"$emit('itemHover', $event)\"\n\t\t@link-run=\"onLinkRun\"\n\t\t@unlink-run=\"onUnlinkRun\"\n\t\t@run-change=\"onRunIndexChange\"\n\t\t@table-mounted=\"$emit('tableMounted', $event)\"\n\t\t@search=\"$emit('search', $event)\"\n\t>\n\t\t<template #header>\n\t\t\t<div :class=\"$style.titleSection\">\n\t\t\t\t<n8n-select\n\t\t\t\t\tv-if=\"parentNodes.length\"\n\t\t\t\t\tteleported\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t:model-value=\"currentNodeName\"\n\t\t\t\t\t:no-data-text=\"$locale.baseText('ndv.input.noNodesFound')\"\n\t\t\t\t\t:placeholder=\"$locale.baseText('ndv.input.parentNodes')\"\n\t\t\t\t\tfilterable\n\t\t\t\t\tdata-test-id=\"ndv-input-select\"\n\t\t\t\t\t@update:model-value=\"onInputNodeChange\"\n\t\t\t\t>\n\t\t\t\t\t<template #prepend>\n\t\t\t\t\t\t<span :class=\"$style.title\">{{ $locale.baseText('ndv.input') }}</span>\n\t\t\t\t\t</template>\n\t\t\t\t\t<n8n-option\n\t\t\t\t\t\tv-for=\"node of parentNodes\"\n\t\t\t\t\t\t:key=\"node.name\"\n\t\t\t\t\t\t:value=\"node.name\"\n\t\t\t\t\t\tclass=\"node-option\"\n\t\t\t\t\t\t:label=\"`${truncate(node.name)} ${getMultipleNodesText(node.name)}`\"\n\t\t\t\t\t\tdata-test-id=\"ndv-input-option\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span>{{ truncate(node.name) }}&nbsp;</span>\n\t\t\t\t\t\t<span v-if=\"getMultipleNodesText(node.name)\">{{\n\t\t\t\t\t\t\tgetMultipleNodesText(node.name)\n\t\t\t\t\t\t}}</span>\n\t\t\t\t\t\t<span v-else>{{\n\t\t\t\t\t\t\t$locale.baseText('ndv.input.nodeDistance', { adjustToNumber: node.depth })\n\t\t\t\t\t\t}}</span>\n\t\t\t\t\t</n8n-option>\n\t\t\t\t</n8n-select>\n\t\t\t\t<span v-else :class=\"$style.title\">{{ $locale.baseText('ndv.input') }}</span>\n\t\t\t\t<n8n-radio-buttons\n\t\t\t\t\tv-if=\"isActiveNodeConfig && !readOnly\"\n\t\t\t\t\t:options=\"inputModes\"\n\t\t\t\t\t:model-value=\"inputMode\"\n\t\t\t\t\t@update:model-value=\"onInputModeChange\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</template>\n\t\t<template v-if=\"isMappingMode\" #before-data>\n\t\t\t<!--\n\t\t\t\t\t\tHide the run linking buttons for both input and ouput panels when in 'Mapping Mode' because the run indices wouldn't match.\n\t\t\t\t\t\tAlthough this is not the most elegant solution, it's straightforward and simpler than introducing a new props and logic to handle this.\n\t\t\t\t-->\n\t\t\t<component :is=\"'style'\">button.linkRun { display: none }</component>\n\t\t\t<div :class=\"$style.mappedNode\">\n\t\t\t\t<n8n-select\n\t\t\t\t\t:model-value=\"mappedNode\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tteleported\n\t\t\t\t\t@update:model-value=\"onMappedNodeSelected\"\n\t\t\t\t\t@click.stop\n\t\t\t\t>\n\t\t\t\t\t<template #prepend>{{ $locale.baseText('ndv.input.previousNode') }}</template>\n\t\t\t\t\t<n8n-option\n\t\t\t\t\t\tv-for=\"nodeName in rootNodesParents\"\n\t\t\t\t\t\t:key=\"nodeName\"\n\t\t\t\t\t\t:label=\"nodeName\"\n\t\t\t\t\t\t:value=\"nodeName\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-select>\n\t\t\t</div>\n\t\t</template>\n\t\t<template #node-not-run>\n\t\t\t<div\n\t\t\t\tv-if=\"(isActiveNodeConfig && rootNode) || parentNodes.length\"\n\t\t\t\t:class=\"$style.noOutputData\"\n\t\t\t>\n\t\t\t\t<n8n-text tag=\"div\" :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t\t$locale.baseText('ndv.input.noOutputData.title')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-tooltip v-if=\"!readOnly\" :visible=\"showDraggableHint && showDraggableHintWithDelay\">\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-html=\"\n\t\t\t\t\t\t\t\t$locale.baseText('dataMapping.dragFromPreviousHint', {\n\t\t\t\t\t\t\t\t\tinterpolate: { name: focusedMappableInput },\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t></div>\n\t\t\t\t\t</template>\n\t\t\t\t\t<NodeExecuteButton\n\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\thide-icon\n\t\t\t\t\t\t:transparent=\"true\"\n\t\t\t\t\t\t:node-name=\"isActiveNodeConfig ? rootNode : currentNodeName ?? ''\"\n\t\t\t\t\t\t:label=\"$locale.baseText('ndv.input.noOutputData.executePrevious')\"\n\t\t\t\t\t\ttelemetry-source=\"inputs\"\n\t\t\t\t\t\tdata-test-id=\"execute-previous-node\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-tooltip>\n\t\t\t\t<n8n-text v-if=\"!readOnly\" tag=\"div\" size=\"small\">\n\t\t\t\t\t{{ $locale.baseText('ndv.input.noOutputData.hint') }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t\t<div v-else :class=\"$style.notConnected\">\n\t\t\t\t<div>\n\t\t\t\t\t<WireMeUp />\n\t\t\t\t</div>\n\t\t\t\t<n8n-text tag=\"div\" :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t\t$locale.baseText('ndv.input.notConnected.title')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-text tag=\"div\">\n\t\t\t\t\t{{ $locale.baseText('ndv.input.notConnected.message') }}\n\t\t\t\t\t<a\n\t\t\t\t\t\thref=\"https://docs.n8n.io/workflows/connections/\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t@click=\"onConnectionHelpClick\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ $locale.baseText('ndv.input.notConnected.learnMore') }}\n\t\t\t\t\t</a>\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template #no-output-data>\n\t\t\t<n8n-text tag=\"div\" :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t$locale.baseText('ndv.input.noOutputData')\n\t\t\t}}</n8n-text>\n\t\t</template>\n\n\t\t<template #recovered-artificial-output-data>\n\t\t\t<div :class=\"$style.recoveredOutputData\">\n\t\t\t\t<n8n-text tag=\"div\" :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t\t$locale.baseText('executionDetails.executionFailed.recoveredNodeTitle')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-text>\n\t\t\t\t\t{{ $locale.baseText('executionDetails.executionFailed.recoveredNodeMessage') }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t</template>\n\t</RunData>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport type { INodeUi } from '@/Interface';\nimport { NodeHelpers, NodeConnectionType } from 'n8n-workflow';\nimport type {\n\tConnectionTypes,\n\tIConnectedNode,\n\tINodeOutputConfiguration,\n\tINodeTypeDescription,\n\tWorkflow,\n} from 'n8n-workflow';\nimport RunData from './RunData.vue';\nimport NodeExecuteButton from './NodeExecuteButton.vue';\nimport WireMeUp from './WireMeUp.vue';\nimport {\n\tCRON_NODE_TYPE,\n\tINTERVAL_NODE_TYPE,\n\tMANUAL_TRIGGER_NODE_TYPE,\n\tSTART_NODE_TYPE,\n} from '@/constants';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useUIStore } from '@/stores/ui.store';\n\ntype MappingMode = 'debugging' | 'mapping';\n\nexport default defineComponent({\n\tname: 'InputPanel',\n\tcomponents: { RunData, NodeExecuteButton, WireMeUp },\n\tprops: {\n\t\tcurrentNodeName: {\n\t\t\ttype: String,\n\t\t},\n\t\trunIndex: {\n\t\t\ttype: Number,\n\t\t\trequired: true,\n\t\t},\n\t\tlinkedRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tworkflow: {},\n\t\tcanLinkRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tpushRef: {\n\t\t\ttype: String,\n\t\t},\n\t\treadOnly: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tisProductionExecutionPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisPaneActive: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tshowDraggableHintWithDelay: false,\n\t\t\tdraggableHintShown: false,\n\t\t\tinputMode: 'debugging' as MappingMode,\n\t\t\tmappedNode: null as string | null,\n\t\t\tinputModes: [\n\t\t\t\t{ value: 'mapping', label: this.$locale.baseText('ndv.input.mapping') },\n\t\t\t\t{ value: 'debugging', label: this.$locale.baseText('ndv.input.debugging') },\n\t\t\t],\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useWorkflowsStore, useUIStore),\n\t\tfocusedMappableInput(): string {\n\t\t\treturn this.ndvStore.focusedMappableInput;\n\t\t},\n\t\tisUserOnboarded(): boolean {\n\t\t\treturn this.ndvStore.isMappingOnboarded;\n\t\t},\n\t\tisMappingMode(): boolean {\n\t\t\treturn this.isActiveNodeConfig && this.inputMode === 'mapping';\n\t\t},\n\t\tshowDraggableHint(): boolean {\n\t\t\tconst toIgnore = [\n\t\t\t\tSTART_NODE_TYPE,\n\t\t\t\tMANUAL_TRIGGER_NODE_TYPE,\n\t\t\t\tCRON_NODE_TYPE,\n\t\t\t\tINTERVAL_NODE_TYPE,\n\t\t\t];\n\t\t\tif (!this.currentNode || toIgnore.includes(this.currentNode.type)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn !!this.focusedMappableInput && !this.isUserOnboarded;\n\t\t},\n\t\tisActiveNodeConfig(): boolean {\n\t\t\tlet inputs = this.activeNodeType?.inputs ?? [];\n\t\t\tlet outputs = this.activeNodeType?.outputs ?? [];\n\t\t\tif (this.activeNode !== null && this.currentWorkflow !== null) {\n\t\t\t\tconst node = this.currentWorkflow.getNode(this.activeNode.name);\n\t\t\t\tinputs = NodeHelpers.getNodeInputs(this.currentWorkflow, node!, this.activeNodeType!);\n\t\t\t\toutputs = NodeHelpers.getNodeOutputs(this.currentWorkflow, node!, this.activeNodeType!);\n\t\t\t} else {\n\t\t\t\t// If we can not figure out the node type we set no outputs\n\t\t\t\tif (!Array.isArray(inputs)) {\n\t\t\t\t\tinputs = [] as ConnectionTypes[];\n\t\t\t\t}\n\t\t\t\tif (!Array.isArray(outputs)) {\n\t\t\t\t\toutputs = [] as ConnectionTypes[];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tinputs.length === 0 ||\n\t\t\t\t(inputs.every((input) => this.filterOutConnectionType(input, NodeConnectionType.Main)) &&\n\t\t\t\t\toutputs.find((output) => this.filterOutConnectionType(output, NodeConnectionType.Main)))\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\t\tisMappingEnabled(): boolean {\n\t\t\tif (this.readOnly) return false;\n\n\t\t\t// Mapping is only enabled in mapping mode for config nodes and if node to map is selected\n\t\t\tif (this.isActiveNodeConfig) return this.isMappingMode && this.mappedNode !== null;\n\n\t\t\treturn true;\n\t\t},\n\t\tisExecutingPrevious(): boolean {\n\t\t\tif (!this.workflowRunning) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst triggeredNode = this.workflowsStore.executedNode;\n\t\t\tconst executingNode = this.workflowsStore.executingNode;\n\n\t\t\tif (\n\t\t\t\tthis.activeNode &&\n\t\t\t\ttriggeredNode === this.activeNode.name &&\n\t\t\t\t!this.workflowsStore.isNodeExecuting(this.activeNode.name)\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (executingNode.length || triggeredNode) {\n\t\t\t\treturn !!this.parentNodes.find(\n\t\t\t\t\t(node) => this.workflowsStore.isNodeExecuting(node.name) || node.name === triggeredNode,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tcurrentWorkflow(): Workflow {\n\t\t\treturn this.workflow as Workflow;\n\t\t},\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\n\t\trootNode(): string {\n\t\t\tconst workflow = this.currentWorkflow;\n\t\t\tconst rootNodes = workflow.getChildNodes(this.activeNode?.name ?? '', 'ALL_NON_MAIN');\n\n\t\t\treturn rootNodes[0];\n\t\t},\n\t\trootNodesParents(): string[] {\n\t\t\tconst workflow = this.currentWorkflow;\n\t\t\tconst parentNodes = [...workflow.getParentNodes(this.rootNode, 'main')].reverse();\n\n\t\t\treturn parentNodes;\n\t\t},\n\t\tcurrentNode(): INodeUi | null {\n\t\t\tif (this.isActiveNodeConfig) {\n\t\t\t\t// if we're mapping node we want to show the output of the mapped node\n\t\t\t\tif (this.mappedNode) {\n\t\t\t\t\treturn this.workflowsStore.getNodeByName(this.mappedNode);\n\t\t\t\t}\n\n\t\t\t\t// in debugging mode data does get set manually and is only for debugging\n\t\t\t\t// so we want to force the node to be the active node to make sure we show the correct data\n\t\t\t\treturn this.activeNode;\n\t\t\t}\n\n\t\t\treturn this.workflowsStore.getNodeByName(this.currentNodeName ?? '');\n\t\t},\n\t\tconnectedCurrentNodeOutputs(): number[] | undefined {\n\t\t\tconst search = this.parentNodes.find(({ name }) => name === this.currentNodeName);\n\t\t\tif (search) {\n\t\t\t\treturn search.indicies;\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t\tparentNodes(): IConnectedNode[] {\n\t\t\tif (!this.activeNode) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tconst nodes: IConnectedNode[] = (this.workflow as Workflow).getParentNodesByDepth(\n\t\t\t\tthis.activeNode.name,\n\t\t\t);\n\n\t\t\treturn nodes.filter(\n\t\t\t\t({ name }, i) =>\n\t\t\t\t\tthis.activeNode &&\n\t\t\t\t\tname !== this.activeNode.name &&\n\t\t\t\t\tnodes.findIndex((node) => node.name === name) === i,\n\t\t\t);\n\t\t},\n\t\tcurrentNodeDepth(): number {\n\t\t\tconst node = this.parentNodes.find(\n\t\t\t\t(node) => this.currentNode && node.name === this.currentNode.name,\n\t\t\t);\n\t\t\treturn node ? node.depth : -1;\n\t\t},\n\t\tactiveNodeType(): INodeTypeDescription | null {\n\t\t\tif (!this.activeNode) return null;\n\n\t\t\treturn this.nodeTypesStore.getNodeType(this.activeNode.type, this.activeNode.typeVersion);\n\t\t},\n\t\tisMultiInputNode(): boolean {\n\t\t\treturn this.activeNodeType !== null && this.activeNodeType.inputs.length > 1;\n\t\t},\n\t},\n\twatch: {\n\t\tinputMode: {\n\t\t\thandler(val) {\n\t\t\t\tthis.onRunIndexChange(-1);\n\t\t\t\tif (val === 'mapping') {\n\t\t\t\t\tthis.onUnlinkRun();\n\t\t\t\t\tthis.mappedNode = this.rootNodesParents[0];\n\t\t\t\t} else {\n\t\t\t\t\tthis.mappedNode = null;\n\t\t\t\t}\n\t\t\t},\n\t\t\timmediate: true,\n\t\t},\n\t\tshowDraggableHint(curr: boolean, prev: boolean) {\n\t\t\tif (curr && !prev) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (this.draggableHintShown) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthis.showDraggableHintWithDelay = this.showDraggableHint;\n\t\t\t\t\tif (this.showDraggableHintWithDelay) {\n\t\t\t\t\t\tthis.draggableHintShown = true;\n\n\t\t\t\t\t\tthis.$telemetry.track('User viewed data mapping tooltip', {\n\t\t\t\t\t\t\ttype: 'unexecuted input pane',\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}, 1000);\n\t\t\t} else if (!curr) {\n\t\t\t\tthis.showDraggableHintWithDelay = false;\n\t\t\t}\n\t\t},\n\t},\n\tmethods: {\n\t\tfilterOutConnectionType(\n\t\t\titem: ConnectionTypes | INodeOutputConfiguration,\n\t\t\ttype: ConnectionTypes,\n\t\t) {\n\t\t\tif (!item) return false;\n\n\t\t\treturn typeof item === 'string' ? item !== type : item.type !== type;\n\t\t},\n\t\tonInputModeChange(val: MappingMode) {\n\t\t\tthis.inputMode = val;\n\t\t},\n\t\tonMappedNodeSelected(val: string) {\n\t\t\tthis.mappedNode = val;\n\n\t\t\tthis.onRunIndexChange(0);\n\t\t\tthis.onUnlinkRun();\n\t\t},\n\t\tgetMultipleNodesText(nodeName?: string): string {\n\t\t\tif (\n\t\t\t\t!nodeName ||\n\t\t\t\t!this.isMultiInputNode ||\n\t\t\t\t!this.activeNode ||\n\t\t\t\tthis.activeNodeType?.inputNames === undefined\n\t\t\t)\n\t\t\t\treturn '';\n\n\t\t\tconst activeNodeConnections =\n\t\t\t\tthis.currentWorkflow.connectionsByDestinationNode[this.activeNode.name].main || [];\n\t\t\t// Collect indexes of connected nodes\n\t\t\tconst connectedInputIndexes = activeNodeConnections.reduce((acc: number[], node, index) => {\n\t\t\t\tif (node[0] && node[0].node === nodeName) return [...acc, index];\n\t\t\t\treturn acc;\n\t\t\t}, []);\n\n\t\t\t// Match connected input indexes to their names specified by active node\n\t\t\tconst connectedInputs = connectedInputIndexes.map(\n\t\t\t\t(inputIndex) => this.activeNodeType?.inputNames?.[inputIndex],\n\t\t\t);\n\n\t\t\tif (connectedInputs.length === 0) return '';\n\n\t\t\treturn `(${connectedInputs.join(' & ')})`;\n\t\t},\n\t\tonNodeExecute() {\n\t\t\tthis.$emit('execute');\n\t\t\tif (this.activeNode) {\n\t\t\t\tthis.$telemetry.track('User clicked ndv button', {\n\t\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\t\tpane: 'input',\n\t\t\t\t\ttype: 'executePrevious',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonRunIndexChange(run: number) {\n\t\t\tthis.$emit('runChange', run);\n\t\t},\n\t\tonLinkRun() {\n\t\t\tthis.$emit('linkRun');\n\t\t},\n\t\tonUnlinkRun() {\n\t\t\tthis.$emit('unlinkRun');\n\t\t},\n\t\tonInputNodeChange(value: string) {\n\t\t\tconst index = this.parentNodes.findIndex((node) => node.name === value) + 1;\n\t\t\tthis.$emit('changeInputNode', value, index);\n\t\t},\n\t\tonConnectionHelpClick() {\n\t\t\tif (this.activeNode) {\n\t\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\t\tpane: 'input',\n\t\t\t\t\ttype: 'not-connected-help',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\ttruncate(nodeName: string) {\n\t\t\tconst truncated = nodeName.substring(0, 30);\n\t\t\tif (truncated.length < nodeName.length) {\n\t\t\t\treturn `${truncated}...`;\n\t\t\t}\n\t\t\treturn truncated;\n\t\t},\n\t\tactivatePane() {\n\t\t\tthis.$emit('activatePane');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.mappedNode {\n\twidth: max-content;\n\tpadding: 0 var(--spacing-s) var(--spacing-s);\n}\n.titleSection {\n\tdisplay: flex;\n\tmax-width: 300px;\n\talign-items: center;\n\n\t> * {\n\t\tmargin-right: var(--spacing-2xs);\n\t}\n}\n.inputModeTab {\n\tmargin-left: auto;\n}\n.noOutputData {\n\tmax-width: 180px;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-m);\n\t}\n\n\t> * {\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n}\n\n.recoveredOutputData {\n\tmargin: auto;\n\tmax-width: 250px;\n\ttext-align: center;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-m);\n\t}\n}\n\n.notConnected {\n\tmax-width: 300px;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-m);\n\t}\n\n\t> * {\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n}\n\n.title {\n\ttext-transform: uppercase;\n\tcolor: var(--color-text-light);\n\tletter-spacing: 3px;\n\tfont-size: var(--font-size-s);\n\tfont-weight: var(--font-weight-bold);\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.node-option {\n\tfont-weight: var(--font-weight-regular) !important;\n\n\tspan {\n\t\tcolor: var(--color-text-light);\n\t}\n\n\t&.selected > span {\n\t\tcolor: var(--color-primary);\n\t}\n}\n</style>\n","<template>\n\t<div :class=\"$style.container\">\n\t\t<transition name=\"fade\" mode=\"out-in\">\n\t\t\t<div v-if=\"hasIssues || hideContent\" key=\"empty\"></div>\n\t\t\t<div v-else-if=\"isListeningForEvents\" key=\"listening\">\n\t\t\t\t<n8n-pulse>\n\t\t\t\t\t<NodeIcon :node-type=\"nodeType\" :size=\"40\"></NodeIcon>\n\t\t\t\t</n8n-pulse>\n\t\t\t\t<div v-if=\"isWebhookNode\">\n\t\t\t\t\t<n8n-text tag=\"div\" size=\"large\" color=\"text-dark\" class=\"mb-2xs\" bold>{{\n\t\t\t\t\t\t$locale.baseText('ndv.trigger.webhookNode.listening')\n\t\t\t\t\t}}</n8n-text>\n\t\t\t\t\t<div :class=\"[$style.shake, 'mb-xs']\">\n\t\t\t\t\t\t<n8n-text>\n\t\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t\t$locale.baseText('ndv.trigger.webhookNode.requestHint', {\n\t\t\t\t\t\t\t\t\tinterpolate: { type: webhookHttpMethod },\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t</div>\n\t\t\t\t\t<CopyInput\n\t\t\t\t\t\t:value=\"webhookTestUrl\"\n\t\t\t\t\t\t:toast-title=\"$locale.baseText('ndv.trigger.copiedTestUrl')\"\n\t\t\t\t\t\tclass=\"mb-2xl\"\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\t:collapse=\"true\"\n\t\t\t\t\t\t:copy-button-text=\"$locale.baseText('generic.clickToCopy')\"\n\t\t\t\t\t\t@copy=\"onTestLinkCopied\"\n\t\t\t\t\t></CopyInput>\n\t\t\t\t\t<NodeExecuteButton\n\t\t\t\t\t\tdata-test-id=\"trigger-execute-button\"\n\t\t\t\t\t\t:node-name=\"nodeName\"\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\ttelemetry-source=\"inputs\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div v-else>\n\t\t\t\t\t<n8n-text tag=\"div\" size=\"large\" color=\"text-dark\" class=\"mb-2xs\" bold>{{\n\t\t\t\t\t\tlisteningTitle\n\t\t\t\t\t}}</n8n-text>\n\t\t\t\t\t<div :class=\"[$style.shake, 'mb-xs']\">\n\t\t\t\t\t\t<n8n-text tag=\"div\">\n\t\t\t\t\t\t\t{{ listeningHint }}\n\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-if=\"displayChatButton\">\n\t\t\t\t\t\t<n8n-button class=\"mb-xl\" @click=\"openWebhookUrl()\">\n\t\t\t\t\t\t\t{{ $locale.baseText('ndv.trigger.chatTrigger.openChat') }}\n\t\t\t\t\t\t</n8n-button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<NodeExecuteButton\n\t\t\t\t\t\tdata-test-id=\"trigger-execute-button\"\n\t\t\t\t\t\t:node-name=\"nodeName\"\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\ttelemetry-source=\"inputs\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-else key=\"default\">\n\t\t\t\t<div v-if=\"isActivelyPolling\" class=\"mb-xl\">\n\t\t\t\t\t<n8n-spinner type=\"ring\" />\n\t\t\t\t</div>\n\n\t\t\t\t<div :class=\"$style.action\">\n\t\t\t\t\t<div :class=\"$style.header\">\n\t\t\t\t\t\t<n8n-heading v-if=\"header\" tag=\"h1\" bold>\n\t\t\t\t\t\t\t{{ header }}\n\t\t\t\t\t\t</n8n-heading>\n\t\t\t\t\t\t<n8n-text v-if=\"subheader\">\n\t\t\t\t\t\t\t<span v-text=\"subheader\" />\n\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<NodeExecuteButton\n\t\t\t\t\t\tdata-test-id=\"trigger-execute-button\"\n\t\t\t\t\t\t:node-name=\"nodeName\"\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\ttelemetry-source=\"inputs\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t<n8n-text v-if=\"activationHint\" size=\"small\" @click=\"onLinkClick\">\n\t\t\t\t\t<span v-html=\"activationHint\"></span>&nbsp;\n\t\t\t\t</n8n-text>\n\t\t\t\t<n8n-link\n\t\t\t\t\tv-if=\"activationHint && executionsHelp\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t@click=\"expandExecutionHelp\"\n\t\t\t\t\t>{{ $locale.baseText('ndv.trigger.moreInfo') }}</n8n-link\n\t\t\t\t>\n\t\t\t\t<n8n-info-accordion\n\t\t\t\t\tv-if=\"executionsHelp\"\n\t\t\t\t\tref=\"help\"\n\t\t\t\t\t:class=\"$style.accordion\"\n\t\t\t\t\t:title=\"$locale.baseText('ndv.trigger.executionsHint.question')\"\n\t\t\t\t\t:description=\"executionsHelp\"\n\t\t\t\t\t:event-bus=\"executionsHelpEventBus\"\n\t\t\t\t\t@click:body=\"onLinkClick\"\n\t\t\t\t></n8n-info-accordion>\n\t\t\t</div>\n\t\t</transition>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport {\n\tCHAT_TRIGGER_NODE_TYPE,\n\tVIEWS,\n\tWEBHOOK_NODE_TYPE,\n\tWORKFLOW_SETTINGS_MODAL_KEY,\n\tFORM_TRIGGER_NODE_TYPE,\n} from '@/constants';\nimport type { INodeUi } from '@/Interface';\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport { getTriggerNodeServiceName } from '@/utils/nodeTypesUtils';\nimport NodeExecuteButton from '@/components/NodeExecuteButton.vue';\nimport CopyInput from '@/components/CopyInput.vue';\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { createEventBus } from 'n8n-design-system/utils';\nimport { useRouter } from 'vue-router';\nimport { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';\n\nexport default defineComponent({\n\tname: 'TriggerPanel',\n\tcomponents: {\n\t\tNodeExecuteButton,\n\t\tCopyInput,\n\t\tNodeIcon,\n\t},\n\tprops: {\n\t\tnodeName: {\n\t\t\ttype: String,\n\t\t},\n\t\tpushRef: {\n\t\t\ttype: String,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst router = useRouter();\n\t\tconst workflowHelpers = useWorkflowHelpers({ router });\n\n\t\treturn {\n\t\t\tworkflowHelpers,\n\t\t};\n\t},\n\tdata: () => {\n\t\treturn {\n\t\t\texecutionsHelpEventBus: createEventBus(),\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useUIStore, useWorkflowsStore),\n\t\tnode(): INodeUi | null {\n\t\t\treturn this.workflowsStore.getNodeByName(this.nodeName as string);\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.nodeTypesStore.getNodeType(this.node.type, this.node.typeVersion);\n\t\t\t}\n\n\t\t\treturn null;\n\t\t},\n\t\thideContent(): boolean {\n\t\t\tif (!this.nodeType?.triggerPanel) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.nodeType?.triggerPanel &&\n\t\t\t\tthis.nodeType?.triggerPanel.hasOwnProperty('hideContent')\n\t\t\t) {\n\t\t\t\tconst hideContent = this.nodeType?.triggerPanel.hideContent;\n\t\t\t\tif (typeof hideContent === 'boolean') {\n\t\t\t\t\treturn hideContent;\n\t\t\t\t}\n\n\t\t\t\tif (this.node) {\n\t\t\t\t\tconst hideContentValue = this.workflowHelpers\n\t\t\t\t\t\t.getCurrentWorkflow()\n\t\t\t\t\t\t.expression.getSimpleParameterValue(this.node, hideContent, 'internal', {});\n\n\t\t\t\t\tif (typeof hideContentValue === 'boolean') {\n\t\t\t\t\t\treturn hideContentValue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\t\thasIssues(): boolean {\n\t\t\treturn Boolean(\n\t\t\t\tthis.node?.issues && (this.node.issues.parameters || this.node.issues.credentials),\n\t\t\t);\n\t\t},\n\t\tserviceName(): string {\n\t\t\tif (this.nodeType) {\n\t\t\t\treturn getTriggerNodeServiceName(this.nodeType);\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tdisplayChatButton(): boolean {\n\t\t\treturn Boolean(\n\t\t\t\tthis.node &&\n\t\t\t\t\tthis.node.type === CHAT_TRIGGER_NODE_TYPE &&\n\t\t\t\t\tthis.node.parameters.mode !== 'webhook',\n\t\t\t);\n\t\t},\n\t\tisWebhookNode(): boolean {\n\t\t\treturn Boolean(this.node && this.node.type === WEBHOOK_NODE_TYPE);\n\t\t},\n\t\twebhookHttpMethod(): string | undefined {\n\t\t\tif (!this.node || !this.nodeType?.webhooks?.length) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst httpMethod = this.workflowHelpers.getWebhookExpressionValue(\n\t\t\t\tthis.nodeType.webhooks[0],\n\t\t\t\t'httpMethod',\n\t\t\t\tfalse,\n\t\t\t);\n\n\t\t\tif (Array.isArray(httpMethod)) {\n\t\t\t\treturn httpMethod.join(', ');\n\t\t\t}\n\n\t\t\treturn httpMethod;\n\t\t},\n\t\twebhookTestUrl(): string | undefined {\n\t\t\tif (!this.node || !this.nodeType?.webhooks?.length) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\treturn this.workflowHelpers.getWebhookUrl(this.nodeType.webhooks[0], this.node, 'test');\n\t\t},\n\t\tisWebhookBasedNode(): boolean {\n\t\t\treturn Boolean(this.nodeType?.webhooks?.length);\n\t\t},\n\t\tisPollingNode(): boolean {\n\t\t\treturn Boolean(this.nodeType?.polling);\n\t\t},\n\t\tisListeningForEvents(): boolean {\n\t\t\tconst waitingOnWebhook = this.workflowsStore.executionWaitingForWebhook;\n\t\t\tconst executedNode = this.workflowsStore.executedNode;\n\t\t\treturn (\n\t\t\t\t!!this.node &&\n\t\t\t\t!this.node.disabled &&\n\t\t\t\tthis.isWebhookBasedNode &&\n\t\t\t\twaitingOnWebhook &&\n\t\t\t\t(!executedNode || executedNode === this.nodeName)\n\t\t\t);\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tisActivelyPolling(): boolean {\n\t\t\tconst triggeredNode = this.workflowsStore.executedNode;\n\n\t\t\treturn this.workflowRunning && this.isPollingNode && this.nodeName === triggeredNode;\n\t\t},\n\t\tisWorkflowActive(): boolean {\n\t\t\treturn this.workflowsStore.isWorkflowActive;\n\t\t},\n\t\tlisteningTitle(): string {\n\t\t\treturn this.nodeType?.name === FORM_TRIGGER_NODE_TYPE\n\t\t\t\t? this.$locale.baseText('ndv.trigger.webhookNode.formTrigger.listening')\n\t\t\t\t: this.$locale.baseText('ndv.trigger.webhookNode.listening');\n\t\t},\n\t\tlisteningHint(): string {\n\t\t\tswitch (this.nodeType?.name) {\n\t\t\t\tcase CHAT_TRIGGER_NODE_TYPE:\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.chatTrigger.serviceHint');\n\t\t\t\tcase FORM_TRIGGER_NODE_TYPE:\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.formTrigger.serviceHint');\n\t\t\t\tdefault:\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.serviceHint', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\theader(): string {\n\t\t\tconst serviceName = this.nodeType ? getTriggerNodeServiceName(this.nodeType) : '';\n\n\t\t\tif (this.isActivelyPolling) {\n\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.fetchingEvent');\n\t\t\t}\n\n\t\t\tif (this.nodeType?.triggerPanel && typeof this.nodeType.triggerPanel.header === 'string') {\n\t\t\t\treturn this.nodeType.triggerPanel.header;\n\t\t\t}\n\n\t\t\tif (this.isWebhookBasedNode) {\n\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.action', {\n\t\t\t\t\tinterpolate: { name: serviceName },\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tsubheader(): string {\n\t\t\tconst serviceName = this.nodeType ? getTriggerNodeServiceName(this.nodeType) : '';\n\t\t\tif (this.isActivelyPolling) {\n\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.fetchingHint', {\n\t\t\t\t\tinterpolate: { name: serviceName },\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\texecutionsHelp(): string {\n\t\t\tif (this.nodeType?.triggerPanel?.executionsHelp !== undefined) {\n\t\t\t\tif (typeof this.nodeType.triggerPanel.executionsHelp === 'string') {\n\t\t\t\t\treturn this.nodeType.triggerPanel.executionsHelp;\n\t\t\t\t}\n\t\t\t\tif (!this.isWorkflowActive && this.nodeType.triggerPanel.executionsHelp.inactive) {\n\t\t\t\t\treturn this.nodeType.triggerPanel.executionsHelp.inactive;\n\t\t\t\t}\n\t\t\t\tif (this.isWorkflowActive && this.nodeType.triggerPanel.executionsHelp.active) {\n\t\t\t\t\treturn this.nodeType.triggerPanel.executionsHelp.active;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.isWebhookBasedNode) {\n\t\t\t\tif (this.isWorkflowActive) {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.executionsHelp.active', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.executionsHelp.inactive', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.isPollingNode) {\n\t\t\t\tif (this.isWorkflowActive) {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.executionsHelp.active', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.executionsHelp.inactive', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tactivationHint(): string {\n\t\t\tif (this.isActivelyPolling) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tif (this.nodeType?.triggerPanel?.activationHint) {\n\t\t\t\tif (typeof this.nodeType.triggerPanel.activationHint === 'string') {\n\t\t\t\t\treturn this.nodeType.triggerPanel.activationHint;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\t!this.isWorkflowActive &&\n\t\t\t\t\ttypeof this.nodeType.triggerPanel.activationHint.inactive === 'string'\n\t\t\t\t) {\n\t\t\t\t\treturn this.nodeType.triggerPanel.activationHint.inactive;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tthis.isWorkflowActive &&\n\t\t\t\t\ttypeof this.nodeType.triggerPanel.activationHint.active === 'string'\n\t\t\t\t) {\n\t\t\t\t\treturn this.nodeType.triggerPanel.activationHint.active;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.isWebhookBasedNode) {\n\t\t\t\tif (this.isWorkflowActive) {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.activationHint.active', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.activationHint.inactive', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.isPollingNode) {\n\t\t\t\tif (this.isWorkflowActive) {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.activationHint.active', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.activationHint.inactive', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t},\n\tmethods: {\n\t\texpandExecutionHelp() {\n\t\t\tif (this.$refs.help) {\n\t\t\t\tthis.executionsHelpEventBus.emit('expand');\n\t\t\t}\n\t\t},\n\t\topenWebhookUrl() {\n\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tpane: 'input',\n\t\t\t\ttype: 'open-chat',\n\t\t\t});\n\t\t\twindow.open(this.webhookTestUrl, '_blank', 'noreferrer');\n\t\t},\n\t\tonLinkClick(e: MouseEvent) {\n\t\t\tif (!e.target) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst target = e.target as HTMLElement;\n\t\t\tif (target.localName !== 'a') return;\n\n\t\t\tif (target.dataset?.key) {\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tif (target.dataset.key === 'activate') {\n\t\t\t\t\tthis.$emit('activate');\n\t\t\t\t} else if (target.dataset.key === 'executions') {\n\t\t\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\t\t\tpane: 'input',\n\t\t\t\t\t\ttype: 'open-executions-log',\n\t\t\t\t\t});\n\t\t\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\t\t\tvoid this.$router.push({\n\t\t\t\t\t\tname: VIEWS.EXECUTIONS,\n\t\t\t\t\t});\n\t\t\t\t} else if (target.dataset.key === 'settings') {\n\t\t\t\t\tthis.uiStore.openModal(WORKFLOW_SETTINGS_MODAL_KEY);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tonTestLinkCopied() {\n\t\t\tthis.$telemetry.track('User copied webhook URL', {\n\t\t\t\tpane: 'inputs',\n\t\t\t\ttype: 'test url',\n\t\t\t});\n\t\t},\n\t\tonNodeExecute() {\n\t\t\tthis.$emit('execute');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.container {\n\tposition: relative;\n\twidth: 100%;\n\theight: 100%;\n\tbackground-color: var(--color-background-base);\n\tdisplay: flex;\n\tflex-direction: column;\n\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: var(--spacing-s) var(--spacing-s) var(--spacing-xl) var(--spacing-s);\n\ttext-align: center;\n\toverflow: hidden;\n\n\t> * {\n\t\twidth: 100%;\n\t}\n}\n\n.header {\n\tmargin-bottom: var(--spacing-s);\n\n\t> * {\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n}\n\n.action {\n\tmargin-bottom: var(--spacing-2xl);\n}\n\n.shake {\n\tanimation: shake 8s infinite;\n}\n\n@keyframes shake {\n\t90% {\n\t\ttransform: translateX(0);\n\t}\n\t92.5% {\n\t\ttransform: translateX(6px);\n\t}\n\t95% {\n\t\ttransform: translateX(-6px);\n\t}\n\t97.5% {\n\t\ttransform: translateX(6px);\n\t}\n\t100% {\n\t\ttransform: translateX(0);\n\t}\n}\n\n.accordion {\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 0;\n\twidth: 100%;\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.fade-enter-active,\n.fade-leave-active {\n\ttransition: opacity 200ms;\n}\n.fade-enter,\n.fade-leave-to {\n\topacity: 0;\n}\n</style>\n","<template>\n\t<el-dialog\n\t\t:model-value=\"(!!activeNode || renaming) && !isActiveStickyNode\"\n\t\t:before-close=\"close\"\n\t\t:show-close=\"false\"\n\t\tclass=\"data-display-wrapper ndv-wrapper\"\n\t\toverlay-class=\"data-display-overlay\"\n\t\twidth=\"auto\"\n\t\tappend-to-body\n\t\tdata-test-id=\"ndv\"\n\t\t:data-has-output-connection=\"hasOutputConnection\"\n\t>\n\t\t<n8n-tooltip\n\t\t\tplacement=\"bottom-start\"\n\t\t\t:visible=\"showTriggerWaitingWarning\"\n\t\t\t:disabled=\"!showTriggerWaitingWarning\"\n\t\t>\n\t\t\t<template #content>\n\t\t\t\t<div :class=\"$style.triggerWarning\">\n\t\t\t\t\t{{ $locale.baseText('ndv.backToCanvas.waitingForTriggerWarning') }}\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<div :class=\"$style.backToCanvas\" data-test-id=\"back-to-canvas\" @click=\"close\">\n\t\t\t\t<n8n-icon icon=\"arrow-left\" color=\"text-xlight\" size=\"medium\" />\n\t\t\t\t<n8n-text color=\"text-xlight\" size=\"medium\" :bold=\"true\">\n\t\t\t\t\t{{ $locale.baseText('ndv.backToCanvas') }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t</n8n-tooltip>\n\n\t\t<div\n\t\t\tv-if=\"activeNode\"\n\t\t\tref=\"container\"\n\t\t\tclass=\"data-display\"\n\t\t\ttabindex=\"0\"\n\t\t\t@keydown.capture=\"onKeyDown\"\n\t\t>\n\t\t\t<div :class=\"$style.modalBackground\" @click=\"close\"></div>\n\t\t\t<NDVDraggablePanels\n\t\t\t\t:key=\"activeNode.name\"\n\t\t\t\t:is-trigger-node=\"isTriggerNode\"\n\t\t\t\t:hide-input-and-output=\"activeNodeType === null\"\n\t\t\t\t:position=\"isTriggerNode && !showTriggerPanel ? 0 : undefined\"\n\t\t\t\t:is-draggable=\"!isTriggerNode\"\n\t\t\t\t:has-double-width=\"activeNodeType?.parameterPane === 'wide'\"\n\t\t\t\t:node-type=\"activeNodeType\"\n\t\t\t\t@switch-selected-node=\"onSwitchSelectedNode\"\n\t\t\t\t@open-connection-node-creator=\"onOpenConnectionNodeCreator\"\n\t\t\t\t@close=\"close\"\n\t\t\t\t@init=\"onPanelsInit\"\n\t\t\t\t@dragstart=\"onDragStart\"\n\t\t\t\t@dragend=\"onDragEnd\"\n\t\t\t>\n\t\t\t\t<template v-if=\"showTriggerPanel || !isTriggerNode\" #input>\n\t\t\t\t\t<TriggerPanel\n\t\t\t\t\t\tv-if=\"showTriggerPanel\"\n\t\t\t\t\t\t:node-name=\"activeNode.name\"\n\t\t\t\t\t\t:push-ref=\"pushRef\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\t@activate=\"onWorkflowActivate\"\n\t\t\t\t\t/>\n\t\t\t\t\t<InputPanel\n\t\t\t\t\t\tv-else-if=\"!isTriggerNode\"\n\t\t\t\t\t\t:workflow=\"workflow\"\n\t\t\t\t\t\t:can-link-runs=\"canLinkRuns\"\n\t\t\t\t\t\t:run-index=\"inputRun\"\n\t\t\t\t\t\t:linked-runs=\"linked\"\n\t\t\t\t\t\t:current-node-name=\"inputNodeName\"\n\t\t\t\t\t\t:push-ref=\"pushRef\"\n\t\t\t\t\t\t:read-only=\"readOnly || hasForeignCredential\"\n\t\t\t\t\t\t:is-production-execution-preview=\"isProductionExecutionPreview\"\n\t\t\t\t\t\t:is-pane-active=\"isInputPaneActive\"\n\t\t\t\t\t\t@activate-pane=\"activateInputPane\"\n\t\t\t\t\t\t@link-run=\"onLinkRunToInput\"\n\t\t\t\t\t\t@unlink-run=\"() => onUnlinkRun('input')\"\n\t\t\t\t\t\t@run-change=\"onRunInputIndexChange\"\n\t\t\t\t\t\t@open-settings=\"openSettings\"\n\t\t\t\t\t\t@change-input-node=\"onInputNodeChange\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\t@table-mounted=\"onInputTableMounted\"\n\t\t\t\t\t\t@item-hover=\"onInputItemHover\"\n\t\t\t\t\t\t@search=\"onSearch\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t\t<template #output>\n\t\t\t\t\t<OutputPanel\n\t\t\t\t\t\tdata-test-id=\"output-panel\"\n\t\t\t\t\t\t:can-link-runs=\"canLinkRuns\"\n\t\t\t\t\t\t:run-index=\"outputRun\"\n\t\t\t\t\t\t:linked-runs=\"linked\"\n\t\t\t\t\t\t:push-ref=\"pushRef\"\n\t\t\t\t\t\t:is-read-only=\"readOnly || hasForeignCredential\"\n\t\t\t\t\t\t:block-u-i=\"blockUi && isTriggerNode && !isExecutableTriggerNode\"\n\t\t\t\t\t\t:is-production-execution-preview=\"isProductionExecutionPreview\"\n\t\t\t\t\t\t:is-pane-active=\"isOutputPaneActive\"\n\t\t\t\t\t\t@activate-pane=\"activateOutputPane\"\n\t\t\t\t\t\t@link-run=\"onLinkRunToOutput\"\n\t\t\t\t\t\t@unlink-run=\"() => onUnlinkRun('output')\"\n\t\t\t\t\t\t@run-change=\"onRunOutputIndexChange\"\n\t\t\t\t\t\t@open-settings=\"openSettings\"\n\t\t\t\t\t\t@table-mounted=\"onOutputTableMounted\"\n\t\t\t\t\t\t@item-hover=\"onOutputItemHover\"\n\t\t\t\t\t\t@search=\"onSearch\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t\t<template #main>\n\t\t\t\t\t<NodeSettings\n\t\t\t\t\t\t:event-bus=\"settingsEventBus\"\n\t\t\t\t\t\t:dragging=\"isDragging\"\n\t\t\t\t\t\t:push-ref=\"pushRef\"\n\t\t\t\t\t\t:node-type=\"activeNodeType\"\n\t\t\t\t\t\t:foreign-credentials=\"foreignCredentials\"\n\t\t\t\t\t\t:read-only=\"readOnly\"\n\t\t\t\t\t\t:block-u-i=\"blockUi && showTriggerPanel\"\n\t\t\t\t\t\t:executable=\"!readOnly\"\n\t\t\t\t\t\t@value-changed=\"valueChanged\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\t@stop-execution=\"onStopExecution\"\n\t\t\t\t\t\t@redraw-required=\"redrawRequired = true\"\n\t\t\t\t\t\t@activate=\"onWorkflowActivate\"\n\t\t\t\t\t\t@switch-selected-node=\"onSwitchSelectedNode\"\n\t\t\t\t\t\t@open-connection-node-creator=\"onOpenConnectionNodeCreator\"\n\t\t\t\t\t/>\n\t\t\t\t\t<a\n\t\t\t\t\t\tv-if=\"featureRequestUrl\"\n\t\t\t\t\t\t:class=\"$style.featureRequest\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t@click=\"onFeatureRequestClick\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<font-awesome-icon icon=\"lightbulb\" />\n\t\t\t\t\t\t{{ $locale.baseText('ndv.featureRequest') }}\n\t\t\t\t\t</a>\n\t\t\t\t</template>\n\t\t\t</NDVDraggablePanels>\n\t\t</div>\n\t</el-dialog>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, onMounted, onBeforeUnmount, computed, watch } from 'vue';\nimport { createEventBus } from 'n8n-design-system/utils';\nimport type { IRunData, ConnectionTypes } from 'n8n-workflow';\nimport { jsonParse, NodeHelpers, NodeConnectionType } from 'n8n-workflow';\nimport type { IUpdateInformation, TargetItem } from '@/Interface';\n\nimport NodeSettings from '@/components/NodeSettings.vue';\nimport NDVDraggablePanels from './NDVDraggablePanels.vue';\n\nimport OutputPanel from './OutputPanel.vue';\nimport InputPanel from './InputPanel.vue';\nimport TriggerPanel from './TriggerPanel.vue';\nimport {\n\tBASE_NODE_SURVEY_URL,\n\tEnterpriseEditionFeature,\n\tEXECUTABLE_TRIGGER_NODE_TYPES,\n\tMODAL_CONFIRM,\n\tSTART_NODE_TYPE,\n\tSTICKY_NODE_TYPE,\n} from '@/constants';\nimport { useWorkflowActivate } from '@/composables/useWorkflowActivate';\nimport { dataPinningEventBus } from '@/event-bus';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useDeviceSupport } from 'n8n-design-system';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\nimport { useMessage } from '@/composables/useMessage';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { usePinnedData } from '@/composables/usePinnedData';\nimport { useRouter } from 'vue-router';\nimport { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport { useI18n } from '@/composables/useI18n';\nimport { storeToRefs } from 'pinia';\n\nexport default defineComponent({\n\tname: 'NodeDetailsView',\n\tcomponents: {\n\t\tNodeSettings,\n\t\tInputPanel,\n\t\tOutputPanel,\n\t\tNDVDraggablePanels,\n\t\tTriggerPanel,\n\t},\n\tprops: {\n\t\treadOnly: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\trenaming: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tisProductionExecutionPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\temits: [\n\t\t'saveKeyboardShortcut',\n\t\t'valueChanged',\n\t\t'nodeTypeSelected',\n\t\t'switchSelectedNode',\n\t\t'openConnectionNodeCreator',\n\t\t'redrawNode',\n\t\t'stopExecution',\n\t],\n\tsetup(props, { emit }) {\n\t\tconst ndvStore = useNDVStore();\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst nodeHelpers = useNodeHelpers();\n\t\tconst { activeNode } = storeToRefs(ndvStore);\n\t\tconst pinnedData = usePinnedData(activeNode);\n\t\tconst router = useRouter();\n\t\tconst workflowHelpers = useWorkflowHelpers({ router });\n\t\tconst workflowActivate = useWorkflowActivate();\n\t\tconst nodeTypesStore = useNodeTypesStore();\n\t\tconst uiStore = useUIStore();\n\t\tconst workflowsStore = useWorkflowsStore();\n\t\tconst settingsStore = useSettingsStore();\n\t\tconst deviceSupport = useDeviceSupport();\n\t\tconst telemetry = useTelemetry();\n\t\tconst i18n = useI18n();\n\t\tconst message = useMessage();\n\n\t\tconst settingsEventBus = createEventBus();\n\t\tconst redrawRequired = ref(false);\n\t\tconst runInputIndex = ref(-1);\n\t\tconst runOutputIndex = ref(-1);\n\t\tconst isLinkingEnabled = ref(true);\n\t\tconst selectedInput = ref<string | undefined>();\n\t\tconst triggerWaitingWarningEnabled = ref(false);\n\t\tconst isDragging = ref(false);\n\t\tconst mainPanelPosition = ref(0);\n\t\tconst pinDataDiscoveryTooltipVisible = ref(false);\n\t\tconst avgInputRowHeight = ref(0);\n\t\tconst avgOutputRowHeight = ref(0);\n\t\tconst isInputPaneActive = ref(false);\n\t\tconst isOutputPaneActive = ref(false);\n\t\tconst isPairedItemHoveringEnabled = ref(true);\n\n\t\t//computed\n\n\t\tconst pushRef = computed(() => ndvStore.pushRef);\n\n\t\tconst activeNodeType = computed(() => {\n\t\t\tif (activeNode.value) {\n\t\t\t\treturn nodeTypesStore.getNodeType(activeNode.value.type, activeNode.value.typeVersion);\n\t\t\t}\n\t\t\treturn null;\n\t\t});\n\n\t\tconst workflowRunning = computed(() => uiStore.isActionActive('workflowRunning'));\n\n\t\tconst showTriggerWaitingWarning = computed(\n\t\t\t() =>\n\t\t\t\ttriggerWaitingWarningEnabled.value &&\n\t\t\t\t!!activeNodeType.value &&\n\t\t\t\t!activeNodeType.value.group.includes('trigger') &&\n\t\t\t\tworkflowRunning.value &&\n\t\t\t\tworkflowsStore.executionWaitingForWebhook,\n\t\t);\n\n\t\tconst workflowRunData = computed(() => {\n\t\t\tif (workflowExecution.value === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst executionData = workflowExecution.value.data;\n\n\t\t\tif (executionData?.resultData) {\n\t\t\t\treturn executionData.resultData.runData;\n\t\t\t}\n\n\t\t\treturn null;\n\t\t});\n\n\t\tconst workflow = computed(() => workflowHelpers.getCurrentWorkflow());\n\n\t\tconst parentNodes = computed(() => {\n\t\t\tif (activeNode.value) {\n\t\t\t\treturn (\n\t\t\t\t\tworkflow.value.getParentNodesByDepth(activeNode.value.name, 1).map(({ name }) => name) ||\n\t\t\t\t\t[]\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t});\n\n\t\tconst parentNode = computed(() => {\n\t\t\tfor (const parentNodeName of parentNodes.value) {\n\t\t\t\tif (workflowsStore?.pinnedWorkflowData?.[parentNodeName]) {\n\t\t\t\t\treturn parentNodeName;\n\t\t\t\t}\n\n\t\t\t\tif (workflowRunData.value?.[parentNodeName]) {\n\t\t\t\t\treturn parentNodeName;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn parentNodes.value[0];\n\t\t});\n\n\t\tconst inputNodeName = computed<string | undefined>(() => {\n\t\t\treturn selectedInput.value || parentNode.value;\n\t\t});\n\n\t\tconst inputNode = computed(() => {\n\t\t\tif (inputNodeName.value) {\n\t\t\t\treturn workflowsStore.getNodeByName(inputNodeName.value);\n\t\t\t}\n\t\t\treturn null;\n\t\t});\n\n\t\tconst isTriggerNode = computed(\n\t\t\t() =>\n\t\t\t\t!!activeNodeType.value &&\n\t\t\t\t(activeNodeType.value.group.includes('trigger') ||\n\t\t\t\t\tactiveNodeType.value.name === START_NODE_TYPE),\n\t\t);\n\n\t\tconst showTriggerPanel = computed(() => {\n\t\t\tconst override = !!activeNodeType.value?.triggerPanel;\n\t\t\tif (typeof activeNodeType.value?.triggerPanel === 'boolean') {\n\t\t\t\treturn override;\n\t\t\t}\n\n\t\t\tconst isWebhookBasedNode = !!activeNodeType.value?.webhooks?.length;\n\t\t\tconst isPollingNode = activeNodeType.value?.polling;\n\n\t\t\treturn (\n\t\t\t\t!props.readOnly && isTriggerNode.value && (isWebhookBasedNode || isPollingNode || override)\n\t\t\t);\n\t\t});\n\n\t\tconst hasOutputConnection = computed(() => {\n\t\t\tif (!activeNode.value) return false;\n\t\t\tconst outgoingConnections = workflowsStore.outgoingConnectionsByNodeName(\n\t\t\t\tactiveNode.value.name,\n\t\t\t);\n\n\t\t\t// Check if there's at-least one output connection\n\t\t\treturn (Object.values(outgoingConnections)?.[0]?.[0] ?? []).length > 0;\n\t\t});\n\n\t\tconst isExecutableTriggerNode = computed(() => {\n\t\t\tif (!activeNodeType.value) return false;\n\n\t\t\treturn EXECUTABLE_TRIGGER_NODE_TYPES.includes(activeNodeType.value.name);\n\t\t});\n\n\t\tconst isActiveStickyNode = computed(\n\t\t\t() => !!ndvStore.activeNode && ndvStore.activeNode.type === STICKY_NODE_TYPE,\n\t\t);\n\n\t\tconst workflowExecution = computed(() => workflowsStore.getWorkflowExecution);\n\n\t\tconst maxOutputRun = computed(() => {\n\t\t\tif (activeNode.value === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst runData = workflowRunData.value;\n\n\t\t\tif (!runData?.[activeNode.value.name]) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[activeNode.value.name].length) {\n\t\t\t\treturn runData[activeNode.value.name].length - 1;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t});\n\n\t\tconst outputRun = computed(() =>\n\t\t\trunOutputIndex.value === -1\n\t\t\t\t? maxOutputRun.value\n\t\t\t\t: Math.min(runOutputIndex.value, maxOutputRun.value),\n\t\t);\n\n\t\tconst maxInputRun = computed(() => {\n\t\t\tif (inputNode.value === null || activeNode.value === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst workflowNode = workflow.value.getNode(activeNode.value.name);\n\n\t\t\tif (!workflowNode || !activeNodeType.value) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst outputs = NodeHelpers.getNodeOutputs(\n\t\t\t\tworkflow.value,\n\t\t\t\tworkflowNode,\n\t\t\t\tactiveNodeType.value,\n\t\t\t);\n\n\t\t\tlet node = inputNode.value;\n\n\t\t\tconst runData: IRunData | null = workflowRunData.value;\n\n\t\t\tif (outputs.some((output) => output !== NodeConnectionType.Main)) {\n\t\t\t\tnode = activeNode.value;\n\t\t\t}\n\n\t\t\tif (!node || !runData || !runData.hasOwnProperty(node.name)) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[node.name].length) {\n\t\t\t\treturn runData[node.name].length - 1;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t});\n\n\t\tconst inputRun = computed(() => {\n\t\t\tif (isLinkingEnabled.value && maxOutputRun.value === maxInputRun.value) {\n\t\t\t\treturn outputRun.value;\n\t\t\t}\n\t\t\tif (runInputIndex.value === -1) {\n\t\t\t\treturn maxInputRun.value;\n\t\t\t}\n\n\t\t\treturn Math.min(runInputIndex.value, maxInputRun.value);\n\t\t});\n\n\t\tconst canLinkRuns = computed(\n\t\t\t() => maxOutputRun.value > 0 && maxOutputRun.value === maxInputRun.value,\n\t\t);\n\n\t\tconst linked = computed(() => isLinkingEnabled.value && canLinkRuns.value);\n\n\t\tconst inputPanelMargin = computed(() => (isTriggerNode.value ? 0 : 80));\n\n\t\tconst featureRequestUrl = computed(() => {\n\t\t\tif (!activeNodeType.value) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\treturn `${BASE_NODE_SURVEY_URL}${activeNodeType.value.name}`;\n\t\t});\n\n\t\tconst outputPanelEditMode = computed(() => ndvStore.outputPanelEditMode);\n\n\t\tconst isWorkflowRunning = computed(() => uiStore.isActionActive('workflowRunning'));\n\n\t\tconst isExecutionWaitingForWebhook = computed(() => workflowsStore.executionWaitingForWebhook);\n\n\t\tconst blockUi = computed(() => isWorkflowRunning.value || isExecutionWaitingForWebhook.value);\n\n\t\tconst foreignCredentials = computed(() => {\n\t\t\tconst credentials = activeNode.value?.credentials;\n\t\t\tconst usedCredentials = workflowsStore.usedCredentials;\n\n\t\t\tconst foreignCredentialsArray: string[] = [];\n\t\t\tif (\n\t\t\t\tcredentials &&\n\t\t\t\tsettingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Sharing)\n\t\t\t) {\n\t\t\t\tObject.values(credentials).forEach((credential) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tcredential.id &&\n\t\t\t\t\t\tusedCredentials[credential.id] &&\n\t\t\t\t\t\t!usedCredentials[credential.id].currentUserHasAccess\n\t\t\t\t\t) {\n\t\t\t\t\t\tforeignCredentialsArray.push(credential.id);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn foreignCredentialsArray;\n\t\t});\n\n\t\tconst hasForeignCredential = computed(() => foreignCredentials.value.length > 0);\n\n\t\t//methods\n\n\t\tconst setIsTooltipVisible = ({ isTooltipVisible }: { isTooltipVisible: boolean }) => {\n\t\t\tpinDataDiscoveryTooltipVisible.value = isTooltipVisible;\n\t\t};\n\n\t\tconst onKeyDown = (e: KeyboardEvent) => {\n\t\t\tif (e.key === 's' && deviceSupport.isCtrlKeyPressed(e)) {\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tif (props.readOnly) return;\n\n\t\t\t\temit('saveKeyboardShortcut', e);\n\t\t\t}\n\t\t};\n\n\t\tconst onInputItemHover = (e: { itemIndex: number; outputIndex: number } | null) => {\n\t\t\tif (e === null || !inputNodeName.value || !isPairedItemHoveringEnabled.value) {\n\t\t\t\tndvStore.setHoveringItem(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst item = {\n\t\t\t\tnodeName: inputNodeName.value,\n\t\t\t\trunIndex: inputRun.value,\n\t\t\t\toutputIndex: e.outputIndex,\n\t\t\t\titemIndex: e.itemIndex,\n\t\t\t};\n\t\t\tndvStore.setHoveringItem(item);\n\t\t};\n\n\t\tconst onInputTableMounted = (e: { avgRowHeight: number }) => {\n\t\t\tavgInputRowHeight.value = e.avgRowHeight;\n\t\t};\n\n\t\tconst onWorkflowActivate = () => {\n\t\t\tndvStore.activeNodeName = null;\n\t\t\tsetTimeout(() => {\n\t\t\t\tvoid workflowActivate.activateCurrentWorkflow('ndv');\n\t\t\t}, 1000);\n\t\t};\n\n\t\tconst onOutputItemHover = (e: { itemIndex: number; outputIndex: number }) => {\n\t\t\tif (e === null || !activeNode.value || !isPairedItemHoveringEnabled.value) {\n\t\t\t\tndvStore.setHoveringItem(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst item: TargetItem = {\n\t\t\t\tnodeName: activeNode.value?.name,\n\t\t\t\trunIndex: outputRun.value,\n\t\t\t\toutputIndex: e.outputIndex,\n\t\t\t\titemIndex: e.itemIndex,\n\t\t\t};\n\t\t\tndvStore.setHoveringItem(item);\n\t\t};\n\n\t\tconst onFeatureRequestClick = () => {\n\t\t\twindow.open(featureRequestUrl.value, '_blank');\n\t\t\tif (activeNode.value) {\n\t\t\t\ttelemetry.track('User clicked ndv link', {\n\t\t\t\t\tnode_type: activeNode.value.type,\n\t\t\t\t\tworkflow_id: workflowsStore.workflowId,\n\t\t\t\t\tpush_ref: pushRef.value,\n\t\t\t\t\tpane: NodeConnectionType.Main,\n\t\t\t\t\ttype: 'i-wish-this-node-would',\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tconst onDragEnd = (e: { windowWidth: number; position: number }) => {\n\t\t\tisDragging.value = false;\n\t\t\ttelemetry.track('User moved parameters pane', {\n\t\t\t\t// example method for tracking\n\t\t\t\twindow_width: e.windowWidth,\n\t\t\t\tstart_position: mainPanelPosition.value,\n\t\t\t\tend_position: e.position,\n\t\t\t\tnode_type: activeNodeType.value ? activeNodeType.value.name : '',\n\t\t\t\tpush_ref: pushRef.value,\n\t\t\t\tworkflow_id: workflowsStore.workflowId,\n\t\t\t});\n\t\t\tmainPanelPosition.value = e.position;\n\t\t};\n\n\t\tconst onDragStart = (e: { position: number }) => {\n\t\t\tisDragging.value = true;\n\t\t\tmainPanelPosition.value = e.position;\n\t\t};\n\n\t\tconst onPanelsInit = (e: { position: number }) => {\n\t\t\tmainPanelPosition.value = e.position;\n\t\t};\n\n\t\tconst onLinkRunToOutput = () => {\n\t\t\tisLinkingEnabled.value = true;\n\t\t\ttrackLinking('output');\n\t\t};\n\n\t\tconst onUnlinkRun = (pane: string) => {\n\t\t\trunInputIndex.value = runOutputIndex.value;\n\t\t\tisLinkingEnabled.value = false;\n\t\t\ttrackLinking(pane);\n\t\t};\n\n\t\tconst onNodeExecute = () => {\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (!activeNode.value || !workflowRunning.value) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\ttriggerWaitingWarningEnabled.value = true;\n\t\t\t}, 1000);\n\t\t};\n\n\t\tconst openSettings = () => {\n\t\t\tsettingsEventBus.emit('openSettings');\n\t\t};\n\n\t\tconst trackLinking = (pane: string) => {\n\t\t\ttelemetry.track('User changed ndv run linking', {\n\t\t\t\tnode_type: activeNodeType.value ? activeNodeType.value.name : '',\n\t\t\t\tpush_ref: pushRef.value,\n\t\t\t\tlinked: linked.value,\n\t\t\t\tpane,\n\t\t\t});\n\t\t};\n\n\t\tconst onLinkRunToInput = () => {\n\t\t\trunOutputIndex.value = runInputIndex.value;\n\t\t\tisLinkingEnabled.value = true;\n\t\t\ttrackLinking('input');\n\t\t};\n\n\t\tconst valueChanged = (parameterData: IUpdateInformation) => {\n\t\t\temit('valueChanged', parameterData);\n\t\t};\n\n\t\tconst nodeTypeSelected = (nodeTypeName: string) => {\n\t\t\temit('nodeTypeSelected', nodeTypeName);\n\t\t};\n\n\t\tconst onSwitchSelectedNode = (nodeTypeName: string) => {\n\t\t\temit('switchSelectedNode', nodeTypeName);\n\t\t};\n\n\t\tconst onOpenConnectionNodeCreator = (nodeTypeName: string, connectionType: ConnectionTypes) => {\n\t\t\temit('openConnectionNodeCreator', nodeTypeName, connectionType);\n\t\t};\n\n\t\tconst close = async () => {\n\t\t\tif (isDragging.value) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tactiveNode.value &&\n\t\t\t\t(typeof activeNodeType.value?.outputs === 'string' ||\n\t\t\t\t\ttypeof activeNodeType.value?.inputs === 'string' ||\n\t\t\t\t\tredrawRequired.value)\n\t\t\t) {\n\t\t\t\tconst nodeName = activeNode.value.name;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\temit('redrawNode', nodeName);\n\t\t\t\t}, 1);\n\t\t\t}\n\n\t\t\tif (outputPanelEditMode.value.enabled && activeNode.value) {\n\t\t\t\tconst shouldPinDataBeforeClosing = await message.confirm(\n\t\t\t\t\t'',\n\t\t\t\t\ti18n.baseText('ndv.pinData.beforeClosing.title'),\n\t\t\t\t\t{\n\t\t\t\t\t\tconfirmButtonText: i18n.baseText('ndv.pinData.beforeClosing.confirm'),\n\t\t\t\t\t\tcancelButtonText: i18n.baseText('ndv.pinData.beforeClosing.cancel'),\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tif (shouldPinDataBeforeClosing === MODAL_CONFIRM) {\n\t\t\t\t\tconst { value } = outputPanelEditMode.value;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpinnedData.setData(jsonParse(value), 'on-ndv-close-modal');\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.error(error);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tndvStore.setOutputPanelEditModeEnabled(false);\n\t\t\t}\n\n\t\t\tawait externalHooks.run('dataDisplay.nodeEditingFinished');\n\t\t\ttelemetry.track('User closed node modal', {\n\t\t\t\tnode_type: activeNodeType.value ? activeNodeType.value?.name : '',\n\t\t\t\tpush_ref: pushRef.value,\n\t\t\t\tworkflow_id: workflowsStore.workflowId,\n\t\t\t});\n\t\t\ttriggerWaitingWarningEnabled.value = false;\n\t\t\tndvStore.activeNodeName = null;\n\t\t\tndvStore.resetNDVPushRef();\n\t\t};\n\n\t\tconst trackRunChange = (run: number, pane: string) => {\n\t\t\ttelemetry.track('User changed ndv run dropdown', {\n\t\t\t\tpush_ref: pushRef.value,\n\t\t\t\trun_index: run,\n\t\t\t\tnode_type: activeNodeType.value ? activeNodeType.value?.name : '',\n\t\t\t\tpane,\n\t\t\t});\n\t\t};\n\n\t\tconst onRunOutputIndexChange = (run: number) => {\n\t\t\trunOutputIndex.value = run;\n\t\t\ttrackRunChange(run, 'output');\n\t\t};\n\n\t\tconst onRunInputIndexChange = (run: number) => {\n\t\t\trunInputIndex.value = run;\n\t\t\tif (linked.value) {\n\t\t\t\trunOutputIndex.value = run;\n\t\t\t}\n\t\t\ttrackRunChange(run, 'input');\n\t\t};\n\n\t\tconst onOutputTableMounted = (e: { avgRowHeight: number }) => {\n\t\t\tavgOutputRowHeight.value = e.avgRowHeight;\n\t\t};\n\n\t\tconst onInputNodeChange = (value: string, index: number) => {\n\t\t\trunInputIndex.value = -1;\n\t\t\tisLinkingEnabled.value = true;\n\t\t\tselectedInput.value = value;\n\n\t\t\ttelemetry.track('User changed ndv input dropdown', {\n\t\t\t\tnode_type: activeNode.value ? activeNode.value.type : '',\n\t\t\t\tpush_ref: pushRef.value,\n\t\t\t\tworkflow_id: workflowsStore.workflowId,\n\t\t\t\tselection_value: index,\n\t\t\t\tinput_node_type: inputNode.value ? inputNode.value.type : '',\n\t\t\t});\n\t\t};\n\n\t\tconst onStopExecution = () => {\n\t\t\temit('stopExecution');\n\t\t};\n\n\t\tconst activateInputPane = () => {\n\t\t\tisInputPaneActive.value = true;\n\t\t\tisOutputPaneActive.value = false;\n\t\t};\n\n\t\tconst activateOutputPane = () => {\n\t\t\tisInputPaneActive.value = false;\n\t\t\tisOutputPaneActive.value = true;\n\t\t};\n\n\t\tconst onSearch = (search: string) => {\n\t\t\tisPairedItemHoveringEnabled.value = !search;\n\t\t};\n\n\t\t//watchers\n\n\t\twatch(\n\t\t\tactiveNode,\n\t\t\t(node, oldNode) => {\n\t\t\t\tif (node && node.name !== oldNode?.name && !isActiveStickyNode.value) {\n\t\t\t\t\trunInputIndex.value = -1;\n\t\t\t\t\trunOutputIndex.value = -1;\n\t\t\t\t\tisLinkingEnabled.value = true;\n\t\t\t\t\tselectedInput.value = undefined;\n\t\t\t\t\ttriggerWaitingWarningEnabled.value = false;\n\t\t\t\t\tavgOutputRowHeight.value = 0;\n\t\t\t\t\tavgInputRowHeight.value = 0;\n\n\t\t\t\t\tsetTimeout(() => ndvStore.setNDVPushRef(), 0);\n\n\t\t\t\t\tif (!activeNodeType.value) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvoid externalHooks.run('dataDisplay.nodeTypeChanged', {\n\t\t\t\t\t\tnodeSubtitle: nodeHelpers.getNodeSubtitle(\n\t\t\t\t\t\t\tnode,\n\t\t\t\t\t\t\tactiveNodeType.value,\n\t\t\t\t\t\t\tworkflowHelpers.getCurrentWorkflow(),\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tif (activeNode.value) {\n\t\t\t\t\t\t\tconst outgoingConnections = workflowsStore.outgoingConnectionsByNodeName(\n\t\t\t\t\t\t\t\tactiveNode.value?.name,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\ttelemetry.track('User opened node modal', {\n\t\t\t\t\t\t\t\tnode_type: activeNodeType.value ? activeNodeType.value?.name : '',\n\t\t\t\t\t\t\t\tworkflow_id: workflowsStore.workflowId,\n\t\t\t\t\t\t\t\tpush_ref: pushRef.value,\n\t\t\t\t\t\t\t\tis_editable: !hasForeignCredential.value,\n\t\t\t\t\t\t\t\tparameters_pane_position: mainPanelPosition.value,\n\t\t\t\t\t\t\t\tinput_first_connector_runs: maxInputRun.value,\n\t\t\t\t\t\t\t\toutput_first_connector_runs: maxOutputRun.value,\n\t\t\t\t\t\t\t\tselected_view_inputs: isTriggerNode.value\n\t\t\t\t\t\t\t\t\t? 'trigger'\n\t\t\t\t\t\t\t\t\t: ndvStore.inputPanelDisplayMode,\n\t\t\t\t\t\t\t\tselected_view_outputs: ndvStore.outputPanelDisplayMode,\n\t\t\t\t\t\t\t\tinput_connectors: parentNodes.value.length,\n\t\t\t\t\t\t\t\toutput_connectors: outgoingConnections?.main?.length,\n\t\t\t\t\t\t\t\tinput_displayed_run_index: inputRun.value,\n\t\t\t\t\t\t\t\toutput_displayed_run_index: outputRun.value,\n\t\t\t\t\t\t\t\tdata_pinning_tooltip_presented: pinDataDiscoveryTooltipVisible.value,\n\t\t\t\t\t\t\t\tinput_displayed_row_height_avg: avgInputRowHeight.value,\n\t\t\t\t\t\t\t\toutput_displayed_row_height_avg: avgOutputRowHeight.value,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 2000); // wait for RunData to mount and present pindata discovery tooltip\n\t\t\t\t}\n\t\t\t\tif (window.top && !isActiveStickyNode.value) {\n\t\t\t\t\twindow.top.postMessage(JSON.stringify({ command: node ? 'openNDV' : 'closeNDV' }), '*');\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ immediate: true },\n\t\t);\n\t\twatch(maxOutputRun, () => {\n\t\t\trunOutputIndex.value = -1;\n\t\t});\n\n\t\twatch(maxInputRun, () => {\n\t\t\trunInputIndex.value = -1;\n\t\t});\n\n\t\twatch(inputNodeName, (nodeName) => {\n\t\t\tsetTimeout(() => {\n\t\t\t\tndvStore.setInputNodeName(nodeName);\n\t\t\t}, 0);\n\t\t});\n\n\t\twatch(inputRun, (inputRun) => {\n\t\t\tsetTimeout(() => {\n\t\t\t\tndvStore.setInputRunIndex(inputRun);\n\t\t\t}, 0);\n\t\t});\n\n\t\tonMounted(() => {\n\t\t\tdataPinningEventBus.on('data-pinning-discovery', setIsTooltipVisible);\n\t\t});\n\n\t\tonBeforeUnmount(() => {\n\t\t\tdataPinningEventBus.off('data-pinning-discovery', setIsTooltipVisible);\n\t\t});\n\n\t\treturn {\n\t\t\texternalHooks,\n\t\t\tnodeHelpers,\n\t\t\tpinnedData,\n\t\t\tworkflowHelpers,\n\t\t\tworkflowActivate,\n\t\t\tredrawRequired,\n\t\t\tisInputPaneActive,\n\t\t\tisDragging,\n\t\t\tactiveNodeType,\n\t\t\tpushRef,\n\t\t\tworkflowRunning,\n\t\t\tshowTriggerWaitingWarning,\n\t\t\tactiveNode,\n\t\t\tisExecutableTriggerNode,\n\t\t\tshowTriggerPanel,\n\t\t\thasOutputConnection,\n\t\t\tblockUi,\n\t\t\tisActiveStickyNode,\n\t\t\tisTriggerNode,\n\t\t\tworkflow,\n\t\t\tcanLinkRuns,\n\t\t\tinputRun,\n\t\t\tlinked,\n\t\t\tinputNodeName,\n\t\t\thasForeignCredential,\n\t\t\toutputRun,\n\t\t\tisOutputPaneActive,\n\t\t\tforeignCredentials,\n\t\t\tfeatureRequestUrl,\n\t\t\tsettingsEventBus,\n\t\t\tinputPanelMargin,\n\t\t\tnodeTypeSelected,\n\t\t\tonOutputItemHover,\n\t\t\tonOutputTableMounted,\n\t\t\tonInputTableMounted,\n\t\t\tonRunOutputIndexChange,\n\t\t\tonStopExecution,\n\t\t\tactivateInputPane,\n\t\t\tactivateOutputPane,\n\t\t\tonSearch,\n\t\t\tonInputNodeChange,\n\t\t\tonRunInputIndexChange,\n\t\t\tonLinkRunToInput,\n\t\t\tvalueChanged,\n\t\t\tonSwitchSelectedNode,\n\t\t\tonOpenConnectionNodeCreator,\n\t\t\tclose,\n\t\t\tonKeyDown,\n\t\t\tonInputItemHover,\n\t\t\tonWorkflowActivate,\n\t\t\tonFeatureRequestClick,\n\t\t\tonDragEnd,\n\t\t\tonDragStart,\n\t\t\tonPanelsInit,\n\t\t\tonLinkRunToOutput,\n\t\t\tonUnlinkRun,\n\t\t\tonNodeExecute,\n\t\t\topenSettings,\n\t\t};\n\t},\n});\n</script>\n\n<style lang=\"scss\">\n// Hide notice(.ndv-connection-hint-notice) warning when node has output connection\n[data-has-output-connection='true'] .ndv-connection-hint-notice {\n\tdisplay: none;\n}\n.ndv-wrapper {\n\toverflow: visible;\n\tmargin-top: 0;\n}\n\n.data-display-wrapper {\n\theight: calc(100% - var(--spacing-l)) !important;\n\tmargin-top: var(--spacing-xl) !important;\n\tmargin-bottom: var(--spacing-xl) !important;\n\twidth: 100%;\n\tbackground: none;\n\tborder: none;\n\n\t.el-dialog__header {\n\t\tpadding: 0 !important;\n\t}\n\n\t.el-dialog__body {\n\t\tpadding: 0 !important;\n\t\theight: 100%;\n\t\tmin-height: 400px;\n\t\toverflow: visible;\n\t\tborder-radius: 8px;\n\t}\n}\n\n.data-display {\n\theight: 100%;\n\twidth: 100%;\n\tdisplay: flex;\n}\n</style>\n\n<style lang=\"scss\" module>\n$main-panel-width: 360px;\n\n.modalBackground {\n\theight: 100%;\n\twidth: 100%;\n}\n\n.triggerWarning {\n\tmax-width: 180px;\n}\n\n.backToCanvas {\n\tposition: fixed;\n\ttop: var(--spacing-xs);\n\tleft: var(--spacing-l);\n\n\tspan {\n\t\tcolor: var(--color-ndv-back-font);\n\t}\n\n\t&:hover {\n\t\tcursor: pointer;\n\t}\n\n\t> * {\n\t\tmargin-right: var(--spacing-3xs);\n\t}\n}\n\n@media (min-width: $breakpoint-lg) {\n\t.backToCanvas {\n\t\ttop: var(--spacing-xs);\n\t\tleft: var(--spacing-m);\n\t}\n}\n\n.featureRequest {\n\tposition: absolute;\n\tbottom: var(--spacing-4xs);\n\tleft: calc(100% + var(--spacing-s));\n\tcolor: var(--color-feature-request-font);\n\tfont-size: var(--font-size-2xs);\n\twhite-space: nowrap;\n\n\t* {\n\t\tmargin-right: var(--spacing-3xs);\n\t}\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { type ContextMenuAction, useContextMenu } from '@/composables/useContextMenu';\nimport { N8nActionDropdown } from 'n8n-design-system';\nimport type { INode } from 'n8n-workflow';\nimport { watch, ref } from 'vue';\n\nconst contextMenu = useContextMenu();\nconst { position, isOpen, actions, target } = contextMenu;\nconst dropdown = ref<InstanceType<typeof N8nActionDropdown>>();\nconst emit = defineEmits<{ (event: 'action', action: ContextMenuAction, nodes: INode[]): void }>();\n\nwatch(\n\tisOpen,\n\t() => {\n\t\tif (isOpen) {\n\t\t\tdropdown.value?.open();\n\t\t} else {\n\t\t\tdropdown.value?.close();\n\t\t}\n\t},\n\t{ flush: 'post' },\n);\n\nfunction onActionSelect(item: string) {\n\tconst action = item as ContextMenuAction;\n\tcontextMenu._dispatchAction(action);\n\temit('action', action, contextMenu.targetNodes.value);\n}\n\nfunction onVisibleChange(open: boolean) {\n\tif (!open) {\n\t\tcontextMenu.close();\n\t}\n}\n</script>\n\n<template>\n\t<Teleport v-if=\"isOpen\" to=\"body\">\n\t\t<div\n\t\t\t:class=\"$style.contextMenu\"\n\t\t\t:style=\"{\n\t\t\t\tleft: `${position[0]}px`,\n\t\t\t\ttop: `${position[1]}px`,\n\t\t\t}\"\n\t\t>\n\t\t\t<N8nActionDropdown\n\t\t\t\tref=\"dropdown\"\n\t\t\t\t:items=\"actions\"\n\t\t\t\tplacement=\"bottom-start\"\n\t\t\t\tdata-test-id=\"context-menu\"\n\t\t\t\t:hide-arrow=\"target.source !== 'node-button'\"\n\t\t\t\t@select=\"onActionSelect\"\n\t\t\t\t@visible-change=\"onVisibleChange\"\n\t\t\t>\n\t\t\t\t<template #activator>\n\t\t\t\t\t<div :class=\"$style.activator\"></div>\n\t\t\t\t</template>\n\t\t\t</N8nActionDropdown>\n\t\t</div>\n\t</Teleport>\n</template>\n\n<style module lang=\"scss\">\n.contextMenu {\n\tposition: fixed;\n}\n\n.activator {\n\tpointer-events: none;\n\topacity: 0;\n}\n</style>\n","import { defineComponent } from 'vue';\nimport type { PropType } from 'vue';\nimport { mapStores } from 'pinia';\n\nimport type { INodeUi } from '@/Interface';\nimport {\n\tNO_OP_NODE_TYPE,\n\tNODE_CONNECTION_TYPE_ALLOW_MULTIPLE,\n\tNODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS,\n\tNODE_MIN_INPUT_ITEMS_COUNT,\n} from '@/constants';\n\nimport { NodeHelpers, NodeConnectionType } from 'n8n-workflow';\nimport type {\n\tConnectionTypes,\n\tINodeInputConfiguration,\n\tINodeTypeDescription,\n\tINodeOutputConfiguration,\n\tWorkflow,\n} from 'n8n-workflow';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport type { BrowserJsPlumbInstance } from '@jsplumb/browser-ui';\nimport type { Endpoint, EndpointOptions } from '@jsplumb/core';\nimport * as NodeViewUtils from '@/utils/nodeViewUtils';\nimport { useHistoryStore } from '@/stores/history.store';\nimport { useCanvasStore } from '@/stores/canvas.store';\nimport type { EndpointSpec } from '@jsplumb/common';\nimport { useDeviceSupport } from 'n8n-design-system';\nimport type { N8nEndpointLabelLength } from '@/plugins/jsplumb/N8nPlusEndpointType';\n\nconst createAddInputEndpointSpec = (\n\tconnectionName: NodeConnectionType,\n\tcolor: string,\n): EndpointSpec => {\n\tconst multiple = NODE_CONNECTION_TYPE_ALLOW_MULTIPLE.includes(connectionName);\n\n\treturn {\n\t\ttype: 'N8nAddInput',\n\t\toptions: {\n\t\t\twidth: 24,\n\t\t\theight: 72,\n\t\t\tcolor,\n\t\t\tmultiple,\n\t\t},\n\t};\n};\n\nconst createDiamondOutputEndpointSpec = (): EndpointSpec => ({\n\ttype: 'Rectangle',\n\toptions: {\n\t\theight: 10,\n\t\twidth: 10,\n\t\tcssClass: 'diamond-output-endpoint',\n\t},\n});\n\nconst getEndpointLabelLength = (length: number): N8nEndpointLabelLength => {\n\tif (length <= 2) return 'small';\n\telse if (length <= 6) return 'medium';\n\treturn 'large';\n};\n\nexport const nodeBase = defineComponent({\n\tdata() {\n\t\treturn {\n\t\t\tinputs: [] as Array<ConnectionTypes | INodeInputConfiguration>,\n\t\t\toutputs: [] as Array<ConnectionTypes | INodeOutputConfiguration>,\n\t\t};\n\t},\n\tmounted() {\n\t\t// Initialize the node\n\t\tif (this.data !== null) {\n\t\t\ttry {\n\t\t\t\tthis.__addNode(this.data);\n\t\t\t} catch (error) {\n\t\t\t\t// This breaks when new nodes are loaded into store but workflow tab is not currently active\n\t\t\t\t// Shouldn't affect anything\n\t\t\t}\n\t\t}\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useUIStore, useCanvasStore, useWorkflowsStore, useHistoryStore),\n\t\tdata(): INodeUi | null {\n\t\t\treturn this.workflowsStore.getNodeByName(this.name);\n\t\t},\n\t\tnodeId(): string {\n\t\t\treturn this.data?.id || '';\n\t\t},\n\t},\n\tprops: {\n\t\tname: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tinstance: {\n\t\t\ttype: Object as PropType<BrowserJsPlumbInstance>,\n\t\t},\n\t\tisReadOnly: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tisActive: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\thideActions: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tdisableSelecting: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tshowCustomTooltip: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tworkflow: {\n\t\t\ttype: Object as () => Workflow,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tmethods: {\n\t\t__addEndpointTestingData(endpoint: Endpoint, type: string, inputIndex: number) {\n\t\t\tif (window?.Cypress && 'canvas' in endpoint.endpoint) {\n\t\t\t\tconst canvas = endpoint.endpoint.canvas;\n\t\t\t\tthis.instance.setAttribute(canvas, 'data-endpoint-name', this.data.name);\n\t\t\t\tthis.instance.setAttribute(canvas, 'data-input-index', inputIndex.toString());\n\t\t\t\tthis.instance.setAttribute(canvas, 'data-endpoint-type', type);\n\t\t\t}\n\t\t},\n\t\t__addInputEndpoints(node: INodeUi, nodeTypeData: INodeTypeDescription) {\n\t\t\t// Add Inputs\n\t\t\tconst rootTypeIndexData: {\n\t\t\t\t[key: string]: number;\n\t\t\t} = {};\n\t\t\tconst typeIndexData: {\n\t\t\t\t[key: string]: number;\n\t\t\t} = {};\n\n\t\t\tconst inputs: Array<ConnectionTypes | INodeInputConfiguration> =\n\t\t\t\tNodeHelpers.getNodeInputs(this.workflow, this.data!, nodeTypeData) || [];\n\t\t\tthis.inputs = inputs;\n\n\t\t\tconst sortedInputs = [...inputs];\n\t\t\tsortedInputs.sort((a, b) => {\n\t\t\t\tif (typeof a === 'string') {\n\t\t\t\t\treturn 1;\n\t\t\t\t} else if (typeof b === 'string') {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\n\t\t\t\tif (a.required && !b.required) {\n\t\t\t\t\treturn -1;\n\t\t\t\t} else if (!a.required && b.required) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\n\t\t\t\treturn 0;\n\t\t\t});\n\n\t\t\tsortedInputs.forEach((value, i) => {\n\t\t\t\tlet inputConfiguration: INodeInputConfiguration;\n\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\tinputConfiguration = {\n\t\t\t\t\t\ttype: value,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tinputConfiguration = value;\n\t\t\t\t}\n\n\t\t\t\tconst inputName: ConnectionTypes = inputConfiguration.type;\n\n\t\t\t\tconst rootCategoryInputName =\n\t\t\t\t\tinputName === NodeConnectionType.Main ? NodeConnectionType.Main : 'other';\n\n\t\t\t\t// Increment the index for inputs with current name\n\t\t\t\tif (rootTypeIndexData.hasOwnProperty(rootCategoryInputName)) {\n\t\t\t\t\trootTypeIndexData[rootCategoryInputName]++;\n\t\t\t\t} else {\n\t\t\t\t\trootTypeIndexData[rootCategoryInputName] = 0;\n\t\t\t\t}\n\n\t\t\t\tif (typeIndexData.hasOwnProperty(inputName)) {\n\t\t\t\t\ttypeIndexData[inputName]++;\n\t\t\t\t} else {\n\t\t\t\t\ttypeIndexData[inputName] = 0;\n\t\t\t\t}\n\n\t\t\t\tconst rootTypeIndex = rootTypeIndexData[rootCategoryInputName];\n\t\t\t\tconst typeIndex = typeIndexData[inputName];\n\n\t\t\t\tconst inputsOfSameRootType = inputs.filter((inputData) => {\n\t\t\t\t\tconst thisInputName: string = typeof inputData === 'string' ? inputData : inputData.type;\n\t\t\t\t\treturn inputName === NodeConnectionType.Main\n\t\t\t\t\t\t? thisInputName === NodeConnectionType.Main\n\t\t\t\t\t\t: thisInputName !== NodeConnectionType.Main;\n\t\t\t\t});\n\n\t\t\t\tconst nonMainInputs = inputsOfSameRootType.filter((inputData) => {\n\t\t\t\t\treturn inputData !== NodeConnectionType.Main;\n\t\t\t\t});\n\t\t\t\tconst requiredNonMainInputs = nonMainInputs.filter((inputData) => {\n\t\t\t\t\treturn typeof inputData !== 'string' && inputData.required;\n\t\t\t\t});\n\t\t\t\tconst optionalNonMainInputs = nonMainInputs.filter((inputData) => {\n\t\t\t\t\treturn typeof inputData !== 'string' && !inputData.required;\n\t\t\t\t});\n\t\t\t\tconst spacerIndexes = this.getSpacerIndexes(\n\t\t\t\t\trequiredNonMainInputs.length,\n\t\t\t\t\toptionalNonMainInputs.length,\n\t\t\t\t);\n\n\t\t\t\t// Get the position of the anchor depending on how many it has\n\t\t\t\tconst anchorPosition = NodeViewUtils.getAnchorPosition(\n\t\t\t\t\tinputName,\n\t\t\t\t\t'input',\n\t\t\t\t\tinputsOfSameRootType.length,\n\t\t\t\t\tspacerIndexes,\n\t\t\t\t)[rootTypeIndex];\n\n\t\t\t\tconst scope = NodeViewUtils.getEndpointScope(inputName as NodeConnectionType);\n\n\t\t\t\tconst newEndpointData: EndpointOptions = {\n\t\t\t\t\tuuid: NodeViewUtils.getInputEndpointUUID(this.nodeId, inputName, typeIndex),\n\t\t\t\t\tanchor: anchorPosition,\n\t\t\t\t\t// We potentially want to change that in the future to allow people to dynamically\n\t\t\t\t\t// activate and deactivate connected nodes\n\t\t\t\t\tmaxConnections: inputConfiguration.maxConnections ?? -1,\n\t\t\t\t\tendpoint: 'Rectangle',\n\t\t\t\t\tpaintStyle: NodeViewUtils.getInputEndpointStyle(\n\t\t\t\t\t\tnodeTypeData,\n\t\t\t\t\t\t'--color-foreground-xdark',\n\t\t\t\t\t\tinputName,\n\t\t\t\t\t),\n\t\t\t\t\thoverPaintStyle: NodeViewUtils.getInputEndpointStyle(\n\t\t\t\t\t\tnodeTypeData,\n\t\t\t\t\t\t'--color-primary',\n\t\t\t\t\t\tinputName,\n\t\t\t\t\t),\n\t\t\t\t\tscope: NodeViewUtils.getScope(scope),\n\t\t\t\t\tsource: inputName !== NodeConnectionType.Main,\n\t\t\t\t\ttarget: !this.isReadOnly && inputs.length > 1, // only enabled for nodes with multiple inputs.. otherwise attachment handled by connectionDrag event in NodeView,\n\t\t\t\t\tparameters: {\n\t\t\t\t\t\tconnection: 'target',\n\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\ttype: inputName,\n\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t},\n\t\t\t\t\tenabled: !this.isReadOnly, // enabled in default case to allow dragging\n\t\t\t\t\tcssClass: 'rect-input-endpoint',\n\t\t\t\t\tdragAllowedWhenFull: true,\n\t\t\t\t\thoverClass: 'rect-input-endpoint-hover',\n\t\t\t\t\t...this.__getInputConnectionStyle(inputName, nodeTypeData),\n\t\t\t\t};\n\n\t\t\t\tconst endpoint = this.instance?.addEndpoint(\n\t\t\t\t\tthis.$refs[this.data.name] as Element,\n\t\t\t\t\tnewEndpointData,\n\t\t\t\t) as Endpoint;\n\t\t\t\tthis.__addEndpointTestingData(endpoint, 'input', typeIndex);\n\t\t\t\tif (inputConfiguration.displayName || nodeTypeData.inputNames?.[i]) {\n\t\t\t\t\t// Apply input names if they got set\n\t\t\t\t\tendpoint.addOverlay(\n\t\t\t\t\t\tNodeViewUtils.getInputNameOverlay(\n\t\t\t\t\t\t\tinputConfiguration.displayName || nodeTypeData.inputNames[i],\n\t\t\t\t\t\t\tinputName,\n\t\t\t\t\t\t\tinputConfiguration.required,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (!Array.isArray(endpoint)) {\n\t\t\t\t\tendpoint.__meta = {\n\t\t\t\t\t\tnodeName: node.name,\n\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t\ttotalEndpoints: inputsOfSameRootType.length,\n\t\t\t\t\t\tnodeType: node.type,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// TODO: Activate again if it makes sense. Currently makes problems when removing\n\t\t\t\t// connection on which the input has a name. It does not get hidden because\n\t\t\t\t// the endpoint to which it connects when letting it go over the node is\n\t\t\t\t// different to the regular one (have different ids). So that seems to make\n\t\t\t\t// problems when hiding the input-name.\n\n\t\t\t\t// if (index === 0 && inputName === NodeConnectionType.Main) {\n\t\t\t\t// \t// Make the first main-input the default one to connect to when connection gets dropped on node\n\t\t\t\t// \tthis.instance.makeTarget(this.nodeId, newEndpointData);\n\t\t\t\t// }\n\t\t\t});\n\t\t\tif (sortedInputs.length === 0) {\n\t\t\t\tthis.instance.manage(this.$refs[this.data.name] as Element);\n\t\t\t}\n\t\t},\n\t\tgetSpacerIndexes(\n\t\t\tleftGroupItemsCount: number,\n\t\t\trightGroupItemsCount: number,\n\t\t\tinsertSpacerBetweenGroups = NODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS,\n\t\t\tminItemsCount = NODE_MIN_INPUT_ITEMS_COUNT,\n\t\t): number[] {\n\t\t\tconst spacerIndexes = [];\n\n\t\t\tif (leftGroupItemsCount > 0 && rightGroupItemsCount > 0) {\n\t\t\t\tif (insertSpacerBetweenGroups) {\n\t\t\t\t\tspacerIndexes.push(leftGroupItemsCount);\n\t\t\t\t} else if (leftGroupItemsCount + rightGroupItemsCount < minItemsCount) {\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet spacerIndex = leftGroupItemsCount;\n\t\t\t\t\t\tspacerIndex < minItemsCount - rightGroupItemsCount;\n\t\t\t\t\t\tspacerIndex++\n\t\t\t\t\t) {\n\t\t\t\t\t\tspacerIndexes.push(spacerIndex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (\n\t\t\t\t\tleftGroupItemsCount > 0 &&\n\t\t\t\t\tleftGroupItemsCount < minItemsCount &&\n\t\t\t\t\trightGroupItemsCount === 0\n\t\t\t\t) {\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet spacerIndex = 0;\n\t\t\t\t\t\tspacerIndex < minItemsCount - leftGroupItemsCount;\n\t\t\t\t\t\tspacerIndex++\n\t\t\t\t\t) {\n\t\t\t\t\t\tspacerIndexes.push(spacerIndex + leftGroupItemsCount);\n\t\t\t\t\t}\n\t\t\t\t} else if (\n\t\t\t\t\tleftGroupItemsCount === 0 &&\n\t\t\t\t\trightGroupItemsCount > 0 &&\n\t\t\t\t\trightGroupItemsCount < minItemsCount\n\t\t\t\t) {\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet spacerIndex = 0;\n\t\t\t\t\t\tspacerIndex < minItemsCount - rightGroupItemsCount;\n\t\t\t\t\t\tspacerIndex++\n\t\t\t\t\t) {\n\t\t\t\t\t\tspacerIndexes.push(spacerIndex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn spacerIndexes;\n\t\t},\n\t\t__addOutputEndpoints(node: INodeUi, nodeTypeData: INodeTypeDescription) {\n\t\t\tconst rootTypeIndexData: {\n\t\t\t\t[key: string]: number;\n\t\t\t} = {};\n\t\t\tconst typeIndexData: {\n\t\t\t\t[key: string]: number;\n\t\t\t} = {};\n\n\t\t\tthis.outputs = NodeHelpers.getNodeOutputs(this.workflow, this.data, nodeTypeData) || [];\n\n\t\t\t// TODO: There are still a lot of references of \"main\" in NodesView and\n\t\t\t// other locations. So assume there will be more problems\n\t\t\tlet maxLabelLength = 0;\n\t\t\tconst outputConfigurations: INodeOutputConfiguration[] = [];\n\t\t\tthis.outputs.forEach((value, i) => {\n\t\t\t\tlet outputConfiguration: INodeOutputConfiguration;\n\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\toutputConfiguration = {\n\t\t\t\t\t\ttype: value,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\toutputConfiguration = value;\n\t\t\t\t}\n\t\t\t\tif (nodeTypeData.outputNames?.[i]) {\n\t\t\t\t\toutputConfiguration.displayName = nodeTypeData.outputNames[i];\n\t\t\t\t}\n\n\t\t\t\tif (outputConfiguration.displayName) {\n\t\t\t\t\tmaxLabelLength =\n\t\t\t\t\t\toutputConfiguration.displayName.length > maxLabelLength\n\t\t\t\t\t\t\t? outputConfiguration.displayName.length\n\t\t\t\t\t\t\t: maxLabelLength;\n\t\t\t\t}\n\n\t\t\t\toutputConfigurations.push(outputConfiguration);\n\t\t\t});\n\n\t\t\tconst endpointLabelLength = getEndpointLabelLength(maxLabelLength);\n\n\t\t\tthis.outputs.forEach((value, i) => {\n\t\t\t\tconst outputConfiguration = outputConfigurations[i];\n\n\t\t\t\tconst outputName: ConnectionTypes = outputConfiguration.type;\n\n\t\t\t\tconst rootCategoryOutputName =\n\t\t\t\t\toutputName === NodeConnectionType.Main ? NodeConnectionType.Main : 'other';\n\n\t\t\t\t// Increment the index for outputs with current name\n\t\t\t\tif (rootTypeIndexData.hasOwnProperty(rootCategoryOutputName)) {\n\t\t\t\t\trootTypeIndexData[rootCategoryOutputName]++;\n\t\t\t\t} else {\n\t\t\t\t\trootTypeIndexData[rootCategoryOutputName] = 0;\n\t\t\t\t}\n\n\t\t\t\tif (typeIndexData.hasOwnProperty(outputName)) {\n\t\t\t\t\ttypeIndexData[outputName]++;\n\t\t\t\t} else {\n\t\t\t\t\ttypeIndexData[outputName] = 0;\n\t\t\t\t}\n\n\t\t\t\tconst rootTypeIndex = rootTypeIndexData[rootCategoryOutputName];\n\t\t\t\tconst typeIndex = typeIndexData[outputName];\n\n\t\t\t\tconst outputsOfSameRootType = this.outputs.filter((outputData) => {\n\t\t\t\t\tconst thisOutputName: string =\n\t\t\t\t\t\ttypeof outputData === 'string' ? outputData : outputData.type;\n\t\t\t\t\treturn outputName === NodeConnectionType.Main\n\t\t\t\t\t\t? thisOutputName === NodeConnectionType.Main\n\t\t\t\t\t\t: thisOutputName !== NodeConnectionType.Main;\n\t\t\t\t});\n\n\t\t\t\t// Get the position of the anchor depending on how many it has\n\t\t\t\tconst anchorPosition = NodeViewUtils.getAnchorPosition(\n\t\t\t\t\toutputName,\n\t\t\t\t\t'output',\n\t\t\t\t\toutputsOfSameRootType.length,\n\t\t\t\t)[rootTypeIndex];\n\n\t\t\t\tconst scope = NodeViewUtils.getEndpointScope(outputName as NodeConnectionType);\n\n\t\t\t\tconst newEndpointData: EndpointOptions = {\n\t\t\t\t\tuuid: NodeViewUtils.getOutputEndpointUUID(this.nodeId, outputName, typeIndex),\n\t\t\t\t\tanchor: anchorPosition,\n\t\t\t\t\tmaxConnections: -1,\n\t\t\t\t\tendpoint: {\n\t\t\t\t\t\ttype: 'Dot',\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tradius: nodeTypeData && outputsOfSameRootType.length > 2 ? 7 : 9,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\thoverPaintStyle: NodeViewUtils.getOutputEndpointStyle(nodeTypeData, '--color-primary'),\n\t\t\t\t\tscope,\n\t\t\t\t\tsource: true,\n\t\t\t\t\ttarget: outputName !== NodeConnectionType.Main,\n\t\t\t\t\tenabled: !this.isReadOnly,\n\t\t\t\t\tparameters: {\n\t\t\t\t\t\tconnection: 'source',\n\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\ttype: outputName,\n\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t},\n\t\t\t\t\thoverClass: 'dot-output-endpoint-hover',\n\t\t\t\t\tconnectionsDirected: true,\n\t\t\t\t\tdragAllowedWhenFull: false,\n\t\t\t\t\t...this.__getOutputConnectionStyle(outputName, outputConfiguration, nodeTypeData),\n\t\t\t\t};\n\n\t\t\t\tconst endpoint = this.instance.addEndpoint(\n\t\t\t\t\tthis.$refs[this.data.name] as Element,\n\t\t\t\t\tnewEndpointData,\n\t\t\t\t);\n\n\t\t\t\tthis.__addEndpointTestingData(endpoint, 'output', typeIndex);\n\t\t\t\tif (outputConfiguration.displayName) {\n\t\t\t\t\t// Apply output names if they got set\n\t\t\t\t\tconst overlaySpec = NodeViewUtils.getOutputNameOverlay(\n\t\t\t\t\t\toutputConfiguration.displayName,\n\t\t\t\t\t\toutputName,\n\t\t\t\t\t\toutputConfiguration?.category,\n\t\t\t\t\t);\n\t\t\t\t\tendpoint.addOverlay(overlaySpec);\n\t\t\t\t}\n\n\t\t\t\tif (!Array.isArray(endpoint)) {\n\t\t\t\t\tendpoint.__meta = {\n\t\t\t\t\t\tnodeName: node.name,\n\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t\ttotalEndpoints: outputsOfSameRootType.length,\n\t\t\t\t\t\tendpointLabelLength,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (!this.isReadOnly && outputName === NodeConnectionType.Main) {\n\t\t\t\t\tconst plusEndpointData: EndpointOptions = {\n\t\t\t\t\t\tuuid: NodeViewUtils.getOutputEndpointUUID(this.nodeId, outputName, typeIndex),\n\t\t\t\t\t\tanchor: anchorPosition,\n\t\t\t\t\t\tmaxConnections: -1,\n\t\t\t\t\t\tendpoint: {\n\t\t\t\t\t\t\ttype: 'N8nPlus',\n\t\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\t\tdimensions: 24,\n\t\t\t\t\t\t\t\tconnectedEndpoint: endpoint,\n\t\t\t\t\t\t\t\tshowOutputLabel: this.outputs.length === 1,\n\t\t\t\t\t\t\t\tsize: this.outputs.length >= 3 ? 'small' : 'medium',\n\t\t\t\t\t\t\t\tendpointLabelLength,\n\t\t\t\t\t\t\t\thoverMessage: this.$locale.baseText('nodeBase.clickToAddNodeOrDragToConnect'),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsource: true,\n\t\t\t\t\t\ttarget: false,\n\t\t\t\t\t\tenabled: !this.isReadOnly,\n\t\t\t\t\t\tpaintStyle: {\n\t\t\t\t\t\t\toutlineStroke: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\thoverPaintStyle: {\n\t\t\t\t\t\t\toutlineStroke: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tparameters: {\n\t\t\t\t\t\t\tconnection: 'source',\n\t\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\t\ttype: outputName,\n\t\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t\t\tcategory: outputConfiguration?.category,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcssClass: 'plus-draggable-endpoint',\n\t\t\t\t\t\tdragAllowedWhenFull: false,\n\t\t\t\t\t};\n\n\t\t\t\t\tif (outputConfiguration?.category) {\n\t\t\t\t\t\tplusEndpointData.cssClass = `${plusEndpointData.cssClass} ${outputConfiguration?.category}`;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst plusEndpoint = this.instance.addEndpoint(\n\t\t\t\t\t\tthis.$refs[this.data.name] as Element,\n\t\t\t\t\t\tplusEndpointData,\n\t\t\t\t\t);\n\t\t\t\t\tthis.__addEndpointTestingData(plusEndpoint, 'plus', typeIndex);\n\n\t\t\t\t\tif (!Array.isArray(plusEndpoint)) {\n\t\t\t\t\t\tplusEndpoint.__meta = {\n\t\t\t\t\t\t\tnodeName: node.name,\n\t\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t\t\tnodeType: node.type,\n\t\t\t\t\t\t\ttotalEndpoints: outputsOfSameRootType.length,\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\t\t__addNode(node: INodeUi) {\n\t\t\tconst nodeTypeData = (this.nodeTypesStore.getNodeType(node.type, node.typeVersion) ??\n\t\t\t\tthis.nodeTypesStore.getNodeType(NO_OP_NODE_TYPE)) as INodeTypeDescription;\n\n\t\t\tthis.__addInputEndpoints(node, nodeTypeData);\n\t\t\tthis.__addOutputEndpoints(node, nodeTypeData);\n\t\t},\n\t\t__getEndpointColor(connectionType: ConnectionTypes) {\n\t\t\treturn `--node-type-${connectionType}-color`;\n\t\t},\n\t\t__getInputConnectionStyle(\n\t\t\tconnectionType: ConnectionTypes,\n\t\t\tnodeTypeData: INodeTypeDescription,\n\t\t): EndpointOptions {\n\t\t\tif (connectionType === NodeConnectionType.Main) {\n\t\t\t\treturn {\n\t\t\t\t\tpaintStyle: NodeViewUtils.getInputEndpointStyle(\n\t\t\t\t\t\tnodeTypeData,\n\t\t\t\t\t\tthis.__getEndpointColor(NodeConnectionType.Main),\n\t\t\t\t\t\tconnectionType,\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (!Object.values(NodeConnectionType).includes(connectionType as NodeConnectionType)) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\tconst createSupplementalConnectionType = (\n\t\t\t\tconnectionName: ConnectionTypes,\n\t\t\t): EndpointOptions => ({\n\t\t\t\tendpoint: createAddInputEndpointSpec(\n\t\t\t\t\tconnectionName as NodeConnectionType,\n\t\t\t\t\tthis.__getEndpointColor(connectionName),\n\t\t\t\t),\n\t\t\t});\n\n\t\t\treturn createSupplementalConnectionType(connectionType);\n\t\t},\n\t\t__getOutputConnectionStyle(\n\t\t\tconnectionType: ConnectionTypes,\n\t\t\toutputConfiguration: INodeOutputConfiguration,\n\t\t\tnodeTypeData: INodeTypeDescription,\n\t\t): EndpointOptions {\n\t\t\tconst type = 'output';\n\n\t\t\tconst createSupplementalConnectionType = (\n\t\t\t\tconnectionName: ConnectionTypes,\n\t\t\t): EndpointOptions => ({\n\t\t\t\tendpoint: createDiamondOutputEndpointSpec(),\n\t\t\t\tpaintStyle: NodeViewUtils.getOutputEndpointStyle(\n\t\t\t\t\tnodeTypeData,\n\t\t\t\t\tthis.__getEndpointColor(connectionName),\n\t\t\t\t),\n\t\t\t\thoverPaintStyle: NodeViewUtils.getOutputEndpointStyle(\n\t\t\t\t\tnodeTypeData,\n\t\t\t\t\tthis.__getEndpointColor(connectionName),\n\t\t\t\t),\n\t\t\t});\n\n\t\t\tif (connectionType === NodeConnectionType.Main) {\n\t\t\t\tif (outputConfiguration.category === 'error') {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tpaintStyle: {\n\t\t\t\t\t\t\t...NodeViewUtils.getOutputEndpointStyle(\n\t\t\t\t\t\t\t\tnodeTypeData,\n\t\t\t\t\t\t\t\tthis.__getEndpointColor(NodeConnectionType.Main),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tfill: 'var(--color-danger)',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcssClass: `dot-${type}-endpoint`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tpaintStyle: NodeViewUtils.getOutputEndpointStyle(\n\t\t\t\t\t\tnodeTypeData,\n\t\t\t\t\t\tthis.__getEndpointColor(NodeConnectionType.Main),\n\t\t\t\t\t),\n\t\t\t\t\tcssClass: `dot-${type}-endpoint`,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (!Object.values(NodeConnectionType).includes(connectionType as NodeConnectionType)) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\treturn createSupplementalConnectionType(connectionType);\n\t\t},\n\t\ttouchEnd(e: MouseEvent) {\n\t\t\tconst deviceSupport = useDeviceSupport();\n\t\t\tif (deviceSupport.isTouchDevice) {\n\t\t\t\tif (this.uiStore.isActionActive('dragActive')) {\n\t\t\t\t\tthis.uiStore.removeActiveAction('dragActive');\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tmouseLeftClick(e: MouseEvent) {\n\t\t\tconst deviceSupport = useDeviceSupport();\n\n\t\t\t// @ts-ignore\n\t\t\tconst path = e.path || (e.composedPath && e.composedPath());\n\t\t\tfor (let index = 0; index < path.length; index++) {\n\t\t\t\tif (\n\t\t\t\t\tpath[index].className &&\n\t\t\t\t\ttypeof path[index].className === 'string' &&\n\t\t\t\t\tpath[index].className.includes('no-select-on-click')\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!deviceSupport.isTouchDevice) {\n\t\t\t\tif (this.uiStore.isActionActive('dragActive')) {\n\t\t\t\t\tthis.uiStore.removeActiveAction('dragActive');\n\t\t\t\t} else {\n\t\t\t\t\tif (!deviceSupport.isCtrlKeyPressed(e)) {\n\t\t\t\t\t\tthis.$emit('deselectAllNodes');\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.uiStore.isNodeSelected(this.data.name)) {\n\t\t\t\t\t\tthis.$emit('deselectNode', this.name);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.$emit('nodeSelected', this.name);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n});\n","<template>\n\t<div\n\t\tv-if=\"data\"\n\t\t:id=\"nodeId\"\n\t\t:ref=\"data.name\"\n\t\t:class=\"nodeWrapperClass\"\n\t\t:style=\"nodeWrapperStyles\"\n\t\tdata-test-id=\"canvas-node\"\n\t\t:data-name=\"data.name\"\n\t\t:data-node-type=\"nodeType?.name\"\n\t\t@contextmenu=\"(e: MouseEvent) => openContextMenu(e, 'node-right-click')\"\n\t>\n\t\t<div v-show=\"isSelected\" class=\"select-background\"></div>\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'node-default': true,\n\t\t\t\t'touch-active': isTouchActive,\n\t\t\t\t'is-touch-device': deviceSupport.isTouchDevice,\n\t\t\t\t'menu-open': isContextMenuOpen,\n\t\t\t\t'disable-pointer-events': disablePointerEvents,\n\t\t\t}\"\n\t\t>\n\t\t\t<div\n\t\t\t\tv-touch:start=\"touchStart\"\n\t\t\t\tv-touch:end=\"touchEnd\"\n\t\t\t\t:class=\"nodeClass\"\n\t\t\t\t:style=\"nodeStyle\"\n\t\t\t\t@click.left=\"onClick\"\n\t\t\t>\n\t\t\t\t<i v-if=\"isTriggerNode\" class=\"trigger-icon\">\n\t\t\t\t\t<n8n-tooltip placement=\"bottom\">\n\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t<span v-html=\"$locale.baseText('node.thisIsATriggerNode')\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<FontAwesomeIcon icon=\"bolt\" size=\"lg\" />\n\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t</i>\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"!data.disabled\"\n\t\t\t\t\t:class=\"{ 'node-info-icon': true, 'shift-icon': shiftOutputCount }\"\n\t\t\t\t>\n\t\t\t\t\t<div v-if=\"hasIssues && !hideNodeIssues\" class=\"node-issues\" data-test-id=\"node-issues\">\n\t\t\t\t\t\t<n8n-tooltip :show-after=\"500\" placement=\"bottom\">\n\t\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t\t<TitledList :title=\"`${$locale.baseText('node.issues')}:`\" :items=\"nodeIssues\" />\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<FontAwesomeIcon icon=\"exclamation-triangle\" />\n\t\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-else-if=\"waiting || nodeExecutionStatus === 'waiting'\" class=\"waiting\">\n\t\t\t\t\t\t<n8n-tooltip placement=\"bottom\">\n\t\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t\t<div v-text=\"waiting\"></div>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<FontAwesomeIcon icon=\"clock\" />\n\t\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span v-else-if=\"showPinnedDataInfo\" class=\"node-pin-data-icon\">\n\t\t\t\t\t\t<FontAwesomeIcon icon=\"thumbtack\" />\n\t\t\t\t\t\t<span v-if=\"workflowDataItems > 1\" class=\"items-count\"> {{ workflowDataItems }}</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span v-else-if=\"nodeExecutionStatus === 'unknown'\">\n\t\t\t\t\t\t<!-- Do nothing, unknown means the node never executed -->\n\t\t\t\t\t</span>\n\t\t\t\t\t<span v-else-if=\"workflowDataItems\" class=\"data-count\">\n\t\t\t\t\t\t<FontAwesomeIcon icon=\"check\" />\n\t\t\t\t\t\t<span v-if=\"workflowDataItems > 1\" class=\"items-count\"> {{ workflowDataItems }}</span>\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"node-executing-info\" :title=\"$locale.baseText('node.nodeIsExecuting')\">\n\t\t\t\t\t<FontAwesomeIcon icon=\"sync-alt\" spin />\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"node-trigger-tooltip__wrapper\">\n\t\t\t\t\t<n8n-tooltip\n\t\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t\t:show-after=\"500\"\n\t\t\t\t\t\t:visible=\"showTriggerNodeTooltip\"\n\t\t\t\t\t\tpopper-class=\"node-trigger-tooltip__wrapper--item\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t<div v-text=\"getTriggerNodeTooltip\"></div>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<span />\n\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t<n8n-tooltip\n\t\t\t\t\t\tv-if=\"isTriggerNode\"\n\t\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t\t:visible=\"pinDataDiscoveryTooltipVisible\"\n\t\t\t\t\t\tpopper-class=\"node-trigger-tooltip__wrapper--item\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t{{ $locale.baseText('node.discovery.pinData.canvas') }}\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<span />\n\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t</div>\n\n\t\t\t\t<NodeIcon\n\t\t\t\t\tclass=\"node-icon\"\n\t\t\t\t\t:node-type=\"iconNodeType\"\n\t\t\t\t\t:size=\"40\"\n\t\t\t\t\t:shrink=\"false\"\n\t\t\t\t\t:color-default=\"iconColorDefault\"\n\t\t\t\t\t:disabled=\"data.disabled\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-if=\"showDisabledLinethrough\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'disabled-linethrough': true,\n\t\t\t\t\tsuccess: !['unknown'].includes(nodeExecutionStatus) && workflowDataItems > 0,\n\t\t\t\t}\"\n\t\t\t></div>\n\t\t</div>\n\t\t<div class=\"node-description\">\n\t\t\t<div class=\"node-name\" :title=\"nodeTitle\">\n\t\t\t\t<p data-test-id=\"canvas-node-box-title\">\n\t\t\t\t\t{{ nodeTitle }}\n\t\t\t\t</p>\n\t\t\t\t<p v-if=\"data.disabled\">({{ $locale.baseText('node.disabled') }})</p>\n\t\t\t</div>\n\t\t\t<div v-if=\"nodeSubtitle !== undefined\" class=\"node-subtitle\" :title=\"nodeSubtitle\">\n\t\t\t\t{{ nodeSubtitle }}\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div\n\t\t\tv-if=\"!isReadOnly\"\n\t\t\tv-show=\"!hideActions\"\n\t\t\tclass=\"node-options no-select-on-click\"\n\t\t\t@contextmenu.stop\n\t\t\t@mousedown.stop\n\t\t>\n\t\t\t<div class=\"node-options-inner\">\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tv-if=\"!isConfigNode\"\n\t\t\t\t\tdata-test-id=\"execute-node-button\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\ttext\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\ticon=\"play\"\n\t\t\t\t\t:disabled=\"workflowRunning\"\n\t\t\t\t\t:title=\"$locale.baseText('node.testStep')\"\n\t\t\t\t\t@click=\"executeNode\"\n\t\t\t\t/>\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tdata-test-id=\"disable-node-button\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\ttext\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\ticon=\"power-off\"\n\t\t\t\t\t:title=\"nodeDisabledTitle\"\n\t\t\t\t\t@click=\"toggleDisableNode\"\n\t\t\t\t/>\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tdata-test-id=\"delete-node-button\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\ttext\n\t\t\t\t\ticon=\"trash\"\n\t\t\t\t\t:title=\"$locale.baseText('node.delete')\"\n\t\t\t\t\t@click=\"deleteNode\"\n\t\t\t\t/>\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tdata-test-id=\"overflow-node-button\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\ttext\n\t\t\t\t\ticon=\"ellipsis-h\"\n\t\t\t\t\t@click=\"(e: MouseEvent) => openContextMenu(e, 'node-button')\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport { useStorage } from '@/composables/useStorage';\nimport {\n\tCUSTOM_API_CALL_KEY,\n\tLOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG,\n\tMANUAL_TRIGGER_NODE_TYPE,\n\tNODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS,\n\tNOT_DUPLICATABE_NODE_TYPES,\n\tSIMULATE_NODE_TYPE,\n\tSIMULATE_TRIGGER_NODE_TYPE,\n\tWAIT_TIME_UNLIMITED,\n} from '@/constants';\nimport { nodeBase } from '@/mixins/nodeBase';\nimport type {\n\tConnectionTypes,\n\tExecutionSummary,\n\tINodeInputConfiguration,\n\tINodeOutputConfiguration,\n\tINodeTypeDescription,\n\tITaskData,\n\tNodeOperationError,\n} from 'n8n-workflow';\nimport { NodeConnectionType, NodeHelpers } from 'n8n-workflow';\n\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport TitledList from '@/components/TitledList.vue';\n\nimport { get } from 'lodash-es';\nimport { getTriggerNodeServiceName } from '@/utils/nodeTypesUtils';\nimport type { INodeUi, XYPosition } from '@/Interface';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { EnableNodeToggleCommand } from '@/models/history';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { type ContextMenuTarget, useContextMenu } from '@/composables/useContextMenu';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { usePinnedData } from '@/composables/usePinnedData';\nimport { useDeviceSupport } from 'n8n-design-system';\nimport { useDebounce } from '@/composables/useDebounce';\n\nexport default defineComponent({\n\tname: 'Node',\n\tcomponents: {\n\t\tTitledList,\n\t\tFontAwesomeIcon,\n\t\tNodeIcon,\n\t},\n\tmixins: [nodeBase],\n\tprops: {\n\t\tisProductionExecutionPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tdisablePointerEvents: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\thideNodeIssues: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tsetup(props) {\n\t\tconst workflowsStore = useWorkflowsStore();\n\t\tconst contextMenu = useContextMenu();\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst nodeHelpers = useNodeHelpers();\n\t\tconst node = workflowsStore.getNodeByName(props.name);\n\t\tconst pinnedData = usePinnedData(node);\n\t\tconst deviceSupport = useDeviceSupport();\n\t\tconst { callDebounced } = useDebounce();\n\n\t\treturn {\n\t\t\tcontextMenu,\n\t\t\texternalHooks,\n\t\t\tnodeHelpers,\n\t\t\tpinnedData,\n\t\t\tdeviceSupport,\n\t\t\tcallDebounced,\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisTouchActive: false,\n\t\t\tnodeSubtitle: '',\n\t\t\tshowTriggerNodeTooltip: false,\n\t\t\tpinDataDiscoveryTooltipVisible: false,\n\t\t\tdragging: false,\n\t\t\tunwatchWorkflowDataItems: () => {},\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useUIStore, useWorkflowsStore),\n\t\tshowPinnedDataInfo(): boolean {\n\t\t\treturn this.pinnedData.hasData.value && !this.isProductionExecutionPreview;\n\t\t},\n\t\tisDuplicatable(): boolean {\n\t\t\tif (!this.nodeType) return true;\n\t\t\tif (NOT_DUPLICATABE_NODE_TYPES.includes(this.nodeType.name)) return false;\n\t\t\treturn (\n\t\t\t\tthis.nodeType.maxNodes === undefined || this.sameTypeNodes.length < this.nodeType.maxNodes\n\t\t\t);\n\t\t},\n\t\tisScheduledGroup(): boolean {\n\t\t\treturn this.nodeType?.group.includes('schedule') === true;\n\t\t},\n\t\ticonColorDefault(): string | undefined {\n\t\t\tif (this.isConfigNode) {\n\t\t\t\treturn 'var(--color-text-base)';\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t\tnodeRunData(): ITaskData[] {\n\t\t\treturn this.workflowsStore.getWorkflowResultDataByNodeName(this.data?.name || '') || [];\n\t\t},\n\t\thasIssues(): boolean {\n\t\t\tif (this.nodeExecutionStatus && ['crashed', 'error'].includes(this.nodeExecutionStatus))\n\t\t\t\treturn true;\n\t\t\tif (this.pinnedData.hasData.value) return false;\n\t\t\tif (this.data?.issues !== undefined && Object.keys(this.data.issues).length) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tworkflowDataItems(): number {\n\t\t\tconst workflowResultDataNode = this.nodeRunData;\n\t\t\tif (workflowResultDataNode === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\treturn workflowResultDataNode.length;\n\t\t},\n\t\tcanvasOffsetPosition() {\n\t\t\treturn this.uiStore.nodeViewOffsetPosition;\n\t\t},\n\t\tgetTriggerNodeTooltip(): string | undefined {\n\t\t\tif (this.nodeType !== null && this.nodeType.hasOwnProperty('eventTriggerDescription')) {\n\t\t\t\tconst nodeName = this.$locale.shortNodeType(this.nodeType.name);\n\t\t\t\tconst { eventTriggerDescription } = this.nodeType;\n\t\t\t\treturn this.$locale\n\t\t\t\t\t.nodeText()\n\t\t\t\t\t.eventTriggerDescription(nodeName, eventTriggerDescription || '');\n\t\t\t} else {\n\t\t\t\treturn this.$locale.baseText('node.waitingForYouToCreateAnEventIn', {\n\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\tnodeType: this.nodeType ? getTriggerNodeServiceName(this.nodeType) : '',\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tisPollingTypeNode(): boolean {\n\t\t\treturn !!this.nodeType?.polling;\n\t\t},\n\t\tisExecuting(): boolean {\n\t\t\tif (!this.data) return false;\n\t\t\treturn this.workflowsStore.isNodeExecuting(this.data.name);\n\t\t},\n\t\tisSingleActiveTriggerNode(): boolean {\n\t\t\tconst nodes = this.workflowsStore.workflowTriggerNodes.filter((node: INodeUi) => {\n\t\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\t\t\t\treturn nodeType && nodeType.eventTriggerDescription !== '' && !node.disabled;\n\t\t\t});\n\n\t\t\treturn nodes.length === 1;\n\t\t},\n\t\tisManualTypeNode(): boolean {\n\t\t\treturn this.data?.type === MANUAL_TRIGGER_NODE_TYPE;\n\t\t},\n\t\tisConfigNode(): boolean {\n\t\t\tif (!this.data) return false;\n\t\t\treturn this.nodeTypesStore.isConfigNode(this.workflow, this.data, this.data.type ?? '');\n\t\t},\n\t\tisConfigurableNode(): boolean {\n\t\t\tif (!this.data) return false;\n\n\t\t\treturn this.nodeTypesStore.isConfigurableNode(\n\t\t\t\tthis.workflow,\n\t\t\t\tthis.data,\n\t\t\t\tthis.data?.type ?? '',\n\t\t\t);\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\treturn this.nodeTypesStore.isTriggerNode(this.data?.type || '');\n\t\t},\n\t\tisTriggerNodeTooltipEmpty(): boolean {\n\t\t\treturn this.nodeType !== null ? this.nodeType.eventTriggerDescription === '' : false;\n\t\t},\n\t\tisNodeDisabled(): boolean | undefined {\n\t\t\treturn this.node && this.node.disabled;\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\treturn this.data && this.nodeTypesStore.getNodeType(this.data.type, this.data.typeVersion);\n\t\t},\n\t\tnode(): INodeUi | undefined {\n\t\t\t// same as this.data but reactive..\n\t\t\treturn this.workflowsStore.nodesByName[this.name] as INodeUi | undefined;\n\t\t},\n\t\tsameTypeNodes(): INodeUi[] {\n\t\t\treturn this.workflowsStore.allNodes.filter((node: INodeUi) => node.type === this.data?.type);\n\t\t},\n\t\tnodeWrapperClass() {\n\t\t\tconst classes: Record<string, boolean> = {\n\t\t\t\t'node-wrapper': true,\n\t\t\t\t'node-wrapper--trigger': this.isTriggerNode,\n\t\t\t\t'node-wrapper--configurable': this.isConfigurableNode,\n\t\t\t\t'node-wrapper--config': this.isConfigNode,\n\t\t\t};\n\n\t\t\tif (this.outputs.length) {\n\t\t\t\tconst outputTypes = NodeHelpers.getConnectionTypes(this.outputs);\n\t\t\t\tconst otherOutputs = outputTypes.filter(\n\t\t\t\t\t(outputName) => outputName !== NodeConnectionType.Main,\n\t\t\t\t);\n\t\t\t\tif (otherOutputs.length) {\n\t\t\t\t\totherOutputs.forEach((outputName) => {\n\t\t\t\t\t\tclasses[`node-wrapper--connection-type-${outputName}`] = true;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn classes;\n\t\t},\n\t\tnodeWrapperStyles() {\n\t\t\tconst styles: {\n\t\t\t\t[key: string]: string | number;\n\t\t\t} = {\n\t\t\t\tleft: this.position[0] + 'px',\n\t\t\t\ttop: this.position[1] + 'px',\n\t\t\t};\n\n\t\t\tif (this.node && this.nodeType) {\n\t\t\t\tconst inputs =\n\t\t\t\t\tNodeHelpers.getNodeInputs(this.workflow, this.node, this.nodeType) ||\n\t\t\t\t\t([] as Array<ConnectionTypes | INodeInputConfiguration>);\n\t\t\t\tconst inputTypes = NodeHelpers.getConnectionTypes(inputs);\n\n\t\t\t\tconst nonMainInputs = inputTypes.filter((input) => input !== NodeConnectionType.Main);\n\t\t\t\tif (nonMainInputs.length) {\n\t\t\t\t\tconst requiredNonMainInputs = inputs.filter(\n\t\t\t\t\t\t(input) => typeof input !== 'string' && input.required,\n\t\t\t\t\t);\n\n\t\t\t\t\tlet spacerCount = 0;\n\t\t\t\t\tif (NODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS) {\n\t\t\t\t\t\tconst requiredNonMainInputsCount = requiredNonMainInputs.length;\n\t\t\t\t\t\tconst optionalNonMainInputsCount = nonMainInputs.length - requiredNonMainInputsCount;\n\t\t\t\t\t\tspacerCount = requiredNonMainInputsCount > 0 && optionalNonMainInputsCount > 0 ? 1 : 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tstyles['--configurable-node-input-count'] = nonMainInputs.length + spacerCount;\n\t\t\t\t}\n\n\t\t\t\tlet outputs = [] as Array<ConnectionTypes | INodeOutputConfiguration>;\n\t\t\t\tif (this.workflow.nodes[this.node.name]) {\n\t\t\t\t\toutputs = NodeHelpers.getNodeOutputs(this.workflow, this.node, this.nodeType);\n\t\t\t\t}\n\n\t\t\t\tconst outputTypes = NodeHelpers.getConnectionTypes(outputs);\n\n\t\t\t\tconst mainOutputs = outputTypes.filter((output) => output === NodeConnectionType.Main);\n\t\t\t\tstyles['--node-main-output-count'] = mainOutputs.length;\n\t\t\t}\n\n\t\t\treturn styles;\n\t\t},\n\t\tnodeClass(): object {\n\t\t\treturn {\n\t\t\t\t'node-box': true,\n\t\t\t\tdisabled: this.data?.disabled,\n\t\t\t\texecuting: this.isExecuting,\n\t\t\t};\n\t\t},\n\t\tnodeExecutionStatus(): string {\n\t\t\tconst nodeExecutionRunData = this.workflowsStore.getWorkflowRunData?.[this.name];\n\t\t\tif (nodeExecutionRunData) {\n\t\t\t\treturn nodeExecutionRunData.filter(Boolean)[0].executionStatus ?? '';\n\t\t\t}\n\t\t\treturn '';\n\t\t},\n\t\tnodeIssues(): string[] {\n\t\t\tconst issues: string[] = [];\n\t\t\tconst nodeExecutionRunData = this.workflowsStore.getWorkflowRunData?.[this.name];\n\t\t\tif (nodeExecutionRunData) {\n\t\t\t\tnodeExecutionRunData.forEach((executionRunData) => {\n\t\t\t\t\tif (executionRunData?.error) {\n\t\t\t\t\t\tissues.push(\n\t\t\t\t\t\t\t`${executionRunData.error.message}${\n\t\t\t\t\t\t\t\texecutionRunData.error.description ? ` (${executionRunData.error.description})` : ''\n\t\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}\n\t\t\tif (this.data?.issues !== undefined) {\n\t\t\t\tissues.push(...NodeHelpers.nodeIssuesToString(this.data.issues, this.data));\n\t\t\t}\n\t\t\treturn issues;\n\t\t},\n\t\tnodeDisabledTitle(): string {\n\t\t\treturn this.data?.disabled\n\t\t\t\t? this.$locale.baseText('node.enable')\n\t\t\t\t: this.$locale.baseText('node.disable');\n\t\t},\n\t\tposition(): XYPosition {\n\t\t\treturn this.node ? this.node.position : [0, 0];\n\t\t},\n\t\tshowDisabledLinethrough(): boolean {\n\t\t\treturn (\n\t\t\t\t!this.isConfigurableNode &&\n\t\t\t\t!!(this.data?.disabled && this.inputs.length === 1 && this.outputs.length === 1)\n\t\t\t);\n\t\t},\n\t\tshortNodeType(): string {\n\t\t\treturn this.$locale.shortNodeType(this.data?.type ?? '');\n\t\t},\n\t\tnodeTitle(): string {\n\t\t\tif (this.data?.name === 'Start') {\n\t\t\t\treturn this.$locale.headerText({\n\t\t\t\t\tkey: 'headers.start.displayName',\n\t\t\t\t\tfallback: 'Start',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn this.data?.name ?? '';\n\t\t},\n\t\twaiting(): string | undefined {\n\t\t\tconst workflowExecution = this.workflowsStore.getWorkflowExecution as ExecutionSummary;\n\n\t\t\tif (workflowExecution?.waitTill) {\n\t\t\t\tconst lastNodeExecuted = get(workflowExecution, 'data.resultData.lastNodeExecuted');\n\t\t\t\tif (this.name === lastNodeExecuted) {\n\t\t\t\t\tconst waitDate = new Date(workflowExecution.waitTill);\n\t\t\t\t\tif (waitDate.toISOString() === WAIT_TIME_UNLIMITED) {\n\t\t\t\t\t\treturn this.$locale.baseText(\n\t\t\t\t\t\t\t'node.theNodeIsWaitingIndefinitelyForAnIncomingWebhookCall',\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn this.$locale.baseText('node.nodeIsWaitingTill', {\n\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\tdate: waitDate.toLocaleDateString(),\n\t\t\t\t\t\t\ttime: waitDate.toLocaleTimeString(),\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tnodeStyle() {\n\t\t\tconst returnStyles: {\n\t\t\t\t[key: string]: string;\n\t\t\t} = {};\n\n\t\t\tlet borderColor = '--color-foreground-xdark';\n\n\t\t\tif (this.isConfigurableNode || this.isConfigNode) {\n\t\t\t\tborderColor = '--color-foreground-dark';\n\t\t\t}\n\n\t\t\tif (this.data?.disabled) {\n\t\t\t\tborderColor = '--color-foreground-base';\n\t\t\t} else if (!this.isExecuting) {\n\t\t\t\tif (this.hasIssues && !this.hideNodeIssues) {\n\t\t\t\t\t// Do not set red border if there is an issue with the configuration node\n\t\t\t\t\tif (\n\t\t\t\t\t\t(this.nodeRunData?.[0]?.error as NodeOperationError)?.functionality !==\n\t\t\t\t\t\t'configuration-node'\n\t\t\t\t\t) {\n\t\t\t\t\t\tborderColor = '--color-danger';\n\t\t\t\t\t\treturnStyles['border-width'] = '2px';\n\t\t\t\t\t\treturnStyles['border-style'] = 'solid';\n\t\t\t\t\t}\n\t\t\t\t} else if (this.waiting || this.showPinnedDataInfo) {\n\t\t\t\t\tborderColor = '--color-canvas-node-pinned-border';\n\t\t\t\t} else if (this.nodeExecutionStatus === 'unknown') {\n\t\t\t\t\tborderColor = '--color-foreground-xdark';\n\t\t\t\t} else if (this.workflowDataItems) {\n\t\t\t\t\treturnStyles['border-width'] = '2px';\n\t\t\t\t\treturnStyles['border-style'] = 'solid';\n\t\t\t\t\tborderColor = '--color-success';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturnStyles['border-color'] = `var(${borderColor})`;\n\n\t\t\treturn returnStyles;\n\t\t},\n\t\tisSelected(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.uiStore.getSelectedNodes.find((node: INodeUi) => node.name === this.data?.name) !==\n\t\t\t\tundefined\n\t\t\t);\n\t\t},\n\t\tshiftOutputCount(): boolean {\n\t\t\treturn !!(this.nodeType && this.outputs.length > 2);\n\t\t},\n\t\tshouldShowTriggerTooltip(): boolean {\n\t\t\treturn (\n\t\t\t\t!!this.node &&\n\t\t\t\tthis.isTriggerNode &&\n\t\t\t\t!this.isPollingTypeNode &&\n\t\t\t\t!this.pinnedData.hasData.value &&\n\t\t\t\t!this.isNodeDisabled &&\n\t\t\t\tthis.workflowRunning &&\n\t\t\t\tthis.workflowDataItems === 0 &&\n\t\t\t\tthis.isSingleActiveTriggerNode &&\n\t\t\t\t!this.isTriggerNodeTooltipEmpty &&\n\t\t\t\t!this.hasIssues &&\n\t\t\t\t!this.dragging\n\t\t\t);\n\t\t},\n\t\tisContextMenuOpen(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.contextMenu.isOpen.value &&\n\t\t\t\tthis.contextMenu.target.value.source === 'node-button' &&\n\t\t\t\tthis.contextMenu.target.value.node.name === this.data?.name\n\t\t\t);\n\t\t},\n\t\ticonNodeType() {\n\t\t\tif (\n\t\t\t\tthis.data?.type === SIMULATE_NODE_TYPE ||\n\t\t\t\tthis.data?.type === SIMULATE_TRIGGER_NODE_TYPE\n\t\t\t) {\n\t\t\t\tconst icon = this.data.parameters?.icon as string;\n\t\t\t\tconst iconNodeType = this.workflow.expression.getSimpleParameterValue(\n\t\t\t\t\tthis.data,\n\t\t\t\t\ticon,\n\t\t\t\t\t'internal',\n\t\t\t\t\t{},\n\t\t\t\t);\n\t\t\t\tif (iconNodeType && typeof iconNodeType === 'string') {\n\t\t\t\t\treturn this.nodeTypesStore.getNodeType(iconNodeType);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this.nodeType;\n\t\t},\n\t},\n\twatch: {\n\t\tisActive(newValue, oldValue) {\n\t\t\tif (!newValue && oldValue) {\n\t\t\t\tthis.setSubtitle();\n\t\t\t}\n\t\t},\n\t\tcanvasOffsetPosition() {\n\t\t\tif (this.showTriggerNodeTooltip) {\n\t\t\t\tthis.showTriggerNodeTooltip = false;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.showTriggerNodeTooltip = this.shouldShowTriggerTooltip;\n\t\t\t\t}, 200);\n\t\t\t}\n\n\t\t\tif (this.pinDataDiscoveryTooltipVisible) {\n\t\t\t\tthis.pinDataDiscoveryTooltipVisible = false;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.pinDataDiscoveryTooltipVisible = true;\n\t\t\t\t}, 200);\n\t\t\t}\n\t\t},\n\t\tshouldShowTriggerTooltip(shouldShowTriggerTooltip) {\n\t\t\tif (shouldShowTriggerTooltip) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.showTriggerNodeTooltip = this.shouldShowTriggerTooltip;\n\t\t\t\t}, 2500);\n\t\t\t} else {\n\t\t\t\tthis.showTriggerNodeTooltip = false;\n\t\t\t}\n\t\t},\n\t\tnodeRunData(newValue) {\n\t\t\tif (!this.data) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.$emit('run', { name: this.data.name, data: newValue, waiting: !!this.waiting });\n\t\t},\n\t},\n\tcreated() {\n\t\tconst hasSeenPinDataTooltip = useStorage(LOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG).value;\n\t\tif (!hasSeenPinDataTooltip) {\n\t\t\tthis.unwatchWorkflowDataItems = this.$watch('workflowDataItems', (dataItemsCount: number) => {\n\t\t\t\tthis.showPinDataDiscoveryTooltip(dataItemsCount);\n\t\t\t});\n\t\t}\n\t},\n\tmounted() {\n\t\tsetTimeout(() => {\n\t\t\tthis.setSubtitle();\n\t\t}, 0);\n\t\tif (this.nodeRunData) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.$emit('run', {\n\t\t\t\t\tname: this.data && this.data.name,\n\t\t\t\t\tdata: this.nodeRunData,\n\t\t\t\t\twaiting: !!this.waiting,\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t}\n\t},\n\tmethods: {\n\t\tshowPinDataDiscoveryTooltip(dataItemsCount: number): void {\n\t\t\tif (\n\t\t\t\t!this.isTriggerNode ||\n\t\t\t\tthis.isManualTypeNode ||\n\t\t\t\tthis.isScheduledGroup ||\n\t\t\t\tthis.uiStore.isAnyModalOpen ||\n\t\t\t\tdataItemsCount === 0\n\t\t\t)\n\t\t\t\treturn;\n\n\t\t\tuseStorage(LOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG).value = 'true';\n\n\t\t\tthis.pinDataDiscoveryTooltipVisible = true;\n\t\t\tthis.unwatchWorkflowDataItems();\n\t\t},\n\t\tsetSubtitle() {\n\t\t\tif (!this.data || !this.nodeType) return;\n\t\t\t// why is this not a computed property? because it's a very expensive operation\n\t\t\t// it requires expressions to resolve each subtitle...\n\t\t\t// and ends up bogging down the UI with big workflows, for example when pasting a workflow or even opening a node...\n\t\t\t// so we only update it when necessary (when node is mounted and when it's opened and closed (isActive))\n\t\t\ttry {\n\t\t\t\tconst nodeSubtitle =\n\t\t\t\t\tthis.nodeHelpers.getNodeSubtitle(this.data, this.nodeType, this.workflow) ?? '';\n\n\t\t\t\tthis.nodeSubtitle = nodeSubtitle.includes(CUSTOM_API_CALL_KEY) ? '' : nodeSubtitle;\n\t\t\t} catch (e) {\n\t\t\t\t// avoid breaking UI if expression error occurs\n\t\t\t}\n\t\t},\n\t\tdisableNode() {\n\t\t\tif (this.data !== null) {\n\t\t\t\tthis.nodeHelpers.disableNodes([this.data]);\n\t\t\t\tthis.historyStore.pushCommandToUndo(\n\t\t\t\t\tnew EnableNodeToggleCommand(\n\t\t\t\t\t\tthis.data.name,\n\t\t\t\t\t\t!this.data.disabled,\n\t\t\t\t\t\tthis.data.disabled === true,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tthis.$telemetry.track('User clicked node hover button', {\n\t\t\t\t\tnode_type: this.data.type,\n\t\t\t\t\tbutton_name: 'disable',\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\texecuteNode() {\n\t\t\tthis.$emit('runWorkflow', this.data?.name, 'Node.executeNode');\n\t\t\tthis.$telemetry.track('User clicked node hover button', {\n\t\t\t\tnode_type: this.data?.type,\n\t\t\t\tbutton_name: 'execute',\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\t\t},\n\n\t\tdeleteNode() {\n\t\t\tthis.$telemetry.track('User clicked node hover button', {\n\t\t\t\tnode_type: this.data?.type,\n\t\t\t\tbutton_name: 'delete',\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\n\t\t\tthis.$emit('removeNode', this.data?.name);\n\t\t},\n\n\t\ttoggleDisableNode(event: MouseEvent) {\n\t\t\t(event.currentTarget as HTMLButtonElement).blur();\n\t\t\tthis.$telemetry.track('User clicked node hover button', {\n\t\t\t\tnode_type: this.data?.type,\n\t\t\t\tbutton_name: 'disable',\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\t\t\tthis.$emit('toggleDisableNode', this.data);\n\t\t},\n\n\t\tonClick(event: MouseEvent) {\n\t\t\tvoid this.callDebounced(this.onClickDebounced, { debounceTime: 50, trailing: true }, event);\n\t\t},\n\n\t\tonClickDebounced(...args: unknown[]) {\n\t\t\tconst event = args[0] as MouseEvent;\n\t\t\tconst isDoubleClick = event.detail >= 2;\n\t\t\tif (isDoubleClick) {\n\t\t\t\tthis.setNodeActive();\n\t\t\t} else {\n\t\t\t\tthis.mouseLeftClick(event);\n\t\t\t}\n\t\t},\n\n\t\tsetNodeActive() {\n\t\t\tthis.ndvStore.activeNodeName = this.data ? this.data.name : '';\n\t\t\tthis.pinDataDiscoveryTooltipVisible = false;\n\t\t},\n\t\ttouchStart() {\n\t\t\tif (this.deviceSupport.isTouchDevice && !this.deviceSupport.isMacOs && !this.isTouchActive) {\n\t\t\t\tthis.isTouchActive = true;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.isTouchActive = false;\n\t\t\t\t}, 2000);\n\t\t\t}\n\t\t},\n\t\topenContextMenu(event: MouseEvent, source: ContextMenuTarget['source']) {\n\t\t\tif (this.data) {\n\t\t\t\tthis.contextMenu.open(event, { source, node: this.data });\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" scoped>\n.context-menu {\n\tposition: absolute;\n}\n\n.node-wrapper {\n\t--node-width: 100px;\n\t/*\n\t\tSet the node height to 100px as a base.\n\t\tIncrease height by 20px for each output beyond the 4th one.\n\t\tmax(0, var(--node-main-output-count, 1) - 4) ensures that we only start counting after the 4th output.\n\t*/\n\t--node-height: calc(100px + max(0, var(--node-main-output-count, 1) - 4) * 20px);\n\n\t--configurable-node-min-input-count: 4;\n\t--configurable-node-input-width: 65px;\n\n\tposition: absolute;\n\twidth: var(--node-width);\n\theight: var(--node-height);\n\n\t.node-description {\n\t\tposition: absolute;\n\t\ttop: var(--node-height);\n\t\tleft: calc(var(--node-width) / 2 * -1);\n\t\tline-height: 1.5;\n\t\ttext-align: center;\n\t\tcursor: default;\n\t\tpadding: 8px;\n\t\twidth: 100%;\n\t\tmin-width: calc(var(--node-width) * 2);\n\t\tpointer-events: none; // prevent container from being draggable\n\n\t\t.node-name > p {\n\t\t\t// must be paragraph tag to have two lines in safari\n\t\t\ttext-overflow: ellipsis;\n\t\t\tdisplay: -webkit-box;\n\t\t\t-webkit-box-orient: vertical;\n\t\t\t-webkit-line-clamp: 2;\n\t\t\toverflow: hidden;\n\t\t\toverflow-wrap: anywhere;\n\t\t\tfont-weight: var(--font-weight-bold);\n\t\t\tline-height: var(--font-line-height-compact);\n\t\t}\n\n\t\t.node-subtitle {\n\t\t\twhite-space: nowrap;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\tfont-weight: 400;\n\t\t\tcolor: $custom-font-light;\n\t\t\tfont-size: 0.8em;\n\t\t}\n\t}\n\n\t&.touch-active,\n\t&:hover,\n\t&.menu-open {\n\t\t.node-options {\n\t\t\topacity: 1;\n\t\t}\n\t}\n\n\t.node-options {\n\t\t:deep(.button) {\n\t\t\t--button-font-color: var(--color-text-light);\n\t\t\t--button-border-radius: 0;\n\t\t}\n\t\tcursor: default;\n\t\tposition: absolute;\n\t\tbottom: 100%;\n\t\tz-index: 11;\n\t\tmin-width: 100%;\n\t\tdisplay: flex;\n\t\tleft: calc(-1 * var(--spacing-4xs));\n\t\tright: calc(-1 * var(--spacing-4xs));\n\t\tjustify-content: center;\n\t\talign-items: center;\n\t\tpadding-bottom: var(--spacing-2xs);\n\t\tfont-size: var(--font-size-s);\n\t\topacity: 0;\n\t\ttransition: opacity 100ms ease-in;\n\n\t\t&-inner {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tbackground-color: var(--color-canvas-background);\n\t\t\tborder-radius: var(--border-radius-base);\n\t\t}\n\t}\n\n\t.node-default {\n\t\tposition: absolute;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tcursor: pointer;\n\t\t&.disable-pointer-events {\n\t\t\tpointer-events: none;\n\t\t}\n\n\t\t.node-box {\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tborder: 2px solid var(--color-foreground-xdark);\n\t\t\tborder-radius: var(--border-radius-large);\n\t\t\tbackground-color: var(--color-canvas-node-background);\n\t\t\t--color-background-node-icon-badge: var(--color-canvas-node-background);\n\t\t\t&.executing {\n\t\t\t\tbackground-color: $node-background-executing !important;\n\n\t\t\t\t.node-executing-info {\n\t\t\t\t\tdisplay: inline-block;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.node-executing-info {\n\t\t\tdisplay: none;\n\t\t\tposition: absolute;\n\t\t\tleft: 0px;\n\t\t\ttop: 0px;\n\t\t\tz-index: 12;\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tfont-size: 3.75em;\n\t\t\tline-height: 1.65em;\n\t\t\ttext-align: center;\n\t\t\tcolor: hsla(var(--color-primary-h), var(--color-primary-s), var(--color-primary-l), 0.7);\n\t\t}\n\n\t\t.node-icon {\n\t\t\tposition: absolute;\n\t\t\ttop: calc(50% - 20px);\n\t\t\tleft: calc(50% - 20px);\n\t\t}\n\n\t\t.node-info-icon {\n\t\t\tposition: absolute;\n\t\t\tbottom: 6px;\n\t\t\tright: 6px;\n\n\t\t\t&.shift-icon {\n\t\t\t\tright: 12px;\n\t\t\t}\n\n\t\t\t.data-count {\n\t\t\t\tfont-weight: 600;\n\t\t\t\tcolor: var(--color-success);\n\t\t\t}\n\n\t\t\t.node-issues {\n\t\t\t\tcolor: var(--color-danger);\n\t\t\t}\n\n\t\t\t.items-count {\n\t\t\t\tfont-size: var(--font-size-s);\n\t\t\t\tpadding: 0;\n\t\t\t}\n\t\t}\n\n\t\t.node-pin-data-icon {\n\t\t\tcolor: var(--color-secondary);\n\t\t\tmargin-right: 2px;\n\n\t\t\tsvg {\n\t\t\t\theight: 0.85rem;\n\t\t\t}\n\t\t}\n\n\t\t.waiting {\n\t\t\tcolor: var(--color-secondary);\n\t\t}\n\t}\n\n\t&--config {\n\t\t--configurable-node-input-width: 55px;\n\t\t--node-width: 75px;\n\t\t--node-height: 75px;\n\n\t\t.node-default {\n\t\t\t.node-icon {\n\t\t\t\tscale: 0.75;\n\t\t\t}\n\n\t\t\t.node-box {\n\t\t\t\tborder: 2px solid var(--color-foreground-xdark);\n\t\t\t\tborder-radius: 50px;\n\n\t\t\t\t&.executing {\n\t\t\t\t\tbackground-color: $node-background-executing-other !important;\n\t\t\t\t}\n\n\t\t\t\t.node-executing-info {\n\t\t\t\t\tfont-size: 2.85em;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t@each $node-type in $supplemental-node-types {\n\t\t\t&.node-wrapper--connection-type-#{$node-type} {\n\t\t\t\t.node-default .node-box {\n\t\t\t\t\tbackground: var(--node-type-#{$node-type}-background);\n\t\t\t\t}\n\n\t\t\t\t.node-description {\n\t\t\t\t\t.node-subtitle {\n\t\t\t\t\t\tcolor: var(--node-type-#{$node-type}-color);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.node-info-icon {\n\t\t\tbottom: 4px !important;\n\t\t\tright: 50% !important;\n\t\t\ttransform: translateX(50%) scale(0.75);\n\t\t}\n\n\t\t&.node-wrapper--configurable {\n\t\t\t--configurable-node-icon-offset: 20px;\n\n\t\t\t.node-info-icon {\n\t\t\t\tbottom: 1px !important;\n\t\t\t\tright: 1px !important;\n\t\t\t}\n\t\t}\n\t}\n\n\t&--configurable {\n\t\t--node-width: var(\n\t\t\t--configurable-node-width,\n\t\t\tcalc(\n\t\t\t\tmax(var(--configurable-node-input-count, 5), var(--configurable-node-min-input-count)) *\n\t\t\t\t\tvar(--configurable-node-input-width)\n\t\t\t)\n\t\t);\n\t\t--configurable-node-icon-offset: 40px;\n\t\t--configurable-node-icon-size: 30px;\n\n\t\t.node-description {\n\t\t\ttop: calc(50%);\n\t\t\ttransform: translateY(-50%);\n\t\t\tleft: calc(\n\t\t\t\tvar(--configurable-node-icon-offset) + var(--configurable-node-icon-size) + var(--spacing-s)\n\t\t\t);\n\t\t\ttext-align: left;\n\t\t\toverflow: auto;\n\t\t\twhite-space: normal;\n\t\t\tmin-width: unset;\n\t\t\tmax-width: calc(\n\t\t\t\tvar(--node-width) - var(--configurable-node-icon-offset) - var(\n\t\t\t\t\t\t--configurable-node-icon-size\n\t\t\t\t\t) - 2 * var(--spacing-s)\n\t\t\t);\n\t\t\t.node-name > p {\n\t\t\t\tcolor: var(--color-configurable-node-name);\n\t\t\t}\n\t\t}\n\n\t\t.node-default {\n\t\t\t.node-icon {\n\t\t\t\tleft: var(--configurable-node-icon-offset);\n\t\t\t}\n\n\t\t\t.node-executing-info {\n\t\t\t\tleft: -67px;\n\t\t\t}\n\t\t}\n\n\t\t&[data-node-type='@n8n/n8n-nodes-langchain.chatTrigger'] {\n\t\t\t--configurable-node-min-input-count: 1;\n\t\t\t--configurable-node-input-width: 176px;\n\t\t}\n\t}\n\n\t&--trigger .node-default .node-box {\n\t\tborder-radius: 32px 8px 8px 32px;\n\t}\n\n\t.trigger-icon {\n\t\tposition: absolute;\n\t\tright: 100%;\n\t\ttop: 0;\n\t\tbottom: 0;\n\t\tmargin: auto;\n\t\tcolor: var(--color-primary);\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\theight: fit-content;\n\t\t// Increase click radius of the bolt icon\n\t\tpadding: var(--spacing-2xs);\n\t}\n}\n\n.select-background {\n\t--node--selected--box-shadow-radius: 8px;\n\n\tdisplay: block;\n\tbackground-color: var(--color-canvas-selected);\n\tborder-radius: var(--border-radius-xlarge);\n\toverflow: hidden;\n\tposition: absolute;\n\tleft: calc(var(--node--selected--box-shadow-radius) * -1) !important;\n\ttop: calc(var(--node--selected--box-shadow-radius) * -1) !important;\n\theight: calc(100% + 2 * var(--node--selected--box-shadow-radius));\n\twidth: calc(100% + 2 * var(--node--selected--box-shadow-radius)) !important;\n\n\t.node-wrapper--trigger & {\n\t\tborder-radius: 36px 8px 8px 36px;\n\t}\n\n\t.node-wrapper--config & {\n\t\t--node--selected--box-shadow-radius: 4px;\n\t\tborder-radius: 60px;\n\t}\n}\n\n.disabled-linethrough {\n\tborder: 1px solid var(--color-foreground-dark);\n\tposition: absolute;\n\ttop: 49px;\n\tleft: -3px;\n\twidth: 111px;\n\tpointer-events: none;\n\n\t&.success {\n\t\tborder-color: var(--color-success-light);\n\t}\n}\n</style>\n\n<style lang=\"scss\">\n.jtk-endpoint {\n\tz-index: 2;\n}\n\n.node-trigger-tooltip {\n\t&__wrapper {\n\t\ttop: -22px;\n\t\tleft: 50px;\n\t\tposition: relative;\n\n\t\t&--item {\n\t\t\tmax-width: 160px;\n\t\t\tposition: fixed;\n\t\t\tz-index: 0 !important;\n\t\t}\n\t}\n}\n.dot-output-endpoint:hover circle {\n\tfill: var(--color-primary);\n}\n/** connector */\n.jtk-connector {\n\tz-index: 3;\n}\n\n.jtk-floating-endpoint {\n\topacity: 0;\n}\n\n.jtk-connector path {\n\ttransition: stroke 0.1s ease-in-out;\n}\n\n.jtk-overlay {\n\tz-index: 3;\n}\n.jtk-connector {\n\tz-index: 4;\n}\n.node-input-endpoint-label,\n.node-output-endpoint-label,\n.connection-run-items-label {\n\tz-index: 5;\n}\n.jtk-connector.jtk-hover {\n\tz-index: 6;\n}\n\n.jtk-endpoint.plus-endpoint {\n\tz-index: 6;\n}\n.jtk-endpoint.dot-output-endpoint {\n\tz-index: 7;\n\toverflow: auto;\n}\n\n.disabled-linethrough {\n\tz-index: 8;\n}\n\n.jtk-drag-active.dot-output-endpoint,\n.jtk-drag-active.rect-input-endpoint {\n\tz-index: 9;\n}\n.rect-input-endpoint > * {\n\tpointer-events: none;\n}\n\n.connection-actions {\n\tz-index: 100;\n}\n\n.drop-add-node-label {\n\tz-index: 10;\n}\n</style>\n\n<style lang=\"scss\">\n:root {\n\t--endpoint-size-small: 14px;\n\t--endpoint-size-medium: 18px;\n\t--stalk-size: 40px;\n\t--stalk-medium-size: 60px;\n\t--stalk-large-size: 90px;\n\t--stalk-success-size: 87px;\n\t--stalk-success-size-without-label: 40px;\n\t--stalk-long-size: 127px;\n\t--plus-endpoint-box-size: 24px;\n\t--plus-endpoint-box-size-small: 17px;\n}\n\n.plus-svg-circle {\n\tz-index: 111;\n\tcircle {\n\t\tstroke: var(--color-foreground-xdark);\n\t\tstroke-width: 2px;\n\t\tfill: var(--color-foreground-xdark);\n\t}\n\n\t&:hover {\n\t\tcircle {\n\t\t\tstroke: var(--color-primary);\n\t\t\tfill: var(--color-primary);\n\t\t}\n\t}\n}\n.plus-stalk {\n\twidth: calc(var(--stalk-size) + 2px);\n\tborder: 1px solid var(--color-foreground-dark);\n\tmargin-left: calc(var(--stalk-size) / 2);\n\tz-index: 3;\n\t&.ep-success {\n\t\tborder-color: var(--color-success-light);\n\n\t\t&:after {\n\t\t\tcontent: attr(data-label);\n\t\t\tposition: absolute;\n\t\t\tleft: 0;\n\t\t\tright: 0;\n\t\t\tbottom: 100%;\n\t\t\tmargin: auto;\n\t\t\tmargin-bottom: 2px;\n\t\t\ttext-align: center;\n\n\t\t\tline-height: 1.3em;\n\t\t\tfont-size: var(--font-size-s);\n\t\t\tfont-weight: var(--font-weight-regular);\n\t\t\tcolor: var(--color-success);\n\t\t}\n\t}\n}\n.connection-run-items-label {\n\t// Disable points events so that the label does not block the connection\n\t// mouse over event.\n\tpointer-events: none;\n\tspan {\n\t\tbackground-color: hsla(\n\t\t\tvar(--color-canvas-background-h),\n\t\t\tvar(--color-canvas-background-s),\n\t\t\tvar(--color-canvas-background-l),\n\t\t\t0.85\n\t\t);\n\t\tborder-radius: var(--border-radius-base);\n\t\tline-height: 1.3em;\n\t\tpadding: 0px 3px;\n\t\twhite-space: nowrap;\n\t\tfont-size: var(--font-size-s);\n\t\tfont-weight: var(--font-weight-regular);\n\t\tmargin-top: -15px;\n\n\t\t&.floating {\n\t\t\tposition: absolute;\n\t\t\ttop: -6px;\n\t\t\ttransform: translateX(-50%);\n\t\t}\n\t}\n}\n\n.connection-input-name-label {\n\tposition: relative;\n\n\tspan {\n\t\tposition: absolute;\n\t\ttop: -10px;\n\t\tleft: -60px;\n\t}\n}\n\n.plus-endpoint {\n\tcursor: pointer;\n\tz-index: 10;\n\tmargin-left: calc((var(--stalk-size) + var(--plus-endpoint-box-size) / 2) - 1px);\n\tg {\n\t\tfill: var(--color-background-xlight);\n\t\tpointer-events: none;\n\t}\n\n\t&:hover {\n\t\tpath {\n\t\t\tfill: var(--color-primary);\n\t\t}\n\t\trect {\n\t\t\tstroke: var(--color-primary);\n\t\t}\n\t}\n\tpath {\n\t\tfill: var(--color-foreground-xdark);\n\t}\n\trect {\n\t\tstroke: var(--color-foreground-xdark);\n\t}\n\n\t&.error {\n\t\tpath {\n\t\t\tfill: var(--color-node-error-output-text-color);\n\t\t}\n\t\trect {\n\t\t\tstroke: var(--color-node-error-output-text-color);\n\t\t}\n\t}\n\n\t&.small {\n\t\tmargin-left: calc((var(--stalk-size) + var(--plus-endpoint-box-size-small) / 2));\n\t\tg {\n\t\t\ttransform: scale(0.75);\n\t\t\ttransform-origin: center;\n\t\t}\n\t\trect {\n\t\t\tstroke-width: 2.5;\n\t\t}\n\t}\n\t&:hover .plus-container {\n\t\tcolor: var(--color-primary);\n\t\tborder: 2px solid var(--color-primary);\n\t}\n\t&:hover .drop-hover-message {\n\t\tdisplay: block;\n\t}\n\n\t&.hidden {\n\t\tdisplay: none;\n\t}\n}\n\n.diamond-output-endpoint {\n\t--diamond-output-endpoint--transition-duration: 0.15s;\n\n\ttransition: transform var(--diamond-output-endpoint--transition-duration) ease;\n\ttransform: rotate(45deg);\n\tz-index: 10;\n}\n\n.add-input-endpoint {\n\t--add-input-endpoint--transition-duration: 0.15s;\n\n\t&:not(.jtk-endpoint-connected) {\n\t\tcursor: pointer;\n\t}\n\n\t&.add-input-endpoint-multiple {\n\t\tz-index: 100;\n\t\tcursor: pointer;\n\t}\n\n\t&.jtk-endpoint-connected {\n\t\tz-index: 10;\n\t}\n\n\t&.add-input-endpoint-error {\n\t\t--endpoint-svg-color: var(--color-danger);\n\t}\n\n\t.add-input-endpoint-default {\n\t\ttransition: transform var(--add-input-endpoint--transition-duration) ease;\n\t}\n\n\t.add-input-endpoint-diamond {\n\t\ttransition: fill var(--add-input-endpoint--transition-duration) ease;\n\t\tfill: var(--svg-color, var(--color-primary));\n\t}\n\n\t.add-input-endpoint-line {\n\t\ttransition: fill var(--add-input-endpoint--transition-duration) ease;\n\t\tfill: var(--svg-color, var(--color-primary));\n\t}\n\n\t.add-input-endpoint-plus-rectangle {\n\t\ttransition:\n\t\t\tfill var(--add-input-endpoint--transition-duration) ease,\n\t\t\tstroke var(--add-input-endpoint--transition-duration) ease;\n\t\tfill: var(--color-foreground-xlight);\n\t\tstroke: var(--svg-color, var(--color-primary));\n\t}\n\n\t.add-input-endpoint-plus-icon {\n\t\tstroke: none;\n\t\ttransition: fill var(--add-input-endpoint--transition-duration) ease;\n\t\tfill: var(--svg-color, var(--color-primary));\n\t}\n\n\t.add-input-endpoint-connected-rectangle {\n\t\ttransition:\n\t\t\tfill var(--add-input-endpoint--transition-duration) ease,\n\t\t\tstroke var(--add-input-endpoint--transition-duration) ease;\n\t\tfill: var(--color-foreground-xdark);\n\t\tstroke: var(--color-foreground-xdark);\n\t}\n\n\t&.rect-input-endpoint-hover {\n\t\t.add-input-endpoint-plus-rectangle {\n\t\t\tstroke: var(--svg-color, var(--color-primary));\n\t\t}\n\n\t\t.add-input-endpoint-plus-icon {\n\t\t\tfill: var(--svg-color, var(--color-primary));\n\t\t}\n\t}\n\n\t&.jtk-endpoint-connected:not(.add-input-endpoint-multiple) {\n\t\t.add-input-endpoint-unconnected {\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t&.rect-input-endpoint-hover {\n\t\t\t.add-input-endpoint-connected-rectangle {\n\t\t\t\tfill: var(--svg-color, var(--color-primary));\n\t\t\t\tstroke: var(--svg-color, var(--color-primary));\n\t\t\t}\n\t\t}\n\t}\n}\n\n.node-input-endpoint-label,\n.node-output-endpoint-label {\n\t--node-endpoint-label--transition-duration: 0.15s;\n\n\tbackground-color: hsla(\n\t\tvar(--color-canvas-background-h),\n\t\tvar(--color-canvas-background-s),\n\t\tvar(--color-canvas-background-l),\n\t\t0.85\n\t);\n\tborder-radius: var(--border-radius-large);\n\tfont-size: var(--font-size-3xs);\n\tpadding: var(--spacing-5xs) var(--spacing-4xs);\n\twhite-space: nowrap;\n\ttransition: color var(--node-endpoint-label--transition-duration) ease;\n\n\t@each $node-type in $supplemental-node-types {\n\t\t&.node-connection-type-#{$node-type} {\n\t\t\tcolor: var(--node-type-supplemental-label-color);\n\t\t}\n\t}\n}\n\n.node-output-endpoint-label.node-connection-category-error {\n\tcolor: var(--color-node-error-output-text-color);\n}\n\n.node-output-endpoint-label {\n\tmargin-left: calc(var(--endpoint-size-small) + var(--spacing-2xs));\n\n\t&--data {\n\t\ttext-align: center;\n\t\tmargin-top: calc(var(--spacing-l) * -1);\n\t\tmargin-left: 0;\n\t}\n\n\t// Some nodes allow for dynamic connection labels\n\t// so we need to make sure the label does not overflow\n\t&.node-connection-type-main[data-endpoint-label-length] {\n\t\tmax-width: calc(var(--stalk-size) - var(--endpoint-size-small) - var(--spacing-4xs));\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\ttransform: translateY(-50%) !important;\n\t\tmargin-left: var(--endpoint-size-small);\n\t}\n}\n\n.node-input-endpoint-label {\n\ttext-align: right;\n\tmargin-left: -25px;\n\n\t&--moved {\n\t\tmargin-left: -40px;\n\t}\n\n\t&--data {\n\t\ttext-align: center;\n\t\tmargin-top: calc(var(--spacing-5xs) * -1);\n\t\tmargin-left: 0;\n\t}\n}\n\n.hover-message.jtk-overlay {\n\t--hover-message-width: 110px;\n\tfont-weight: var(--font-weight-bold);\n\tfont-size: var(--font-size-2xs);\n\tline-height: var(--font-line-height-regular);\n\tcolor: var(--color-text-light);\n\twidth: var(--hover-message-width);\n\tmargin-left: calc(\n\t\t(var(--hover-message-width) / 2) + var(--stalk-size) + var(--plus-endpoint-box-size) +\n\t\t\tvar(--spacing-2xs)\n\t);\n\topacity: 0;\n\tpointer-events: none;\n\t&.small {\n\t\tmargin-left: calc(\n\t\t\t(var(--hover-message-width) / 2) + var(--stalk-size) + var(--plus-endpoint-box-size-small) +\n\t\t\t\tvar(--spacing-2xs)\n\t\t);\n\t}\n\t&.visible {\n\t\tpointer-events: all;\n\t\topacity: 1;\n\t}\n}\n\n.long-stalk {\n\t--stalk-size: var(--stalk-long-size);\n}\n.ep-success {\n\t--stalk-size: var(--stalk-success-size);\n}\n.ep-success--without-label {\n\t--stalk-size: var(--stalk-success-size-without-label);\n}\n\n[data-endpoint-label-length='medium'] {\n\t--stalk-size: var(--stalk-medium-size);\n}\n\n[data-endpoint-label-length='large'] {\n\t--stalk-size: var(--stalk-large-size);\n}\n</style>\n","<template>\n\t<div\n\t\t:id=\"nodeId\"\n\t\t:ref=\"data.name\"\n\t\tclass=\"sticky-wrapper\"\n\t\t:style=\"stickyPosition\"\n\t\t:data-name=\"data.name\"\n\t\tdata-test-id=\"sticky\"\n\t>\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'sticky-default': true,\n\t\t\t\t'touch-active': isTouchActive,\n\t\t\t\t'is-touch-device': deviceSupport.isTouchDevice,\n\t\t\t\t'is-read-only': isReadOnly,\n\t\t\t}\"\n\t\t\t:style=\"stickySize\"\n\t\t>\n\t\t\t<div v-show=\"isSelected\" class=\"select-sticky-background\" />\n\t\t\t<div\n\t\t\t\tv-touch:start=\"touchStart\"\n\t\t\t\tv-touch:end=\"touchEnd\"\n\t\t\t\tclass=\"sticky-box\"\n\t\t\t\t@click.left=\"mouseLeftClick\"\n\t\t\t\t@contextmenu=\"onContextMenu\"\n\t\t\t>\n\t\t\t\t<n8n-sticky\n\t\t\t\t\t:id=\"node.id\"\n\t\t\t\t\t:model-value=\"node.parameters.content\"\n\t\t\t\t\t:height=\"node.parameters.height\"\n\t\t\t\t\t:width=\"node.parameters.width\"\n\t\t\t\t\t:scale=\"nodeViewScale\"\n\t\t\t\t\t:background-color=\"node.parameters.color\"\n\t\t\t\t\t:read-only=\"isReadOnly\"\n\t\t\t\t\t:default-text=\"defaultText\"\n\t\t\t\t\t:edit-mode=\"isActive && !isReadOnly\"\n\t\t\t\t\t:grid-size=\"gridSize\"\n\t\t\t\t\t@edit=\"onEdit\"\n\t\t\t\t\t@resizestart=\"onResizeStart\"\n\t\t\t\t\t@resize=\"onResize\"\n\t\t\t\t\t@resizeend=\"onResizeEnd\"\n\t\t\t\t\t@markdown-click=\"onMarkdownClick\"\n\t\t\t\t\t@update:model-value=\"onInputChange\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-show=\"showActions\"\n\t\t\t\t:class=\"{ 'sticky-options': true, 'no-select-on-click': true, 'force-show': forceActions }\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tv-touch:tap=\"deleteNode\"\n\t\t\t\t\tclass=\"option\"\n\t\t\t\t\tdata-test-id=\"delete-sticky\"\n\t\t\t\t\t:title=\"$locale.baseText('node.delete')\"\n\t\t\t\t>\n\t\t\t\t\t<font-awesome-icon icon=\"trash\" />\n\t\t\t\t</div>\n\t\t\t\t<n8n-popover\n\t\t\t\t\teffect=\"dark\"\n\t\t\t\t\t:popper-style=\"{ width: '208px' }\"\n\t\t\t\t\ttrigger=\"click\"\n\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t@show=\"onShowPopover\"\n\t\t\t\t\t@hide=\"onHidePopover\"\n\t\t\t\t>\n\t\t\t\t\t<template #reference>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tref=\"colorPopoverTrigger\"\n\t\t\t\t\t\t\tclass=\"option\"\n\t\t\t\t\t\t\tdata-test-id=\"change-sticky-color\"\n\t\t\t\t\t\t\t:title=\"$locale.baseText('node.changeColor')\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<font-awesome-icon icon=\"palette\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</template>\n\t\t\t\t\t<div class=\"content\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-for=\"(_, index) in Array.from({ length: 7 })\"\n\t\t\t\t\t\t\t:key=\"index\"\n\t\t\t\t\t\t\tclass=\"color\"\n\t\t\t\t\t\t\tdata-test-id=\"color\"\n\t\t\t\t\t\t\t:class=\"`sticky-color-${index + 1}`\"\n\t\t\t\t\t\t\t:style=\"{\n\t\t\t\t\t\t\t\t'border-width': '1px',\n\t\t\t\t\t\t\t\t'border-style': 'solid',\n\t\t\t\t\t\t\t\t'border-color': 'var(--color-foreground-xdark)',\n\t\t\t\t\t\t\t\t'background-color': `var(--color-sticky-background-${index + 1})`,\n\t\t\t\t\t\t\t\t'box-shadow':\n\t\t\t\t\t\t\t\t\t(index === 0 && node?.parameters.color === '') ||\n\t\t\t\t\t\t\t\t\tindex + 1 === node?.parameters.color\n\t\t\t\t\t\t\t\t\t\t? `0 0 0 1px var(--color-sticky-background-${index + 1})`\n\t\t\t\t\t\t\t\t\t\t: 'none',\n\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t@click=\"changeColor(index + 1)\"\n\t\t\t\t\t\t></div>\n\t\t\t\t\t</div>\n\t\t\t\t</n8n-popover>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref } from 'vue';\nimport { mapStores } from 'pinia';\n\nimport { nodeBase } from '@/mixins/nodeBase';\nimport { isNumber, isString } from '@/utils/typeGuards';\nimport type {\n\tINodeUi,\n\tINodeUpdatePropertiesInformation,\n\tIUpdateInformation,\n\tXYPosition,\n} from '@/Interface';\n\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport { QUICKSTART_NOTE_NAME } from '@/constants';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useContextMenu } from '@/composables/useContextMenu';\nimport { useDeviceSupport } from 'n8n-design-system';\n\nexport default defineComponent({\n\tname: 'Sticky',\n\tmixins: [nodeBase],\n\tprops: {\n\t\tnodeViewScale: {\n\t\t\ttype: Number,\n\t\t},\n\t\tgridSize: {\n\t\t\ttype: Number,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst deviceSupport = useDeviceSupport();\n\t\tconst colorPopoverTrigger = ref<HTMLDivElement>();\n\t\tconst forceActions = ref(false);\n\t\tconst setForceActions = (value: boolean) => {\n\t\t\tforceActions.value = value;\n\t\t};\n\t\tconst contextMenu = useContextMenu((action) => {\n\t\t\tif (action === 'change_color') {\n\t\t\t\tsetForceActions(true);\n\t\t\t\tcolorPopoverTrigger.value?.click();\n\t\t\t}\n\t\t});\n\n\t\treturn { deviceSupport, colorPopoverTrigger, contextMenu, forceActions, setForceActions };\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useUIStore, useWorkflowsStore),\n\t\tdefaultText(): string {\n\t\t\tif (!this.nodeType) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\tconst properties = this.nodeType.properties;\n\t\t\tconst content = properties.find((property) => property.name === 'content');\n\n\t\t\treturn content && isString(content.default) ? content.default : '';\n\t\t},\n\t\tisSelected(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.uiStore.getSelectedNodes.find((node: INodeUi) => node.name === this.data.name) !==\n\t\t\t\tundefined\n\t\t\t);\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\treturn this.data && this.nodeTypesStore.getNodeType(this.data.type, this.data.typeVersion);\n\t\t},\n\t\tnode(): INodeUi | null {\n\t\t\t// same as this.data but reactive..\n\t\t\treturn this.workflowsStore.getNodeByName(this.name);\n\t\t},\n\t\tposition(): XYPosition {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.node.position;\n\t\t\t} else {\n\t\t\t\treturn [0, 0];\n\t\t\t}\n\t\t},\n\t\theight(): number {\n\t\t\treturn this.node && isNumber(this.node.parameters.height) ? this.node.parameters.height : 0;\n\t\t},\n\t\twidth(): number {\n\t\t\treturn this.node && isNumber(this.node.parameters.width) ? this.node.parameters.width : 0;\n\t\t},\n\t\tstickySize(): object {\n\t\t\tconst returnStyles: {\n\t\t\t\t[key: string]: string | number;\n\t\t\t} = {\n\t\t\t\theight: this.height + 'px',\n\t\t\t\twidth: this.width + 'px',\n\t\t\t};\n\n\t\t\treturn returnStyles;\n\t\t},\n\t\tstickyPosition(): object {\n\t\t\tconst returnStyles: {\n\t\t\t\t[key: string]: string | number;\n\t\t\t} = {\n\t\t\t\tleft: this.position[0] + 'px',\n\t\t\t\ttop: this.position[1] + 'px',\n\t\t\t\tzIndex: this.isActive ? 9999999 : -1 * Math.floor((this.height * this.width) / 1000),\n\t\t\t};\n\n\t\t\treturn returnStyles;\n\t\t},\n\t\tshowActions(): boolean {\n\t\t\treturn (\n\t\t\t\t!(this.hideActions || this.isReadOnly || this.workflowRunning || this.isResizing) ||\n\t\t\t\tthis.forceActions\n\t\t\t);\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisResizing: false,\n\t\t\tisTouchActive: false,\n\t\t};\n\t},\n\tmethods: {\n\t\tonShowPopover() {\n\t\t\tthis.setForceActions(true);\n\t\t},\n\t\tonHidePopover() {\n\t\t\tthis.setForceActions(false);\n\t\t},\n\t\tasync deleteNode() {\n\t\t\t// Wait a tick else vue causes problems because the data is gone\n\t\t\tawait this.$nextTick();\n\t\t\tthis.$emit('removeNode', this.data.name);\n\t\t},\n\t\tchangeColor(index: number) {\n\t\t\tthis.workflowsStore.updateNodeProperties({\n\t\t\t\tname: this.name,\n\t\t\t\tproperties: { parameters: { ...this.node.parameters, color: index } },\n\t\t\t});\n\t\t},\n\t\tonEdit(edit: boolean) {\n\t\t\tif (edit && !this.isActive && this.node) {\n\t\t\t\tthis.ndvStore.activeNodeName = this.node.name;\n\t\t\t} else if (this.isActive && !edit) {\n\t\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\t}\n\t\t},\n\t\tonMarkdownClick(link: HTMLAnchorElement, event: Event) {\n\t\t\tif (link) {\n\t\t\t\tconst isOnboardingNote = this.name === QUICKSTART_NOTE_NAME;\n\t\t\t\tconst isWelcomeVideo = link.querySelector('img[alt=\"n8n quickstart video\"');\n\t\t\t\tconst type =\n\t\t\t\t\tisOnboardingNote && isWelcomeVideo\n\t\t\t\t\t\t? 'welcome_video'\n\t\t\t\t\t\t: isOnboardingNote && link.getAttribute('href') === '/templates'\n\t\t\t\t\t\t\t? 'templates'\n\t\t\t\t\t\t\t: 'other';\n\n\t\t\t\tthis.$telemetry.track('User clicked note link', { type });\n\t\t\t}\n\t\t},\n\t\tonInputChange(content: string) {\n\t\t\tthis.node.parameters.content = content;\n\t\t\tthis.setParameters({ content });\n\t\t},\n\t\tonResizeStart() {\n\t\t\tthis.isResizing = true;\n\t\t\tif (!this.isSelected && this.node) {\n\t\t\t\tthis.$emit('nodeSelected', this.node.name, false, true);\n\t\t\t}\n\t\t},\n\t\tonResize({ height, width, dX, dY }: { width: number; height: number; dX: number; dY: number }) {\n\t\t\tif (!this.node) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (dX !== 0 || dY !== 0) {\n\t\t\t\tthis.setPosition([this.node.position[0] + (dX || 0), this.node.position[1] + (dY || 0)]);\n\t\t\t}\n\n\t\t\tthis.setParameters({ height, width });\n\t\t},\n\t\tonResizeEnd() {\n\t\t\tthis.isResizing = false;\n\t\t},\n\t\tsetParameters(params: { content?: string; height?: number; width?: number; color?: string }) {\n\t\t\tif (this.node) {\n\t\t\t\tconst nodeParameters = {\n\t\t\t\t\tcontent: isString(params.content) ? params.content : this.node.parameters.content,\n\t\t\t\t\theight: isNumber(params.height) ? params.height : this.node.parameters.height,\n\t\t\t\t\twidth: isNumber(params.width) ? params.width : this.node.parameters.width,\n\t\t\t\t\tcolor: isString(params.color) ? params.color : this.node.parameters.color,\n\t\t\t\t};\n\n\t\t\t\tconst updateInformation: IUpdateInformation = {\n\t\t\t\t\tkey: this.node.id,\n\t\t\t\t\tname: this.node.name,\n\t\t\t\t\tvalue: nodeParameters,\n\t\t\t\t};\n\n\t\t\t\tthis.workflowsStore.setNodeParameters(updateInformation);\n\t\t\t}\n\t\t},\n\t\tsetPosition(position: XYPosition) {\n\t\t\tif (!this.node) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst updateInformation: INodeUpdatePropertiesInformation = {\n\t\t\t\tname: this.node.name,\n\t\t\t\tproperties: {\n\t\t\t\t\tposition,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tthis.workflowsStore.updateNodeProperties(updateInformation);\n\t\t},\n\t\ttouchStart() {\n\t\t\tif (this.deviceSupport.isTouchDevice && !this.isMacOs && !this.isTouchActive) {\n\t\t\t\tthis.isTouchActive = true;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.isTouchActive = false;\n\t\t\t\t}, 2000);\n\t\t\t}\n\t\t},\n\t\tonContextMenu(e: MouseEvent): void {\n\t\t\tif (this.node && !this.isActive) {\n\t\t\t\tthis.contextMenu.open(e, { source: 'node-right-click', node: this.node });\n\t\t\t} else {\n\t\t\t\te.stopPropagation();\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" scoped>\n.sticky-wrapper {\n\tposition: absolute;\n\n\t.sticky-default {\n\t\t.sticky-box {\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t}\n\n\t\t&.touch-active,\n\t\t&:hover {\n\t\t\t.sticky-options {\n\t\t\t\tdisplay: flex;\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\t\t}\n\n\t\t&.is-read-only {\n\t\t\tpointer-events: none;\n\t\t}\n\n\t\t.sticky-options {\n\t\t\tdisplay: none;\n\t\t\tjustify-content: flex-start;\n\t\t\tposition: absolute;\n\t\t\ttop: -25px;\n\t\t\tleft: -8px;\n\t\t\theight: 26px;\n\t\t\tfont-size: 0.9em;\n\t\t\ttext-align: left;\n\t\t\tz-index: 10;\n\t\t\tcolor: #aaa;\n\t\t\ttext-align: center;\n\n\t\t\t.option {\n\t\t\t\twidth: 28px;\n\t\t\t\tdisplay: inline-block;\n\n\t\t\t\t&.touch {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\n\t\t\t\t&:hover {\n\t\t\t\t\tcolor: $color-primary;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.force-show {\n\t\t\tdisplay: flex;\n\t\t}\n\n\t\t&.is-touch-device .sticky-options {\n\t\t\tleft: -25px;\n\t\t\twidth: 150px;\n\n\t\t\t.option.touch {\n\t\t\t\tdisplay: initial;\n\t\t\t}\n\t\t}\n\t}\n}\n\n.select-sticky-background {\n\tdisplay: block;\n\tposition: absolute;\n\tbackground-color: var(--color-canvas-selected);\n\tborder-radius: var(--border-radius-xlarge);\n\toverflow: hidden;\n\theight: calc(100% + 16px);\n\twidth: calc(100% + 16px);\n\tleft: -8px;\n\ttop: -8px;\n\tz-index: 0;\n}\n\n.content {\n\tdisplay: flex;\n\tflex-direction: row;\n\twidth: fit-content;\n\tgap: var(--spacing-2xs);\n}\n\n.color {\n\twidth: 20px;\n\theight: 20px;\n\tborder-radius: 50%;\n\tborder-color: var(--color-primary-shade-1);\n\n\t&:hover {\n\t\tcursor: pointer;\n\t}\n}\n</style>\n","/*\n\tConstants and utility functions used for searching for node types in node creator component\n*/\n\n// based on https://github.com/forrestthewoods/lib_fts/blob/master/code/fts_fuzzy_match.js\n\nconst SEQUENTIAL_BONUS = 60; // bonus for adjacent matches\nconst SEPARATOR_BONUS = 30; // bonus if match occurs after a separator\nconst CAMEL_BONUS = 30; // bonus if match is uppercase and prev is lower\nconst FIRST_LETTER_BONUS = 15; // bonus if the first letter is matched\n\nconst LEADING_LETTER_PENALTY = -20; // penalty applied for every letter in str before the first match\nconst MAX_LEADING_LETTER_PENALTY = -200; // maximum penalty for leading letters\nconst UNMATCHED_LETTER_PENALTY = -5;\n\n/**\n * Returns true if each character in pattern is found sequentially within target\n * @param {*} pattern string\n * @param {*} target string\n */\nfunction fuzzyMatchSimple(pattern: string, target: string): boolean {\n\tlet patternIdx = 0;\n\tlet strIdx = 0;\n\n\twhile (patternIdx < pattern.length && strIdx < target.length) {\n\t\tconst patternChar = pattern.charAt(patternIdx).toLowerCase();\n\t\tconst targetChar = target.charAt(strIdx).toLowerCase();\n\t\tif (patternChar === targetChar) {\n\t\t\tpatternIdx++;\n\t\t}\n\t\t++strIdx;\n\t}\n\n\treturn pattern.length !== 0 && target.length !== 0 && patternIdx === pattern.length;\n}\n\n/**\n * Does a fuzzy search to find pattern inside a string.\n * @param {*} pattern string pattern to search for\n * @param {*} target string string which is being searched\n * @returns [boolean, number] a boolean which tells if pattern was\n * found or not and a search score\n */\nfunction fuzzyMatch(pattern: string, target: string): { matched: boolean; outScore: number } {\n\tconst recursionCount = 0;\n\tconst recursionLimit = 5;\n\tconst matches: number[] = [];\n\tconst maxMatches = 256;\n\n\treturn fuzzyMatchRecursive(\n\t\tpattern,\n\t\ttarget,\n\t\t0 /* patternCurIndex */,\n\t\t0 /* strCurrIndex */,\n\t\tnull /* srcMatces */,\n\t\tmatches,\n\t\tmaxMatches,\n\t\t0 /* nextMatch */,\n\t\trecursionCount,\n\t\trecursionLimit,\n\t);\n}\n\nfunction fuzzyMatchRecursive(\n\tpattern: string,\n\ttarget: string,\n\tpatternCurIndex: number,\n\ttargetCurrIndex: number,\n\ttargetMatches: null | number[],\n\tmatches: number[],\n\tmaxMatches: number,\n\tnextMatch: number,\n\trecursionCount: number,\n\trecursionLimit: number,\n): { matched: boolean; outScore: number } {\n\tlet outScore = 0;\n\n\t// Return if recursion limit is reached.\n\tif (++recursionCount >= recursionLimit) {\n\t\treturn { matched: false, outScore };\n\t}\n\n\t// Return if we reached ends of strings.\n\tif (patternCurIndex === pattern.length || targetCurrIndex === target.length) {\n\t\treturn { matched: false, outScore };\n\t}\n\n\t// Recursion params\n\tlet recursiveMatch = false;\n\tlet bestRecursiveMatches: number[] = [];\n\tlet bestRecursiveScore = 0;\n\n\t// Loop through pattern and str looking for a match.\n\tlet firstMatch = true;\n\twhile (patternCurIndex < pattern.length && targetCurrIndex < target.length) {\n\t\t// Match found.\n\t\tif (pattern[patternCurIndex].toLowerCase() === target[targetCurrIndex].toLowerCase()) {\n\t\t\tif (nextMatch >= maxMatches) {\n\t\t\t\treturn { matched: false, outScore };\n\t\t\t}\n\n\t\t\tif (firstMatch && targetMatches) {\n\t\t\t\tmatches = [...targetMatches];\n\t\t\t\tfirstMatch = false;\n\t\t\t}\n\n\t\t\tconst recursiveMatches: number[] = [];\n\t\t\tconst recursiveResult = fuzzyMatchRecursive(\n\t\t\t\tpattern,\n\t\t\t\ttarget,\n\t\t\t\tpatternCurIndex,\n\t\t\t\ttargetCurrIndex + 1,\n\t\t\t\tmatches,\n\t\t\t\trecursiveMatches,\n\t\t\t\tmaxMatches,\n\t\t\t\tnextMatch,\n\t\t\t\trecursionCount,\n\t\t\t\trecursionLimit,\n\t\t\t);\n\n\t\t\tconst recursiveScore = recursiveResult.outScore;\n\t\t\tif (recursiveResult.matched) {\n\t\t\t\t// Pick best recursive score.\n\t\t\t\tif (!recursiveMatch || recursiveScore > bestRecursiveScore) {\n\t\t\t\t\tbestRecursiveMatches = [...recursiveMatches];\n\t\t\t\t\tbestRecursiveScore = recursiveScore;\n\t\t\t\t}\n\t\t\t\trecursiveMatch = true;\n\t\t\t}\n\n\t\t\tmatches[nextMatch++] = targetCurrIndex;\n\t\t\t++patternCurIndex;\n\t\t}\n\t\t++targetCurrIndex;\n\t}\n\n\tconst matched = patternCurIndex === pattern.length;\n\n\tif (matched) {\n\t\toutScore = 100;\n\n\t\t// Apply leading letter penalty\n\t\tlet penalty = LEADING_LETTER_PENALTY * matches[0];\n\t\tpenalty = penalty < MAX_LEADING_LETTER_PENALTY ? MAX_LEADING_LETTER_PENALTY : penalty;\n\t\toutScore += penalty;\n\n\t\t//Apply unmatched penalty\n\t\tconst unmatched = target.length - nextMatch;\n\t\toutScore += UNMATCHED_LETTER_PENALTY * unmatched;\n\n\t\t// Apply ordering bonuses\n\t\tfor (let i = 0; i < nextMatch; i++) {\n\t\t\tconst currIdx = matches[i];\n\n\t\t\tif (i > 0) {\n\t\t\t\tconst prevIdx = matches[i - 1];\n\t\t\t\tif (currIdx === prevIdx + 1) {\n\t\t\t\t\toutScore += SEQUENTIAL_BONUS;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check for bonuses based on neighbor character value.\n\t\t\tif (currIdx > 0) {\n\t\t\t\t// Camel case\n\t\t\t\tconst neighbor = target[currIdx - 1];\n\t\t\t\tconst curr = target[currIdx];\n\t\t\t\tif (neighbor !== neighbor.toUpperCase() && curr !== curr.toLowerCase()) {\n\t\t\t\t\toutScore += CAMEL_BONUS;\n\t\t\t\t}\n\t\t\t\tconst isNeighbourSeparator = neighbor === '_' || neighbor === ' ';\n\t\t\t\tif (isNeighbourSeparator) {\n\t\t\t\t\toutScore += SEPARATOR_BONUS;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// First letter\n\t\t\t\toutScore += FIRST_LETTER_BONUS;\n\t\t\t}\n\t\t}\n\n\t\t// Return best result\n\t\tif (recursiveMatch && (!matched || bestRecursiveScore > outScore)) {\n\t\t\t// Recursive score is better than \"this\"\n\t\t\tmatches = [...bestRecursiveMatches];\n\t\t\toutScore = bestRecursiveScore;\n\t\t\treturn { matched: true, outScore };\n\t\t} else if (matched) {\n\t\t\t// \"this\" score is better than recursive\n\t\t\treturn { matched: true, outScore };\n\t\t} else {\n\t\t\treturn { matched: false, outScore };\n\t\t}\n\t}\n\treturn { matched: false, outScore };\n}\n\n// prop = 'key'\n// prop = 'key1.key2'\n// prop = ['key1', 'key2']\nfunction getValue<T extends object>(obj: T, prop: string): unknown {\n\tif (obj.hasOwnProperty(prop)) {\n\t\treturn obj[prop as keyof T];\n\t}\n\n\tconst segments = prop.split('.');\n\n\tlet result = obj;\n\tlet i = 0;\n\twhile (result && i < segments.length) {\n\t\tconst key = segments[i] as keyof T;\n\t\tresult = result[key] as T;\n\t\ti++;\n\t}\n\treturn result;\n}\n\nexport function sublimeSearch<T extends object>(\n\tfilter: string,\n\tdata: Readonly<T[]>,\n\tkeys: Array<{ key: string; weight: number }>,\n): Array<{ score: number; item: T }> {\n\tconst results = data.reduce((accu: Array<{ score: number; item: T }>, item: T) => {\n\t\tlet values: Array<{ value: string; weight: number }> = [];\n\t\tkeys.forEach(({ key, weight }) => {\n\t\t\tconst value = getValue(item, key);\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tvalues = values.concat(value.map((v) => ({ value: v, weight })));\n\t\t\t} else if (typeof value === 'string') {\n\t\t\t\tvalues.push({\n\t\t\t\t\tvalue,\n\t\t\t\t\tweight,\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// for each item, check every key and get maximum score\n\t\tconst itemMatch = values.reduce(\n\t\t\t(\n\t\t\t\taccu: null | { matched: boolean; outScore: number },\n\t\t\t\t{ value, weight }: { value: string; weight: number },\n\t\t\t) => {\n\t\t\t\tif (!fuzzyMatchSimple(filter, value)) {\n\t\t\t\t\treturn accu;\n\t\t\t\t}\n\n\t\t\t\tconst match = fuzzyMatch(filter, value);\n\t\t\t\tmatch.outScore *= weight;\n\n\t\t\t\tconst { matched, outScore } = match;\n\t\t\t\tif (!accu && matched) {\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t\tif (matched && accu && outScore > accu.outScore) {\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t\treturn accu;\n\t\t\t},\n\t\t\tnull,\n\t\t);\n\n\t\tif (itemMatch) {\n\t\t\taccu.push({\n\t\t\t\tscore: itemMatch.outScore,\n\t\t\t\titem,\n\t\t\t});\n\t\t}\n\n\t\treturn accu;\n\t}, []);\n\n\tresults.sort((a, b) => {\n\t\treturn b.score - a.score;\n\t});\n\n\treturn results;\n}\n","import type {\n\tNodeCreateElement,\n\tActionCreateElement,\n\tSubcategorizedNodeTypes,\n\tSimplifiedNodeType,\n\tINodeCreateElement,\n\tSectionCreateElement,\n} from '@/Interface';\nimport { AI_SUBCATEGORY, CORE_NODES_CATEGORY, DEFAULT_SUBCATEGORY } from '@/constants';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { sublimeSearch } from '@/utils/sortUtils';\nimport { i18n } from '@/plugins/i18n';\nimport type { NodeViewItemSection } from './viewsData';\n\nexport function transformNodeType(\n\tnode: SimplifiedNodeType,\n\tsubcategory?: string,\n\ttype: 'node' | 'action' = 'node',\n): NodeCreateElement | ActionCreateElement {\n\tconst createElement = {\n\t\tuuid: uuidv4(),\n\t\tkey: node.name,\n\t\tsubcategory:\n\t\t\tsubcategory ?? node.codex?.subcategories?.[CORE_NODES_CATEGORY]?.[0] ?? DEFAULT_SUBCATEGORY,\n\t\tproperties: {\n\t\t\t...node,\n\t\t},\n\t\ttype,\n\t};\n\n\treturn type === 'action'\n\t\t? (createElement as ActionCreateElement)\n\t\t: (createElement as NodeCreateElement);\n}\n\nexport function subcategorizeItems(items: SimplifiedNodeType[]) {\n\tconst WHITE_LISTED_SUBCATEGORIES = [CORE_NODES_CATEGORY, AI_SUBCATEGORY];\n\treturn items.reduce((acc: SubcategorizedNodeTypes, item) => {\n\t\t// Only some subcategories are allowed\n\t\tlet subcategories: string[] = [DEFAULT_SUBCATEGORY];\n\n\t\tWHITE_LISTED_SUBCATEGORIES.forEach((category) => {\n\t\t\tif (item.codex?.categories?.includes(category)) {\n\t\t\t\tsubcategories = item.codex?.subcategories?.[category] ?? [];\n\t\t\t}\n\t\t});\n\n\t\tsubcategories.forEach((subcategory: string) => {\n\t\t\tif (!acc[subcategory]) {\n\t\t\t\tacc[subcategory] = [];\n\t\t\t}\n\t\t\tacc[subcategory].push(transformNodeType(item, subcategory));\n\t\t});\n\n\t\treturn acc;\n\t}, {});\n}\n\nexport function sortNodeCreateElements(nodes: INodeCreateElement[]) {\n\treturn nodes.sort((a, b) => {\n\t\tif (a.type !== 'node' || b.type !== 'node') return 0;\n\t\tconst displayNameA = a.properties?.displayName?.toLowerCase() || a.key;\n\t\tconst displayNameB = b.properties?.displayName?.toLowerCase() || b.key;\n\n\t\treturn displayNameA.localeCompare(displayNameB, undefined, { sensitivity: 'base' });\n\t});\n}\n\nexport function searchNodes(searchFilter: string, items: INodeCreateElement[]) {\n\t// In order to support the old search we need to remove the 'trigger' part\n\tconst trimmedFilter = searchFilter.toLowerCase().replace('trigger', '').trimEnd();\n\tconst result = (\n\t\tsublimeSearch<INodeCreateElement>(trimmedFilter, items, [\n\t\t\t{ key: 'properties.displayName', weight: 1.3 },\n\t\t\t{ key: 'properties.codex.alias', weight: 1 },\n\t\t]) || []\n\t).map(({ item }) => item);\n\n\treturn result;\n}\n\nexport function flattenCreateElements(items: INodeCreateElement[]): INodeCreateElement[] {\n\treturn items.map((item) => (item.type === 'section' ? item.children : item)).flat();\n}\n\nexport function groupItemsInSections(\n\titems: INodeCreateElement[],\n\tsections: string[] | NodeViewItemSection[],\n): INodeCreateElement[] {\n\tconst filteredSections = sections.filter(\n\t\t(section): section is NodeViewItemSection => typeof section === 'object',\n\t);\n\n\tconst itemsBySection = items.reduce((acc: Record<string, INodeCreateElement[]>, item) => {\n\t\tconst section = filteredSections.find((s) => s.items.includes(item.key));\n\t\tconst key = section?.key ?? 'other';\n\t\tacc[key] = [...(acc[key] ?? []), item];\n\t\treturn acc;\n\t}, {});\n\n\tconst result: SectionCreateElement[] = filteredSections\n\t\t.map(\n\t\t\t(section): SectionCreateElement => ({\n\t\t\t\ttype: 'section',\n\t\t\t\tkey: section.key,\n\t\t\t\ttitle: section.title,\n\t\t\t\tchildren: sortNodeCreateElements(itemsBySection[section.key] ?? []),\n\t\t\t}),\n\t\t)\n\t\t.concat({\n\t\t\ttype: 'section',\n\t\t\tkey: 'other',\n\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.other'),\n\t\t\tchildren: sortNodeCreateElements(itemsBySection.other ?? []),\n\t\t})\n\t\t.filter((section) => section.children.length > 0);\n\n\tif (result.length <= 1) {\n\t\treturn items;\n\t}\n\n\treturn result;\n}\n","import { defineStore } from 'pinia';\nimport { STORES, TRIGGER_NODE_CREATOR_VIEW } from '@/constants';\nimport type {\n\tNodeFilterType,\n\tNodeCreatorOpenSource,\n\tSimplifiedNodeType,\n\tActionsRecord,\n} from '@/Interface';\n\nimport { computed, ref } from 'vue';\nimport { transformNodeType } from '@/components/Node/NodeCreator/utils';\n\nexport const useNodeCreatorStore = defineStore(STORES.NODE_CREATOR, () => {\n\tconst selectedView = ref<NodeFilterType>(TRIGGER_NODE_CREATOR_VIEW);\n\tconst mergedNodes = ref<SimplifiedNodeType[]>([]);\n\tconst actions = ref<ActionsRecord<typeof mergedNodes.value>>({});\n\n\tconst showScrim = ref(false);\n\tconst openSource = ref<NodeCreatorOpenSource>('');\n\n\tconst allNodeCreatorNodes = computed(() =>\n\t\tObject.values(mergedNodes.value).map((i) => transformNodeType(i)),\n\t);\n\n\tfunction setMergeNodes(nodes: SimplifiedNodeType[]) {\n\t\tmergedNodes.value = nodes;\n\t}\n\n\tfunction setActions(nodes: ActionsRecord<typeof mergedNodes.value>) {\n\t\tactions.value = nodes;\n\t}\n\n\tfunction setShowScrim(isVisible: boolean) {\n\t\tshowScrim.value = isVisible;\n\t}\n\n\tfunction setSelectedView(view: NodeFilterType) {\n\t\tselectedView.value = view;\n\t}\n\n\tfunction setOpenSource(view: NodeCreatorOpenSource) {\n\t\topenSource.value = view;\n\t}\n\n\treturn {\n\t\topenSource,\n\t\tselectedView,\n\t\tshowScrim,\n\t\tmergedNodes,\n\t\tactions,\n\t\tsetShowScrim,\n\t\tsetSelectedView,\n\t\tsetOpenSource,\n\t\tsetActions,\n\t\tsetMergeNodes,\n\t\tallNodeCreatorNodes,\n\t};\n});\n","<template>\n\t<div\n\t\tref=\"container\"\n\t\t:class=\"$style.canvasAddButton\"\n\t\t:style=\"containerCssVars\"\n\t\tdata-test-id=\"canvas-add-button\"\n\t>\n\t\t<n8n-tooltip\n\t\t\tplacement=\"top\"\n\t\t\t:visible=\"showTooltip\"\n\t\t\t:disabled=\"nodeCreatorStore.showScrim\"\n\t\t\t:popper-class=\"$style.tooltip\"\n\t\t\t:show-after=\"700\"\n\t\t>\n\t\t\t<button :class=\"$style.button\" data-test-id=\"canvas-plus-button\" @click=\"$emit('click')\">\n\t\t\t\t<font-awesome-icon icon=\"plus\" size=\"lg\" />\n\t\t\t</button>\n\t\t\t<template #content>\n\t\t\t\t{{ $locale.baseText('nodeView.canvasAddButton.addATriggerNodeBeforeExecuting') }}\n\t\t\t</template>\n\t\t</n8n-tooltip>\n\t\t<p :class=\"$style.label\" v-text=\"$locale.baseText('nodeView.canvasAddButton.addFirstStep')\" />\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { XYPosition } from '@/Interface';\nimport { useNodeCreatorStore } from '@/stores/nodeCreator.store';\n\nexport interface Props {\n\tshowTooltip: boolean;\n\tposition: XYPosition;\n}\n\nconst props = defineProps<Props>();\n\nconst nodeCreatorStore = useNodeCreatorStore();\nconst containerCssVars = computed(() => ({\n\t'--trigger-placeholder-left-position': `${props.position[0]}px`,\n\t'--trigger-placeholder-top-position': `${props.position[1]}px`,\n}));\n</script>\n\n<style lang=\"scss\" module>\n.canvasAddButton {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 100px;\n\theight: 100px;\n\tposition: absolute;\n\ttop: var(--trigger-placeholder-top-position);\n\tleft: var(--trigger-placeholder-left-position);\n\t// We have to increase z-index to make sure it's higher than selecting box in NodeView\n\t// otherwise the clicks wouldn't register\n\tz-index: 101;\n\n\t&:hover .button svg path {\n\t\tfill: var(--color-primary);\n\t}\n}\n\n.button {\n\tbackground: var(--color-foreground-xlight);\n\tborder: 2px dashed var(--color-foreground-xdark);\n\tborder-radius: 8px;\n\tpadding: 0;\n\n\tmin-width: 100px;\n\tmin-height: 100px;\n\tcursor: pointer;\n\n\tsvg {\n\t\twidth: 26px !important;\n\t\theight: 40px;\n\t\tpath {\n\t\t\tfill: var(--color-foreground-xdark);\n\t\t}\n\t}\n}\n\n.label {\n\twidth: max-content;\n\tfont-weight: var(--font-weight-bold);\n\tfont-size: var(--font-size-m);\n\tline-height: var(--font-line-height-xloose);\n\tcolor: var(--color-text-dark);\n\tmargin-top: var(--spacing-2xs);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useAIStore } from '@/stores/ai.store';\nimport { useI18n } from '@/composables/useI18n';\nimport { computed } from 'vue';\nimport { useTelemetry } from '@/composables/useTelemetry';\n\nconst aiStore = useAIStore();\nconst locale = useI18n();\nconst telemetry = useTelemetry();\n\nconst emit = defineEmits<{ (event: 'optionSelected', option: string): void }>();\n\nconst aiAssistantChatOpen = computed(() => aiStore.assistantChatOpen);\n\nconst title = computed(() => {\n\treturn aiStore.nextStepPopupConfig.title;\n});\n\nconst options = computed(() => [\n\t{\n\t\tlabel: locale.baseText('nextStepPopup.option.choose'),\n\t\ticon: '➕',\n\t\tkey: 'choose',\n\t\tdisabled: false,\n\t},\n\t{\n\t\tlabel: locale.baseText('nextStepPopup.option.generate'),\n\t\ticon: '✨',\n\t\tkey: 'generate',\n\t\tdisabled: aiAssistantChatOpen.value,\n\t},\n]);\n\nconst position = computed(() => {\n\treturn [aiStore.nextStepPopupConfig.position[0], aiStore.nextStepPopupConfig.position[1]];\n});\n\nconst style = computed(() => {\n\treturn {\n\t\tleft: `${position.value[0]}px`,\n\t\ttop: `${position.value[1]}px`,\n\t};\n});\n\nconst close = () => {\n\taiStore.closeNextStepPopup();\n};\n\nconst onOptionSelected = (option: string) => {\n\tif (option === 'choose') {\n\t\temit('optionSelected', option);\n\t} else if (option === 'generate') {\n\t\ttelemetry.track('User clicked generate AI button', {}, { withPostHog: true });\n\t\taiStore.assistantChatOpen = true;\n\t}\n\tclose();\n};\n</script>\n\n<template>\n\t<div v-on-click-outside=\"close\" :class=\"$style.container\" :style=\"style\">\n\t\t<div :class=\"$style.title\">{{ title }}</div>\n\t\t<ul :class=\"$style.options\">\n\t\t\t<li\n\t\t\t\tv-for=\"option in options\"\n\t\t\t\t:key=\"option.key\"\n\t\t\t\t:class=\"{ [$style.option]: true, [$style.disabled]: option.disabled }\"\n\t\t\t\t@click=\"onOptionSelected(option.key)\"\n\t\t\t>\n\t\t\t\t<div :class=\"$style.icon\">\n\t\t\t\t\t{{ option.icon }}\n\t\t\t\t</div>\n\t\t\t\t<div :class=\"$style.label\">\n\t\t\t\t\t{{ option.label }}\n\t\t\t\t</div>\n\t\t\t</li>\n\t\t</ul>\n\t</div>\n</template>\n\n<style module lang=\"scss\">\n.container {\n\tposition: fixed;\n\tdisplay: flex;\n\tflex-direction: column;\n\tmin-width: 190px;\n\tfont-size: var(--font-size-2xs);\n\tbackground: var(--color-background-xlight);\n\tfilter: drop-shadow(0px 6px 16px #441c170f);\n\tborder: var(--border-width-base) var(--border-style-base) var(--color-foreground-light);\n\tborder-radius: var(--border-radius-base);\n\n\t// Arrow border is created as the outer triange\n\t&:before {\n\t\tcontent: '';\n\t\tposition: relative;\n\t\tleft: -11px;\n\t\ttop: calc(50% - 8px);\n\t\tborder-top: 10px solid transparent;\n\t\tborder-bottom: 10px solid transparent;\n\t\tborder-right: 10px solid var(--color-foreground-light);\n\t\tposition: absolute;\n\t}\n\n\t// Arrow background is created as the inner triangle\n\t&:after {\n\t\tcontent: '';\n\t\tposition: relative;\n\t\tleft: -10px;\n\t\ttop: calc(50% - 8px);\n\t\tborder-top: 10px solid transparent;\n\t\tborder-bottom: 10px solid transparent;\n\t\tborder-right: 10px solid var(--color-background-xlight);\n\t\tposition: absolute;\n\t}\n}\n\n.title {\n\tpadding: var(--spacing-xs);\n\tcolor: var(--color-text-base);\n\tfont-weight: var(--font-weight-bold);\n}\n\n.options {\n\tlist-style: none;\n\tdisplay: flex;\n\tflex-direction: column;\n\tpadding-bottom: var(--spacing-2xs);\n}\n\n.option {\n\tdisplay: flex;\n\tpadding: var(--spacing-3xs) var(--spacing-xs);\n\tgap: var(--spacing-xs);\n\tcursor: pointer;\n\tcolor: var(--color-text-dark);\n\n\t&:hover {\n\t\tbackground: var(--color-background-base);\n\t\tfont-weight: var(--font-weight-bold);\n\t}\n\n\t&.disabled {\n\t\tpointer-events: none;\n\t\tcolor: var(--color-text-light);\n\t}\n}\n</style>\n","import {\n\tCORE_NODES_CATEGORY,\n\tWEBHOOK_NODE_TYPE,\n\tOTHER_TRIGGER_NODES_SUBCATEGORY,\n\tEXECUTE_WORKFLOW_TRIGGER_NODE_TYPE,\n\tFORM_TRIGGER_NODE_TYPE,\n\tMANUAL_TRIGGER_NODE_TYPE,\n\tSCHEDULE_TRIGGER_NODE_TYPE,\n\tREGULAR_NODE_CREATOR_VIEW,\n\tTRANSFORM_DATA_SUBCATEGORY,\n\tFILES_SUBCATEGORY,\n\tFLOWS_CONTROL_SUBCATEGORY,\n\tTRIGGER_NODE_CREATOR_VIEW,\n\tEMAIL_IMAP_NODE_TYPE,\n\tDEFAULT_SUBCATEGORY,\n\tAI_NODE_CREATOR_VIEW,\n\tAI_CATEGORY_AGENTS,\n\tAI_CATEGORY_CHAINS,\n\tAI_CATEGORY_DOCUMENT_LOADERS,\n\tAI_CATEGORY_LANGUAGE_MODELS,\n\tAI_CATEGORY_MEMORY,\n\tAI_CATEGORY_OUTPUTPARSER,\n\tAI_CATEGORY_RETRIEVERS,\n\tAI_CATEGORY_TEXT_SPLITTERS,\n\tAI_CATEGORY_TOOLS,\n\tAI_CATEGORY_VECTOR_STORES,\n\tAI_SUBCATEGORY,\n\tAI_CATEGORY_EMBEDDING,\n\tAI_OTHERS_NODE_CREATOR_VIEW,\n\tAI_UNCATEGORIZED_CATEGORY,\n\tCONVERT_TO_FILE_NODE_TYPE,\n\tEXTRACT_FROM_FILE_NODE_TYPE,\n\tSET_NODE_TYPE,\n\tCODE_NODE_TYPE,\n\tDATETIME_NODE_TYPE,\n\tFILTER_NODE_TYPE,\n\tREMOVE_DUPLICATES_NODE_TYPE,\n\tSPLIT_OUT_NODE_TYPE,\n\tLIMIT_NODE_TYPE,\n\tSUMMARIZE_NODE_TYPE,\n\tAGGREGATE_NODE_TYPE,\n\tMERGE_NODE_TYPE,\n\tHTML_NODE_TYPE,\n\tMARKDOWN_NODE_TYPE,\n\tXML_NODE_TYPE,\n\tCRYPTO_NODE_TYPE,\n\tIF_NODE_TYPE,\n\tSPLIT_IN_BATCHES_NODE_TYPE,\n\tHTTP_REQUEST_NODE_TYPE,\n\tHELPERS_SUBCATEGORY,\n\tRSS_READ_NODE_TYPE,\n\tEMAIL_SEND_NODE_TYPE,\n\tEDIT_IMAGE_NODE_TYPE,\n\tCOMPRESSION_NODE_TYPE,\n} from '@/constants';\nimport { useI18n } from '@/composables/useI18n';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport type { SimplifiedNodeType } from '@/Interface';\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport { NodeConnectionType } from 'n8n-workflow';\nimport { useTemplatesStore } from '@/stores/templates.store';\n\nexport interface NodeViewItemSection {\n\tkey: string;\n\ttitle: string;\n\titems: string[];\n}\n\nexport interface NodeViewItem {\n\tkey: string;\n\ttype: string;\n\tproperties: {\n\t\tname?: string;\n\t\ttitle?: string;\n\t\ticon?: string;\n\t\ticonProps?: {\n\t\t\tcolor?: string;\n\t\t};\n\t\tconnectionType?: NodeConnectionType;\n\t\tpanelClass?: string;\n\t\tgroup?: string[];\n\t\tsections?: NodeViewItemSection[];\n\t\tdescription?: string;\n\t\tdisplayName?: string;\n\t\ttag?: string;\n\t\tforceIncludeNodes?: string[];\n\t\ticonData?: {\n\t\t\ttype: string;\n\t\t\ticon?: string;\n\t\t\tfileBuffer?: string;\n\t\t};\n\t};\n\tcategory?: string | string[];\n}\n\ninterface NodeView {\n\tvalue: string;\n\ttitle: string;\n\tinfo?: string;\n\tsubtitle?: string;\n\titems: NodeViewItem[];\n}\n\nfunction getAiNodesBySubcategory(nodes: INodeTypeDescription[], subcategory: string) {\n\treturn nodes\n\t\t.filter(\n\t\t\t(node) => !node.hidden && node.codex?.subcategories?.[AI_SUBCATEGORY]?.includes(subcategory),\n\t\t)\n\t\t.map((node) => ({\n\t\t\tkey: node.name,\n\t\t\ttype: 'node',\n\t\t\tproperties: {\n\t\t\t\tgroup: [],\n\t\t\t\tname: node.name,\n\t\t\t\tdisplayName: node.displayName,\n\t\t\t\ttitle: node.displayName,\n\t\t\t\tdescription: node.description,\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\ticon: node.icon!,\n\t\t\t\ticonData: node.name.toLowerCase().includes('openai')\n\t\t\t\t\t? {\n\t\t\t\t\t\t\ttype: 'file',\n\t\t\t\t\t\t\ticon: 'openai',\n\t\t\t\t\t\t\tfileBuffer: '/static/open-ai.svg',\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t},\n\t\t}))\n\t\t.sort((a, b) => a.properties.displayName.localeCompare(b.properties.displayName));\n}\n\nexport function AIView(_nodes: SimplifiedNodeType[]): NodeView {\n\tconst i18n = useI18n();\n\tconst nodeTypesStore = useNodeTypesStore();\n\tconst templatesStore = useTemplatesStore();\n\n\tconst chainNodes = getAiNodesBySubcategory(nodeTypesStore.allLatestNodeTypes, AI_CATEGORY_CHAINS);\n\tconst agentNodes = getAiNodesBySubcategory(nodeTypesStore.allLatestNodeTypes, AI_CATEGORY_AGENTS);\n\n\treturn {\n\t\tvalue: AI_NODE_CREATOR_VIEW,\n\t\ttitle: i18n.baseText('nodeCreator.aiPanel.aiNodes'),\n\t\tsubtitle: i18n.baseText('nodeCreator.aiPanel.selectAiNode'),\n\t\tinfo: i18n.baseText('nodeCreator.aiPanel.infoBox', {\n\t\t\tinterpolate: { link: templatesStore.getWebsiteCategoryURL('ai') },\n\t\t}),\n\t\titems: [\n\t\t\t...chainNodes,\n\t\t\t...agentNodes,\n\t\t\t{\n\t\t\t\tkey: AI_OTHERS_NODE_CREATOR_VIEW,\n\t\t\t\ttype: 'view',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: i18n.baseText('nodeCreator.aiPanel.aiOtherNodes'),\n\t\t\t\t\ticon: 'robot',\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.aiPanel.aiOtherNodesDescription'),\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t};\n}\nexport function AINodesView(_nodes: SimplifiedNodeType[]): NodeView {\n\tconst i18n = useI18n();\n\n\tfunction getAISubcategoryProperties(nodeConnectionType: NodeConnectionType) {\n\t\treturn {\n\t\t\tconnectionType: nodeConnectionType,\n\t\t\ticonProps: {\n\t\t\t\tcolor: `var(--node-type-${nodeConnectionType}-color)`,\n\t\t\t},\n\t\t\tpanelClass: `nodes-list-panel-${nodeConnectionType}`,\n\t\t};\n\t}\n\n\treturn {\n\t\tvalue: AI_OTHERS_NODE_CREATOR_VIEW,\n\t\ttitle: i18n.baseText('nodeCreator.aiPanel.aiOtherNodes'),\n\t\tsubtitle: i18n.baseText('nodeCreator.aiPanel.selectAiNode'),\n\t\titems: [\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_DOCUMENT_LOADERS,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_DOCUMENT_LOADERS,\n\t\t\t\t\ticon: 'file-import',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiDocument),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_LANGUAGE_MODELS,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_LANGUAGE_MODELS,\n\t\t\t\t\ticon: 'language',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiLanguageModel),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_MEMORY,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_MEMORY,\n\t\t\t\t\ticon: 'brain',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiMemory),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_OUTPUTPARSER,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_OUTPUTPARSER,\n\t\t\t\t\ticon: 'list',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiOutputParser),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_RETRIEVERS,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_RETRIEVERS,\n\t\t\t\t\ticon: 'search',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiRetriever),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_TEXT_SPLITTERS,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_TEXT_SPLITTERS,\n\t\t\t\t\ticon: 'grip-lines-vertical',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiTextSplitter),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_TOOLS,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_TOOLS,\n\t\t\t\t\ticon: 'tools',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiTool),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_EMBEDDING,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_EMBEDDING,\n\t\t\t\t\ticon: 'vector-square',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiEmbedding),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_VECTOR_STORES,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_VECTOR_STORES,\n\t\t\t\t\ticon: 'project-diagram',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiVectorStore),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_UNCATEGORIZED_CATEGORY,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_UNCATEGORIZED_CATEGORY,\n\t\t\t\t\ticon: 'code',\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t};\n}\n\nexport function TriggerView() {\n\tconst i18n = useI18n();\n\n\tconst view: NodeView = {\n\t\tvalue: TRIGGER_NODE_CREATOR_VIEW,\n\t\ttitle: i18n.baseText('nodeCreator.triggerHelperPanel.selectATrigger'),\n\t\tsubtitle: i18n.baseText('nodeCreator.triggerHelperPanel.selectATriggerDescription'),\n\t\titems: [\n\t\t\t{\n\t\t\t\tkey: DEFAULT_SUBCATEGORY,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\tforceIncludeNodes: [WEBHOOK_NODE_TYPE, EMAIL_IMAP_NODE_TYPE],\n\t\t\t\t\ttitle: 'App Trigger Nodes',\n\t\t\t\t\ticon: 'satellite-dish',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: SCHEDULE_TRIGGER_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: SCHEDULE_TRIGGER_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.scheduleTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.scheduleTriggerDescription'),\n\t\t\t\t\ticon: 'fa:clock',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: WEBHOOK_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: WEBHOOK_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.webhookTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.webhookTriggerDescription'),\n\t\t\t\t\ticonData: {\n\t\t\t\t\t\ttype: 'file',\n\t\t\t\t\t\ticon: 'webhook',\n\t\t\t\t\t\tfileBuffer: '/static/webhook-icon.svg',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: FORM_TRIGGER_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: FORM_TRIGGER_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.formTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.formTriggerDescription'),\n\t\t\t\t\ticonData: {\n\t\t\t\t\t\ttype: 'file',\n\t\t\t\t\t\ticon: 'form',\n\t\t\t\t\t\tfileBuffer: '/static/form-grey.svg',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: MANUAL_TRIGGER_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: MANUAL_TRIGGER_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.manualTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.manualTriggerDescription'),\n\t\t\t\t\ticon: 'fa:mouse-pointer',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.workflowTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.workflowTriggerDescription'),\n\t\t\t\t\ticon: 'fa:sign-out-alt',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: OTHER_TRIGGER_NODES_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: OTHER_TRIGGER_NODES_SUBCATEGORY,\n\t\t\t\t\ticon: 'folder-open',\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t};\n\n\treturn view;\n}\n\nexport function RegularView(nodes: SimplifiedNodeType[]) {\n\tconst i18n = useI18n();\n\n\tconst view: NodeView = {\n\t\tvalue: REGULAR_NODE_CREATOR_VIEW,\n\t\ttitle: i18n.baseText('nodeCreator.triggerHelperPanel.whatHappensNext'),\n\t\titems: [\n\t\t\t{\n\t\t\t\tkey: DEFAULT_SUBCATEGORY,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: 'App Regular Nodes',\n\t\t\t\t\ticon: 'globe',\n\t\t\t\t\tforceIncludeNodes: [RSS_READ_NODE_TYPE, EMAIL_SEND_NODE_TYPE],\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: TRANSFORM_DATA_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: TRANSFORM_DATA_SUBCATEGORY,\n\t\t\t\t\ticon: 'pen',\n\t\t\t\t\tsections: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'popular',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.popular'),\n\t\t\t\t\t\t\titems: [SET_NODE_TYPE, CODE_NODE_TYPE, DATETIME_NODE_TYPE],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'addOrRemove',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.transform.addOrRemove'),\n\t\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t\tFILTER_NODE_TYPE,\n\t\t\t\t\t\t\t\tREMOVE_DUPLICATES_NODE_TYPE,\n\t\t\t\t\t\t\t\tSPLIT_OUT_NODE_TYPE,\n\t\t\t\t\t\t\t\tLIMIT_NODE_TYPE,\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'combine',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.transform.combine'),\n\t\t\t\t\t\t\titems: [SUMMARIZE_NODE_TYPE, AGGREGATE_NODE_TYPE, MERGE_NODE_TYPE],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'convert',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.transform.convert'),\n\t\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t\tHTML_NODE_TYPE,\n\t\t\t\t\t\t\t\tMARKDOWN_NODE_TYPE,\n\t\t\t\t\t\t\t\tXML_NODE_TYPE,\n\t\t\t\t\t\t\t\tCRYPTO_NODE_TYPE,\n\t\t\t\t\t\t\t\tEXTRACT_FROM_FILE_NODE_TYPE,\n\t\t\t\t\t\t\t\tCONVERT_TO_FILE_NODE_TYPE,\n\t\t\t\t\t\t\t\tCOMPRESSION_NODE_TYPE,\n\t\t\t\t\t\t\t\tEDIT_IMAGE_NODE_TYPE,\n\t\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},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: FLOWS_CONTROL_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: FLOWS_CONTROL_SUBCATEGORY,\n\t\t\t\t\ticon: 'code-branch',\n\t\t\t\t\tsections: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'popular',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.popular'),\n\t\t\t\t\t\t\titems: [FILTER_NODE_TYPE, IF_NODE_TYPE, SPLIT_IN_BATCHES_NODE_TYPE, MERGE_NODE_TYPE],\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\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: FILES_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: FILES_SUBCATEGORY,\n\t\t\t\t\ticon: 'file-alt',\n\t\t\t\t\tsections: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'popular',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.popular'),\n\t\t\t\t\t\t\titems: [CONVERT_TO_FILE_NODE_TYPE, EXTRACT_FROM_FILE_NODE_TYPE],\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\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: HELPERS_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: HELPERS_SUBCATEGORY,\n\t\t\t\t\ticon: 'toolbox',\n\t\t\t\t\tsections: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'popular',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.popular'),\n\t\t\t\t\t\t\titems: [HTTP_REQUEST_NODE_TYPE, WEBHOOK_NODE_TYPE, CODE_NODE_TYPE],\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\t};\n\n\tconst hasAINodes = (nodes ?? []).some((node) => node.codex?.categories?.includes(AI_SUBCATEGORY));\n\tif (hasAINodes)\n\t\tview.items.push({\n\t\t\tkey: AI_NODE_CREATOR_VIEW,\n\t\t\ttype: 'view',\n\t\t\tproperties: {\n\t\t\t\ttitle: i18n.baseText('nodeCreator.aiPanel.langchainAiNodes'),\n\t\t\t\ticon: 'robot',\n\t\t\t\tdescription: i18n.baseText('nodeCreator.aiPanel.nodesForAi'),\n\t\t\t\ttag: i18n.baseText('nodeCreator.aiPanel.newTag'),\n\t\t\t},\n\t\t});\n\n\tview.items.push({\n\t\tkey: TRIGGER_NODE_CREATOR_VIEW,\n\t\ttype: 'view',\n\t\tproperties: {\n\t\t\ttitle: i18n.baseText('nodeCreator.triggerHelperPanel.addAnotherTrigger'),\n\t\t\ticon: 'bolt',\n\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.addAnotherTriggerDescription'),\n\t\t},\n\t});\n\n\treturn view;\n}\n","import { ref } from 'vue';\nimport { defineStore } from 'pinia';\n\nexport type KeyboardKey = (typeof WATCHED_KEYS)[number];\ninterface KeyHook {\n\tkeyboardKeys: KeyboardKey[];\n\tcondition?: (type: string, activeItemId: string) => boolean;\n\thandler: (activeItemId: string, keyboardKey: KeyboardKey) => void;\n}\n\nexport const KEYBOARD_ID_ATTR = 'data-keyboard-nav-id';\nexport const WATCHED_KEYS = [\n\t'ArrowUp',\n\t'ArrowDown',\n\t'ArrowLeft',\n\t'ArrowRight',\n\t'Enter',\n\t'Escape',\n\t'Tab',\n];\n\nexport const useKeyboardNavigation = defineStore('nodeCreatorKeyboardNavigation', () => {\n\tconst selectableItems = ref<Array<WeakRef<Element>>>([]);\n\tconst activeItemId = ref<string | null>(null);\n\t// Array of objects that contains key code and handler\n\tconst keysHooks = ref<Record<string, KeyHook>>({});\n\n\tfunction getItemType(element?: Element) {\n\t\treturn element?.getAttribute('data-keyboard-nav-type');\n\t}\n\tfunction getElementId(element?: Element) {\n\t\treturn element?.getAttribute(KEYBOARD_ID_ATTR) || undefined;\n\t}\n\tasync function refreshSelectableItems(): Promise<void> {\n\t\treturn await new Promise((resolve) => {\n\t\t\t// Wait for DOM to update\n\t\t\tcleanupSelectableItems();\n\t\t\tsetTimeout(() => {\n\t\t\t\tselectableItems.value = Array.from(\n\t\t\t\t\tdocument.querySelectorAll('[data-keyboard-nav-type]'),\n\t\t\t\t).map((el) => new WeakRef(el));\n\t\t\t\tresolve();\n\t\t\t}, 0);\n\t\t});\n\t}\n\n\tfunction executeKeyHooks(keyboardKey: KeyboardKey, activeItem: Element) {\n\t\tconst flatHooks = Object.values(keysHooks.value);\n\t\tconst hooks = flatHooks.filter((hook) => hook.keyboardKeys.includes(keyboardKey));\n\n\t\thooks.forEach((hook) => {\n\t\t\tif (!activeItemId.value) return;\n\n\t\t\tconst conditionPassed =\n\t\t\t\thook.condition === undefined ||\n\t\t\t\thook.condition(getItemType(activeItem) || '', activeItemId.value);\n\n\t\t\tif (conditionPassed && activeItemId.value) {\n\t\t\t\thook.handler(activeItemId.value, keyboardKey);\n\t\t\t}\n\t\t});\n\t}\n\n\tasync function onKeyDown(e: KeyboardEvent) {\n\t\tconst pressedKey = e.key;\n\t\tif (!WATCHED_KEYS.includes(pressedKey)) return;\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tawait refreshSelectableItems();\n\t\tconst activeItemIndex = selectableItems.value.findIndex(\n\t\t\t(item) => getElementId(item?.deref()) === activeItemId.value,\n\t\t);\n\t\tconst activeItem = selectableItems.value[activeItemIndex]?.deref();\n\n\t\tconst isArrowDown = pressedKey === 'ArrowDown';\n\t\tconst isArrowUp = pressedKey === 'ArrowUp';\n\n\t\tif (!activeItem) return;\n\n\t\tif (isArrowDown) {\n\t\t\tconst nextItemIndex =\n\t\t\t\tactiveItemIndex < selectableItems.value.length - 1 ? activeItemIndex + 1 : 0;\n\n\t\t\tsetActiveItem(selectableItems.value[nextItemIndex]?.deref());\n\t\t}\n\t\tif (isArrowUp) {\n\t\t\tconst previousIndex =\n\t\t\t\tactiveItemIndex > 0 ? activeItemIndex - 1 : selectableItems.value.length - 1;\n\n\t\t\tsetActiveItem(selectableItems.value[previousIndex]?.deref());\n\t\t}\n\t\texecuteKeyHooks(pressedKey, activeItem);\n\t}\n\n\tfunction setActiveItemId(id: string) {\n\t\tactiveItemId.value = id;\n\t}\n\n\tfunction setActiveItem(item?: Element) {\n\t\tconst itemId = getElementId(item);\n\t\tif (!itemId) return;\n\n\t\tsetActiveItemId(itemId);\n\t\tif (item?.scrollIntoView) {\n\t\t\titem?.scrollIntoView({ block: 'center' });\n\t\t}\n\t}\n\n\tasync function setActiveItemIndex(index: number) {\n\t\tawait refreshSelectableItems();\n\n\t\tsetActiveItem(selectableItems.value[index]?.deref());\n\t}\n\n\tfunction attachKeydownEvent() {\n\t\tdocument.addEventListener('keydown', onKeyDown, { capture: true });\n\t}\n\n\tfunction detachKeydownEvent() {\n\t\tcleanupSelectableItems();\n\t\tdocument.removeEventListener('keydown', onKeyDown, { capture: true });\n\t}\n\n\tfunction registerKeyHook(name: string, hook: KeyHook) {\n\t\thook.keyboardKeys.forEach((keyboardKey) => {\n\t\t\tif (WATCHED_KEYS.includes(keyboardKey)) {\n\t\t\t\tkeysHooks.value = { ...keysHooks.value, [name]: hook };\n\t\t\t} else {\n\t\t\t\tthrow new Error(`Key ${keyboardKey} is not supported`);\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction cleanupSelectableItems() {\n\t\t// Cleanup to make sure DOM elements get garbage collected\n\t\tselectableItems.value = [];\n\t}\n\n\tfunction getActiveItemIndex() {\n\t\treturn selectableItems.value.findIndex(\n\t\t\t(item) => getElementId(item?.deref()) === activeItemId.value,\n\t\t);\n\t}\n\n\treturn {\n\t\tactiveItemId,\n\t\tattachKeydownEvent,\n\t\trefreshSelectableItems,\n\t\tdetachKeydownEvent,\n\t\tregisterKeyHook,\n\t\tgetActiveItemIndex,\n\t\tsetActiveItemId,\n\t\tsetActiveItemIndex,\n\t};\n});\n","import type { INodeCreateElement, NodeFilterType, SimplifiedNodeType } from '@/Interface';\nimport {\n\tAI_CODE_NODE_TYPE,\n\tAI_OTHERS_NODE_CREATOR_VIEW,\n\tDEFAULT_SUBCATEGORY,\n\tTRIGGER_NODE_CREATOR_VIEW,\n} from '@/constants';\nimport { defineStore } from 'pinia';\nimport { v4 as uuid } from 'uuid';\nimport { computed, nextTick, ref } from 'vue';\n\nimport { useNodeCreatorStore } from '@/stores/nodeCreator.store';\n\nimport {\n\tflattenCreateElements,\n\tgroupItemsInSections,\n\tsearchNodes,\n\tsortNodeCreateElements,\n\tsubcategorizeItems,\n\ttransformNodeType,\n} from '../utils';\n\nimport type { NodeViewItem, NodeViewItemSection } from '@/components/Node/NodeCreator/viewsData';\nimport { AINodesView } from '@/components/Node/NodeCreator/viewsData';\nimport { useI18n } from '@/composables/useI18n';\nimport { useKeyboardNavigation } from './useKeyboardNavigation';\n\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport type { INodeInputFilter, NodeConnectionType } from 'n8n-workflow';\n\ninterface ViewStack {\n\tuuid?: string;\n\ttitle?: string;\n\tsubtitle?: string;\n\tsearch?: string;\n\tsubcategory?: string;\n\tinfo?: string;\n\tnodeIcon?: {\n\t\ticonType?: string;\n\t\ticon?: string;\n\t\tcolor?: string;\n\t};\n\ticonUrl?: string;\n\trootView?: NodeFilterType;\n\tactiveIndex?: number;\n\ttransitionDirection?: 'in' | 'out';\n\thasSearch?: boolean;\n\tpreventBack?: boolean;\n\titems?: INodeCreateElement[];\n\tbaselineItems?: INodeCreateElement[];\n\tsearchItems?: SimplifiedNodeType[];\n\tforceIncludeNodes?: string[];\n\tmode?: 'actions' | 'nodes';\n\tbaseFilter?: (item: INodeCreateElement) => boolean;\n\titemsMapper?: (item: INodeCreateElement) => INodeCreateElement;\n\tpanelClass?: string;\n\tsections?: string[] | NodeViewItemSection[];\n}\n\nexport const useViewStacks = defineStore('nodeCreatorViewStacks', () => {\n\tconst nodeCreatorStore = useNodeCreatorStore();\n\tconst { getActiveItemIndex } = useKeyboardNavigation();\n\n\tconst viewStacks = ref<ViewStack[]>([]);\n\n\tconst activeStackItems = computed<INodeCreateElement[]>(() => {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\n\t\tif (!stack?.baselineItems) {\n\t\t\treturn stack.items ? extendItemsWithUUID(stack.items) : [];\n\t\t}\n\n\t\tif (stack.search && searchBaseItems.value) {\n\t\t\tconst searchBase =\n\t\t\t\tsearchBaseItems.value.length > 0\n\t\t\t\t\t? searchBaseItems.value\n\t\t\t\t\t: flattenCreateElements(stack.baselineItems ?? []);\n\n\t\t\treturn extendItemsWithUUID(searchNodes(stack.search || '', searchBase));\n\t\t}\n\t\treturn extendItemsWithUUID(stack.baselineItems);\n\t});\n\n\tconst activeViewStack = computed<ViewStack>(() => {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\t\tif (!stack) return {};\n\n\t\tconst flatBaselineItems = flattenCreateElements(stack.baselineItems ?? []);\n\n\t\treturn {\n\t\t\t...stack,\n\t\t\titems: activeStackItems.value,\n\t\t\thasSearch: flatBaselineItems.length > 8 || stack?.hasSearch,\n\t\t};\n\t});\n\n\tconst activeViewStackMode = computed(\n\t\t() => activeViewStack.value.mode || TRIGGER_NODE_CREATOR_VIEW,\n\t);\n\n\tconst searchBaseItems = computed<INodeCreateElement[]>(() => {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\t\tif (!stack?.searchItems) return [];\n\n\t\treturn stack.searchItems.map((item) => transformNodeType(item, stack.subcategory));\n\t});\n\n\t// Generate a delta between the global search results(all nodes) and the stack search results\n\tconst globalSearchItemsDiff = computed<INodeCreateElement[]>(() => {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\t\tif (!stack?.search) return [];\n\n\t\tconst allNodes = nodeCreatorStore.mergedNodes.map((item) => transformNodeType(item));\n\t\tconst globalSearchResult = extendItemsWithUUID(searchNodes(stack.search || '', allNodes));\n\n\t\treturn globalSearchResult.filter((item) => {\n\t\t\treturn !activeStackItems.value.find((activeItem) => activeItem.key === item.key);\n\t\t});\n\t});\n\n\tconst itemsBySubcategory = computed(() => subcategorizeItems(nodeCreatorStore.mergedNodes));\n\n\tasync function gotoCompatibleConnectionView(\n\t\tconnectionType: NodeConnectionType,\n\t\tisOutput?: boolean,\n\t\tfilter?: INodeInputFilter,\n\t) {\n\t\tconst i18n = useI18n();\n\n\t\tlet nodesByConnectionType: { [key: string]: string[] };\n\t\tlet relatedAIView: { properties: NodeViewItem['properties'] } | undefined;\n\n\t\tif (isOutput === true) {\n\t\t\tnodesByConnectionType = useNodeTypesStore().visibleNodeTypesByInputConnectionTypeNames;\n\t\t\trelatedAIView = {\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: i18n.baseText('nodeCreator.aiPanel.aiNodes'),\n\t\t\t\t\ticon: 'robot',\n\t\t\t\t},\n\t\t\t};\n\t\t} else {\n\t\t\tnodesByConnectionType = useNodeTypesStore().visibleNodeTypesByOutputConnectionTypeNames;\n\n\t\t\trelatedAIView = AINodesView([]).items.find(\n\t\t\t\t(item) => item.properties.connectionType === connectionType,\n\t\t\t);\n\t\t}\n\n\t\tawait nextTick();\n\t\tpushViewStack({\n\t\t\ttitle: relatedAIView?.properties.title,\n\t\t\trootView: AI_OTHERS_NODE_CREATOR_VIEW,\n\t\t\tmode: 'nodes',\n\t\t\titems: nodeCreatorStore.allNodeCreatorNodes,\n\t\t\tnodeIcon: {\n\t\t\t\ticonType: 'icon',\n\t\t\t\ticon: relatedAIView?.properties.icon,\n\t\t\t\tcolor: relatedAIView?.properties.iconProps?.color,\n\t\t\t},\n\t\t\tpanelClass: relatedAIView?.properties.panelClass,\n\t\t\tbaseFilter: (i: INodeCreateElement) => {\n\t\t\t\t// AI Code node could have any connection type so we don't want to display it\n\t\t\t\t// in the compatible connection view as it would be displayed in all of them\n\t\t\t\tif (i.key === AI_CODE_NODE_TYPE) return false;\n\t\t\t\tconst displayNode = nodesByConnectionType[connectionType].includes(i.key);\n\n\t\t\t\t// TODO: Filtering works currently fine for displaying compatible node when dropping\n\t\t\t\t// input connections. However, it does not work for output connections.\n\t\t\t\t// For that reason does it currently display nodes that are maybe not compatible\n\t\t\t\t// but then errors once it got selected by the user.\n\t\t\t\tif (displayNode && filter?.nodes?.length) {\n\t\t\t\t\treturn filter.nodes.includes(i.key);\n\t\t\t\t}\n\n\t\t\t\treturn displayNode;\n\t\t\t},\n\t\t\titemsMapper(item) {\n\t\t\t\treturn {\n\t\t\t\t\t...item,\n\t\t\t\t\tsubcategory: connectionType,\n\t\t\t\t};\n\t\t\t},\n\t\t\tpreventBack: true,\n\t\t});\n\t}\n\n\tfunction setStackBaselineItems() {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\t\tif (!stack || !activeViewStack.value.uuid) return;\n\n\t\tlet stackItems = stack?.items ?? [];\n\n\t\tif (!stack?.items) {\n\t\t\tconst subcategory = stack?.subcategory ?? DEFAULT_SUBCATEGORY;\n\t\t\tconst itemsInSubcategory = itemsBySubcategory.value[subcategory];\n\t\t\tconst sections = stack.sections;\n\n\t\t\tif (sections) {\n\t\t\t\tstackItems = groupItemsInSections(itemsInSubcategory, sections);\n\t\t\t} else {\n\t\t\t\tstackItems = itemsInSubcategory;\n\t\t\t}\n\t\t}\n\n\t\t// Ensure that the nodes specified in `stack.forceIncludeNodes` are always included,\n\t\t// regardless of whether the subcategory is matched\n\t\tif ((stack.forceIncludeNodes ?? []).length > 0) {\n\t\t\tconst matchedNodes = nodeCreatorStore.mergedNodes\n\t\t\t\t.filter((item) => stack.forceIncludeNodes?.includes(item.name))\n\t\t\t\t.map((item) => transformNodeType(item, stack.subcategory));\n\n\t\t\tstackItems.push(...matchedNodes);\n\t\t}\n\n\t\tif (stack.baseFilter) {\n\t\t\tstackItems = stackItems.filter(stack.baseFilter);\n\t\t}\n\n\t\tif (stack.itemsMapper) {\n\t\t\tstackItems = stackItems.map(stack.itemsMapper);\n\t\t}\n\n\t\t// Sort only if non-root view\n\t\tif (!stack.items) {\n\t\t\tstackItems = sortNodeCreateElements(stackItems);\n\t\t}\n\n\t\tupdateCurrentViewStack({ baselineItems: stackItems });\n\t}\n\n\tfunction extendItemsWithUUID(items: INodeCreateElement[]) {\n\t\treturn items.map((item) => ({\n\t\t\t...item,\n\t\t\tuuid: `${item.key}-${uuid()}`,\n\t\t}));\n\t}\n\n\tfunction pushViewStack(stack: ViewStack) {\n\t\tif (activeViewStack.value.uuid) {\n\t\t\tupdateCurrentViewStack({ activeIndex: getActiveItemIndex() });\n\t\t}\n\n\t\tconst newStackUuid = uuid();\n\t\tviewStacks.value.push({\n\t\t\t...stack,\n\t\t\tuuid: newStackUuid,\n\t\t\ttransitionDirection: 'in',\n\t\t\tactiveIndex: 0,\n\t\t});\n\t\tsetStackBaselineItems();\n\t}\n\n\tfunction popViewStack() {\n\t\tif (activeViewStack.value.uuid) {\n\t\t\tviewStacks.value.pop();\n\t\t\tupdateCurrentViewStack({ transitionDirection: 'out' });\n\t\t}\n\t}\n\n\tfunction updateCurrentViewStack(stack: Partial<ViewStack>) {\n\t\tconst currentStack = viewStacks.value[viewStacks.value.length - 1];\n\t\tconst matchedIndex = viewStacks.value.findIndex((s) => s.uuid === currentStack.uuid);\n\t\tif (!currentStack) return;\n\n\t\t// For each key in the stack, update the matched stack\n\t\tObject.keys(stack).forEach((key) => {\n\t\t\tconst typedKey = key as keyof ViewStack;\n\t\t\tviewStacks.value[matchedIndex] = {\n\t\t\t\t...viewStacks.value[matchedIndex],\n\t\t\t\t[key]: stack[typedKey],\n\t\t\t};\n\t\t});\n\t}\n\n\tfunction resetViewStacks() {\n\t\tviewStacks.value = [];\n\t}\n\n\treturn {\n\t\tviewStacks,\n\t\tactiveViewStack,\n\t\tactiveViewStackMode,\n\t\tglobalSearchItemsDiff,\n\t\tgotoCompatibleConnectionView,\n\t\tresetViewStacks,\n\t\tupdateCurrentViewStack,\n\t\tpushViewStack,\n\t\tpopViewStack,\n\t};\n});\n","import type { Ref } from 'vue';\nimport { ref, unref } from 'vue';\n\nimport { getMousePosition } from '@/utils/nodeViewUtils';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useDeviceSupport } from 'n8n-design-system';\nimport { MOUSE_EVENT_BUTTON, MOUSE_EVENT_BUTTONS } from '@/constants';\n\n/**\n * Composable for handling canvas panning interactions - it facilitates the movement of the\n * canvas element in response to mouse events\n */\nexport function useCanvasPanning(\n\telementRef: Ref<null | HTMLElement>,\n\toptions: {\n\t\t// @TODO To be refactored (unref) when migrating NodeView to composition API\n\t\tonMouseMoveEnd?: Ref<null | ((e: MouseEvent) => void)>;\n\t} = {},\n) {\n\tconst uiStore = useUIStore();\n\tconst moveLastPosition = ref([0, 0]);\n\tconst deviceSupport = useDeviceSupport();\n\n\t/**\n\t * Updates the canvas offset position based on the mouse movement\n\t */\n\tfunction panCanvas(e: MouseEvent) {\n\t\tconst offsetPosition = uiStore.nodeViewOffsetPosition;\n\n\t\tconst [x, y] = getMousePosition(e);\n\n\t\tconst nodeViewOffsetPositionX = offsetPosition[0] + (x - moveLastPosition.value[0]);\n\t\tconst nodeViewOffsetPositionY = offsetPosition[1] + (y - moveLastPosition.value[1]);\n\t\tuiStore.nodeViewOffsetPosition = [nodeViewOffsetPositionX, nodeViewOffsetPositionY];\n\n\t\t// Update the last position\n\t\tmoveLastPosition.value = [x, y];\n\n\t\treturn [nodeViewOffsetPositionX, nodeViewOffsetPositionY];\n\t}\n\n\t/**\n\t * Initiates the panning process when specific conditions are met (middle mouse or ctrl key pressed)\n\t */\n\tfunction onMouseDown(e: MouseEvent, moveButtonPressed: boolean) {\n\t\tif (!(deviceSupport.isCtrlKeyPressed(e) || moveButtonPressed)) {\n\t\t\t// We only care about it when the ctrl key is pressed at the same time.\n\t\t\t// So we exit when it is not pressed.\n\t\t\treturn;\n\t\t}\n\n\t\tif (uiStore.isActionActive('dragActive')) {\n\t\t\t// If a node does currently get dragged we do not activate the selection\n\t\t\treturn;\n\t\t}\n\n\t\t// Prevent moving canvas on anything but middle button\n\t\tif (e.button !== MOUSE_EVENT_BUTTON.MIDDLE) {\n\t\t\tuiStore.nodeViewMoveInProgress = true;\n\t\t}\n\n\t\tconst [x, y] = getMousePosition(e);\n\n\t\tmoveLastPosition.value = [x, y];\n\n\t\tconst element = unref(elementRef);\n\t\telement?.addEventListener('mousemove', onMouseMove);\n\t}\n\n\t/**\n\t * Ends the panning process and removes the mousemove event listener\n\t */\n\tfunction onMouseUp(_: MouseEvent) {\n\t\tif (!uiStore.nodeViewMoveInProgress) {\n\t\t\t// If it is not active return directly.\n\t\t\t// Else normal node dragging will not work.\n\t\t\treturn;\n\t\t}\n\n\t\tconst element = unref(elementRef);\n\t\telement?.removeEventListener('mousemove', onMouseMove);\n\n\t\tuiStore.nodeViewMoveInProgress = false;\n\n\t\t// Nothing else to do. Simply leave the node view at the current offset\n\t}\n\n\t/**\n\t * Handles the actual movement of the canvas during a mouse drag,\n\t * updating the position based on the current mouse position\n\t */\n\tfunction onMouseMove(e: MouseEvent) {\n\t\tconst element = unref(elementRef);\n\t\tif (e.target && !(element === e.target || element?.contains(e.target as Node))) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (uiStore.isActionActive('dragActive')) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Signal that moving canvas is active if middle button is pressed and mouse is moved\n\t\tif (e.buttons === MOUSE_EVENT_BUTTONS.MIDDLE) {\n\t\t\tuiStore.nodeViewMoveInProgress = true;\n\t\t}\n\n\t\tif (e.buttons === MOUSE_EVENT_BUTTONS.NONE) {\n\t\t\t// Mouse button is not pressed anymore so stop selection mode\n\t\t\t// Happens normally when mouse leave the view pressed and then\n\t\t\t// comes back unpressed.\n\t\t\tconst onMouseMoveEnd = unref(options.onMouseMoveEnd);\n\t\t\tonMouseMoveEnd?.(e);\n\t\t\treturn;\n\t\t}\n\n\t\tpanCanvas(e);\n\t}\n\n\treturn {\n\t\tmoveLastPosition,\n\t\tonMouseDown,\n\t\tonMouseUp,\n\t\tonMouseMove,\n\t\tpanCanvas,\n\t};\n}\n","<template>\n\t<div ref=\"nodeViewRootRef\" :class=\"$style['content']\">\n\t\t<div\n\t\t\tid=\"node-view-root\"\n\t\t\tclass=\"node-view-root do-not-select\"\n\t\t\tdata-test-id=\"node-view-root\"\n\t\t\t@dragover=\"onDragOver\"\n\t\t\t@drop=\"onDrop\"\n\t\t>\n\t\t\t<div\n\t\t\t\tv-touch:tap=\"touchTap\"\n\t\t\t\tclass=\"node-view-wrapper\"\n\t\t\t\t:class=\"workflowClasses\"\n\t\t\t\tdata-test-id=\"node-view-wrapper\"\n\t\t\t\t@touchstart=\"mouseDown\"\n\t\t\t\t@touchend=\"mouseUp\"\n\t\t\t\t@touchmove=\"canvasPanning.onMouseMove\"\n\t\t\t\t@mousedown=\"mouseDown\"\n\t\t\t\t@mouseup=\"mouseUp\"\n\t\t\t\t@contextmenu=\"contextMenu.open\"\n\t\t\t\t@wheel=\"canvasStore.wheelScroll\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tid=\"node-view-background\"\n\t\t\t\t\tclass=\"node-view-background\"\n\t\t\t\t\t:style=\"backgroundStyle\"\n\t\t\t\t\tdata-test-id=\"node-view-background\"\n\t\t\t\t/>\n\t\t\t\t<div\n\t\t\t\t\tid=\"node-view\"\n\t\t\t\t\tref=\"nodeViewRef\"\n\t\t\t\t\tclass=\"node-view\"\n\t\t\t\t\t:style=\"workflowStyle\"\n\t\t\t\t\tdata-test-id=\"node-view\"\n\t\t\t\t>\n\t\t\t\t\t<CanvasAddButton\n\t\t\t\t\t\tv-show=\"showCanvasAddButton\"\n\t\t\t\t\t\tref=\"canvasAddButton\"\n\t\t\t\t\t\t:style=\"canvasAddButtonStyle\"\n\t\t\t\t\t\t:show-tooltip=\"!containsTrigger && showTriggerMissingTooltip\"\n\t\t\t\t\t\t:position=\"canvasStore.canvasAddButtonPosition\"\n\t\t\t\t\t\tdata-test-id=\"canvas-add-button\"\n\t\t\t\t\t\t@click=\"onCanvasAddButtonCLick\"\n\t\t\t\t\t\t@hook:mounted=\"canvasStore.setRecenteredCanvasAddButtonPosition\"\n\t\t\t\t\t/>\n\t\t\t\t\t<Node\n\t\t\t\t\t\tv-for=\"nodeData in nodesToRender\"\n\t\t\t\t\t\t:key=\"`${nodeData.id}_node`\"\n\t\t\t\t\t\t:name=\"nodeData.name\"\n\t\t\t\t\t\t:is-read-only=\"isReadOnlyRoute || readOnlyEnv\"\n\t\t\t\t\t\t:instance=\"instance\"\n\t\t\t\t\t\t:is-active=\"!!activeNode && activeNode.name === nodeData.name\"\n\t\t\t\t\t\t:hide-actions=\"pullConnActive\"\n\t\t\t\t\t\t:is-production-execution-preview=\"isProductionExecutionPreview\"\n\t\t\t\t\t\t:workflow=\"currentWorkflowObject\"\n\t\t\t\t\t\t:disable-pointer-events=\"!canOpenNDV\"\n\t\t\t\t\t\t:hide-node-issues=\"hideNodeIssues\"\n\t\t\t\t\t\t@deselect-all-nodes=\"deselectAllNodes\"\n\t\t\t\t\t\t@deselect-node=\"nodeDeselectedByName\"\n\t\t\t\t\t\t@node-selected=\"nodeSelectedByName\"\n\t\t\t\t\t\t@run-workflow=\"onRunNode\"\n\t\t\t\t\t\t@moved=\"onNodeMoved\"\n\t\t\t\t\t\t@run=\"onNodeRun\"\n\t\t\t\t\t\t@remove-node=\"(name) => removeNode(name, true)\"\n\t\t\t\t\t\t@toggle-disable-node=\"(node) => toggleActivationNodes([node])\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #custom-tooltip>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tv-text=\"$locale.baseText('nodeView.placeholderNode.addTriggerNodeBeforeExecuting')\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</Node>\n\t\t\t\t\t<Sticky\n\t\t\t\t\t\tv-for=\"stickyData in stickiesToRender\"\n\t\t\t\t\t\t:key=\"`${stickyData.id}_sticky`\"\n\t\t\t\t\t\t:name=\"stickyData.name\"\n\t\t\t\t\t\t:workflow=\"currentWorkflowObject\"\n\t\t\t\t\t\t:is-read-only=\"isReadOnlyRoute || readOnlyEnv\"\n\t\t\t\t\t\t:instance=\"instance\"\n\t\t\t\t\t\t:is-active=\"!!activeNode && activeNode.name === stickyData.name\"\n\t\t\t\t\t\t:node-view-scale=\"nodeViewScale\"\n\t\t\t\t\t\t:grid-size=\"GRID_SIZE\"\n\t\t\t\t\t\t:hide-actions=\"pullConnActive\"\n\t\t\t\t\t\t@deselect-all-nodes=\"deselectAllNodes\"\n\t\t\t\t\t\t@deselect-node=\"nodeDeselectedByName\"\n\t\t\t\t\t\t@node-selected=\"nodeSelectedByName\"\n\t\t\t\t\t\t@remove-node=\"(name) => removeNode(name, true)\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<NodeDetailsView\n\t\t\t\t:read-only=\"isReadOnlyRoute || readOnlyEnv\"\n\t\t\t\t:renaming=\"renamingActive\"\n\t\t\t\t:is-production-execution-preview=\"isProductionExecutionPreview\"\n\t\t\t\t@redraw-node=\"redrawNode\"\n\t\t\t\t@switch-selected-node=\"onSwitchSelectedNode\"\n\t\t\t\t@open-connection-node-creator=\"onOpenConnectionNodeCreator\"\n\t\t\t\t@value-changed=\"valueChanged\"\n\t\t\t\t@stop-execution=\"stopExecution\"\n\t\t\t\t@save-keyboard-shortcut=\"onSaveKeyboardShortcut\"\n\t\t\t/>\n\t\t\t<Suspense>\n\t\t\t\t<div :class=\"$style.setupCredentialsButtonWrapper\">\n\t\t\t\t\t<SetupWorkflowCredentialsButton />\n\t\t\t\t</div>\n\t\t\t</Suspense>\n\t\t\t<Suspense>\n\t\t\t\t<NodeCreation\n\t\t\t\t\tv-if=\"!isReadOnlyRoute && !readOnlyEnv\"\n\t\t\t\t\t:create-node-active=\"createNodeActive\"\n\t\t\t\t\t:node-view-scale=\"nodeViewScale\"\n\t\t\t\t\t@toggle-node-creator=\"onToggleNodeCreator\"\n\t\t\t\t\t@add-nodes=\"onAddNodes\"\n\t\t\t\t/>\n\t\t\t</Suspense>\n\t\t\t<Suspense>\n\t\t\t\t<CanvasControls />\n\t\t\t</Suspense>\n\t\t\t<Suspense>\n\t\t\t\t<ContextMenu @action=\"onContextMenuAction\" />\n\t\t\t</Suspense>\n\t\t\t<Suspense>\n\t\t\t\t<NextStepPopup v-show=\"isNextStepPopupVisible\" @option-selected=\"onNextStepSelected\" />\n\t\t\t</Suspense>\n\t\t\t<div v-if=\"!isReadOnlyRoute && !readOnlyEnv\" class=\"workflow-execute-wrapper\">\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"!isManualChatOnly\"\n\t\t\t\t\t@mouseenter=\"showTriggerMissingToltip(true)\"\n\t\t\t\t\t@mouseleave=\"showTriggerMissingToltip(false)\"\n\t\t\t\t\t@click=\"onRunContainerClick\"\n\t\t\t\t>\n\t\t\t\t\t<KeyboardShortcutTooltip\n\t\t\t\t\t\t:label=\"runButtonText\"\n\t\t\t\t\t\t:shortcut=\"{ metaKey: true, keys: ['↵'] }\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\t:loading=\"workflowRunning\"\n\t\t\t\t\t\t\t:label=\"runButtonText\"\n\t\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\t\ticon=\"flask\"\n\t\t\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t\t\t:disabled=\"isExecutionDisabled\"\n\t\t\t\t\t\t\tdata-test-id=\"execute-workflow-button\"\n\t\t\t\t\t\t\t@click.stop=\"onRunWorkflow\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</KeyboardShortcutTooltip>\n\t\t\t\t</span>\n\n\t\t\t\t<n8n-button\n\t\t\t\t\tv-if=\"containsChatNodes\"\n\t\t\t\t\tlabel=\"Chat\"\n\t\t\t\t\tsize=\"large\"\n\t\t\t\t\ticon=\"comment\"\n\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\tdata-test-id=\"workflow-chat-button\"\n\t\t\t\t\t@click.stop=\"onOpenChat\"\n\t\t\t\t/>\n\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tv-if=\"workflowRunning === true && !executionWaitingForWebhook\"\n\t\t\t\t\ticon=\"stop\"\n\t\t\t\t\tsize=\"large\"\n\t\t\t\t\tclass=\"stop-execution\"\n\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t:title=\"\n\t\t\t\t\t\tstopExecutionInProgress\n\t\t\t\t\t\t\t? $locale.baseText('nodeView.stoppingCurrentExecution')\n\t\t\t\t\t\t\t: $locale.baseText('nodeView.stopCurrentExecution')\n\t\t\t\t\t\"\n\t\t\t\t\t:loading=\"stopExecutionInProgress\"\n\t\t\t\t\tdata-test-id=\"stop-execution-button\"\n\t\t\t\t\t@click.stop=\"stopExecution\"\n\t\t\t\t/>\n\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tv-if=\"workflowRunning === true && executionWaitingForWebhook === true\"\n\t\t\t\t\tclass=\"stop-execution\"\n\t\t\t\t\ticon=\"stop\"\n\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t:title=\"$locale.baseText('nodeView.stopWaitingForWebhookCall')\"\n\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\tdata-test-id=\"stop-execution-waiting-for-webhook-button\"\n\t\t\t\t\t@click.stop=\"stopWaitingForWebhook\"\n\t\t\t\t/>\n\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tv-if=\"\n\t\t\t\t\t\t!isReadOnlyRoute &&\n\t\t\t\t\t\t!readOnlyEnv &&\n\t\t\t\t\t\tworkflowExecution &&\n\t\t\t\t\t\t!workflowRunning &&\n\t\t\t\t\t\t!allTriggersDisabled\n\t\t\t\t\t\"\n\t\t\t\t\t:title=\"$locale.baseText('nodeView.deletesTheCurrentExecutionData')\"\n\t\t\t\t\ticon=\"trash\"\n\t\t\t\t\tsize=\"large\"\n\t\t\t\t\tdata-test-id=\"clear-execution-data-button\"\n\t\t\t\t\t@click.stop=\"clearExecutionData\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineAsyncComponent, defineComponent, nextTick, ref } from 'vue';\nimport { mapStores, storeToRefs } from 'pinia';\n\nimport type {\n\tEndpoint,\n\tConnection,\n\tConnectionEstablishedParams,\n\tBeforeDropParams,\n\tConnectionDetachedParams,\n\tConnectionMovedParams,\n\tComponentParameters,\n} from '@jsplumb/core';\nimport {\n\tEVENT_CONNECTION,\n\tEVENT_CONNECTION_DETACHED,\n\tEVENT_CONNECTION_MOVED,\n\tINTERCEPT_BEFORE_DROP,\n} from '@jsplumb/core';\nimport type { MessageBoxInputData, ElNotification } from 'element-plus';\n\nimport {\n\tFIRST_ONBOARDING_PROMPT_TIMEOUT,\n\tMAIN_HEADER_TABS,\n\tMODAL_CANCEL,\n\tMODAL_CLOSE,\n\tMODAL_CONFIRM,\n\tONBOARDING_CALL_SIGNUP_MODAL_KEY,\n\tONBOARDING_PROMPT_TIMEBOX,\n\tPLACEHOLDER_EMPTY_WORKFLOW_ID,\n\tQUICKSTART_NOTE_NAME,\n\tSTART_NODE_TYPE,\n\tSTICKY_NODE_TYPE,\n\tVIEWS,\n\tWEBHOOK_NODE_TYPE,\n\tFORM_TRIGGER_NODE_TYPE,\n\tTRIGGER_NODE_CREATOR_VIEW,\n\tEnterpriseEditionFeature,\n\tREGULAR_NODE_CREATOR_VIEW,\n\tNODE_CREATOR_OPEN_SOURCES,\n\tCHAT_TRIGGER_NODE_TYPE,\n\tMANUAL_CHAT_TRIGGER_NODE_TYPE,\n\tWORKFLOW_LM_CHAT_MODAL_KEY,\n\tAI_NODE_CREATOR_VIEW,\n\tDRAG_EVENT_DATA_KEY,\n\tUPDATE_WEBHOOK_ID_NODE_TYPES,\n\tTIME,\n\tAI_ASSISTANT_LOCAL_STORAGE_KEY,\n} from '@/constants';\n\nimport useGlobalLinkActions from '@/composables/useGlobalLinkActions';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\nimport useCanvasMouseSelect from '@/composables/useCanvasMouseSelect';\nimport { useExecutionDebugging } from '@/composables/useExecutionDebugging';\nimport { useTitleChange } from '@/composables/useTitleChange';\nimport { useDataSchema } from '@/composables/useDataSchema';\nimport { type ContextMenuAction, useContextMenu } from '@/composables/useContextMenu';\nimport { useUniqueNodeName } from '@/composables/useUniqueNodeName';\nimport { useI18n } from '@/composables/useI18n';\nimport { useMessage } from '@/composables/useMessage';\nimport { useToast } from '@/composables/useToast';\n\nimport NodeDetailsView from '@/components/NodeDetailsView.vue';\nimport ContextMenu from '@/components/ContextMenu/ContextMenu.vue';\nimport Node from '@/components/Node.vue';\nimport Sticky from '@/components/Sticky.vue';\nimport CanvasAddButton from './CanvasAddButton.vue';\nimport KeyboardShortcutTooltip from '@/components/KeyboardShortcutTooltip.vue';\nimport NextStepPopup from '@/components/AIAssistantChat/NextStepPopup.vue';\nimport { v4 as uuid } from 'uuid';\nimport type {\n\tIConnection,\n\tIConnections,\n\tIDataObject,\n\tExecutionSummary,\n\tINode,\n\tINodeConnections,\n\tINodeCredentialsDetails,\n\tINodeInputConfiguration,\n\tINodeTypeDescription,\n\tINodeTypeNameVersion,\n\tIPinData,\n\tITaskData,\n\tITelemetryTrackProperties,\n\tIWorkflowBase,\n\tWorkflow,\n\tConnectionTypes,\n\tINodeOutputConfiguration,\n\tIRun,\n} from 'n8n-workflow';\nimport {\n\tdeepCopy,\n\tjsonParse,\n\tNodeConnectionType,\n\tNodeHelpers,\n\tTelemetryHelpers,\n} from 'n8n-workflow';\nimport type {\n\tNewConnectionInfo,\n\tICredentialsResponse,\n\tIExecutionResponse,\n\tIWorkflowDb,\n\tIWorkflowData,\n\tINodeUi,\n\tIUpdateInformation,\n\tIWorkflowDataUpdate,\n\tXYPosition,\n\tITag,\n\tINewWorkflowData,\n\tIWorkflowTemplate,\n\tIWorkflowToShare,\n\tIUser,\n\tINodeUpdatePropertiesInformation,\n\tNodeCreatorOpenSource,\n\tAddedNodesAndConnections,\n\tToggleNodeCreatorOptions,\n\tIPushDataExecutionFinished,\n\tAIAssistantConnectionInfo,\n} from '@/Interface';\n\nimport { type Route, type RawLocation, useRouter } from 'vue-router';\nimport { dataPinningEventBus, nodeViewEventBus } from '@/event-bus';\nimport { useCanvasStore } from '@/stores/canvas.store';\nimport { useCollaborationStore } from '@/stores/collaboration.store';\nimport { useCredentialsStore } from '@/stores/credentials.store';\nimport { useEnvironmentsStore } from '@/stores/environments.ee.store';\nimport { useExternalSecretsStore } from '@/stores/externalSecrets.ee.store';\nimport { useHistoryStore } from '@/stores/history.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeCreatorStore } from '@/stores/nodeCreator.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { usePushConnectionStore } from '@/stores/pushConnection.store';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport { useSegment } from '@/stores/segment.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useTagsStore } from '@/stores/tags.store';\nimport { useTemplatesStore } from '@/stores/templates.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport { useWorkflowsEEStore } from '@/stores/workflows.ee.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport * as NodeViewUtils from '@/utils/nodeViewUtils';\nimport { getAccountAge } from '@/utils/userUtils';\nimport { getConnectionInfo, getNodeViewTab } from '@/utils/canvasUtils';\nimport {\n\tAddConnectionCommand,\n\tAddNodeCommand,\n\tMoveNodeCommand,\n\tRemoveConnectionCommand,\n\tRemoveNodeCommand,\n\tRenameNodeCommand,\n\thistoryBus,\n} from '@/models/history';\nimport type { BrowserJsPlumbInstance } from '@jsplumb/browser-ui';\nimport {\n\tEVENT_ENDPOINT_MOUSEOVER,\n\tEVENT_ENDPOINT_MOUSEOUT,\n\tEVENT_DRAG_MOVE,\n\tEVENT_CONNECTION_DRAG,\n\tEVENT_CONNECTION_ABORT,\n\tEVENT_CONNECTION_MOUSEOUT,\n\tEVENT_CONNECTION_MOUSEOVER,\n\tready,\n} from '@jsplumb/browser-ui';\nimport type { N8nPlusEndpoint } from '@/plugins/jsplumb/N8nPlusEndpointType';\nimport {\n\tN8nPlusEndpointType,\n\tEVENT_PLUS_ENDPOINT_CLICK,\n} from '@/plugins/jsplumb/N8nPlusEndpointType';\nimport type { N8nAddInputEndpoint } from '@/plugins/jsplumb/N8nAddInputEndpointType';\nimport {\n\tEVENT_ADD_INPUT_ENDPOINT_CLICK,\n\tN8nAddInputEndpointType,\n} from '@/plugins/jsplumb/N8nAddInputEndpointType';\nimport { sourceControlEventBus } from '@/event-bus/source-control';\nimport { getConnectorPaintStyleData, OVERLAY_ENDPOINT_ARROW_ID } from '@/utils/nodeViewUtils';\nimport { useViewStacks } from '@/components/Node/NodeCreator/composables/useViewStacks';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { useClipboard } from '@/composables/useClipboard';\nimport { usePinnedData } from '@/composables/usePinnedData';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useDeviceSupport } from 'n8n-design-system';\nimport { useDebounce } from '@/composables/useDebounce';\nimport { useExecutionsStore } from '@/stores/executions.store';\nimport { useCanvasPanning } from '@/composables/useCanvasPanning';\nimport { tryToParseNumber } from '@/utils/typesUtils';\nimport { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';\nimport { useRunWorkflow } from '@/composables/useRunWorkflow';\nimport { useProjectsStore } from '@/features/projects/projects.store';\nimport type { ProjectSharingData } from '@/features/projects/projects.types';\nimport { useAIStore } from '@/stores/ai.store';\nimport { useStorage } from '@/composables/useStorage';\nimport { isJSPlumbEndpointElement } from '@/utils/typeGuards';\nimport { ProjectTypes } from '@/features/projects/projects.utils';\n\ninterface AddNodeOptions {\n\tposition?: XYPosition;\n\tdragAndDrop?: boolean;\n\tname?: string;\n}\n\nconst NodeCreation = defineAsyncComponent(\n\tasync () => await import('@/components/Node/NodeCreation.vue'),\n);\nconst CanvasControls = defineAsyncComponent(\n\tasync () => await import('@/components/CanvasControls.vue'),\n);\nconst SetupWorkflowCredentialsButton = defineAsyncComponent(\n\tasync () =>\n\t\tawait import('@/components/SetupWorkflowCredentialsButton/SetupWorkflowCredentialsButton.vue'),\n);\n\nexport default defineComponent({\n\tname: 'NodeView',\n\tcomponents: {\n\t\tNodeDetailsView,\n\t\tNode,\n\t\tSticky,\n\t\tCanvasAddButton,\n\t\tKeyboardShortcutTooltip,\n\t\tNodeCreation,\n\t\tCanvasControls,\n\t\tContextMenu,\n\t\tSetupWorkflowCredentialsButton,\n\t\tNextStepPopup,\n\t},\n\tasync beforeRouteLeave(to, from, next) {\n\t\tif (\n\t\t\tgetNodeViewTab(to) === MAIN_HEADER_TABS.EXECUTIONS ||\n\t\t\tfrom.name === VIEWS.TEMPLATE_IMPORT ||\n\t\t\t(getNodeViewTab(to) === MAIN_HEADER_TABS.WORKFLOW && from.name === VIEWS.EXECUTION_DEBUG)\n\t\t) {\n\t\t\tnext();\n\t\t\treturn;\n\t\t}\n\t\tif (this.uiStore.stateIsDirty && !this.readOnlyEnv) {\n\t\t\tconst confirmModal = await this.confirm(\n\t\t\t\tthis.$locale.baseText('generic.unsavedWork.confirmMessage.message'),\n\t\t\t\t{\n\t\t\t\t\ttitle: this.$locale.baseText('generic.unsavedWork.confirmMessage.headline'),\n\t\t\t\t\ttype: 'warning',\n\t\t\t\t\tconfirmButtonText: this.$locale.baseText(\n\t\t\t\t\t\t'generic.unsavedWork.confirmMessage.confirmButtonText',\n\t\t\t\t\t),\n\t\t\t\t\tcancelButtonText: this.$locale.baseText(\n\t\t\t\t\t\t'generic.unsavedWork.confirmMessage.cancelButtonText',\n\t\t\t\t\t),\n\t\t\t\t\tshowClose: true,\n\t\t\t\t},\n\t\t\t);\n\t\t\tif (confirmModal === MODAL_CONFIRM) {\n\t\t\t\t// Make sure workflow id is empty when leaving the editor\n\t\t\t\tthis.workflowsStore.setWorkflowId(PLACEHOLDER_EMPTY_WORKFLOW_ID);\n\t\t\t\tconst saved = await this.workflowHelpers.saveCurrentWorkflow({}, false);\n\t\t\t\tif (saved) {\n\t\t\t\t\tawait this.settingsStore.fetchPromptsData();\n\t\t\t\t}\n\t\t\t\tthis.uiStore.stateIsDirty = false;\n\n\t\t\t\tif (from.name === VIEWS.NEW_WORKFLOW) {\n\t\t\t\t\t// Replace the current route with the new workflow route\n\t\t\t\t\t// before navigating to the new route when saving new workflow.\n\t\t\t\t\tawait this.$router.replace(\n\t\t\t\t\t\t{ name: VIEWS.WORKFLOW, params: { name: this.currentWorkflow } },\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t// We can't use next() here since vue-router\n\t\t\t\t\t\t\t// would prevent the navigation with an error\n\t\t\t\t\t\t\tvoid this.$router.push(to as RawLocation);\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthis.collaborationStore.notifyWorkflowClosed(this.currentWorkflow);\n\t\t\t\t\tnext();\n\t\t\t\t}\n\t\t\t} else if (confirmModal === MODAL_CANCEL) {\n\t\t\t\tthis.collaborationStore.notifyWorkflowClosed(this.currentWorkflow);\n\t\t\t\tthis.workflowsStore.setWorkflowId(PLACEHOLDER_EMPTY_WORKFLOW_ID);\n\t\t\t\tthis.resetWorkspace();\n\t\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\t\tnext();\n\t\t\t}\n\t\t} else {\n\t\t\tthis.collaborationStore.notifyWorkflowClosed(this.currentWorkflow);\n\t\t\tnext();\n\t\t}\n\t},\n\tsetup() {\n\t\tconst nodeViewRootRef = ref(null);\n\t\tconst nodeViewRef = ref(null);\n\t\tconst onMouseMoveEnd = ref(null);\n\t\tconst router = useRouter();\n\n\t\tconst ndvStore = useNDVStore();\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst locale = useI18n();\n\t\tconst contextMenu = useContextMenu();\n\t\tconst dataSchema = useDataSchema();\n\t\tconst nodeHelpers = useNodeHelpers();\n\t\tconst clipboard = useClipboard();\n\t\tconst { activeNode } = storeToRefs(ndvStore);\n\t\tconst pinnedData = usePinnedData(activeNode);\n\t\tconst deviceSupport = useDeviceSupport();\n\t\tconst { callDebounced } = useDebounce();\n\t\tconst canvasPanning = useCanvasPanning(nodeViewRootRef, { onMouseMoveEnd });\n\t\tconst workflowHelpers = useWorkflowHelpers({ router });\n\t\tconst { runWorkflow, stopCurrentExecution } = useRunWorkflow({ router });\n\n\t\treturn {\n\t\t\tlocale,\n\t\t\tcontextMenu,\n\t\t\tdataSchema,\n\t\t\tnodeHelpers,\n\t\t\texternalHooks,\n\t\t\tclipboard,\n\t\t\tpinnedData,\n\t\t\tdeviceSupport,\n\t\t\tcanvasPanning,\n\t\t\tnodeViewRootRef,\n\t\t\tnodeViewRef,\n\t\t\tonMouseMoveEnd,\n\t\t\tworkflowHelpers,\n\t\t\trunWorkflow,\n\t\t\tstopCurrentExecution,\n\t\t\tcallDebounced,\n\t\t\t...useCanvasMouseSelect(),\n\t\t\t...useGlobalLinkActions(),\n\t\t\t...useTitleChange(),\n\t\t\t...useToast(),\n\t\t\t...useMessage(),\n\t\t\t...useUniqueNodeName(),\n\t\t\t...useExecutionDebugging(),\n\t\t};\n\t},\n\twatch: {\n\t\t// Listen to route changes and load the workflow accordingly\n\t\tasync $route(to: Route, from: Route) {\n\t\t\tthis.readOnlyEnvRouteCheck();\n\n\t\t\tconst currentTab = getNodeViewTab(to);\n\t\t\tconst nodeViewNotInitialized = !this.uiStore.nodeViewInitialized;\n\t\t\tlet workflowChanged =\n\t\t\t\tfrom.params.name !== to.params.name &&\n\t\t\t\t// Both 'new' and __EMPTY__ are new workflow names, so ignore them when detecting if wf changed\n\t\t\t\t!(from.params.name === 'new' && this.currentWorkflow === PLACEHOLDER_EMPTY_WORKFLOW_ID) &&\n\t\t\t\t!(from.name === VIEWS.NEW_WORKFLOW) &&\n\t\t\t\t// Also ignore if workflow id changes when saving new workflow\n\t\t\t\tto.params.action !== 'workflowSave';\n\t\t\tconst isOpeningTemplate = to.name === VIEWS.TEMPLATE_IMPORT;\n\n\t\t\t// When entering this tab:\n\t\t\tif (currentTab === MAIN_HEADER_TABS.WORKFLOW || isOpeningTemplate) {\n\t\t\t\tif (workflowChanged || nodeViewNotInitialized || isOpeningTemplate) {\n\t\t\t\t\tthis.canvasStore.startLoading();\n\t\t\t\t\tif (nodeViewNotInitialized) {\n\t\t\t\t\t\tconst previousDirtyState = this.uiStore.stateIsDirty;\n\t\t\t\t\t\tthis.resetWorkspace();\n\t\t\t\t\t\tthis.uiStore.stateIsDirty = previousDirtyState;\n\t\t\t\t\t}\n\t\t\t\t\tawait this.initView();\n\t\t\t\t\tthis.canvasStore.stopLoading();\n\t\t\t\t\tif (this.blankRedirect) {\n\t\t\t\t\t\tthis.blankRedirect = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tawait this.checkAndInitDebugMode();\n\t\t\t}\n\t\t\t// Also, when landing on executions tab, check if workflow data is changed\n\t\t\tif (currentTab === MAIN_HEADER_TABS.EXECUTIONS) {\n\t\t\t\tworkflowChanged =\n\t\t\t\t\tfrom.params.name !== to.params.name &&\n\t\t\t\t\t!(to.params.name === 'new' && from.params.name === undefined);\n\t\t\t\tif (workflowChanged) {\n\t\t\t\t\t// This will trigger node view to update next time workflow tab is opened\n\t\t\t\t\tthis.uiStore.nodeViewInitialized = false;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tactiveNode() {\n\t\t\t// When a node gets set as active deactivate the create-menu\n\t\t\tthis.createNodeActive = false;\n\t\t},\n\t\tcontainsTrigger(containsTrigger) {\n\t\t\t// Re-center CanvasAddButton if there's no triggers\n\t\t\tif (containsTrigger === false)\n\t\t\t\tthis.canvasStore.setRecenteredCanvasAddButtonPosition(this.getNodeViewOffsetPosition);\n\t\t},\n\t\tnodeViewScale(newScale) {\n\t\t\tconst elementRef = this.nodeViewRef as HTMLDivElement | undefined;\n\t\t\tif (elementRef) {\n\t\t\t\telementRef.style.transform = `scale(${newScale})`;\n\t\t\t}\n\t\t},\n\t},\n\terrorCaptured: (err, vm, info) => {\n\t\tconsole.error('errorCaptured');\n\t\tconsole.error(err);\n\t},\n\tcomputed: {\n\t\t...mapStores(\n\t\t\tuseCanvasStore,\n\t\t\tuseTagsStore,\n\t\t\tuseCredentialsStore,\n\t\t\tuseNodeCreatorStore,\n\t\t\tuseNodeTypesStore,\n\t\t\tuseNDVStore,\n\t\t\tuseRootStore,\n\t\t\tuseSettingsStore,\n\t\t\tuseTemplatesStore,\n\t\t\tuseUIStore,\n\t\t\tuseWorkflowsStore,\n\t\t\tuseUsersStore,\n\t\t\tuseNodeCreatorStore,\n\t\t\tuseEnvironmentsStore,\n\t\t\tuseWorkflowsEEStore,\n\t\t\tuseHistoryStore,\n\t\t\tuseExternalSecretsStore,\n\t\t\tuseCollaborationStore,\n\t\t\tusePushConnectionStore,\n\t\t\tuseSourceControlStore,\n\t\t\tuseExecutionsStore,\n\t\t\tuseProjectsStore,\n\t\t\tuseAIStore,\n\t\t),\n\t\tnativelyNumberSuffixedDefaults(): string[] {\n\t\t\treturn this.nodeTypesStore.nativelyNumberSuffixedDefaults;\n\t\t},\n\t\tcurrentUser(): IUser | null {\n\t\t\treturn this.usersStore.currentUser;\n\t\t},\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\texecutionWaitingForWebhook(): boolean {\n\t\t\treturn this.workflowsStore.executionWaitingForWebhook;\n\t\t},\n\t\tisDemo(): boolean {\n\t\t\treturn this.$route.name === VIEWS.DEMO;\n\t\t},\n\t\tshowCanvasAddButton(): boolean {\n\t\t\treturn !this.isLoading && !this.containsTrigger && !this.isDemo && !this.readOnlyEnv;\n\t\t},\n\t\tlastSelectedNode(): INodeUi | null {\n\t\t\treturn this.uiStore.getLastSelectedNode;\n\t\t},\n\t\tnodes(): INodeUi[] {\n\t\t\treturn this.workflowsStore.allNodes;\n\t\t},\n\t\tnodesToRender(): INodeUi[] {\n\t\t\treturn this.workflowsStore.allNodes.filter((node) => node.type !== STICKY_NODE_TYPE);\n\t\t},\n\t\tstickiesToRender(): INodeUi[] {\n\t\t\treturn this.workflowsStore.allNodes.filter((node) => node.type === STICKY_NODE_TYPE);\n\t\t},\n\t\trunButtonText(): string {\n\t\t\tif (!this.workflowRunning) {\n\t\t\t\treturn this.$locale.baseText('nodeView.runButtonText.executeWorkflow');\n\t\t\t}\n\n\t\t\tif (this.executionWaitingForWebhook) {\n\t\t\t\treturn this.$locale.baseText('nodeView.runButtonText.waitingForTriggerEvent');\n\t\t\t}\n\n\t\t\treturn this.$locale.baseText('nodeView.runButtonText.executingWorkflow');\n\t\t},\n\t\tworkflowStyle(): object {\n\t\t\tconst offsetPosition = this.uiStore.nodeViewOffsetPosition;\n\t\t\treturn {\n\t\t\t\tleft: offsetPosition[0] + 'px',\n\t\t\t\ttop: offsetPosition[1] + 'px',\n\t\t\t};\n\t\t},\n\t\tcanvasAddButtonStyle(): object {\n\t\t\treturn {\n\t\t\t\t'pointer-events': this.createNodeActive ? 'none' : 'all',\n\t\t\t};\n\t\t},\n\t\tbackgroundStyle(): object {\n\t\t\treturn NodeViewUtils.getBackgroundStyles(\n\t\t\t\tthis.nodeViewScale,\n\t\t\t\tthis.uiStore.nodeViewOffsetPosition,\n\t\t\t\tthis.isExecutionPreview,\n\t\t\t);\n\t\t},\n\t\tworkflowClasses() {\n\t\t\tconst returnClasses = [];\n\t\t\tif (this.ctrlKeyPressed || this.moveCanvasKeyPressed) {\n\t\t\t\tif (this.uiStore.nodeViewMoveInProgress) {\n\t\t\t\t\treturnClasses.push('move-in-process');\n\t\t\t\t} else {\n\t\t\t\t\treturnClasses.push('move-active');\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.selectActive || this.ctrlKeyPressed || this.moveCanvasKeyPressed) {\n\t\t\t\t// Makes sure that nothing gets selected while select or move is active\n\t\t\t\treturnClasses.push('do-not-select');\n\t\t\t}\n\n\t\t\tif (this.connectionDragScope.type) {\n\t\t\t\treturnClasses.push('connection-drag-scope-active');\n\t\t\t\treturnClasses.push(`connection-drag-scope-active-type-${this.connectionDragScope.type}`);\n\t\t\t\treturnClasses.push(\n\t\t\t\t\t`connection-drag-scope-active-connection-${this.connectionDragScope.connection}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn returnClasses;\n\t\t},\n\t\tworkflowExecution(): IExecutionResponse | null {\n\t\t\treturn this.workflowsStore.getWorkflowExecution;\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tcurrentWorkflow(): string {\n\t\t\treturn this.$route.params.name || this.workflowsStore.workflowId;\n\t\t},\n\t\tworkflowName(): string {\n\t\t\treturn this.workflowsStore.workflowName;\n\t\t},\n\t\tallTriggersDisabled(): boolean {\n\t\t\tconst disabledTriggerNodes = this.triggerNodes.filter((node) => node.disabled);\n\t\t\treturn disabledTriggerNodes.length === this.triggerNodes.length;\n\t\t},\n\t\ttriggerNodes(): INodeUi[] {\n\t\t\treturn this.nodes.filter(\n\t\t\t\t(node) => node.type === START_NODE_TYPE || this.nodeTypesStore.isTriggerNode(node.type),\n\t\t\t);\n\t\t},\n\t\tcontainsTrigger(): boolean {\n\t\t\treturn this.triggerNodes.length > 0;\n\t\t},\n\t\tcontainsChatNodes(): boolean {\n\t\t\treturn (\n\t\t\t\t!this.executionWaitingForWebhook &&\n\t\t\t\t!!this.nodes.find(\n\t\t\t\t\t(node) =>\n\t\t\t\t\t\t[MANUAL_CHAT_TRIGGER_NODE_TYPE, CHAT_TRIGGER_NODE_TYPE].includes(node.type) &&\n\t\t\t\t\t\tnode.disabled !== true,\n\t\t\t\t)\n\t\t\t);\n\t\t},\n\t\tisManualChatOnly(): boolean {\n\t\t\treturn this.containsChatNodes && this.triggerNodes.length === 1;\n\t\t},\n\t\tisExecutionDisabled(): boolean {\n\t\t\tif (\n\t\t\t\tthis.containsChatNodes &&\n\t\t\t\tthis.triggerNodes.every((node) => node.disabled || node.type === CHAT_TRIGGER_NODE_TYPE)\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn !this.containsTrigger || this.allTriggersDisabled;\n\t\t},\n\t\tgetNodeViewOffsetPosition(): XYPosition {\n\t\t\treturn this.uiStore.nodeViewOffsetPosition;\n\t\t},\n\t\tnodeViewScale(): number {\n\t\t\treturn this.canvasStore.nodeViewScale;\n\t\t},\n\t\tinstance(): BrowserJsPlumbInstance {\n\t\t\treturn this.canvasStore.jsPlumbInstance;\n\t\t},\n\t\tisLoading(): boolean {\n\t\t\treturn this.canvasStore.isLoading;\n\t\t},\n\t\tcurrentWorkflowObject(): Workflow {\n\t\t\treturn this.workflowsStore.getCurrentWorkflow();\n\t\t},\n\t\treadOnlyEnv(): boolean {\n\t\t\treturn this.sourceControlStore.preferences.branchReadOnly;\n\t\t},\n\t\tisReadOnlyRoute() {\n\t\t\treturn this.$route?.meta?.readOnlyCanvas === true;\n\t\t},\n\t\tisNextStepPopupVisible(): boolean {\n\t\t\treturn this.aiStore.nextStepPopupConfig.open;\n\t\t},\n\t\tshouldShowNextStepDialog(): boolean {\n\t\t\tconst userHasSeenAIAssistantExperiment =\n\t\t\t\tuseStorage(AI_ASSISTANT_LOCAL_STORAGE_KEY).value === 'true';\n\t\t\tconst experimentEnabled = this.aiStore.isAssistantExperimentEnabled;\n\t\t\tconst isCloudDeployment = this.settingsStore.isCloudDeployment;\n\t\t\treturn isCloudDeployment && experimentEnabled && !userHasSeenAIAssistantExperiment;\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tGRID_SIZE: NodeViewUtils.GRID_SIZE,\n\t\t\tSTICKY_NODE_TYPE,\n\t\t\tcreateNodeActive: false,\n\t\t\tlastClickPosition: [450, 450] as XYPosition,\n\t\t\tctrlKeyPressed: false,\n\t\t\tmoveCanvasKeyPressed: false,\n\t\t\tstopExecutionInProgress: false,\n\t\t\tblankRedirect: false,\n\t\t\tcredentialsUpdated: false,\n\t\t\tpullConnActiveNodeName: null as string | null,\n\t\t\tpullConnActive: false,\n\t\t\tdropPrevented: false,\n\t\t\tconnectionDragScope: {\n\t\t\t\ttype: null,\n\t\t\t\tconnection: null,\n\t\t\t} as { type: string | null; connection: 'source' | 'target' | null },\n\t\t\trenamingActive: false,\n\t\t\tshowStickyButton: false,\n\t\t\tisExecutionPreview: false,\n\t\t\tshowTriggerMissingTooltip: false,\n\t\t\tworkflowData: null as INewWorkflowData | null,\n\t\t\tactiveConnection: null as null | Connection,\n\t\t\tisInsertingNodes: false,\n\t\t\tisProductionExecutionPreview: false,\n\t\t\tenterTimer: undefined as undefined | ReturnType<typeof setTimeout>,\n\t\t\texitTimer: undefined as undefined | ReturnType<typeof setTimeout>,\n\t\t\treadOnlyNotification: null as null | typeof ElNotification,\n\t\t\t// jsplumb automatically deletes all loose connections which is in turn recorded\n\t\t\t// in undo history as a user action.\n\t\t\t// This should prevent automatically removed connections from populating undo stack\n\t\t\tsuspendRecordingDetachedConnections: false,\n\t\t\tNODE_CREATOR_OPEN_SOURCES,\n\t\t\teventsAttached: false,\n\t\t\tunloadTimeout: undefined as undefined | ReturnType<typeof setTimeout>,\n\t\t\tcanOpenNDV: true,\n\t\t\thideNodeIssues: false,\n\t\t};\n\t},\n\tasync mounted() {\n\t\t// To be refactored (unref) when migrating to composition API\n\t\tthis.onMouseMoveEnd = this.mouseUp;\n\n\t\tthis.resetWorkspace();\n\t\tthis.canvasStore.initInstance(this.nodeViewRef as HTMLElement);\n\t\tthis.titleReset();\n\n\t\twindow.addEventListener('message', this.onPostMessageReceived);\n\n\t\tthis.clipboard.onPaste.value = this.onClipboardPasteEvent;\n\n\t\tthis.canvasStore.startLoading();\n\n\t\tconst loadPromises = (() => {\n\t\t\tif (this.settingsStore.isPreviewMode && this.isDemo) return [];\n\t\t\tconst promises = [this.loadActiveWorkflows(), this.loadCredentialTypes()];\n\t\t\tif (this.settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Variables)) {\n\t\t\t\tpromises.push(this.loadVariables());\n\t\t\t}\n\t\t\tif (this.settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.ExternalSecrets)) {\n\t\t\t\tpromises.push(this.loadSecrets());\n\t\t\t}\n\t\t\treturn promises;\n\t\t})();\n\n\t\tif (this.nodeTypesStore.allNodeTypes.length === 0) {\n\t\t\tloadPromises.push(this.loadNodeTypes());\n\t\t}\n\n\t\ttry {\n\t\t\tawait Promise.all(loadPromises);\n\t\t} catch (error) {\n\t\t\tthis.showError(\n\t\t\t\terror,\n\t\t\t\tthis.$locale.baseText('nodeView.showError.mounted1.title'),\n\t\t\t\tthis.$locale.baseText('nodeView.showError.mounted1.message') + ':',\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tready(async () => {\n\t\t\ttry {\n\t\t\t\ttry {\n\t\t\t\t\tthis.bindCanvasEvents();\n\t\t\t\t} catch {} // This will break if mounted after jsplumb has been initiated from executions preview, so continue if it breaks\n\t\t\t\tawait this.initView();\n\t\t\t\tif (window.parent) {\n\t\t\t\t\twindow.parent.postMessage(\n\t\t\t\t\t\tJSON.stringify({ command: 'n8nReady', version: this.rootStore.versionCli }),\n\t\t\t\t\t\t'*',\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(\n\t\t\t\t\terror,\n\t\t\t\t\tthis.$locale.baseText('nodeView.showError.mounted2.title'),\n\t\t\t\t\tthis.$locale.baseText('nodeView.showError.mounted2.message') + ':',\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.canvasStore.stopLoading();\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tvoid this.usersStore.showPersonalizationSurvey();\n\t\t\t\tthis.addPinDataConnections(this.workflowsStore.pinnedWorkflowData || ({} as IPinData));\n\t\t\t}, 0);\n\t\t});\n\n\t\t// TODO: This currently breaks since front-end hooks are still not updated to work with pinia store\n\t\tvoid this.externalHooks.run('nodeView.mount').catch((e) => {});\n\n\t\tif (\n\t\t\tthis.currentUser?.personalizationAnswers !== null &&\n\t\t\tthis.settingsStore.onboardingCallPromptEnabled &&\n\t\t\tthis.currentUser &&\n\t\t\tgetAccountAge(this.currentUser) <= ONBOARDING_PROMPT_TIMEBOX\n\t\t) {\n\t\t\tconst onboardingResponse = await this.uiStore.getNextOnboardingPrompt();\n\t\t\tconst promptTimeout =\n\t\t\t\tonboardingResponse?.toast_sequence_number === 1 ? FIRST_ONBOARDING_PROMPT_TIMEOUT : 1000;\n\n\t\t\tif (onboardingResponse?.title && onboardingResponse?.description) {\n\t\t\t\tsetTimeout(async () => {\n\t\t\t\t\tthis.showToast({\n\t\t\t\t\t\ttype: 'info',\n\t\t\t\t\t\ttitle: onboardingResponse.title,\n\t\t\t\t\t\tmessage: onboardingResponse.description,\n\t\t\t\t\t\tduration: 0,\n\t\t\t\t\t\tcustomClass: 'clickable',\n\t\t\t\t\t\tcloseOnClick: true,\n\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\tthis.$telemetry.track('user clicked onboarding toast', {\n\t\t\t\t\t\t\t\tseq_num: onboardingResponse.toast_sequence_number,\n\t\t\t\t\t\t\t\ttitle: onboardingResponse.title,\n\t\t\t\t\t\t\t\tdescription: onboardingResponse.description,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tthis.uiStore.openModal(ONBOARDING_CALL_SIGNUP_MODAL_KEY);\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}, promptTimeout);\n\t\t\t}\n\t\t}\n\n\t\tsourceControlEventBus.on('pull', this.onSourceControlPull);\n\n\t\tthis.registerCustomAction({\n\t\t\tkey: 'openNodeDetail',\n\t\t\taction: ({ node }: { node: string }) => {\n\t\t\t\tthis.nodeSelectedByName(node, true);\n\t\t\t},\n\t\t});\n\n\t\tthis.registerCustomAction({\n\t\t\tkey: 'openSelectiveNodeCreator',\n\t\t\taction: this.openSelectiveNodeCreator,\n\t\t});\n\n\t\tthis.readOnlyEnvRouteCheck();\n\t\tthis.canvasStore.isDemo = this.isDemo;\n\t},\n\tactivated() {\n\t\tconst openSideMenu = this.uiStore.addFirstStepOnLoad;\n\t\tif (openSideMenu) {\n\t\t\tthis.showTriggerCreator(NODE_CREATOR_OPEN_SOURCES.TRIGGER_PLACEHOLDER_BUTTON);\n\t\t}\n\t\tthis.uiStore.addFirstStepOnLoad = false;\n\t\tthis.bindCanvasEvents();\n\t\tdocument.addEventListener('keydown', this.keyDown);\n\t\tdocument.addEventListener('keyup', this.keyUp);\n\t\twindow.addEventListener('message', this.onPostMessageReceived);\n\t\twindow.addEventListener('pageshow', this.onPageShow);\n\n\t\tnodeViewEventBus.on('newWorkflow', this.newWorkflow);\n\t\tnodeViewEventBus.on('importWorkflowData', this.onImportWorkflowDataEvent);\n\t\tnodeViewEventBus.on('importWorkflowUrl', this.onImportWorkflowUrlEvent);\n\t\tnodeViewEventBus.on('openChat', this.onOpenChat);\n\t\thistoryBus.on('nodeMove', this.onMoveNode);\n\t\thistoryBus.on('revertAddNode', this.onRevertAddNode);\n\t\thistoryBus.on('revertRemoveNode', this.onRevertRemoveNode);\n\t\thistoryBus.on('revertAddConnection', this.onRevertAddConnection);\n\t\thistoryBus.on('revertRemoveConnection', this.onRevertRemoveConnection);\n\t\thistoryBus.on('revertRenameNode', this.onRevertNameChange);\n\t\thistoryBus.on('enableNodeToggle', this.onRevertEnableToggle);\n\n\t\tdataPinningEventBus.on('pin-data', this.addPinDataConnections);\n\t\tdataPinningEventBus.on('unpin-data', this.removePinDataConnections);\n\t\tnodeViewEventBus.on('saveWorkflow', this.saveCurrentWorkflowExternal);\n\n\t\tthis.canvasStore.isDemo = this.isDemo;\n\t},\n\tdeactivated() {\n\t\tthis.unbindCanvasEvents();\n\t\tdocument.removeEventListener('keydown', this.keyDown);\n\t\tdocument.removeEventListener('keyup', this.keyUp);\n\t\twindow.removeEventListener('message', this.onPostMessageReceived);\n\t\twindow.removeEventListener('beforeunload', this.onBeforeUnload);\n\t\twindow.removeEventListener('pageshow', this.onPageShow);\n\n\t\tnodeViewEventBus.off('newWorkflow', this.newWorkflow);\n\t\tnodeViewEventBus.off('importWorkflowData', this.onImportWorkflowDataEvent);\n\t\tnodeViewEventBus.off('importWorkflowUrl', this.onImportWorkflowUrlEvent);\n\t\tnodeViewEventBus.off('openChat', this.onOpenChat);\n\t\thistoryBus.off('nodeMove', this.onMoveNode);\n\t\thistoryBus.off('revertAddNode', this.onRevertAddNode);\n\t\thistoryBus.off('revertRemoveNode', this.onRevertRemoveNode);\n\t\thistoryBus.off('revertAddConnection', this.onRevertAddConnection);\n\t\thistoryBus.off('revertRemoveConnection', this.onRevertRemoveConnection);\n\t\thistoryBus.off('revertRenameNode', this.onRevertNameChange);\n\t\thistoryBus.off('enableNodeToggle', this.onRevertEnableToggle);\n\n\t\tdataPinningEventBus.off('pin-data', this.addPinDataConnections);\n\t\tdataPinningEventBus.off('unpin-data', this.removePinDataConnections);\n\t\tnodeViewEventBus.off('saveWorkflow', this.saveCurrentWorkflowExternal);\n\t},\n\tbeforeMount() {\n\t\tif (!this.isDemo) {\n\t\t\tthis.pushStore.pushConnect();\n\t\t}\n\t\tthis.collaborationStore.initialize();\n\t},\n\tbeforeUnmount() {\n\t\t// Make sure the event listeners get removed again else we\n\t\t// could add up with them registered multiple times\n\t\tdocument.removeEventListener('keydown', this.keyDown);\n\t\tdocument.removeEventListener('keyup', this.keyUp);\n\t\tthis.unregisterCustomAction('showNodeCreator');\n\t\tthis.unregisterCustomAction('openNodeDetail');\n\t\tthis.unregisterCustomAction('openSelectiveNodeCreator');\n\n\t\tif (!this.isDemo) {\n\t\t\tthis.pushStore.pushDisconnect();\n\t\t}\n\t\tthis.collaborationStore.terminate();\n\n\t\tthis.resetWorkspace();\n\t\tthis.instance.unbind();\n\t\tthis.instance.destroy();\n\t\tthis.uiStore.stateIsDirty = false;\n\t\tthis.workflowsStore.resetChatMessages();\n\t\twindow.removeEventListener('message', this.onPostMessageReceived);\n\t\tnodeViewEventBus.off('newWorkflow', this.newWorkflow);\n\t\tnodeViewEventBus.off('importWorkflowData', this.onImportWorkflowDataEvent);\n\t\tnodeViewEventBus.off('importWorkflowUrl', this.onImportWorkflowUrlEvent);\n\t\tthis.workflowsStore.setWorkflowId(PLACEHOLDER_EMPTY_WORKFLOW_ID);\n\t\tsourceControlEventBus.off('pull', this.onSourceControlPull);\n\t},\n\tmethods: {\n\t\tasync openSelectiveNodeCreator({\n\t\t\tconnectiontype,\n\t\t\tnode,\n\t\t\tcreatorview,\n\t\t}: {\n\t\t\tconnectiontype: ConnectionTypes;\n\t\t\tnode: string;\n\t\t\tcreatorview?: string;\n\t\t}) {\n\t\t\tconst nodeName = node ?? this.ndvStore.activeNodeName;\n\t\t\tconst nodeData = nodeName ? this.workflowsStore.getNodeByName(nodeName) : null;\n\n\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\tawait this.redrawNode(node);\n\t\t\t// Wait for UI to update\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (creatorview) {\n\t\t\t\t\tthis.onToggleNodeCreator({\n\t\t\t\t\t\tcreateNodeActive: true,\n\t\t\t\t\t\tnodeCreatorView: creatorview,\n\t\t\t\t\t});\n\t\t\t\t} else if (connectiontype && nodeData) {\n\t\t\t\t\tthis.insertNodeAfterSelected({\n\t\t\t\t\t\tindex: 0,\n\t\t\t\t\t\tendpointUuid: `${nodeData.id}-input${connectiontype}0`,\n\t\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.NOTICE_ERROR_MESSAGE,\n\t\t\t\t\t\toutputType: connectiontype,\n\t\t\t\t\t\tsourceId: nodeData.id,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\teditAllowedCheck(): boolean {\n\t\t\tif (this.readOnlyNotification?.visible) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.isReadOnlyRoute || this.readOnlyEnv) {\n\t\t\t\tthis.readOnlyNotification = this.showMessage({\n\t\t\t\t\ttitle: this.$locale.baseText(\n\t\t\t\t\t\tthis.readOnlyEnv\n\t\t\t\t\t\t\t? `readOnlyEnv.showMessage.${this.isReadOnlyRoute ? 'executions' : 'workflows'}.title`\n\t\t\t\t\t\t\t: 'readOnly.showMessage.executions.title',\n\t\t\t\t\t),\n\t\t\t\t\tmessage: this.$locale.baseText(\n\t\t\t\t\t\tthis.readOnlyEnv\n\t\t\t\t\t\t\t? `readOnlyEnv.showMessage.${\n\t\t\t\t\t\t\t\t\tthis.isReadOnlyRoute ? 'executions' : 'workflows'\n\t\t\t\t\t\t\t\t}.message`\n\t\t\t\t\t\t\t: 'readOnly.showMessage.executions.message',\n\t\t\t\t\t),\n\t\t\t\t\ttype: 'info',\n\t\t\t\t\tdangerouslyUseHTMLString: true,\n\t\t\t\t});\n\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\tshowTriggerMissingToltip(isVisible: boolean) {\n\t\t\tthis.showTriggerMissingTooltip = isVisible;\n\t\t},\n\t\tonRunNode(nodeName: string, source: string) {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tconst telemetryPayload = {\n\t\t\t\tnode_type: node ? node.type : null,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tsource: 'canvas',\n\t\t\t\tpush_ref: this.ndvStore.pushRef,\n\t\t\t};\n\t\t\tthis.$telemetry.track('User clicked execute node button', telemetryPayload);\n\t\t\tvoid this.externalHooks.run('nodeView.onRunNode', telemetryPayload);\n\t\t\tvoid this.runWorkflow({ destinationNode: nodeName, source });\n\t\t},\n\t\tasync onOpenChat() {\n\t\t\tconst telemetryPayload = {\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t};\n\t\t\tthis.$telemetry.track('User clicked chat open button', telemetryPayload);\n\t\t\tvoid this.externalHooks.run('nodeView.onOpenChat', telemetryPayload);\n\t\t\tthis.uiStore.openModal(WORKFLOW_LM_CHAT_MODAL_KEY);\n\t\t},\n\t\tasync onRunWorkflow() {\n\t\t\tvoid this.workflowHelpers.getWorkflowDataToSave().then((workflowData) => {\n\t\t\t\tconst telemetryPayload = {\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tnode_graph_string: JSON.stringify(\n\t\t\t\t\t\tTelemetryHelpers.generateNodesGraph(\n\t\t\t\t\t\t\tworkflowData as IWorkflowBase,\n\t\t\t\t\t\t\tthis.workflowHelpers.getNodeTypes(),\n\t\t\t\t\t\t\t{ isCloudDeployment: this.settingsStore.isCloudDeployment },\n\t\t\t\t\t\t).nodeGraph,\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\t\tthis.$telemetry.track('User clicked execute workflow button', telemetryPayload);\n\t\t\t\tvoid this.externalHooks.run('nodeView.onRunWorkflow', telemetryPayload);\n\t\t\t});\n\n\t\t\tawait this.runWorkflow({});\n\t\t\tthis.refreshEndpointsErrorsState();\n\t\t},\n\t\tresetEndpointsErrors() {\n\t\t\tconst allEndpoints = Object.values(this.instance.getManagedElements()).flatMap(\n\t\t\t\t(el) => el.endpoints,\n\t\t\t);\n\n\t\t\tallEndpoints\n\t\t\t\t.filter((endpoint) => endpoint?.endpoint.type === N8nAddInputEndpointType)\n\t\t\t\t.forEach((endpoint) => {\n\t\t\t\t\tconst n8nAddInputEndpoint = endpoint?.endpoint as N8nAddInputEndpoint;\n\t\t\t\t\tif (n8nAddInputEndpoint && (endpoint?.connections ?? []).length > 0) {\n\t\t\t\t\t\tn8nAddInputEndpoint.resetError();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\t\trefreshEndpointsErrorsState() {\n\t\t\tconst nodeIssues = this.workflowsStore.allNodes.filter((n) => n.issues);\n\t\t\t// Set input color to red if there are issues\n\t\t\tthis.resetEndpointsErrors();\n\t\t\tnodeIssues.forEach((node) => {\n\t\t\t\tconst managedNode = this.instance.getManagedElement(node.id);\n\t\t\t\tconst endpoints = this.instance.getEndpoints(managedNode);\n\n\t\t\t\tObject.keys(node?.issues?.input ?? {}).forEach((connectionType) => {\n\t\t\t\t\tconst inputEndpointsWithIssues = endpoints.filter(\n\t\t\t\t\t\t(e) => e._defaultType.scope === connectionType,\n\t\t\t\t\t);\n\t\t\t\t\tinputEndpointsWithIssues.forEach((endpoint) => {\n\t\t\t\t\t\tconst n8nAddInputEndpoint = endpoint?.endpoint as N8nAddInputEndpoint;\n\t\t\t\t\t\tif (n8nAddInputEndpoint) {\n\t\t\t\t\t\t\tn8nAddInputEndpoint.setError();\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\t\tonRunContainerClick() {\n\t\t\tif (this.containsTrigger && !this.allTriggersDisabled) return;\n\n\t\t\tconst message =\n\t\t\t\tthis.containsTrigger && this.allTriggersDisabled\n\t\t\t\t\t? this.$locale.baseText('nodeView.addOrEnableTriggerNode')\n\t\t\t\t\t: this.$locale.baseText('nodeView.addATriggerNodeFirst');\n\n\t\t\tthis.registerCustomAction({\n\t\t\t\tkey: 'showNodeCreator',\n\t\t\t\taction: () =>\n\t\t\t\t\tthis.showTriggerCreator(NODE_CREATOR_OPEN_SOURCES.NO_TRIGGER_EXECUTION_TOOLTIP),\n\t\t\t});\n\n\t\t\tconst notice = this.showMessage({\n\t\t\t\ttype: 'info',\n\t\t\t\ttitle: this.$locale.baseText('nodeView.cantExecuteNoTrigger'),\n\t\t\t\tmessage,\n\t\t\t\tduration: 3000,\n\t\t\t\tonClick: () =>\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t// Close the creator panel if user clicked on the link\n\t\t\t\t\t\tif (this.createNodeActive) notice.close();\n\t\t\t\t\t}, 0),\n\t\t\t\tdangerouslyUseHTMLString: true,\n\t\t\t});\n\t\t},\n\t\tclearExecutionData() {\n\t\t\tthis.workflowsStore.workflowExecutionData = null;\n\t\t\tthis.nodeHelpers.updateNodesExecutionIssues();\n\t\t},\n\t\tasync onSaveKeyboardShortcut(e: KeyboardEvent) {\n\t\t\tlet saved = await this.workflowHelpers.saveCurrentWorkflow();\n\t\t\tif (saved) {\n\t\t\t\tawait this.settingsStore.fetchPromptsData();\n\n\t\t\t\tif (this.$route.name === VIEWS.EXECUTION_DEBUG) {\n\t\t\t\t\tawait this.$router.replace({\n\t\t\t\t\t\tname: VIEWS.WORKFLOW,\n\t\t\t\t\t\tparams: { name: this.currentWorkflow },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.activeNode) {\n\t\t\t\t// If NDV is open, save will not work from editable input fields\n\t\t\t\t// so don't show success message if this is true\n\t\t\t\tif (e.target instanceof HTMLInputElement) {\n\t\t\t\t\tsaved = e.target.readOnly;\n\t\t\t\t} else {\n\t\t\t\t\tsaved = true;\n\t\t\t\t}\n\t\t\t\tif (saved) {\n\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\ttitle: this.$locale.baseText('generic.workflowSaved'),\n\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tasync onCanvasAddButtonCLick(event: PointerEvent) {\n\t\t\tif (event) {\n\t\t\t\tif (this.shouldShowNextStepDialog) {\n\t\t\t\t\tconst newNodeButton = (event.target as HTMLElement).closest('button');\n\t\t\t\t\tif (newNodeButton) {\n\t\t\t\t\t\tthis.aiStore.latestConnectionInfo = null;\n\t\t\t\t\t\tthis.aiStore.openNextStepPopup(\n\t\t\t\t\t\t\tthis.$locale.baseText('nextStepPopup.title.firstStep'),\n\t\t\t\t\t\t\tnewNodeButton,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.showTriggerCreator(NODE_CREATOR_OPEN_SOURCES.TRIGGER_PLACEHOLDER_BUTTON);\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\t\tonNextStepSelected(action: string) {\n\t\t\tif (action === 'choose') {\n\t\t\t\tconst lastConnectionInfo = this.aiStore.latestConnectionInfo as NewConnectionInfo;\n\t\t\t\tif (lastConnectionInfo === null) {\n\t\t\t\t\tthis.showTriggerCreator(NODE_CREATOR_OPEN_SOURCES.TRIGGER_PLACEHOLDER_BUTTON);\n\t\t\t\t} else {\n\t\t\t\t\tthis.insertNodeAfterSelected(lastConnectionInfo);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tshowTriggerCreator(source: NodeCreatorOpenSource) {\n\t\t\tif (this.createNodeActive) return;\n\t\t\tthis.nodeCreatorStore.setSelectedView(TRIGGER_NODE_CREATOR_VIEW);\n\t\t\tthis.nodeCreatorStore.setShowScrim(true);\n\t\t\tthis.onToggleNodeCreator({ source, createNodeActive: true });\n\t\t},\n\t\tasync openExecution(executionId: string) {\n\t\t\tthis.canvasStore.startLoading();\n\t\t\tthis.resetWorkspace();\n\t\t\tlet data: IExecutionResponse | undefined;\n\t\t\ttry {\n\t\t\t\tdata = await this.workflowsStore.getExecution(executionId);\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(error, this.$locale.baseText('nodeView.showError.openExecution.title'));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (data === undefined) {\n\t\t\t\tthrow new Error(`Execution with id \"${executionId}\" could not be found!`);\n\t\t\t}\n\t\t\tthis.workflowsStore.setWorkflowName({\n\t\t\t\tnewName: data.workflowData.name,\n\t\t\t\tsetStateDirty: false,\n\t\t\t});\n\t\t\tthis.workflowsStore.setWorkflowId(PLACEHOLDER_EMPTY_WORKFLOW_ID);\n\t\t\tthis.workflowsStore.setWorkflowExecutionData(data);\n\t\t\tif (data.workflowData.pinData) {\n\t\t\t\tthis.workflowsStore.setWorkflowPinData(data.workflowData.pinData);\n\t\t\t}\n\n\t\t\tif (data.workflowData.sharedWithProjects) {\n\t\t\t\tthis.workflowsEEStore.setWorkflowSharedWith({\n\t\t\t\t\tworkflowId: data.workflowData.id,\n\t\t\t\t\tsharedWithProjects: data.workflowData.sharedWithProjects,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (data.workflowData.usedCredentials) {\n\t\t\t\tthis.workflowsStore.setUsedCredentials(data.workflowData.usedCredentials);\n\t\t\t}\n\n\t\t\tawait this.addNodes(\n\t\t\t\tdeepCopy(data.workflowData.nodes),\n\t\t\t\tdeepCopy(data.workflowData.connections),\n\t\t\t);\n\t\t\tawait this.$nextTick();\n\t\t\tthis.canvasStore.zoomToFit();\n\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\tvoid this.externalHooks.run('execution.open', {\n\t\t\t\tworkflowId: data.workflowData.id,\n\t\t\t\tworkflowName: data.workflowData.name,\n\t\t\t\texecutionId,\n\t\t\t});\n\t\t\tthis.$telemetry.track('User opened read-only execution', {\n\t\t\t\tworkflow_id: data.workflowData.id,\n\t\t\t\texecution_mode: data.mode,\n\t\t\t\texecution_finished: data.finished,\n\t\t\t});\n\n\t\t\tif (!data.finished && data.data?.resultData?.error) {\n\t\t\t\t// Check if any node contains an error\n\t\t\t\tlet nodeErrorFound = false;\n\t\t\t\tif (data.data.resultData.runData) {\n\t\t\t\t\tconst runData = data.data.resultData.runData;\n\t\t\t\t\terrorCheck: for (const nodeName of Object.keys(runData)) {\n\t\t\t\t\t\tfor (const taskData of runData[nodeName]) {\n\t\t\t\t\t\t\tif (taskData.error) {\n\t\t\t\t\t\t\t\tnodeErrorFound = true;\n\t\t\t\t\t\t\t\tbreak errorCheck;\n\t\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\n\t\t\t\tif (!nodeErrorFound && data.data.resultData.error.stack) {\n\t\t\t\t\t// Display some more information for now in console to make debugging easier\n\t\t\t\t\tconsole.error(`Execution ${executionId} error:`);\n\t\t\t\t\tconsole.error(data.data.resultData.error.stack);\n\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showError.workflowError'),\n\t\t\t\t\t\tmessage: data.data.resultData.error.message,\n\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\tduration: 0,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ((data as ExecutionSummary).waitTill) {\n\t\t\t\tthis.showMessage({\n\t\t\t\t\ttitle: this.$locale.baseText('nodeView.thisExecutionHasntFinishedYet'),\n\t\t\t\t\tmessage: `<a data-action=\"reload\">${this.$locale.baseText(\n\t\t\t\t\t\t'nodeView.refresh',\n\t\t\t\t\t)}</a> ${this.$locale.baseText(\n\t\t\t\t\t\t'nodeView.toSeeTheLatestStatus',\n\t\t\t\t\t)}.<br/> <a href=\"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.wait/\" target=\"_blank\">${this.$locale.baseText(\n\t\t\t\t\t\t'nodeView.moreInfo',\n\t\t\t\t\t)}</a>`,\n\t\t\t\t\ttype: 'warning',\n\t\t\t\t\tduration: 0,\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.canvasStore.stopLoading();\n\t\t},\n\t\tasync importWorkflowExact(data: { workflow: IWorkflowDataUpdate }) {\n\t\t\tif (!data.workflow.nodes || !data.workflow.connections) {\n\t\t\t\tthrow new Error('Invalid workflow object');\n\t\t\t}\n\t\t\tthis.resetWorkspace();\n\t\t\tdata.workflow.nodes = NodeViewUtils.getFixedNodesList(data.workflow.nodes);\n\n\t\t\tawait this.addNodes(data.workflow.nodes as INodeUi[], data.workflow.connections);\n\n\t\t\tif (data.workflow.pinData) {\n\t\t\t\tthis.workflowsStore.setWorkflowPinData(data.workflow.pinData);\n\t\t\t}\n\t\t\tawait this.$nextTick();\n\t\t\tthis.canvasStore.zoomToFit();\n\t\t},\n\t\tasync openWorkflowTemplate(templateId: string) {\n\t\t\tthis.canvasStore.startLoading();\n\t\t\tthis.canvasStore.setLoadingText(this.$locale.baseText('nodeView.loadingTemplate'));\n\t\t\tthis.resetWorkspace();\n\n\t\t\tthis.workflowsStore.currentWorkflowExecutions = [];\n\t\t\tthis.executionsStore.activeExecution = null;\n\n\t\t\tlet data: IWorkflowTemplate | undefined;\n\t\t\ttry {\n\t\t\t\tvoid this.externalHooks.run('template.requested', { templateId });\n\t\t\t\tdata = await this.templatesStore.getFixedWorkflowTemplate(templateId);\n\n\t\t\t\tif (!data) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\tthis.$locale.baseText('nodeView.workflowTemplateWithIdCouldNotBeFound', {\n\t\t\t\t\t\t\tinterpolate: { templateId },\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(error, this.$locale.baseText('nodeView.couldntImportWorkflow'));\n\t\t\t\tawait this.$router.replace({ name: VIEWS.NEW_WORKFLOW });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.$telemetry.track(\n\t\t\t\t'User inserted workflow template',\n\t\t\t\t{\n\t\t\t\t\tsource: 'workflow',\n\t\t\t\t\ttemplate_id: tryToParseNumber(templateId),\n\t\t\t\t\twf_template_repo_session_id: this.templatesStore.previousSessionId,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\twithPostHog: true,\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tthis.blankRedirect = true;\n\t\t\tawait this.$router.replace({ name: VIEWS.NEW_WORKFLOW, query: { templateId } });\n\n\t\t\tawait this.addNodes(data.workflow.nodes, data.workflow.connections);\n\t\t\tthis.workflowData =\n\t\t\t\t(await this.workflowsStore.getNewWorkflowData(\n\t\t\t\t\tdata.name,\n\t\t\t\t\tthis.projectsStore.currentProjectId,\n\t\t\t\t)) || {};\n\t\t\tthis.workflowsStore.addToWorkflowMetadata({ templateId });\n\t\t\tawait this.$nextTick();\n\t\t\tthis.canvasStore.zoomToFit();\n\t\t\tthis.uiStore.stateIsDirty = true;\n\n\t\t\tvoid this.externalHooks.run('template.open', {\n\t\t\t\ttemplateId,\n\t\t\t\ttemplateName: data.name,\n\t\t\t\tworkflow: data.workflow,\n\t\t\t});\n\t\t\tthis.canvasStore.stopLoading();\n\t\t},\n\t\tasync openWorkflow(workflow: IWorkflowDb) {\n\t\t\tthis.canvasStore.startLoading();\n\n\t\t\tconst selectedExecution = this.executionsStore.activeExecution;\n\n\t\t\tthis.resetWorkspace();\n\n\t\t\tthis.workflowsStore.addWorkflow(workflow);\n\t\t\tthis.workflowsStore.setActive(workflow.active || false);\n\t\t\tthis.workflowsStore.setWorkflowId(workflow.id);\n\t\t\tthis.workflowsStore.setWorkflowName({ newName: workflow.name, setStateDirty: false });\n\t\t\tthis.workflowsStore.setWorkflowSettings(workflow.settings || {});\n\t\t\tthis.workflowsStore.setWorkflowPinData(workflow.pinData || {});\n\t\t\tthis.workflowsStore.setWorkflowVersionId(workflow.versionId);\n\t\t\tthis.workflowsStore.setWorkflowMetadata(workflow.meta);\n\n\t\t\tif (workflow.sharedWithProjects) {\n\t\t\t\tthis.workflowsEEStore.setWorkflowSharedWith({\n\t\t\t\t\tworkflowId: workflow.id,\n\t\t\t\t\tsharedWithProjects: workflow.sharedWithProjects,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (workflow.usedCredentials) {\n\t\t\t\tthis.workflowsStore.setUsedCredentials(workflow.usedCredentials);\n\t\t\t}\n\n\t\t\tconst tags = (workflow.tags || []) as ITag[];\n\t\t\tconst tagIds = tags.map((tag) => tag.id);\n\t\t\tthis.workflowsStore.setWorkflowTagIds(tagIds || []);\n\t\t\tthis.tagsStore.upsertTags(tags);\n\n\t\t\tawait this.addNodes(workflow.nodes, workflow.connections);\n\n\t\t\tif (!this.credentialsUpdated) {\n\t\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\t}\n\t\t\tthis.canvasStore.zoomToFit();\n\t\t\tvoid this.externalHooks.run('workflow.open', {\n\t\t\t\tworkflowId: workflow.id,\n\t\t\t\tworkflowName: workflow.name,\n\t\t\t});\n\t\t\tif (selectedExecution?.workflowId !== workflow.id) {\n\t\t\t\tthis.executionsStore.activeExecution = null;\n\t\t\t\tthis.workflowsStore.currentWorkflowExecutions = [];\n\t\t\t} else {\n\t\t\t\tthis.executionsStore.activeExecution = selectedExecution;\n\t\t\t}\n\t\t\tthis.canvasStore.stopLoading();\n\t\t\tthis.collaborationStore.notifyWorkflowOpened(workflow.id);\n\t\t},\n\t\ttouchTap(e: MouseEvent | TouchEvent) {\n\t\t\tif (this.deviceSupport.isTouchDevice) {\n\t\t\t\tthis.mouseDown(e);\n\t\t\t}\n\t\t},\n\t\tmouseDown(e: MouseEvent | TouchEvent) {\n\t\t\t// Save the location of the mouse click\n\t\t\tthis.lastClickPosition = this.getMousePositionWithinNodeView(e);\n\t\t\tif (e instanceof MouseEvent && e.button === 1) {\n\t\t\t\tthis.aiStore.closeNextStepPopup();\n\t\t\t\tthis.moveCanvasKeyPressed = true;\n\t\t\t}\n\n\t\t\tthis.mouseDownMouseSelect(e as MouseEvent, this.moveCanvasKeyPressed);\n\t\t\tthis.canvasPanning.onMouseDown(e as MouseEvent, this.moveCanvasKeyPressed);\n\n\t\t\t// Hide the node-creator\n\t\t\tthis.createNodeActive = false;\n\t\t},\n\t\tmouseUp(e: MouseEvent) {\n\t\t\tif (e.button === 1) {\n\t\t\t\tthis.moveCanvasKeyPressed = false;\n\t\t\t}\n\t\t\tthis.mouseUpMouseSelect(e);\n\t\t\tthis.canvasPanning.onMouseUp(e);\n\t\t},\n\t\tkeyUp(e: KeyboardEvent) {\n\t\t\tif (e.key === this.deviceSupport.controlKeyCode) {\n\t\t\t\tthis.ctrlKeyPressed = false;\n\t\t\t}\n\t\t\tif (e.key === ' ') {\n\t\t\t\tthis.moveCanvasKeyPressed = false;\n\t\t\t}\n\t\t},\n\t\tasync keyDown(e: KeyboardEvent) {\n\t\t\tthis.contextMenu.close();\n\t\t\tthis.aiStore.closeNextStepPopup();\n\n\t\t\tconst ctrlModifier = this.deviceSupport.isCtrlKeyPressed(e) && !e.shiftKey && !e.altKey;\n\t\t\tconst shiftModifier = e.shiftKey && !e.altKey && !this.deviceSupport.isCtrlKeyPressed(e);\n\t\t\tconst ctrlAltModifier = this.deviceSupport.isCtrlKeyPressed(e) && e.altKey && !e.shiftKey;\n\t\t\tconst noModifierKeys = !this.deviceSupport.isCtrlKeyPressed(e) && !e.shiftKey && !e.altKey;\n\t\t\tconst readOnly = this.isReadOnlyRoute || this.readOnlyEnv;\n\n\t\t\tif (e.key === 's' && ctrlModifier && !readOnly) {\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tif (this.isReadOnlyRoute || this.readOnlyEnv) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvoid this.callDebounced(this.onSaveKeyboardShortcut, { debounceTime: 1000 }, e);\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// @ts-ignore\n\t\t\tconst path = e.path || (e.composedPath && e.composedPath());\n\n\t\t\t// Check if the keys got emitted from a message box or from something\n\t\t\t// else which should ignore the default keybindings\n\t\t\tfor (const element of path) {\n\t\t\t\tif (\n\t\t\t\t\telement.className &&\n\t\t\t\t\ttypeof element.className === 'string' &&\n\t\t\t\t\telement.className.includes('ignore-key-press')\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// el-dialog or el-message-box element is open\n\t\t\tif (window.document.body.classList.contains('el-popup-parent--hidden')) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (e.key === 'Escape' && noModifierKeys) {\n\t\t\t\tthis.createNodeActive = false;\n\t\t\t\tif (this.activeNode) {\n\t\t\t\t\tvoid this.externalHooks.run('dataDisplay.nodeEditingFinished');\n\t\t\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// node modal is open\n\t\t\tif (this.activeNode) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst selectedNodes = this.uiStore.getSelectedNodes\n\t\t\t\t.map((node) => node && this.workflowsStore.getNodeByName(node.name))\n\t\t\t\t.filter((node) => !!node) as INode[];\n\n\t\t\tif (e.key === 'd' && noModifierKeys && !readOnly) {\n\t\t\t\tvoid this.callDebounced(this.toggleActivationNodes, { debounceTime: 350 }, selectedNodes);\n\t\t\t} else if (e.key === 'd' && ctrlModifier && !readOnly) {\n\t\t\t\tif (selectedNodes.length > 0) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tvoid this.duplicateNodes(selectedNodes);\n\t\t\t\t}\n\t\t\t} else if (e.key === 'p' && noModifierKeys && !readOnly) {\n\t\t\t\tif (selectedNodes.length > 0) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis.togglePinNodes(selectedNodes, 'keyboard-shortcut');\n\t\t\t\t}\n\t\t\t} else if ((e.key === 'Delete' || e.key === 'Backspace') && noModifierKeys && !readOnly) {\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tvoid this.callDebounced(this.deleteNodes, { debounceTime: 500 }, selectedNodes);\n\t\t\t} else if (e.key === 'Tab' && noModifierKeys && !readOnly) {\n\t\t\t\tthis.onToggleNodeCreator({\n\t\t\t\t\tsource: NODE_CREATOR_OPEN_SOURCES.TAB,\n\t\t\t\t\tcreateNodeActive: !this.createNodeActive && !this.isReadOnlyRoute && !this.readOnlyEnv,\n\t\t\t\t});\n\t\t\t} else if (e.key === 'Enter' && ctrlModifier && !readOnly) {\n\t\t\t\tvoid this.onRunWorkflow();\n\t\t\t} else if (e.key === 'S' && shiftModifier && !readOnly) {\n\t\t\t\tvoid this.onAddNodes({ nodes: [{ type: STICKY_NODE_TYPE }], connections: [] });\n\t\t\t} else if (e.key === this.deviceSupport.controlKeyCode) {\n\t\t\t\tthis.ctrlKeyPressed = true;\n\t\t\t} else if (e.key === ' ') {\n\t\t\t\tthis.moveCanvasKeyPressed = true;\n\t\t\t} else if (e.key === 'F2' && noModifierKeys && !readOnly) {\n\t\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\t\tif (lastSelectedNode !== null && lastSelectedNode.type !== STICKY_NODE_TYPE) {\n\t\t\t\t\tvoid this.callDebounced(\n\t\t\t\t\t\tthis.renameNodePrompt,\n\t\t\t\t\t\t{ debounceTime: 1500 },\n\t\t\t\t\t\tlastSelectedNode.name,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else if (e.key === 'a' && ctrlModifier) {\n\t\t\t\t// Select all nodes\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tvoid this.callDebounced(this.selectAllNodes, { debounceTime: 1000 });\n\t\t\t} else if (e.key === 'c' && ctrlModifier) {\n\t\t\t\tvoid this.callDebounced(this.copyNodes, { debounceTime: 1000 }, selectedNodes);\n\t\t\t} else if (e.key === 'x' && ctrlModifier && !readOnly) {\n\t\t\t\t// Cut nodes\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tvoid this.callDebounced(this.cutNodes, { debounceTime: 1000 }, selectedNodes);\n\t\t\t} else if (e.key === 'n' && ctrlAltModifier) {\n\t\t\t\t// Create a new workflow\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\t\t\t\tif (this.isDemo) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (this.$router.currentRoute.name === VIEWS.NEW_WORKFLOW) {\n\t\t\t\t\tnodeViewEventBus.emit('newWorkflow');\n\t\t\t\t} else {\n\t\t\t\t\tvoid this.$router.push({ name: VIEWS.NEW_WORKFLOW });\n\t\t\t\t}\n\n\t\t\t\tthis.showMessage({\n\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showMessage.keyDown.title'),\n\t\t\t\t\ttype: 'success',\n\t\t\t\t});\n\t\t\t} else if (e.key === 'Enter' && noModifierKeys) {\n\t\t\t\t// Activate the last selected node\n\t\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\n\t\t\t\tif (lastSelectedNode !== null) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tlastSelectedNode.type === STICKY_NODE_TYPE &&\n\t\t\t\t\t\t(this.isReadOnlyRoute || this.readOnlyEnv)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthis.ndvStore.activeNodeName = lastSelectedNode.name;\n\t\t\t\t}\n\t\t\t} else if (e.key === 'ArrowRight' && shiftModifier) {\n\t\t\t\t// Select all downstream nodes\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tvoid this.callDebounced(this.selectDownstreamNodes, {\n\t\t\t\t\tdebounceTime: 1000,\n\t\t\t\t});\n\t\t\t} else if (e.key === 'ArrowRight' && noModifierKeys) {\n\t\t\t\t// Set child node active\n\t\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\t\tif (lastSelectedNode === null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst connections = this.workflowsStore.outgoingConnectionsByNodeName(\n\t\t\t\t\tlastSelectedNode.name,\n\t\t\t\t);\n\n\t\t\t\tif (connections.main === undefined || connections.main.length === 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvoid this.callDebounced(\n\t\t\t\t\tthis.nodeSelectedByName,\n\t\t\t\t\t{ debounceTime: 100 },\n\t\t\t\t\tconnections.main[0][0].node,\n\t\t\t\t\tfalse,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t} else if (e.key === 'ArrowLeft' && shiftModifier) {\n\t\t\t\t// Select all downstream nodes\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tvoid this.callDebounced(this.selectUpstreamNodes, {\n\t\t\t\t\tdebounceTime: 1000,\n\t\t\t\t});\n\t\t\t} else if (e.key === 'ArrowLeft' && noModifierKeys) {\n\t\t\t\t// Set parent node active\n\t\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\t\tif (lastSelectedNode === null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\n\t\t\t\tif (!workflow.connectionsByDestinationNode.hasOwnProperty(lastSelectedNode.name)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst connections = workflow.connectionsByDestinationNode[lastSelectedNode.name];\n\n\t\t\t\tif (connections.main === undefined || connections.main.length === 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvoid this.callDebounced(\n\t\t\t\t\tthis.nodeSelectedByName,\n\t\t\t\t\t{ debounceTime: 100 },\n\t\t\t\t\tconnections.main[0][0].node,\n\t\t\t\t\tfalse,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t} else if (['ArrowUp', 'ArrowDown'].includes(e.key) && noModifierKeys) {\n\t\t\t\t// Set sibling node as active\n\n\t\t\t\t// Check first if it has a parent node\n\t\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\t\tif (lastSelectedNode === null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\n\t\t\t\tif (!workflow.connectionsByDestinationNode.hasOwnProperty(lastSelectedNode.name)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst connections = workflow.connectionsByDestinationNode[lastSelectedNode.name];\n\n\t\t\t\tif (!Array.isArray(connections.main) || !connections.main.length) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst parentNode = connections.main[0][0].node;\n\t\t\t\tconst connectionsParent = this.workflowsStore.outgoingConnectionsByNodeName(parentNode);\n\n\t\t\t\tif (!Array.isArray(connectionsParent.main) || !connectionsParent.main.length) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Get all the sibling nodes and their x positions to know which one to set active\n\t\t\t\tlet siblingNode: INodeUi | null;\n\t\t\t\tlet lastCheckedNodePosition = e.key === 'ArrowUp' ? -99999999 : 99999999;\n\t\t\t\tlet nextSelectNode: string | null = null;\n\t\t\t\tfor (const ouputConnections of connectionsParent.main) {\n\t\t\t\t\tfor (const ouputConnection of ouputConnections) {\n\t\t\t\t\t\tif (ouputConnection.node === lastSelectedNode.name) {\n\t\t\t\t\t\t\t// Ignore current node\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsiblingNode = this.workflowsStore.getNodeByName(ouputConnection.node);\n\n\t\t\t\t\t\tif (siblingNode) {\n\t\t\t\t\t\t\tif (e.key === 'ArrowUp') {\n\t\t\t\t\t\t\t\t// Get the next node on the left\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tsiblingNode.position[1] <= lastSelectedNode.position[1] &&\n\t\t\t\t\t\t\t\t\tsiblingNode.position[1] > lastCheckedNodePosition\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tnextSelectNode = siblingNode.name;\n\t\t\t\t\t\t\t\t\tlastCheckedNodePosition = siblingNode.position[1];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Get the next node on the right\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tsiblingNode.position[1] >= lastSelectedNode.position[1] &&\n\t\t\t\t\t\t\t\t\tsiblingNode.position[1] < lastCheckedNodePosition\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tnextSelectNode = siblingNode.name;\n\t\t\t\t\t\t\t\t\tlastCheckedNodePosition = siblingNode.position[1];\n\t\t\t\t\t\t\t\t}\n\t\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\n\t\t\t\tif (nextSelectNode !== null) {\n\t\t\t\t\tvoid this.callDebounced(\n\t\t\t\t\t\tthis.nodeSelectedByName,\n\t\t\t\t\t\t{ debounceTime: 100 },\n\t\t\t\t\t\tnextSelectNode,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\ttoggleActivationNodes(nodes: INode[]) {\n\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.nodeHelpers.disableNodes(nodes, true);\n\t\t},\n\n\t\ttogglePinNodes(nodes: INode[], source: 'keyboard-shortcut' | 'context-menu') {\n\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.historyStore.startRecordingUndo();\n\n\t\t\tconst nextStatePinned = nodes.some(\n\t\t\t\t(node) => !this.workflowsStore.pinDataByNodeName(node.name),\n\t\t\t);\n\n\t\t\tfor (const node of nodes) {\n\t\t\t\tconst pinnedDataForNode = usePinnedData(node);\n\t\t\t\tif (nextStatePinned) {\n\t\t\t\t\tconst dataToPin = this.dataSchema.getInputDataWithPinned(node);\n\t\t\t\t\tif (dataToPin.length !== 0) {\n\t\t\t\t\t\tpinnedDataForNode.setData(dataToPin, source);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tpinnedDataForNode.unsetData(source);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t},\n\n\t\tdeleteNodes(nodes: INode[]) {\n\t\t\t// Copy \"selectedNodes\" as the nodes get deleted out of selection\n\t\t\t// when they get deleted and if we would use original it would mess\n\t\t\t// with the index and would so not delete all nodes\n\t\t\tthis.historyStore.startRecordingUndo();\n\t\t\tnodes.forEach((node) => {\n\t\t\t\tthis.removeNode(node.name, true, false);\n\t\t\t});\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t\t}, 200);\n\t\t},\n\n\t\tselectAllNodes() {\n\t\t\tthis.nodes.forEach((node) => {\n\t\t\t\tthis.nodeSelectedByName(node.name);\n\t\t\t});\n\t\t},\n\n\t\tselectUpstreamNodes() {\n\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\tif (lastSelectedNode === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.deselectAllNodes();\n\n\t\t\t// Get all upstream nodes and select them\n\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\n\t\t\tconst checkNodes = this.workflowHelpers.getConnectedNodes(\n\t\t\t\t'upstream',\n\t\t\t\tworkflow,\n\t\t\t\tlastSelectedNode.name,\n\t\t\t);\n\t\t\tfor (const nodeName of checkNodes) {\n\t\t\t\tthis.nodeSelectedByName(nodeName);\n\t\t\t}\n\n\t\t\t// At the end select the previously selected node again\n\t\t\tthis.nodeSelectedByName(lastSelectedNode.name);\n\t\t},\n\t\tselectDownstreamNodes() {\n\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\tif (lastSelectedNode === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.deselectAllNodes();\n\n\t\t\t// Get all downstream nodes and select them\n\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\n\t\t\tconst checkNodes = this.workflowHelpers.getConnectedNodes(\n\t\t\t\t'downstream',\n\t\t\t\tworkflow,\n\t\t\t\tlastSelectedNode.name,\n\t\t\t);\n\t\t\tfor (const nodeName of checkNodes) {\n\t\t\t\tthis.nodeSelectedByName(nodeName);\n\t\t\t}\n\n\t\t\t// At the end select the previously selected node again\n\t\t\tthis.nodeSelectedByName(lastSelectedNode.name);\n\t\t},\n\n\t\tpushDownstreamNodes(sourceNodeName: string, margin: number, recordHistory = false) {\n\t\t\tconst sourceNode = this.workflowsStore.nodesByName[sourceNodeName];\n\n\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\n\t\t\tconst checkNodes = this.workflowHelpers.getConnectedNodes(\n\t\t\t\t'downstream',\n\t\t\t\tworkflow,\n\t\t\t\tsourceNodeName,\n\t\t\t);\n\t\t\tfor (const nodeName of checkNodes) {\n\t\t\t\tconst node = this.workflowsStore.nodesByName[nodeName];\n\t\t\t\tconst oldPosition = node.position;\n\n\t\t\t\tif (node.position[0] < sourceNode.position[0]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst updateInformation: INodeUpdatePropertiesInformation = {\n\t\t\t\t\tname: nodeName,\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tposition: [node.position[0] + margin, node.position[1]],\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\tthis.workflowsStore.updateNodeProperties(updateInformation);\n\t\t\t\tthis.onNodeMoved(node);\n\n\t\t\t\tif (\n\t\t\t\t\t(recordHistory && oldPosition[0] !== updateInformation.properties.position[0]) ||\n\t\t\t\t\toldPosition[1] !== updateInformation.properties.position[1]\n\t\t\t\t) {\n\t\t\t\t\tthis.historyStore.pushCommandToUndo(\n\t\t\t\t\t\tnew MoveNodeCommand(nodeName, oldPosition, updateInformation.properties.position),\n\t\t\t\t\t\trecordHistory,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tcutNodes(nodes: INode[]) {\n\t\t\tconst deleteCopiedNodes = !this.isReadOnlyRoute && !this.readOnlyEnv;\n\t\t\tthis.copyNodes(nodes, deleteCopiedNodes);\n\t\t\tif (deleteCopiedNodes) {\n\t\t\t\tthis.deleteNodes(nodes);\n\t\t\t}\n\t\t},\n\n\t\tcopyNodes(nodes: INode[], isCut = false) {\n\t\t\tvoid this.getNodesToSave(nodes).then((data) => {\n\t\t\t\tconst workflowToCopy: IWorkflowToShare = {\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\t...(this.workflowsStore.workflow.meta ?? {}),\n\t\t\t\t\t\tinstanceId: this.rootStore.instanceId,\n\t\t\t\t\t},\n\t\t\t\t\t...data,\n\t\t\t\t};\n\n\t\t\t\tthis.workflowHelpers.removeForeignCredentialsFromWorkflow(\n\t\t\t\t\tworkflowToCopy,\n\t\t\t\t\tthis.credentialsStore.allCredentials,\n\t\t\t\t);\n\n\t\t\t\tconst nodeData = JSON.stringify(workflowToCopy, null, 2);\n\n\t\t\t\tvoid this.clipboard.copy(nodeData);\n\t\t\t\tif (data.nodes.length > 0) {\n\t\t\t\t\tif (!isCut) {\n\t\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\t\ttitle: 'Copied!',\n\t\t\t\t\t\t\tmessage: '',\n\t\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tthis.$telemetry.track('User copied nodes', {\n\t\t\t\t\t\tnode_types: data.nodes.map((node) => node.type),\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tasync stopExecution() {\n\t\t\tconst executionId = this.workflowsStore.activeExecutionId;\n\t\t\tif (executionId === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tthis.stopExecutionInProgress = true;\n\t\t\t\tawait this.executionsStore.stopCurrentExecution(executionId);\n\t\t\t} catch (error) {\n\t\t\t\t// Execution stop might fail when the execution has already finished. Let's treat this here.\n\t\t\t\tconst execution = await this.workflowsStore.getExecution(executionId);\n\n\t\t\t\tif (execution === undefined) {\n\t\t\t\t\t// execution finished but was not saved (e.g. due to low connectivity)\n\n\t\t\t\t\tthis.workflowsStore.finishActiveExecution({\n\t\t\t\t\t\texecutionId,\n\t\t\t\t\t\tdata: { finished: true, stoppedAt: new Date() },\n\t\t\t\t\t});\n\t\t\t\t\tthis.workflowsStore.executingNode.length = 0;\n\t\t\t\t\tthis.uiStore.removeActiveAction('workflowRunning');\n\n\t\t\t\t\tthis.titleSet(this.workflowsStore.workflowName, 'IDLE');\n\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showMessage.stopExecutionCatch.unsaved.title'),\n\t\t\t\t\t\tmessage: this.$locale.baseText(\n\t\t\t\t\t\t\t'nodeView.showMessage.stopExecutionCatch.unsaved.message',\n\t\t\t\t\t\t),\n\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t});\n\t\t\t\t} else if (execution?.finished) {\n\t\t\t\t\t// execution finished before it could be stopped\n\n\t\t\t\t\tconst executedData = {\n\t\t\t\t\t\tdata: execution.data,\n\t\t\t\t\t\tfinished: execution.finished,\n\t\t\t\t\t\tmode: execution.mode,\n\t\t\t\t\t\tstartedAt: execution.startedAt,\n\t\t\t\t\t\tstoppedAt: execution.stoppedAt,\n\t\t\t\t\t} as IRun;\n\t\t\t\t\tconst pushData = {\n\t\t\t\t\t\tdata: executedData,\n\t\t\t\t\t\texecutionId,\n\t\t\t\t\t\tretryOf: execution.retryOf,\n\t\t\t\t\t} as IPushDataExecutionFinished;\n\t\t\t\t\tthis.workflowsStore.finishActiveExecution(pushData);\n\t\t\t\t\tthis.titleSet(execution.workflowData.name, 'IDLE');\n\t\t\t\t\tthis.workflowsStore.executingNode.length = 0;\n\t\t\t\t\tthis.workflowsStore.setWorkflowExecutionData(executedData as IExecutionResponse);\n\t\t\t\t\tthis.uiStore.removeActiveAction('workflowRunning');\n\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showMessage.stopExecutionCatch.title'),\n\t\t\t\t\t\tmessage: this.$locale.baseText('nodeView.showMessage.stopExecutionCatch.message'),\n\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.showError(error, this.$locale.baseText('nodeView.showError.stopExecution.title'));\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.stopExecutionInProgress = false;\n\t\t\tvoid this.workflowHelpers.getWorkflowDataToSave().then((workflowData) => {\n\t\t\t\tconst trackProps = {\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tnode_graph_string: JSON.stringify(\n\t\t\t\t\t\tTelemetryHelpers.generateNodesGraph(\n\t\t\t\t\t\t\tworkflowData as IWorkflowBase,\n\t\t\t\t\t\t\tthis.workflowHelpers.getNodeTypes(),\n\t\t\t\t\t\t\t{ isCloudDeployment: this.settingsStore.isCloudDeployment },\n\t\t\t\t\t\t).nodeGraph,\n\t\t\t\t\t),\n\t\t\t\t};\n\n\t\t\t\tthis.$telemetry.track('User clicked stop workflow execution', trackProps);\n\t\t\t});\n\t\t},\n\n\t\tasync stopWaitingForWebhook() {\n\t\t\ttry {\n\t\t\t\tawait this.workflowsStore.removeTestWebhook(this.workflowsStore.workflowId);\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(\n\t\t\t\t\terror,\n\t\t\t\t\tthis.$locale.baseText('nodeView.showError.stopWaitingForWebhook.title'),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * This method gets called when data got pasted into the window\n\t\t */\n\t\tasync onClipboardPasteEvent(plainTextData: string): Promise<void> {\n\t\t\tif (this.readOnlyEnv) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst currentTab = getNodeViewTab(this.$route);\n\t\t\tif (currentTab === MAIN_HEADER_TABS.WORKFLOW) {\n\t\t\t\tlet workflowData: IWorkflowDataUpdate | undefined;\n\t\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Check if it is an URL which could contain workflow data\n\t\t\t\tif (plainTextData.match(/^http[s]?:\\/\\/.*\\.json$/i)) {\n\t\t\t\t\t// Pasted data points to a possible workflow JSON file\n\n\t\t\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst importConfirm = await this.confirm(\n\t\t\t\t\t\tthis.$locale.baseText('nodeView.confirmMessage.onClipboardPasteEvent.message', {\n\t\t\t\t\t\t\tinterpolate: { plainTextData },\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tthis.$locale.baseText('nodeView.confirmMessage.onClipboardPasteEvent.headline'),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'warning',\n\t\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t\t'nodeView.confirmMessage.onClipboardPasteEvent.confirmButtonText',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tcancelButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t\t'nodeView.confirmMessage.onClipboardPasteEvent.cancelButtonText',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tdangerouslyUseHTMLString: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\n\t\t\t\t\tif (importConfirm !== MODAL_CONFIRM) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tworkflowData = await this.getWorkflowDataFromUrl(plainTextData);\n\t\t\t\t\tif (workflowData === undefined) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Pasted data is is possible workflow data\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Check first if it is valid JSON\n\t\t\t\t\t\tworkflowData = JSON.parse(plainTextData);\n\n\t\t\t\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t// Is no valid JSON so ignore\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn await this.importWorkflowData(workflowData!, 'paste', false);\n\t\t\t}\n\t\t},\n\n\t\t// Returns the workflow data from a given URL. If no data gets found or\n\t\t// data is invalid it returns undefined and displays an error message by itself.\n\t\tasync getWorkflowDataFromUrl(url: string): Promise<IWorkflowDataUpdate | undefined> {\n\t\t\tlet workflowData: IWorkflowDataUpdate;\n\n\t\t\tthis.canvasStore.startLoading();\n\t\t\ttry {\n\t\t\t\tworkflowData = await this.workflowsStore.getWorkflowFromUrl(url);\n\t\t\t} catch (error) {\n\t\t\t\tthis.canvasStore.stopLoading();\n\t\t\t\tthis.showError(\n\t\t\t\t\terror,\n\t\t\t\t\tthis.$locale.baseText('nodeView.showError.getWorkflowDataFromUrl.title'),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.canvasStore.stopLoading();\n\n\t\t\treturn workflowData;\n\t\t},\n\n\t\t// Imports the given workflow data into the current workflow\n\t\tasync importWorkflowData(\n\t\t\tworkflowData: IWorkflowToShare,\n\t\t\tsource: string,\n\t\t\timportTags = true,\n\t\t): Promise<void> {\n\t\t\t// If it is JSON check if it looks on the first look like data we can use\n\t\t\tif (!workflowData.hasOwnProperty('nodes') || !workflowData.hasOwnProperty('connections')) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst nodeIdMap: { [prev: string]: string } = {};\n\t\t\t\tif (workflowData.nodes) {\n\t\t\t\t\tworkflowData.nodes.forEach((node: INode) => {\n\t\t\t\t\t\t//generate new webhookId if workflow already contains a node with the same webhookId\n\t\t\t\t\t\tif (node.webhookId && UPDATE_WEBHOOK_ID_NODE_TYPES.includes(node.type)) {\n\t\t\t\t\t\t\tconst isDuplicate = Object.values(\n\t\t\t\t\t\t\t\tthis.workflowHelpers.getCurrentWorkflow().nodes,\n\t\t\t\t\t\t\t).some((n) => n.webhookId === node.webhookId);\n\t\t\t\t\t\t\tif (isDuplicate) {\n\t\t\t\t\t\t\t\tnode.webhookId = uuid();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// set all new ids when pasting/importing workflows\n\t\t\t\t\t\tif (node.id) {\n\t\t\t\t\t\t\tconst newId = uuid();\n\t\t\t\t\t\t\tnodeIdMap[newId] = node.id;\n\t\t\t\t\t\t\tnode.id = newId;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnode.id = uuid();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthis.removeUnknownCredentials(workflowData);\n\n\t\t\t\tconst currInstanceId = this.rootStore.instanceId;\n\n\t\t\t\tconst nodeGraph = JSON.stringify(\n\t\t\t\t\tTelemetryHelpers.generateNodesGraph(\n\t\t\t\t\t\tworkflowData as IWorkflowBase,\n\t\t\t\t\t\tthis.workflowHelpers.getNodeTypes(),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnodeIdMap,\n\t\t\t\t\t\t\tsourceInstanceId:\n\t\t\t\t\t\t\t\tworkflowData.meta && workflowData.meta.instanceId !== currInstanceId\n\t\t\t\t\t\t\t\t\t? workflowData.meta.instanceId\n\t\t\t\t\t\t\t\t\t: '',\n\t\t\t\t\t\t\tisCloudDeployment: this.settingsStore.isCloudDeployment,\n\t\t\t\t\t\t},\n\t\t\t\t\t).nodeGraph,\n\t\t\t\t);\n\t\t\t\tif (source === 'paste') {\n\t\t\t\t\tthis.$telemetry.track('User pasted nodes', {\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\tnode_graph_string: nodeGraph,\n\t\t\t\t\t});\n\t\t\t\t} else if (source === 'duplicate') {\n\t\t\t\t\tthis.$telemetry.track('User duplicated nodes', {\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\tnode_graph_string: nodeGraph,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.$telemetry.track('User imported workflow', {\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\tnode_graph_string: nodeGraph,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// By default we automatically deselect all the currently\n\t\t\t\t// selected nodes and select the new ones\n\t\t\t\tthis.deselectAllNodes();\n\n\t\t\t\t// Fix the node position as it could be totally offscreen\n\t\t\t\t// and the pasted nodes would so not be directly visible to\n\t\t\t\t// the user\n\t\t\t\tthis.workflowHelpers.updateNodePositions(\n\t\t\t\t\tworkflowData,\n\t\t\t\t\tNodeViewUtils.getNewNodePosition(this.nodes, this.lastClickPosition),\n\t\t\t\t);\n\n\t\t\t\tconst data = await this.addNodesToWorkflow(workflowData);\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tdata.nodes!.forEach((node: INodeUi) => {\n\t\t\t\t\t\tthis.nodeSelectedByName(node.name);\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tconst tagsEnabled = this.settingsStore.areTagsEnabled;\n\t\t\t\tif (importTags && tagsEnabled && Array.isArray(workflowData.tags)) {\n\t\t\t\t\tconst allTags = await this.tagsStore.fetchAll();\n\t\t\t\t\tconst tagNames = new Set(allTags.map((tag) => tag.name));\n\n\t\t\t\t\tconst workflowTags = workflowData.tags as ITag[];\n\t\t\t\t\tconst notFound = workflowTags.filter((tag) => !tagNames.has(tag.name));\n\n\t\t\t\t\tconst creatingTagPromises: Array<Promise<ITag>> = [];\n\t\t\t\t\tfor (const tag of notFound) {\n\t\t\t\t\t\tconst creationPromise = this.tagsStore.create(tag.name).then((tag: ITag) => {\n\t\t\t\t\t\t\tallTags.push(tag);\n\t\t\t\t\t\t\treturn tag;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tcreatingTagPromises.push(creationPromise);\n\t\t\t\t\t}\n\n\t\t\t\t\tawait Promise.all(creatingTagPromises);\n\n\t\t\t\t\tconst tagIds = workflowTags.reduce((accu: string[], imported: ITag) => {\n\t\t\t\t\t\tconst tag = allTags.find((tag) => tag.name === imported.name);\n\t\t\t\t\t\tif (tag) {\n\t\t\t\t\t\t\taccu.push(tag.id);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn accu;\n\t\t\t\t\t}, []);\n\n\t\t\t\t\tthis.workflowsStore.addWorkflowTagIds(tagIds);\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis.addPinDataConnections(this.workflowsStore.pinnedWorkflowData || ({} as IPinData));\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(error, this.$locale.baseText('nodeView.showError.importWorkflowData.title'));\n\t\t\t}\n\t\t},\n\n\t\tremoveUnknownCredentials(workflow: IWorkflowToShare) {\n\t\t\tif (!workflow?.nodes) return;\n\n\t\t\tfor (const node of workflow.nodes) {\n\t\t\t\tif (!node.credentials) continue;\n\n\t\t\t\tfor (const [name, credential] of Object.entries(node.credentials)) {\n\t\t\t\t\tif (credential.id === null) continue;\n\n\t\t\t\t\tif (!this.credentialsStore.getCredentialById(credential.id)) {\n\t\t\t\t\t\tdelete node.credentials[name];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tonDragOver(event: DragEvent) {\n\t\t\tevent.preventDefault();\n\t\t},\n\n\t\tasync onDrop(event: DragEvent) {\n\t\t\tif (!event.dataTransfer) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst dropData = jsonParse<AddedNodesAndConnections>(\n\t\t\t\tevent.dataTransfer.getData(DRAG_EVENT_DATA_KEY),\n\t\t\t);\n\t\t\tif (dropData) {\n\t\t\t\tconst mousePosition = this.getMousePositionWithinNodeView(event);\n\t\t\t\tconst insertNodePosition = [\n\t\t\t\t\tmousePosition[0] - NodeViewUtils.NODE_SIZE / 2 + NodeViewUtils.GRID_SIZE,\n\t\t\t\t\tmousePosition[1] - NodeViewUtils.NODE_SIZE / 2,\n\t\t\t\t] as XYPosition;\n\n\t\t\t\tawait this.onAddNodes(dropData, true, insertNodePosition);\n\t\t\t\tthis.createNodeActive = false;\n\t\t\t}\n\t\t},\n\n\t\tnodeDeselectedByName(nodeName: string) {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (node) {\n\t\t\t\tthis.nodeDeselected(node);\n\t\t\t}\n\t\t},\n\n\t\tnodeSelectedByName(nodeName: string, setActive = false, deselectAllOthers?: boolean) {\n\t\t\tif (deselectAllOthers === true) {\n\t\t\t\tthis.deselectAllNodes();\n\t\t\t}\n\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (node) {\n\t\t\t\tthis.nodeSelected(node);\n\t\t\t\tthis.uiStore.lastSelectedNode = node.name;\n\t\t\t\tthis.uiStore.lastSelectedNodeOutputIndex = null;\n\t\t\t\tthis.uiStore.lastSelectedNodeEndpointUuid = null;\n\t\t\t\tthis.canvasStore.lastSelectedConnection = null;\n\t\t\t\tthis.canvasStore.newNodeInsertPosition = null;\n\n\t\t\t\tif (setActive) {\n\t\t\t\t\tthis.ndvStore.activeNodeName = node.name;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tshowMaxNodeTypeError(nodeTypeData: INodeTypeDescription) {\n\t\t\tconst maxNodes = nodeTypeData.maxNodes;\n\t\t\tthis.showMessage({\n\t\t\t\ttitle: this.$locale.baseText('nodeView.showMessage.showMaxNodeTypeError.title'),\n\t\t\t\tmessage: this.$locale.baseText('nodeView.showMessage.showMaxNodeTypeError.message', {\n\t\t\t\t\tadjustToNumber: maxNodes,\n\t\t\t\t\tinterpolate: { nodeTypeDataDisplayName: nodeTypeData.displayName },\n\t\t\t\t}),\n\t\t\t\ttype: 'error',\n\t\t\t\tduration: 0,\n\t\t\t});\n\t\t},\n\n\t\tasync getNewNodeWithDefaultCredential(\n\t\t\tnodeTypeData: INodeTypeDescription,\n\t\t\toverrides: Partial<INodeUi>,\n\t\t) {\n\t\t\tlet nodeVersion = nodeTypeData.defaultVersion;\n\n\t\t\tif (nodeVersion === undefined) {\n\t\t\t\tnodeVersion = Array.isArray(nodeTypeData.version)\n\t\t\t\t\t? nodeTypeData.version.slice(-1)[0]\n\t\t\t\t\t: nodeTypeData.version;\n\t\t\t}\n\n\t\t\tconst newNodeData: INodeUi = {\n\t\t\t\tid: uuid(),\n\t\t\t\tname: overrides.name ?? (nodeTypeData.defaults.name as string),\n\t\t\t\ttype: nodeTypeData.name,\n\t\t\t\ttypeVersion: nodeVersion,\n\t\t\t\tposition: [0, 0],\n\t\t\t\tparameters: {},\n\t\t\t};\n\n\t\t\tconst credentialPerType = nodeTypeData.credentials\n\t\t\t\t?.map((type) => this.credentialsStore.getUsableCredentialByType(type.name))\n\t\t\t\t.flat();\n\n\t\t\tif (credentialPerType && credentialPerType.length === 1) {\n\t\t\t\tconst defaultCredential = credentialPerType[0];\n\n\t\t\t\tconst selectedCredentials = this.credentialsStore.getCredentialById(defaultCredential.id);\n\t\t\t\tconst selected = { id: selectedCredentials.id, name: selectedCredentials.name };\n\t\t\t\tconst credentials = {\n\t\t\t\t\t[defaultCredential.type]: selected,\n\t\t\t\t};\n\n\t\t\t\tawait this.loadNodesProperties(\n\t\t\t\t\t[newNodeData].map((node) => ({ name: node.type, version: node.typeVersion })),\n\t\t\t\t);\n\t\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(newNodeData.type, newNodeData.typeVersion);\n\t\t\t\tconst nodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\tnodeType?.properties || [],\n\t\t\t\t\t{},\n\t\t\t\t\ttrue,\n\t\t\t\t\tfalse,\n\t\t\t\t\tnewNodeData,\n\t\t\t\t);\n\n\t\t\t\tif (nodeTypeData.credentials) {\n\t\t\t\t\tconst authentication = nodeTypeData.credentials.find(\n\t\t\t\t\t\t(type) => type.name === defaultCredential.type,\n\t\t\t\t\t);\n\t\t\t\t\tif (authentication?.displayOptions?.hide) {\n\t\t\t\t\t\treturn newNodeData;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst authDisplayOptions = authentication?.displayOptions?.show;\n\t\t\t\t\tif (!authDisplayOptions) {\n\t\t\t\t\t\tnewNodeData.credentials = credentials;\n\t\t\t\t\t\treturn newNodeData;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (Object.keys(authDisplayOptions).length === 1 && authDisplayOptions.authentication) {\n\t\t\t\t\t\t// ignore complex case when there's multiple dependencies\n\t\t\t\t\t\tnewNodeData.credentials = credentials;\n\n\t\t\t\t\t\tlet parameters: { [key: string]: string } = {};\n\t\t\t\t\t\tfor (const displayOption of Object.keys(authDisplayOptions)) {\n\t\t\t\t\t\t\tif (nodeParameters && !nodeParameters[displayOption]) {\n\t\t\t\t\t\t\t\tparameters = {};\n\t\t\t\t\t\t\t\tnewNodeData.credentials = undefined;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst optionValue = authDisplayOptions[displayOption]?.[0];\n\t\t\t\t\t\t\tif (optionValue && typeof optionValue === 'string') {\n\t\t\t\t\t\t\t\tparameters[displayOption] = optionValue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tnewNodeData.parameters = {\n\t\t\t\t\t\t\t\t...newNodeData.parameters,\n\t\t\t\t\t\t\t\t...parameters,\n\t\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}\n\t\t\treturn newNodeData;\n\t\t},\n\n\t\tasync injectNode(\n\t\t\tnodeTypeName: string,\n\t\t\toptions: AddNodeOptions = {},\n\t\t\tshowDetail = true,\n\t\t\ttrackHistory = false,\n\t\t\tisAutoAdd = false,\n\t\t) {\n\t\t\tconst nodeTypeData: INodeTypeDescription | null =\n\t\t\t\tthis.nodeTypesStore.getNodeType(nodeTypeName);\n\n\t\t\tif (nodeTypeData === null) {\n\t\t\t\tthis.showMessage({\n\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showMessage.addNodeButton.title'),\n\t\t\t\t\tmessage: this.$locale.baseText('nodeView.showMessage.addNodeButton.message', {\n\t\t\t\t\t\tinterpolate: { nodeTypeName },\n\t\t\t\t\t}),\n\t\t\t\t\ttype: 'error',\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tnodeTypeData.maxNodes !== undefined &&\n\t\t\t\tthis.workflowHelpers.getNodeTypeCount(nodeTypeName) >= nodeTypeData.maxNodes\n\t\t\t) {\n\t\t\t\tthis.showMaxNodeTypeError(nodeTypeData);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst newNodeData = await this.getNewNodeWithDefaultCredential(nodeTypeData, {\n\t\t\t\tname: options.name,\n\t\t\t});\n\n\t\t\t// when pulling new connection from node or injecting into a connection\n\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\n\t\t\tif (options.position) {\n\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(\n\t\t\t\t\tthis.canvasStore.getNodesWithPlaceholderNode(),\n\t\t\t\t\toptions.position,\n\t\t\t\t);\n\t\t\t} else if (lastSelectedNode) {\n\t\t\t\tconst lastSelectedConnection = this.canvasStore.lastSelectedConnection;\n\t\t\t\tif (lastSelectedConnection) {\n\t\t\t\t\t// set when injecting into a connection\n\t\t\t\t\tconst [diffX] = NodeViewUtils.getConnectorLengths(lastSelectedConnection);\n\t\t\t\t\tif (diffX <= NodeViewUtils.MAX_X_TO_PUSH_DOWNSTREAM_NODES) {\n\t\t\t\t\t\tthis.pushDownstreamNodes(\n\t\t\t\t\t\t\tlastSelectedNode.name,\n\t\t\t\t\t\t\tNodeViewUtils.PUSH_NODES_OFFSET,\n\t\t\t\t\t\t\ttrackHistory,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// set when pulling connections\n\t\t\t\tif (this.canvasStore.newNodeInsertPosition) {\n\t\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(this.nodes, [\n\t\t\t\t\t\tthis.canvasStore.newNodeInsertPosition[0] + NodeViewUtils.GRID_SIZE,\n\t\t\t\t\t\tthis.canvasStore.newNodeInsertPosition[1] - NodeViewUtils.NODE_SIZE / 2,\n\t\t\t\t\t]);\n\t\t\t\t\tthis.canvasStore.newNodeInsertPosition = null;\n\t\t\t\t} else {\n\t\t\t\t\tlet yOffset = 0;\n\t\t\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\n\t\t\t\t\tif (lastSelectedConnection) {\n\t\t\t\t\t\tconst sourceNodeType = this.nodeTypesStore.getNodeType(\n\t\t\t\t\t\t\tlastSelectedNode.type,\n\t\t\t\t\t\t\tlastSelectedNode.typeVersion,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (sourceNodeType) {\n\t\t\t\t\t\t\tconst offsets = [\n\t\t\t\t\t\t\t\t[-100, 100],\n\t\t\t\t\t\t\t\t[-140, 0, 140],\n\t\t\t\t\t\t\t\t[-240, -100, 100, 240],\n\t\t\t\t\t\t\t];\n\n\t\t\t\t\t\t\tconst sourceNodeOutputs = NodeHelpers.getNodeOutputs(\n\t\t\t\t\t\t\t\tworkflow,\n\t\t\t\t\t\t\t\tlastSelectedNode,\n\t\t\t\t\t\t\t\tsourceNodeType,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst sourceNodeOutputTypes = NodeHelpers.getConnectionTypes(sourceNodeOutputs);\n\n\t\t\t\t\t\t\tconst sourceNodeOutputMainOutputs = sourceNodeOutputTypes.filter(\n\t\t\t\t\t\t\t\t(output) => output === NodeConnectionType.Main,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (sourceNodeOutputMainOutputs.length > 1) {\n\t\t\t\t\t\t\t\tconst offset = offsets[sourceNodeOutputMainOutputs.length - 2];\n\t\t\t\t\t\t\t\tconst sourceOutputIndex = lastSelectedConnection.__meta\n\t\t\t\t\t\t\t\t\t? lastSelectedConnection.__meta.sourceOutputIndex\n\t\t\t\t\t\t\t\t\t: 0;\n\t\t\t\t\t\t\t\tyOffset = offset[sourceOutputIndex];\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\t\t\tlet outputs: Array<ConnectionTypes | INodeOutputConfiguration> = [];\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// It fails when the outputs are an expression. As those nodes have\n\t\t\t\t\t\t// normally no outputs by default and the only reason we need the\n\t\t\t\t\t\t// outputs here is to calculate the position, it is fine to assume\n\t\t\t\t\t\t// that they have no outputs and are so treated as a regular node\n\t\t\t\t\t\t// with only \"main\" outputs.\n\t\t\t\t\t\toutputs = NodeHelpers.getNodeOutputs(workflow, newNodeData, nodeTypeData);\n\t\t\t\t\t} catch (e) {}\n\t\t\t\t\tconst outputTypes = NodeHelpers.getConnectionTypes(outputs);\n\t\t\t\t\tconst lastSelectedNodeType = this.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\t// If node has only scoped outputs, position it below the last selected node\n\t\t\t\t\tif (\n\t\t\t\t\t\toutputTypes.length > 0 &&\n\t\t\t\t\t\toutputTypes.every((outputName) => outputName !== NodeConnectionType.Main)\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst lastSelectedNodeWorkflow = workflow.getNode(lastSelectedNode.name);\n\t\t\t\t\t\tconst lastSelectedInputs = NodeHelpers.getNodeInputs(\n\t\t\t\t\t\t\tworkflow,\n\t\t\t\t\t\t\tlastSelectedNodeWorkflow,\n\t\t\t\t\t\t\tlastSelectedNodeType,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst lastSelectedInputTypes = NodeHelpers.getConnectionTypes(lastSelectedInputs);\n\n\t\t\t\t\t\tconst scopedConnectionIndex = (lastSelectedInputTypes || [])\n\t\t\t\t\t\t\t.filter((input) => input !== NodeConnectionType.Main)\n\t\t\t\t\t\t\t.findIndex((inputType) => outputs[0] === inputType);\n\n\t\t\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(\n\t\t\t\t\t\t\tthis.nodes,\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\tlastSelectedNode.position[0] +\n\t\t\t\t\t\t\t\t\t(NodeViewUtils.NODE_SIZE /\n\t\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\t\tscopedConnectionIndex,\n\t\t\t\t\t\t\t\tlastSelectedNode.position[1] + NodeViewUtils.PUSH_NODES_OFFSET,\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t[100, 0],\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Has only main outputs or no outputs at all\n\t\t\t\t\t\tconst inputs = NodeHelpers.getNodeInputs(\n\t\t\t\t\t\t\tworkflow,\n\t\t\t\t\t\t\tlastSelectedNode,\n\t\t\t\t\t\t\tlastSelectedNodeType,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst inputsTypes = NodeHelpers.getConnectionTypes(inputs);\n\n\t\t\t\t\t\tlet pushOffset = NodeViewUtils.PUSH_NODES_OFFSET;\n\t\t\t\t\t\tif (!!inputsTypes.find((input) => input !== NodeConnectionType.Main)) {\n\t\t\t\t\t\t\t// If the node has scoped inputs, push it down a bit more\n\t\t\t\t\t\t\tpushOffset += 150;\n\t\t\t\t\t\t}\n\n\t\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\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(\n\t\t\t\t\t\t\tthis.nodes,\n\t\t\t\t\t\t\t[lastSelectedNode.position[0] + pushOffset, lastSelectedNode.position[1] + yOffset],\n\t\t\t\t\t\t\t[100, 0],\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If added node is a trigger and it's the first one added to the canvas\n\t\t\t\t// we place it at canvasAddButtonPosition to replace the canvas add button\n\t\t\t\tconst position =\n\t\t\t\t\tthis.nodeTypesStore.isTriggerNode(nodeTypeName) && !this.containsTrigger\n\t\t\t\t\t\t? this.canvasStore.canvasAddButtonPosition\n\t\t\t\t\t\t: // If no node is active find a free spot\n\t\t\t\t\t\t\t(this.lastClickPosition as XYPosition);\n\n\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(this.nodes, position);\n\t\t\t}\n\n\t\t\tconst localizedName = this.locale.localizeNodeName(newNodeData.name, newNodeData.type);\n\n\t\t\tnewNodeData.name = this.uniqueNodeName(localizedName);\n\n\t\t\tif (nodeTypeData.webhooks?.length) {\n\t\t\t\tnewNodeData.webhookId = uuid();\n\t\t\t}\n\n\t\t\tawait this.addNodes([newNodeData], undefined, trackHistory);\n\t\t\tthis.workflowsStore.setNodePristine(newNodeData.name, true);\n\n\t\t\tthis.uiStore.stateIsDirty = true;\n\n\t\t\tif (nodeTypeName === STICKY_NODE_TYPE) {\n\t\t\t\tthis.$telemetry.trackNodesPanel('nodeView.addSticky', {\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tvoid this.externalHooks.run('nodeView.addNodeButton', { nodeTypeName });\n\t\t\t\tuseSegment().trackAddedTrigger(nodeTypeName);\n\t\t\t\tconst trackProperties: ITelemetryTrackProperties = {\n\t\t\t\t\tnode_type: nodeTypeName,\n\t\t\t\t\tnode_version: newNodeData.typeVersion,\n\t\t\t\t\tis_auto_add: isAutoAdd,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tdrag_and_drop: options.dragAndDrop,\n\t\t\t\t};\n\n\t\t\t\tif (lastSelectedNode) {\n\t\t\t\t\ttrackProperties.input_node_type = lastSelectedNode.type;\n\t\t\t\t}\n\n\t\t\t\tthis.$telemetry.trackNodesPanel('nodeView.addNodeButton', trackProperties);\n\t\t\t}\n\n\t\t\t// Automatically deselect all nodes and select the current one and also active\n\t\t\t// current node. But only if it's added manually by the user (not by undo/redo mechanism)\n\t\t\tif (trackHistory) {\n\t\t\t\tthis.deselectAllNodes();\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.nodeSelectedByName(\n\t\t\t\t\t\tnewNodeData.name,\n\t\t\t\t\t\tshowDetail && nodeTypeName !== STICKY_NODE_TYPE,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn newNodeData;\n\t\t},\n\t\tgetConnection(\n\t\t\tsourceNodeName: string,\n\t\t\tsourceNodeOutputIndex: number,\n\t\t\ttargetNodeName: string,\n\t\t\ttargetNodeOuputIndex: number,\n\t\t\ttype: ConnectionTypes,\n\t\t): IConnection | undefined {\n\t\t\tconst nodeConnections =\n\t\t\t\tthis.workflowsStore.outgoingConnectionsByNodeName(sourceNodeName)[type];\n\t\t\tif (nodeConnections) {\n\t\t\t\tconst connections: IConnection[] | null = nodeConnections[sourceNodeOutputIndex];\n\n\t\t\t\tif (connections) {\n\t\t\t\t\treturn connections.find(\n\t\t\t\t\t\t(connection: IConnection) =>\n\t\t\t\t\t\t\tconnection.node === targetNodeName && connection.index === targetNodeOuputIndex,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t\tconnectTwoNodes(\n\t\t\tsourceNodeName: string,\n\t\t\tsourceNodeOutputIndex: number,\n\t\t\ttargetNodeName: string,\n\t\t\ttargetNodeOutputIndex: number,\n\t\t\ttype: ConnectionTypes,\n\t\t) {\n\t\t\tthis.uiStore.stateIsDirty = true;\n\n\t\t\tconst sourceNode = this.workflowsStore.getNodeByName(sourceNodeName);\n\t\t\tconst targetNode = this.workflowsStore.getNodeByName(targetNodeName);\n\n\t\t\tif (\n\t\t\t\tsourceNode &&\n\t\t\t\ttargetNode &&\n\t\t\t\t!this.checkNodeConnectionAllowed(sourceNode, targetNode, type)\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.getConnection(\n\t\t\t\t\tsourceNodeName,\n\t\t\t\t\tsourceNodeOutputIndex,\n\t\t\t\t\ttargetNodeName,\n\t\t\t\t\ttargetNodeOutputIndex,\n\t\t\t\t\ttype,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst connectionData = [\n\t\t\t\t{\n\t\t\t\t\tnode: sourceNodeName,\n\t\t\t\t\ttype,\n\t\t\t\t\tindex: sourceNodeOutputIndex,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnode: targetNodeName,\n\t\t\t\t\ttype,\n\t\t\t\t\tindex: targetNodeOutputIndex,\n\t\t\t\t},\n\t\t\t] as [IConnection, IConnection];\n\n\t\t\tthis.__addConnection(connectionData);\n\t\t},\n\t\tasync addNode(\n\t\t\tnodeTypeName: string,\n\t\t\toptions: AddNodeOptions = {},\n\t\t\tshowDetail = true,\n\t\t\ttrackHistory = false,\n\t\t\tisAutoAdd = false,\n\t\t) {\n\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\tconst lastSelectedNodeOutputIndex = this.uiStore.lastSelectedNodeOutputIndex;\n\t\t\tconst lastSelectedNodeEndpointUuid = this.uiStore.lastSelectedNodeEndpointUuid;\n\t\t\tconst lastSelectedConnection = this.canvasStore.lastSelectedConnection;\n\n\t\t\tthis.historyStore.startRecordingUndo();\n\n\t\t\tconst newNodeData = await this.injectNode(\n\t\t\t\tnodeTypeName,\n\t\t\t\toptions,\n\t\t\t\tshowDetail,\n\t\t\t\ttrackHistory,\n\t\t\t\tisAutoAdd,\n\t\t\t);\n\t\t\tif (!newNodeData) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst outputIndex = lastSelectedNodeOutputIndex || 0;\n\t\t\tconst targetEndpoint = lastSelectedNodeEndpointUuid || '';\n\n\t\t\t// Handle connection of scoped_endpoint types\n\t\t\tif (lastSelectedNodeEndpointUuid && !isAutoAdd) {\n\t\t\t\tconst lastSelectedEndpoint = this.instance.getEndpoint(lastSelectedNodeEndpointUuid);\n\t\t\t\tif (\n\t\t\t\t\tlastSelectedEndpoint &&\n\t\t\t\t\tthis.checkNodeConnectionAllowed(\n\t\t\t\t\t\tlastSelectedNode,\n\t\t\t\t\t\tnewNodeData,\n\t\t\t\t\t\tlastSelectedEndpoint.scope as NodeConnectionType,\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tconst connectionType = lastSelectedEndpoint.scope as ConnectionTypes;\n\t\t\t\t\tconst newNodeElement = this.instance.getManagedElement(newNodeData.id);\n\t\t\t\t\tconst newNodeConnections = this.instance.getEndpoints(newNodeElement);\n\t\t\t\t\tconst viableConnection = newNodeConnections.find((conn) => {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\tconn.scope === connectionType &&\n\t\t\t\t\t\t\tlastSelectedEndpoint.parameters.connection !== conn.parameters.connection\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\n\t\t\t\t\tthis.instance?.connect({\n\t\t\t\t\t\tuuids: [targetEndpoint, viableConnection?.uuid || ''],\n\t\t\t\t\t\tdetachable: !this.isReadOnlyRoute && !this.readOnlyEnv,\n\t\t\t\t\t});\n\t\t\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If a node is last selected then connect between the active and its child ones\n\t\t\tif (lastSelectedNode && !isAutoAdd) {\n\t\t\t\tawait this.$nextTick();\n\n\t\t\t\tif (lastSelectedConnection?.__meta) {\n\t\t\t\t\tthis.__deleteJSPlumbConnection(lastSelectedConnection, trackHistory);\n\n\t\t\t\t\tconst targetNodeName = lastSelectedConnection.__meta.targetNodeName;\n\t\t\t\t\tconst targetOutputIndex = lastSelectedConnection.__meta.targetOutputIndex;\n\t\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\t\tnewNodeData.name,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\ttargetNodeName,\n\t\t\t\t\t\ttargetOutputIndex,\n\t\t\t\t\t\tNodeConnectionType.Main,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Connect active node to the newly created one\n\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\tlastSelectedNode.name,\n\t\t\t\t\toutputIndex,\n\t\t\t\t\tnewNodeData.name,\n\t\t\t\t\t0,\n\t\t\t\t\tNodeConnectionType.Main,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t},\n\t\tgetNodeCreatorFilter(nodeName: string, outputType?: NodeConnectionType) {\n\t\t\tlet filter;\n\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\t\t\tconst workflowNode = workflow.getNode(nodeName);\n\t\t\tif (!workflowNode) return { nodes: [] };\n\n\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(\n\t\t\t\tworkflowNode?.type,\n\t\t\t\tworkflowNode.typeVersion,\n\t\t\t);\n\t\t\tif (nodeType) {\n\t\t\t\tconst inputs = NodeHelpers.getNodeInputs(workflow, workflowNode, nodeType);\n\n\t\t\t\tconst filterFound = inputs.filter((input) => {\n\t\t\t\t\tif (typeof input === 'string' || input.type !== outputType || !input.filter) {\n\t\t\t\t\t\t// No filters defined or wrong connection type\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\t\t\t\t}) as INodeInputConfiguration[];\n\n\t\t\t\tif (filterFound.length) {\n\t\t\t\t\tfilter = filterFound[0].filter;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn filter;\n\t\t},\n\t\tinsertNodeAfterSelected(info: NewConnectionInfo) {\n\t\t\tconst type = info.outputType ?? NodeConnectionType.Main;\n\t\t\t// Get the node and set it as active that new nodes\n\t\t\t// which get created get automatically connected\n\t\t\t// to it.\n\t\t\tconst sourceNode = this.workflowsStore.getNodeById(info.sourceId);\n\t\t\tif (!sourceNode) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.uiStore.lastSelectedNode = sourceNode.name;\n\t\t\tthis.uiStore.lastSelectedNodeEndpointUuid =\n\t\t\t\tinfo.endpointUuid ?? info.connection?.target.jtk?.endpoint.uuid;\n\t\t\tthis.uiStore.lastSelectedNodeOutputIndex = info.index;\n\t\t\tthis.canvasStore.newNodeInsertPosition = null;\n\n\t\t\tif (info.connection) {\n\t\t\t\tthis.canvasStore.lastSelectedConnection = info.connection;\n\t\t\t}\n\n\t\t\tthis.onToggleNodeCreator({\n\t\t\t\tsource: info.eventSource,\n\t\t\t\tcreateNodeActive: true,\n\t\t\t\tnodeCreatorView: info.nodeCreatorView,\n\t\t\t});\n\n\t\t\t// TODO: The animation is a bit glitchy because we're updating view stack immediately\n\t\t\t// after the node creator is opened\n\t\t\tconst isOutput = info.connection?.endpoints[0].parameters.connection === 'source';\n\t\t\tconst isScopedConnection =\n\t\t\t\ttype !== NodeConnectionType.Main && Object.values(NodeConnectionType).includes(type);\n\n\t\t\tif (isScopedConnection) {\n\t\t\t\tuseViewStacks()\n\t\t\t\t\t.gotoCompatibleConnectionView(\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\tisOutput,\n\t\t\t\t\t\tthis.getNodeCreatorFilter(sourceNode.name, type),\n\t\t\t\t\t)\n\t\t\t\t\t.catch((e) => {});\n\t\t\t}\n\t\t},\n\t\tasync onEventConnectionAbort(connection: Connection) {\n\t\t\ttry {\n\t\t\t\tif (this.dropPrevented) {\n\t\t\t\t\tthis.dropPrevented = false;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (this.pullConnActiveNodeName) {\n\t\t\t\t\tconst sourceNode = this.workflowsStore.getNodeById(connection.parameters.nodeId);\n\t\t\t\t\tconst connectionType = connection.parameters.type ?? NodeConnectionType.Main;\n\t\t\t\t\tconst overrideTargetEndpoint = connection?.connector\n\t\t\t\t\t\t?.overrideTargetEndpoint as Endpoint | null;\n\n\t\t\t\t\tif (sourceNode) {\n\t\t\t\t\t\tconst isTarget = connection.parameters.connection === 'target';\n\t\t\t\t\t\tconst sourceNodeName = isTarget ? this.pullConnActiveNodeName : sourceNode.name;\n\t\t\t\t\t\tconst targetNodeName = isTarget ? sourceNode.name : this.pullConnActiveNodeName;\n\t\t\t\t\t\tconst outputIndex = connection.parameters.index;\n\t\t\t\t\t\tNodeViewUtils.resetConnectionAfterPull(connection);\n\t\t\t\t\t\tawait this.$nextTick();\n\n\t\t\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\t\toutputIndex,\n\t\t\t\t\t\t\ttargetNodeName,\n\t\t\t\t\t\t\toverrideTargetEndpoint?.parameters?.index ?? 0,\n\t\t\t\t\t\t\tconnectionType,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.pullConnActiveNodeName = null;\n\t\t\t\t\t\tthis.dropPrevented = false;\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// When connection is aborted, we want to show the 'Next step' popup\n\t\t\t\tconst endpointId = `${connection.parameters.nodeId}-output${connection.parameters.index}`;\n\t\t\t\tconst endpoint = connection.instance.getEndpoint(endpointId);\n\t\t\t\t// First, show node creator if endpoint is not a plus endpoint\n\t\t\t\t// or if the AI Assistant experiment doesn't need to be shown to user\n\t\t\t\tif (!endpoint?.endpoint?.canvas || !this.shouldShowNextStepDialog) {\n\t\t\t\t\tthis.insertNodeAfterSelected({\n\t\t\t\t\t\tsourceId: connection.parameters.nodeId,\n\t\t\t\t\t\tindex: connection.parameters.index,\n\t\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.NODE_CONNECTION_DROP,\n\t\t\t\t\t\tconnection,\n\t\t\t\t\t\toutputType: connection.parameters.type,\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Else render the popup\n\t\t\t\tconst endpointElement: HTMLElement = endpoint.endpoint.canvas;\n\t\t\t\t// Use observer to trigger the popup once the endpoint is rendered back again\n\t\t\t\t// after connection drag is aborted (so we can get it's position and dimensions)\n\t\t\t\tconst observer = new MutationObserver((mutations) => {\n\t\t\t\t\t// Find the mutation in which the current endpoint becomes visible again\n\t\t\t\t\tconst endpointMutation = mutations.find((mutation) => {\n\t\t\t\t\t\tconst target = mutation.target;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\tisJSPlumbEndpointElement(target) &&\n\t\t\t\t\t\t\ttarget.jtk.endpoint.uuid === endpoint.uuid &&\n\t\t\t\t\t\t\ttarget.style.display === 'block'\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t\tif (endpointMutation) {\n\t\t\t\t\t\t// When found, display the popup\n\t\t\t\t\t\tconst newConnectionInfo: AIAssistantConnectionInfo = {\n\t\t\t\t\t\t\tsourceId: connection.parameters.nodeId,\n\t\t\t\t\t\t\tindex: connection.parameters.index,\n\t\t\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.NODE_CONNECTION_DROP,\n\t\t\t\t\t\t\toutputType: connection.parameters.type,\n\t\t\t\t\t\t\tendpointUuid: endpoint.uuid,\n\t\t\t\t\t\t\tstepName: endpoint.__meta.nodeName,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tthis.aiStore.latestConnectionInfo = newConnectionInfo;\n\t\t\t\t\t\tthis.aiStore.openNextStepPopup(\n\t\t\t\t\t\t\tthis.$locale.baseText('nextStepPopup.title.nextStep'),\n\t\t\t\t\t\t\tendpointElement,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tobserver.disconnect();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tobserver.observe(this.$refs.nodeViewRef as HTMLElement, {\n\t\t\t\t\tattributes: true,\n\t\t\t\t\tattributeFilter: ['style'],\n\t\t\t\t\tsubtree: true,\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tcheckNodeConnectionAllowed(\n\t\t\tsourceNode: INodeUi,\n\t\t\ttargetNode: INodeUi,\n\t\t\ttargetInfoType: NodeConnectionType,\n\t\t): boolean {\n\t\t\tconst targetNodeType = this.nodeTypesStore.getNodeType(\n\t\t\t\ttargetNode.type,\n\t\t\t\ttargetNode.typeVersion,\n\t\t\t);\n\n\t\t\tif (targetNodeType?.inputs?.length) {\n\t\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\t\t\t\tconst workflowNode = workflow.getNode(targetNode.name);\n\t\t\t\tlet inputs: Array<ConnectionTypes | INodeInputConfiguration> = [];\n\t\t\t\tif (targetNodeType) {\n\t\t\t\t\tinputs = NodeHelpers.getNodeInputs(workflow, workflowNode, targetNodeType);\n\t\t\t\t}\n\n\t\t\t\tfor (const input of inputs || []) {\n\t\t\t\t\tif (typeof input === 'string' || input.type !== targetInfoType || !input.filter) {\n\t\t\t\t\t\t// No filters defined or wrong connection type\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (input.filter.nodes.length) {\n\t\t\t\t\t\tif (!input.filter.nodes.includes(sourceNode.type)) {\n\t\t\t\t\t\t\tthis.dropPrevented = true;\n\t\t\t\t\t\t\tthis.showToast({\n\t\t\t\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showError.nodeNodeCompatible.title'),\n\t\t\t\t\t\t\t\tmessage: this.$locale.baseText('nodeView.showError.nodeNodeCompatible.message', {\n\t\t\t\t\t\t\t\t\tinterpolate: { sourceNodeName: sourceNode.name, targetNodeName: targetNode.name },\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\t\t\tduration: 5000,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn false;\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\treturn true;\n\t\t},\n\t\tonInterceptBeforeDrop(info: BeforeDropParams) {\n\t\t\ttry {\n\t\t\t\tlet sourceInfo: ComponentParameters;\n\t\t\t\tlet targetInfo: ComponentParameters;\n\t\t\t\tif (info.connection.endpoints[0].parameters.connection === 'target') {\n\t\t\t\t\tsourceInfo = info.dropEndpoint.parameters;\n\t\t\t\t\ttargetInfo = info.connection.endpoints[0].parameters;\n\t\t\t\t} else {\n\t\t\t\t\tsourceInfo = info.connection.endpoints[0].parameters;\n\t\t\t\t\ttargetInfo = info.dropEndpoint.parameters;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tsourceInfo.type !== targetInfo.type ||\n\t\t\t\t\tsourceInfo.connection === targetInfo.connection\n\t\t\t\t) {\n\t\t\t\t\tthis.dropPrevented = true;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst sourceNode = this.workflowsStore.getNodeById(sourceInfo.nodeId);\n\t\t\t\tconst targetNode = this.workflowsStore.getNodeById(targetInfo.nodeId);\n\n\t\t\t\tconst sourceNodeName = sourceNode?.name || '';\n\t\t\t\tconst targetNodeName = targetNode?.name || '';\n\n\t\t\t\tif (sourceNode && targetNode) {\n\t\t\t\t\tif (!this.checkNodeConnectionAllowed(sourceNode, targetNode, targetInfo.type)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// check for duplicates\n\t\t\t\tif (\n\t\t\t\t\tthis.getConnection(\n\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\tsourceInfo.index,\n\t\t\t\t\t\ttargetNodeName,\n\t\t\t\t\t\ttargetInfo.index,\n\t\t\t\t\t\tsourceInfo.type,\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tthis.dropPrevented = true;\n\t\t\t\t\tthis.pullConnActiveNodeName = null;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\t\tonEventConnection(info: ConnectionEstablishedParams) {\n\t\t\ttry {\n\t\t\t\tif (info.sourceEndpoint.parameters.connection === 'target') {\n\t\t\t\t\t// Allow that not \"main\" connections can also be dragged the other way around\n\t\t\t\t\t// so switch them around if necessary\n\t\t\t\t\tconst tempEndpoint = info.sourceEndpoint;\n\t\t\t\t\tinfo.sourceEndpoint = info.targetEndpoint;\n\t\t\t\t\tinfo.targetEndpoint = tempEndpoint;\n\t\t\t\t}\n\n\t\t\t\tconst sourceInfo = info.sourceEndpoint.parameters;\n\t\t\t\tconst targetInfo = info.targetEndpoint.parameters;\n\n\t\t\t\tconst sourceNodeName = this.workflowsStore.getNodeById(sourceInfo.nodeId)?.name;\n\t\t\t\tconst targetNodeName = this.workflowsStore.getNodeById(targetInfo.nodeId)?.name;\n\n\t\t\t\tif (sourceNodeName && targetNodeName) {\n\t\t\t\t\tinfo.connection.__meta = {\n\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\tsourceOutputIndex: sourceInfo.index,\n\t\t\t\t\t\ttargetNodeName,\n\t\t\t\t\t\ttargetOutputIndex: targetInfo.index,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tNodeViewUtils.resetConnection(info.connection);\n\t\t\t\tNodeViewUtils.moveBackInputLabelPosition(info.targetEndpoint);\n\n\t\t\t\tconst connectionData: [IConnection, IConnection] = [\n\t\t\t\t\t{\n\t\t\t\t\t\tnode: sourceNodeName,\n\t\t\t\t\t\ttype: sourceInfo.type,\n\t\t\t\t\t\tindex: sourceInfo.index,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tnode: targetNodeName,\n\t\t\t\t\t\ttype: targetInfo.type,\n\t\t\t\t\t\tindex: targetInfo.index,\n\t\t\t\t\t},\n\t\t\t\t];\n\n\t\t\t\tthis.dropPrevented = true;\n\t\t\t\tthis.workflowsStore.addConnection({ connection: connectionData });\n\n\t\t\t\tif (!this.isReadOnlyRoute && !this.readOnlyEnv) {\n\t\t\t\t\tNodeViewUtils.hideOutputNameLabel(info.sourceEndpoint);\n\t\t\t\t\tNodeViewUtils.addConnectionActionsOverlay(\n\t\t\t\t\t\tinfo.connection,\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\tthis.activeConnection = null;\n\t\t\t\t\t\t\tthis.__deleteJSPlumbConnection(info.connection);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\tthis.insertNodeAfterSelected({\n\t\t\t\t\t\t\t\tsourceId: info.sourceEndpoint.parameters.nodeId,\n\t\t\t\t\t\t\t\tindex: sourceInfo.index,\n\t\t\t\t\t\t\t\tconnection: info.connection,\n\t\t\t\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.NODE_CONNECTION_ACTION,\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\t\t\tconst endpointArrow = NodeViewUtils.getOverlay(\n\t\t\t\t\t\tinfo.connection,\n\t\t\t\t\t\tOVERLAY_ENDPOINT_ARROW_ID,\n\t\t\t\t\t);\n\t\t\t\t\tif (sourceInfo.type !== NodeConnectionType.Main) {\n\t\t\t\t\t\t// Not \"main\" connections get a different connection style\n\t\t\t\t\t\tinfo.connection.setPaintStyle(\n\t\t\t\t\t\t\tgetConnectorPaintStyleData(info.connection, info.sourceEndpoint.parameters.category),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tendpointArrow?.setVisible(false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.dropPrevented = false;\n\t\t\t\tif (!this.isLoading) {\n\t\t\t\t\tthis.uiStore.stateIsDirty = true;\n\t\t\t\t\tif (!this.suspendRecordingDetachedConnections) {\n\t\t\t\t\t\tthis.historyStore.pushCommandToUndo(new AddConnectionCommand(connectionData));\n\t\t\t\t\t}\n\t\t\t\t\t// When we add multiple nodes, this event could be fired hundreds of times for large workflows.\n\t\t\t\t\t// And because the updateNodesInputIssues() method is quite expensive, we only call it if not in insert mode\n\t\t\t\t\tif (!this.isInsertingNodes) {\n\t\t\t\t\t\tthis.nodeHelpers.updateNodesInputIssues();\n\t\t\t\t\t\tthis.resetEndpointsErrors();\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tNodeViewUtils.addConnectionTestData(\n\t\t\t\t\t\t\t\tinfo.source,\n\t\t\t\t\t\t\t\tinfo.target,\n\t\t\t\t\t\t\t\tinfo.connection?.connector?.hasOwnProperty('canvas')\n\t\t\t\t\t\t\t\t\t? (info.connection.connector.canvas as HTMLElement)\n\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\taddConectionsTestData() {\n\t\t\tthis.instance.connections.forEach((connection) => {\n\t\t\t\tNodeViewUtils.addConnectionTestData(\n\t\t\t\t\tconnection.source,\n\t\t\t\t\tconnection.target,\n\t\t\t\t\tconnection?.connector?.hasOwnProperty('canvas')\n\t\t\t\t\t\t? (connection?.connector.canvas as HTMLElement)\n\t\t\t\t\t\t: undefined,\n\t\t\t\t);\n\t\t\t});\n\t\t},\n\t\tonDragMove() {\n\t\t\tconst totalNodes = this.nodes.length;\n\t\t\tvoid this.callDebounced(this.updateConnectionsOverlays, {\n\t\t\t\tdebounceTime: totalNodes > 20 ? 200 : 0,\n\t\t\t});\n\t\t},\n\t\tupdateConnectionsOverlays() {\n\t\t\tthis.instance?.connections.forEach((connection) => {\n\t\t\t\tNodeViewUtils.showOrHideItemsLabel(connection);\n\t\t\t\tNodeViewUtils.showOrHideMidpointArrow(connection);\n\n\t\t\t\tObject.values(connection.overlays).forEach((overlay) => {\n\t\t\t\t\tif (!overlay.canvas) return;\n\t\t\t\t\tthis.instance?.repaint(overlay.canvas);\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\tisConnectionActive(connection: Connection | null) {\n\t\t\tif (!connection?.id || !this.activeConnection?.id) return false;\n\n\t\t\treturn this.activeConnection?.id === connection.id;\n\t\t},\n\t\tonConnectionMouseOver(connection: Connection) {\n\t\t\ttry {\n\t\t\t\tif (this.exitTimer !== undefined) {\n\t\t\t\t\tclearTimeout(this.exitTimer);\n\t\t\t\t\tthis.exitTimer = undefined;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t// eslint-disable-next-line no-constant-binary-expression\n\t\t\t\t\tthis.isReadOnlyRoute ??\n\t\t\t\t\tthis.readOnlyEnv ??\n\t\t\t\t\tthis.enterTimer ??\n\t\t\t\t\t!connection ??\n\t\t\t\t\tthis.isConnectionActive(connection)\n\t\t\t\t)\n\t\t\t\t\treturn;\n\n\t\t\t\tthis.enterTimer = setTimeout(() => {\n\t\t\t\t\t// If there is already an active connection then hide it first\n\t\t\t\t\tif (this.activeConnection && !this.isConnectionActive(connection)) {\n\t\t\t\t\t\tNodeViewUtils.hideConnectionActions(this.activeConnection);\n\t\t\t\t\t}\n\t\t\t\t\tthis.enterTimer = undefined;\n\t\t\t\t\tif (connection) {\n\t\t\t\t\t\tNodeViewUtils.showConnectionActions(connection);\n\t\t\t\t\t\tthis.activeConnection = connection;\n\t\t\t\t\t}\n\t\t\t\t}, 150);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tonConnectionMouseOut(connection: Connection) {\n\t\t\ttry {\n\t\t\t\tif (this.exitTimer) return;\n\n\t\t\t\tif (this.enterTimer) {\n\t\t\t\t\tclearTimeout(this.enterTimer);\n\t\t\t\t\tthis.enterTimer = undefined;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t// eslint-disable-next-line no-constant-binary-expression\n\t\t\t\t\tthis.isReadOnlyRoute ??\n\t\t\t\t\tthis.readOnlyEnv ??\n\t\t\t\t\t!connection ??\n\t\t\t\t\t!this.isConnectionActive(connection)\n\t\t\t\t)\n\t\t\t\t\treturn;\n\n\t\t\t\tthis.exitTimer = setTimeout(() => {\n\t\t\t\t\tthis.exitTimer = undefined;\n\n\t\t\t\t\tif (connection && this.isConnectionActive(connection)) {\n\t\t\t\t\t\tNodeViewUtils.hideConnectionActions(this.activeConnection);\n\t\t\t\t\t\tthis.activeConnection = null;\n\t\t\t\t\t}\n\t\t\t\t}, 500);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tonConnectionMoved(info: ConnectionMovedParams) {\n\t\t\ttry {\n\t\t\t\t// When a connection gets moved from one node to another it for some reason\n\t\t\t\t// calls the \"connection\" event but not the \"connectionDetached\" one. So we listen\n\t\t\t\t// additionally to the \"connectionMoved\" event and then only delete the existing connection.\n\n\t\t\t\tNodeViewUtils.resetInputLabelPosition(info.connection);\n\n\t\t\t\tconst sourceInfo = info.connection.parameters;\n\t\t\t\tconst targetInfo = info.originalEndpoint.parameters;\n\n\t\t\t\tconst connectionInfo = [\n\t\t\t\t\t{\n\t\t\t\t\t\tnode: this.workflowsStore.getNodeById(sourceInfo.nodeId)?.name || '',\n\t\t\t\t\t\ttype: sourceInfo.type,\n\t\t\t\t\t\tindex: sourceInfo.index,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tnode: this.workflowsStore.getNodeById(targetInfo.nodeId)?.name || '',\n\t\t\t\t\t\ttype: targetInfo.type,\n\t\t\t\t\t\tindex: targetInfo.index,\n\t\t\t\t\t},\n\t\t\t\t] as [IConnection, IConnection];\n\n\t\t\t\tthis.__removeConnection(connectionInfo, false);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tonEndpointMouseOver(endpoint: Endpoint, mouse) {\n\t\t\t// This event seems bugged. It gets called constantly even when the mouse is not over the endpoint\n\t\t\t// if the endpoint has a connection attached to it. So we need to check if the mouse is actually over\n\t\t\t// the endpoint.\n\t\t\tif (!endpoint.isTarget || mouse.target !== endpoint.endpoint.canvas) return;\n\t\t\tthis.instance.setHover(endpoint, true);\n\t\t},\n\t\tonEndpointMouseOut(endpoint: Endpoint) {\n\t\t\tif (!endpoint.isTarget) return;\n\t\t\tthis.instance.setHover(endpoint, false);\n\t\t},\n\t\tasync onConnectionDetached(info: ConnectionDetachedParams) {\n\t\t\ttry {\n\t\t\t\tif (info.sourceEndpoint.parameters.connection === 'target') {\n\t\t\t\t\t// Allow that not \"main\" connections can also be dragged the other way around\n\t\t\t\t\tconst tempEndpoint = info.sourceEndpoint;\n\t\t\t\t\tinfo.sourceEndpoint = info.targetEndpoint;\n\t\t\t\t\tinfo.targetEndpoint = tempEndpoint;\n\t\t\t\t}\n\n\t\t\t\tconst connectionInfo: [IConnection, IConnection] | null = getConnectionInfo(info);\n\t\t\t\tNodeViewUtils.resetInputLabelPosition(info.targetEndpoint);\n\t\t\t\tNodeViewUtils.showOutputNameLabel(info.sourceEndpoint, info.connection);\n\n\t\t\t\tinfo.connection.removeOverlays();\n\t\t\t\tthis.__removeConnectionByConnectionInfo(info, false, false);\n\n\t\t\t\tif (this.pullConnActiveNodeName) {\n\t\t\t\t\t// establish new connection when dragging connection from one node to another\n\t\t\t\t\tthis.historyStore.startRecordingUndo();\n\t\t\t\t\tconst sourceNode = this.workflowsStore.getNodeById(info.connection.parameters.nodeId);\n\t\t\t\t\tconst sourceNodeName = sourceNode.name;\n\t\t\t\t\tconst outputIndex = info.connection.parameters.index;\n\t\t\t\t\tconst overrideTargetEndpoint = info.connection.connector\n\t\t\t\t\t\t.overrideTargetEndpoint as Endpoint | null;\n\n\t\t\t\t\tif (connectionInfo) {\n\t\t\t\t\t\tthis.historyStore.pushCommandToUndo(new RemoveConnectionCommand(connectionInfo));\n\t\t\t\t\t}\n\t\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\toutputIndex,\n\t\t\t\t\t\tthis.pullConnActiveNodeName,\n\t\t\t\t\t\toverrideTargetEndpoint?.parameters?.index ?? 0,\n\t\t\t\t\t\tNodeConnectionType.Main,\n\t\t\t\t\t);\n\t\t\t\t\tthis.pullConnActiveNodeName = null;\n\t\t\t\t\tawait this.$nextTick();\n\t\t\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t\t\t} else if (\n\t\t\t\t\t!this.historyStore.bulkInProgress &&\n\t\t\t\t\t!this.suspendRecordingDetachedConnections &&\n\t\t\t\t\tconnectionInfo\n\t\t\t\t) {\n\t\t\t\t\t// Ff connection being detached by user, save this in history\n\t\t\t\t\t// but skip if it's detached as a side effect of bulk undo/redo or node rename process\n\t\t\t\t\tconst removeCommand = new RemoveConnectionCommand(connectionInfo, this);\n\t\t\t\t\tthis.historyStore.pushCommandToUndo(removeCommand);\n\t\t\t\t}\n\n\t\t\t\tvoid this.nodeHelpers.updateNodesInputIssues();\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tonConnectionDrag(connection: Connection) {\n\t\t\t// The overlays are visible by default so we need to hide the midpoint arrow\n\t\t\t// manually\n\t\t\tconnection.overlays['midpoint-arrow']?.setVisible(false);\n\t\t\ttry {\n\t\t\t\tthis.pullConnActiveNodeName = null;\n\t\t\t\tthis.pullConnActive = true;\n\t\t\t\tthis.canvasStore.newNodeInsertPosition = null;\n\t\t\t\tNodeViewUtils.hideConnectionActions(connection);\n\t\t\t\tNodeViewUtils.resetConnection(connection);\n\n\t\t\t\tconst scope = connection.scope as ConnectionTypes;\n\t\t\t\tconst scopedEndpoints = Array.from(\n\t\t\t\t\tdocument.querySelectorAll(`[data-jtk-scope-${scope}=true]`),\n\t\t\t\t);\n\t\t\t\tconst connectionType = connection.parameters.connection;\n\t\t\t\tconst requiredType = connectionType === 'source' ? 'target' : 'source';\n\n\t\t\t\tconst filteredEndpoints = scopedEndpoints.filter((el) => {\n\t\t\t\t\tconst endpoint = el.jtk.endpoint as Endpoint;\n\t\t\t\t\tif (!endpoint) return false;\n\n\t\t\t\t\t// Prevent snapping(but not connecting) to the same node\n\t\t\t\t\tconst isSameNode = endpoint.parameters.nodeId === connection.parameters.nodeId;\n\t\t\t\t\tconst endpointType = endpoint.parameters.connection;\n\n\t\t\t\t\treturn !isSameNode && endpointType === requiredType;\n\t\t\t\t});\n\n\t\t\t\tconst onMouseMove = (e: MouseEvent | TouchEvent) => {\n\t\t\t\t\tif (!connection) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst intersectingEndpoints = filteredEndpoints\n\t\t\t\t\t\t.filter((element: Element) => {\n\t\t\t\t\t\t\tconst endpoint = element.jtk.endpoint as Endpoint;\n\n\t\t\t\t\t\t\tif (element.classList.contains('jtk-floating-endpoint')) {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst isEndpointIntersect = NodeViewUtils.isElementIntersection(element, e, 50);\n\t\t\t\t\t\t\tconst isNodeElementIntersect = NodeViewUtils.isElementIntersection(\n\t\t\t\t\t\t\t\tendpoint.element,\n\t\t\t\t\t\t\t\te,\n\t\t\t\t\t\t\t\t30,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (isEndpointIntersect || isNodeElementIntersect) {\n\t\t\t\t\t\t\t\tconst node = this.workflowsStore.getNodeById(endpoint.parameters.nodeId);\n\n\t\t\t\t\t\t\t\tif (node) {\n\t\t\t\t\t\t\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\n\t\t\t\t\t\t\t\t\tif (!nodeType) return false;\n\n\t\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.sort((a, b) => {\n\t\t\t\t\t\t\tconst aEndpointIntersect = NodeViewUtils.calculateElementIntersection(a, e, 50);\n\t\t\t\t\t\t\tconst bEndpointIntersect = NodeViewUtils.calculateElementIntersection(b, e, 50);\n\n\t\t\t\t\t\t\t// If both intersections are null, treat them as equal\n\t\t\t\t\t\t\tif (!aEndpointIntersect?.y && !bEndpointIntersect?.y) {\n\t\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// If one intersection is null, sort the non-null one first\n\t\t\t\t\t\t\tif (!aEndpointIntersect?.y) return 1;\n\t\t\t\t\t\t\tif (!bEndpointIntersect?.y) return -1;\n\n\t\t\t\t\t\t\t// Otherwise, sort by ascending Y distance\n\t\t\t\t\t\t\treturn bEndpointIntersect.y - aEndpointIntersect.y;\n\t\t\t\t\t\t});\n\n\t\t\t\t\tif (intersectingEndpoints.length > 0) {\n\t\t\t\t\t\tconst intersectingEndpoint = intersectingEndpoints[0];\n\t\t\t\t\t\tconst endpoint = intersectingEndpoint.jtk.endpoint as Endpoint;\n\t\t\t\t\t\tconst node = this.workflowsStore.getNodeById(endpoint.parameters.nodeId);\n\n\t\t\t\t\t\tthis.pullConnActiveNodeName = node?.name ?? null;\n\n\t\t\t\t\t\tNodeViewUtils.showDropConnectionState(connection, endpoint);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tNodeViewUtils.showPullConnectionState(connection);\n\t\t\t\t\t\tthis.pullConnActiveNodeName = null;\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tconst onMouseUp = (e: MouseEvent | TouchEvent) => {\n\t\t\t\t\tthis.pullConnActive = false;\n\t\t\t\t\tthis.canvasStore.newNodeInsertPosition = this.getMousePositionWithinNodeView(e);\n\t\t\t\t\tNodeViewUtils.resetConnectionAfterPull(connection);\n\t\t\t\t\twindow.removeEventListener('mousemove', onMouseMove);\n\t\t\t\t\twindow.removeEventListener('mouseup', onMouseUp);\n\n\t\t\t\t\tthis.connectionDragScope = {\n\t\t\t\t\t\ttype: null,\n\t\t\t\t\t\tconnection: null,\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\twindow.addEventListener('mousemove', onMouseMove);\n\t\t\t\twindow.addEventListener('touchmove', onMouseMove);\n\t\t\t\twindow.addEventListener('mouseup', onMouseUp);\n\t\t\t\twindow.addEventListener('touchend', onMouseMove);\n\n\t\t\t\tthis.connectionDragScope = {\n\t\t\t\t\ttype: connection.parameters.type,\n\t\t\t\t\tconnection: connection.parameters.connection,\n\t\t\t\t};\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tonConnectionDragAbortDetached(connection: Connection) {\n\t\t\tObject.values(this.instance?.endpointsByElement)\n\t\t\t\t.flatMap((endpoints) => Object.values(endpoints))\n\t\t\t\t.filter((endpoint) => endpoint.endpoint.type === 'N8nPlus')\n\t\t\t\t.forEach((endpoint) => setTimeout(() => endpoint.instance.revalidate(endpoint.element), 0));\n\t\t},\n\t\tonPlusEndpointClick(endpoint: Endpoint) {\n\t\t\tif (this.shouldShowNextStepDialog) {\n\t\t\t\tif (endpoint?.__meta) {\n\t\t\t\t\tthis.aiStore.latestConnectionInfo = {\n\t\t\t\t\t\tsourceId: endpoint.__meta.nodeId,\n\t\t\t\t\t\tindex: endpoint.__meta.index,\n\t\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.PLUS_ENDPOINT,\n\t\t\t\t\t\toutputType: endpoint.scope as NodeConnectionType,\n\t\t\t\t\t\tendpointUuid: endpoint.uuid,\n\t\t\t\t\t\tstepName: endpoint.__meta.nodeName,\n\t\t\t\t\t};\n\t\t\t\t\tconst endpointElement = endpoint.endpoint.canvas;\n\t\t\t\t\tthis.aiStore.openNextStepPopup(\n\t\t\t\t\t\tthis.$locale.baseText('nextStepPopup.title.nextStep'),\n\t\t\t\t\t\tendpointElement,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.insertNodeAfterSelected({\n\t\t\t\t\tsourceId: endpoint.__meta.nodeId,\n\t\t\t\t\tindex: endpoint.__meta.index,\n\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.PLUS_ENDPOINT,\n\t\t\t\t\toutputType: endpoint.scope as ConnectionTypes,\n\t\t\t\t\tendpointUuid: endpoint.uuid,\n\t\t\t\t\tstepName: endpoint.__meta.nodeName,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonAddInputEndpointClick(endpoint: Endpoint) {\n\t\t\tif (endpoint?.__meta) {\n\t\t\t\tthis.insertNodeAfterSelected({\n\t\t\t\t\tsourceId: endpoint.__meta.nodeId,\n\t\t\t\t\tindex: endpoint.__meta.index,\n\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.ADD_INPUT_ENDPOINT,\n\t\t\t\t\tnodeCreatorView: AI_NODE_CREATOR_VIEW,\n\t\t\t\t\toutputType: endpoint.scope as ConnectionTypes,\n\t\t\t\t\tendpointUuid: endpoint.uuid,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tbindCanvasEvents() {\n\t\t\tif (this.eventsAttached) return;\n\t\t\tthis.instance.bind(EVENT_CONNECTION_ABORT, this.onEventConnectionAbort);\n\n\t\t\tthis.instance.bind(INTERCEPT_BEFORE_DROP, this.onInterceptBeforeDrop);\n\n\t\t\tthis.instance.bind(EVENT_CONNECTION, this.onEventConnection);\n\n\t\t\tthis.instance.bind(EVENT_DRAG_MOVE, this.onDragMove);\n\t\t\tthis.instance.bind(EVENT_CONNECTION_MOUSEOVER, this.onConnectionMouseOver);\n\t\t\tthis.instance.bind(EVENT_CONNECTION_MOUSEOUT, this.onConnectionMouseOut);\n\n\t\t\tthis.instance.bind(EVENT_CONNECTION_MOVED, this.onConnectionMoved);\n\t\t\tthis.instance.bind(EVENT_ENDPOINT_MOUSEOVER, this.onEndpointMouseOver);\n\t\t\tthis.instance.bind(EVENT_ENDPOINT_MOUSEOUT, this.onEndpointMouseOut);\n\t\t\tthis.instance.bind(EVENT_CONNECTION_DETACHED, this.onConnectionDetached);\n\t\t\tthis.instance.bind(EVENT_CONNECTION_DRAG, this.onConnectionDrag);\n\t\t\tthis.instance.bind(\n\t\t\t\t[EVENT_CONNECTION_DRAG, EVENT_CONNECTION_ABORT, EVENT_CONNECTION_DETACHED],\n\t\t\t\tthis.onConnectionDragAbortDetached,\n\t\t\t);\n\t\t\tthis.instance.bind(EVENT_PLUS_ENDPOINT_CLICK, this.onPlusEndpointClick);\n\t\t\tthis.instance.bind(EVENT_ADD_INPUT_ENDPOINT_CLICK, this.onAddInputEndpointClick);\n\n\t\t\tthis.eventsAttached = true;\n\t\t},\n\t\tunbindCanvasEvents() {\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_ABORT, this.onEventConnectionAbort);\n\n\t\t\tthis.instance.unbind(INTERCEPT_BEFORE_DROP, this.onInterceptBeforeDrop);\n\n\t\t\tthis.instance.unbind(EVENT_CONNECTION, this.onEventConnection);\n\n\t\t\tthis.instance.unbind(EVENT_DRAG_MOVE, this.onDragMove);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_MOUSEOVER, this.onConnectionMouseOver);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_MOUSEOUT, this.onConnectionMouseOut);\n\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_MOVED, this.onConnectionMoved);\n\t\t\tthis.instance.unbind(EVENT_ENDPOINT_MOUSEOVER, this.onEndpointMouseOver);\n\t\t\tthis.instance.unbind(EVENT_ENDPOINT_MOUSEOUT, this.onEndpointMouseOut);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_DETACHED, this.onConnectionDetached);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_DRAG, this.onConnectionDrag);\n\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_DRAG, this.onConnectionDragAbortDetached);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_ABORT, this.onConnectionDragAbortDetached);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_DETACHED, this.onConnectionDragAbortDetached);\n\t\t\tthis.instance.unbind(EVENT_PLUS_ENDPOINT_CLICK, this.onPlusEndpointClick);\n\t\t\tthis.instance.unbind(EVENT_ADD_INPUT_ENDPOINT_CLICK, this.onAddInputEndpointClick);\n\t\t\tthis.eventsAttached = false;\n\t\t},\n\t\tunbindEndpointEventListeners(bind = true) {\n\t\t\tif (this.instance) {\n\t\t\t\t// Get all the endpoints and unbind the events\n\t\t\t\tconst elements = this.instance.getManagedElements();\n\t\t\t\tfor (const element of Object.values(elements)) {\n\t\t\t\t\tconst endpoints = element.endpoints;\n\t\t\t\t\tfor (const endpoint of endpoints || []) {\n\t\t\t\t\t\tconst endpointInstance = endpoint?.endpoint;\n\t\t\t\t\t\tif (endpointInstance && endpointInstance.type === N8nPlusEndpointType) {\n\t\t\t\t\t\t\t(endpointInstance as N8nPlusEndpoint).unbindEvents();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.eventsAttached = false;\n\t\t},\n\t\tonBeforeUnload(e: BeforeUnloadEvent) {\n\t\t\tif (this.isDemo || window.preventNodeViewBeforeUnload) {\n\t\t\t\treturn;\n\t\t\t} else if (this.uiStore.stateIsDirty) {\n\t\t\t\t// A bit hacky solution to detecting users leaving the page after prompt:\n\t\t\t\t// 1. Notify that workflow is closed straight away\n\t\t\t\tthis.collaborationStore.notifyWorkflowClosed(this.workflowsStore.workflowId);\n\t\t\t\t// 2. If user decided to stay on the page we notify that the workflow is opened again\n\t\t\t\tthis.unloadTimeout = setTimeout(() => {\n\t\t\t\t\tthis.collaborationStore.notifyWorkflowOpened(this.workflowsStore.workflowId);\n\t\t\t\t}, 5 * TIME.SECOND);\n\t\t\t\te.returnValue = true; //Gecko + IE\n\t\t\t\treturn true; //Gecko + Webkit, Safari, Chrome etc.\n\t\t\t} else {\n\t\t\t\tthis.canvasStore.startLoading(this.$locale.baseText('nodeView.redirecting'));\n\t\t\t\tthis.collaborationStore.notifyWorkflowClosed(this.workflowsStore.workflowId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\t\tonUnload() {\n\t\t\t// This will fire if users decides to leave the page after prompted\n\t\t\t// Clear the interval to prevent the notification from being sent\n\t\t\tclearTimeout(this.unloadTimeout);\n\t\t},\n\t\tmakeNewWorkflowShareable() {\n\t\t\tconst { currentProject, personalProject } = this.projectsStore;\n\t\t\tconst homeProject = currentProject ?? personalProject ?? {};\n\t\t\tconst scopes = currentProject?.scopes ?? personalProject?.scopes ?? [];\n\n\t\t\tthis.workflowsStore.workflow.homeProject = homeProject as ProjectSharingData;\n\t\t\tthis.workflowsStore.workflow.scopes = scopes;\n\t\t},\n\t\tasync newWorkflow(): Promise<void> {\n\t\t\tthis.canvasStore.startLoading();\n\t\t\tthis.resetWorkspace();\n\t\t\tthis.workflowData = await this.workflowsStore.getNewWorkflowData(\n\t\t\t\tundefined,\n\t\t\t\tthis.projectsStore.currentProjectId,\n\t\t\t);\n\t\t\tthis.workflowsStore.currentWorkflowExecutions = [];\n\t\t\tthis.executionsStore.activeExecution = null;\n\n\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\tthis.canvasStore.setZoomLevel(1, [0, 0]);\n\t\t\tawait this.tryToAddWelcomeSticky();\n\t\t\tthis.uiStore.nodeViewInitialized = true;\n\t\t\tthis.historyStore.reset();\n\t\t\tthis.executionsStore.activeExecution = null;\n\t\t\tthis.makeNewWorkflowShareable();\n\t\t\tthis.canvasStore.stopLoading();\n\t\t},\n\t\tasync tryToAddWelcomeSticky(): Promise<void> {\n\t\t\tthis.canvasStore.zoomToFit();\n\t\t},\n\t\tasync initView(): Promise<void> {\n\t\t\tif (this.$route.params.action === 'workflowSave') {\n\t\t\t\t// In case the workflow got saved we do not have to run init\n\t\t\t\t// as only the route changed but all the needed data is already loaded\n\t\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.blankRedirect) {\n\t\t\t\tthis.blankRedirect = false;\n\t\t\t} else if (this.$route.name === VIEWS.TEMPLATE_IMPORT) {\n\t\t\t\tconst templateId = this.$route.params.id;\n\t\t\t\tawait this.openWorkflowTemplate(templateId);\n\t\t\t} else {\n\t\t\t\tif (this.uiStore.stateIsDirty && !this.readOnlyEnv) {\n\t\t\t\t\tconst confirmModal = await this.confirm(\n\t\t\t\t\t\tthis.$locale.baseText('generic.unsavedWork.confirmMessage.message'),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttitle: this.$locale.baseText('generic.unsavedWork.confirmMessage.headline'),\n\t\t\t\t\t\t\ttype: 'warning',\n\t\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t\t'generic.unsavedWork.confirmMessage.confirmButtonText',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tcancelButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t\t'generic.unsavedWork.confirmMessage.cancelButtonText',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tshowClose: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tif (confirmModal === MODAL_CONFIRM) {\n\t\t\t\t\t\tconst saved = await this.workflowHelpers.saveCurrentWorkflow();\n\t\t\t\t\t\tif (saved) await this.settingsStore.fetchPromptsData();\n\t\t\t\t\t} else if (confirmModal === MODAL_CLOSE) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tawait this.loadCredentials();\n\t\t\t\t// Load a workflow\n\t\t\t\tlet workflowId = null as string | null;\n\t\t\t\tif (this.$route.params.name) {\n\t\t\t\t\tworkflowId = this.$route.params.name;\n\t\t\t\t}\n\t\t\t\tif (workflowId !== null) {\n\t\t\t\t\tlet workflow: IWorkflowDb | undefined = undefined;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tworkflow = await this.workflowsStore.fetchWorkflow(workflowId);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthis.showError(error, this.$locale.baseText('openWorkflow.workflowNotFoundError'));\n\n\t\t\t\t\t\tvoid this.$router.push({\n\t\t\t\t\t\t\tname: VIEWS.NEW_WORKFLOW,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (workflow) {\n\t\t\t\t\t\tthis.titleSet(workflow.name, 'IDLE');\n\t\t\t\t\t\tawait this.openWorkflow(workflow);\n\t\t\t\t\t\tawait this.checkAndInitDebugMode();\n\n\t\t\t\t\t\tawait this.projectsStore.setProjectNavActiveIdByWorkflowHomeProject(\n\t\t\t\t\t\t\tworkflow.homeProject,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (workflow.meta?.onboardingId) {\n\t\t\t\t\t\t\tthis.$telemetry.track(\n\t\t\t\t\t\t\t\t`User opened workflow from onboarding template with ID ${workflow.meta.onboardingId}`,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tworkflow_id: workflow.id,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\twithPostHog: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (this.$route.meta?.nodeView === true) {\n\t\t\t\t\t// Create new workflow\n\t\t\t\t\tawait this.newWorkflow();\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.historyStore.reset();\n\t\t\tthis.uiStore.nodeViewInitialized = true;\n\t\t\tdocument.addEventListener('keydown', this.keyDown);\n\t\t\tdocument.addEventListener('keyup', this.keyUp);\n\n\t\t\twindow.addEventListener('beforeunload', this.onBeforeUnload);\n\t\t\twindow.addEventListener('unload', this.onUnload);\n\t\t\t// Once view is initialized, pick up all toast notifications\n\t\t\t// waiting in the store and display them\n\t\t\tthis.showNotificationForViews([VIEWS.WORKFLOW, VIEWS.NEW_WORKFLOW]);\n\t\t},\n\t\tgetOutputEndpointUUID(\n\t\t\tnodeName: string,\n\t\t\tconnectionType: ConnectionTypes,\n\t\t\tindex: number,\n\t\t): string | null {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (!node) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn NodeViewUtils.getOutputEndpointUUID(node.id, connectionType, index);\n\t\t},\n\t\tgetInputEndpointUUID(nodeName: string, connectionType: ConnectionTypes, index: number) {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (!node) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn NodeViewUtils.getInputEndpointUUID(node.id, connectionType, index);\n\t\t},\n\t\t__addConnection(connection: [IConnection, IConnection]) {\n\t\t\tconst outputUuid = this.getOutputEndpointUUID(\n\t\t\t\tconnection[0].node,\n\t\t\t\tconnection[0].type as ConnectionTypes,\n\t\t\t\tconnection[0].index,\n\t\t\t);\n\t\t\tconst inputUuid = this.getInputEndpointUUID(\n\t\t\t\tconnection[1].node,\n\t\t\t\tconnection[1].type as ConnectionTypes,\n\t\t\t\tconnection[1].index,\n\t\t\t);\n\t\t\tif (!outputUuid || !inputUuid) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst uuid: [string, string] = [outputUuid, inputUuid];\n\t\t\t// Create connections in DOM\n\t\t\tthis.instance?.connect({\n\t\t\t\tuuids: uuid,\n\t\t\t\tdetachable: !this.isReadOnlyRoute && !this.readOnlyEnv,\n\t\t\t});\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.addPinDataConnections(this.workflowsStore.pinnedWorkflowData || ({} as IPinData));\n\t\t\t});\n\t\t},\n\t\t__removeConnection(connection: [IConnection, IConnection], removeVisualConnection = false) {\n\t\t\tif (removeVisualConnection) {\n\t\t\t\tconst sourceNode = this.workflowsStore.getNodeByName(connection[0].node);\n\t\t\t\tconst targetNode = this.workflowsStore.getNodeByName(connection[1].node);\n\n\t\t\t\tif (!sourceNode || !targetNode) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst sourceNodeType = this.nodeTypesStore.getNodeType(\n\t\t\t\t\tsourceNode.type,\n\t\t\t\t\tsourceNode.typeVersion,\n\t\t\t\t);\n\t\t\t\tconst sourceNodeOutput =\n\t\t\t\t\tsourceNodeType?.outputs?.[connection[0].index] || NodeConnectionType.Main;\n\t\t\t\tconst sourceNodeOutputName =\n\t\t\t\t\ttypeof sourceNodeOutput === 'string' ? sourceNodeOutput : sourceNodeOutput.name;\n\t\t\t\tconst scope = NodeViewUtils.getEndpointScope(sourceNodeOutputName);\n\n\t\t\t\tconst connections = this.instance?.getConnections({\n\t\t\t\t\tscope,\n\t\t\t\t\tsource: sourceNode.id,\n\t\t\t\t\ttarget: targetNode.id,\n\t\t\t\t});\n\n\t\t\t\tconnections.forEach((connectionInstance: Connection) => {\n\t\t\t\t\tif (connectionInstance.__meta) {\n\t\t\t\t\t\t// Only delete connections from specific indexes (if it can be determined by meta)\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tconnectionInstance.__meta.sourceOutputIndex === connection[0].index &&\n\t\t\t\t\t\t\tconnectionInstance.__meta.targetOutputIndex === connection[1].index\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthis.__deleteJSPlumbConnection(connectionInstance);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.__deleteJSPlumbConnection(connectionInstance);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.workflowsStore.removeConnection({ connection });\n\t\t},\n\t\t__deleteJSPlumbConnection(connection: Connection, trackHistory = false) {\n\t\t\t// Make sure to remove the overlay else after the second move\n\t\t\t// it visibly stays behind free floating without a connection.\n\t\t\tconnection.removeOverlays();\n\n\t\t\tthis.pullConnActiveNodeName = null; // prevent new connections when connectionDetached is triggered\n\t\t\tthis.instance?.deleteConnection(connection); // on delete, triggers connectionDetached event which applies mutation to store\n\t\t\tif (trackHistory && connection.__meta) {\n\t\t\t\tconst connectionData: [IConnection, IConnection] = [\n\t\t\t\t\t{\n\t\t\t\t\t\tindex: connection.__meta?.sourceOutputIndex,\n\t\t\t\t\t\tnode: connection.__meta.sourceNodeName,\n\t\t\t\t\t\ttype: NodeConnectionType.Main,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tindex: connection.__meta?.targetOutputIndex,\n\t\t\t\t\t\tnode: connection.__meta.targetNodeName,\n\t\t\t\t\t\ttype: NodeConnectionType.Main,\n\t\t\t\t\t},\n\t\t\t\t];\n\t\t\t\tconst removeCommand = new RemoveConnectionCommand(connectionData, this);\n\t\t\t\tthis.historyStore.pushCommandToUndo(removeCommand);\n\t\t\t}\n\t\t},\n\t\t__removeConnectionByConnectionInfo(info, removeVisualConnection = false, trackHistory = false) {\n\t\t\tconst connectionInfo: [IConnection, IConnection] | null = getConnectionInfo(info);\n\n\t\t\tif (connectionInfo) {\n\t\t\t\tif (removeVisualConnection) {\n\t\t\t\t\tthis.__deleteJSPlumbConnection(info.connection, trackHistory);\n\t\t\t\t} else if (trackHistory) {\n\t\t\t\t\tthis.historyStore.pushCommandToUndo(new RemoveConnectionCommand(connectionInfo));\n\t\t\t\t}\n\t\t\t\tthis.workflowsStore.removeConnection({ connection: connectionInfo });\n\t\t\t}\n\t\t},\n\t\tasync duplicateNodes(nodes: INode[]): Promise<void> {\n\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst workflowData = deepCopy(await this.getNodesToSave(nodes));\n\t\t\tawait this.importWorkflowData(workflowData, 'duplicate', false);\n\t\t},\n\t\tgetIncomingOutgoingConnections(nodeName: string): {\n\t\t\tincoming: Connection[];\n\t\t\toutgoing: Connection[];\n\t\t} {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\n\t\t\tif (node) {\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst outgoing = this.instance?.getConnections({\n\t\t\t\t\tsource: node.id,\n\t\t\t\t});\n\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst incoming = this.instance?.getConnections({\n\t\t\t\t\ttarget: node.id,\n\t\t\t\t}) as Connection[];\n\n\t\t\t\treturn {\n\t\t\t\t\tincoming,\n\t\t\t\t\toutgoing,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn { incoming: [], outgoing: [] };\n\t\t},\n\t\tonNodeMoved(node: INodeUi) {\n\t\t\tconst { incoming, outgoing } = this.getIncomingOutgoingConnections(node.name);\n\n\t\t\t[...incoming, ...outgoing].forEach((connection: Connection) => {\n\t\t\t\tNodeViewUtils.showOrHideMidpointArrow(connection);\n\t\t\t\tNodeViewUtils.showOrHideItemsLabel(connection);\n\t\t\t});\n\t\t},\n\t\tonNodeRun({\n\t\t\tname,\n\t\t\tdata,\n\t\t\twaiting,\n\t\t}: {\n\t\t\tname: string;\n\t\t\tdata: ITaskData[] | null;\n\t\t\twaiting: boolean;\n\t\t}) {\n\t\t\tconst pinData = this.workflowsStore.pinnedWorkflowData;\n\n\t\t\tif (pinData?.[name]) {\n\t\t\t\tconst { outgoing } = this.getIncomingOutgoingConnections(name);\n\n\t\t\t\toutgoing.forEach((connection: Connection) => {\n\t\t\t\t\tif (connection.__meta?.sourceNodeName === name) {\n\t\t\t\t\t\tconst hasRun = this.workflowsStore.getWorkflowResultDataByNodeName(name) !== null;\n\t\t\t\t\t\tNodeViewUtils.addClassesToOverlays({\n\t\t\t\t\t\t\tconnection,\n\t\t\t\t\t\t\toverlayIds: [NodeViewUtils.OVERLAY_RUN_ITEMS_ID],\n\t\t\t\t\t\t\tclassNames: hasRun ? ['has-run'] : [],\n\t\t\t\t\t\t\tincludeConnector: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst sourceNodeName = name;\n\t\t\tconst sourceNode = this.workflowsStore.getNodeByName(sourceNodeName);\n\t\t\tconst sourceId = sourceNode !== null ? sourceNode.id : '';\n\n\t\t\tif (data === null || data.length === 0 || waiting) {\n\t\t\t\tconst outgoing = this.instance?.getConnections({\n\t\t\t\t\tsource: sourceId,\n\t\t\t\t}) as Connection[];\n\n\t\t\t\toutgoing.forEach((connection: Connection) => {\n\t\t\t\t\tNodeViewUtils.resetConnection(connection);\n\t\t\t\t});\n\t\t\t\tconst endpoints = NodeViewUtils.getJSPlumbEndpoints(sourceNode, this.instance);\n\t\t\t\tendpoints.forEach((endpoint: Endpoint) => {\n\t\t\t\t\tif (endpoint.endpoint.type === 'N8nPlus') {\n\t\t\t\t\t\t(endpoint.endpoint as N8nPlusEndpoint).clearSuccessOutput();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.nodeHelpers.setSuccessOutput(data, sourceNode);\n\t\t},\n\t\tremoveNode(nodeName: string, trackHistory = false, trackBulk = true) {\n\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (!node) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (trackHistory && trackBulk) {\n\t\t\t\tthis.historyStore.startRecordingUndo();\n\t\t\t}\n\n\t\t\t// \"requiredNodeTypes\" are also defined in cli/commands/run.ts\n\t\t\tconst requiredNodeTypes: string[] = [];\n\n\t\t\tif (requiredNodeTypes.includes(node.type)) {\n\t\t\t\t// The node is of the required type so check first\n\t\t\t\t// if any node of that type would be left when the\n\t\t\t\t// current one would get deleted.\n\t\t\t\tlet deleteAllowed = false;\n\t\t\t\tfor (const checkNode of this.nodes) {\n\t\t\t\t\tif (checkNode.name === node.name) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (requiredNodeTypes.includes(checkNode.type)) {\n\t\t\t\t\t\tdeleteAllowed = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!deleteAllowed) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (node.type === STICKY_NODE_TYPE) {\n\t\t\t\tthis.$telemetry.track('User deleted workflow note', {\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tis_welcome_note: node.name === QUICKSTART_NOTE_NAME,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tvoid this.externalHooks.run('node.deleteNode', { node });\n\t\t\t\tthis.$telemetry.track('User deleted node', {\n\t\t\t\t\tnode_type: node.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet waitForNewConnection = false;\n\t\t\t// connect nodes before/after deleted node\n\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\n\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\t\t\tconst workflowNode = workflow.getNode(node.name);\n\t\t\tlet inputs: Array<ConnectionTypes | INodeInputConfiguration> = [];\n\t\t\tlet outputs: Array<ConnectionTypes | INodeOutputConfiguration> = [];\n\t\t\tif (nodeType) {\n\t\t\t\tinputs = NodeHelpers.getNodeInputs(workflow, workflowNode, nodeType);\n\t\t\t\toutputs = NodeHelpers.getNodeOutputs(workflow, workflowNode, nodeType);\n\t\t\t}\n\n\t\t\tif (outputs.length === 1 && inputs.length === 1) {\n\t\t\t\tconst { incoming, outgoing } = this.getIncomingOutgoingConnections(node.name);\n\t\t\t\tif (incoming.length === 1 && outgoing.length === 1) {\n\t\t\t\t\tconst conn1 = incoming[0];\n\t\t\t\t\tconst conn2 = outgoing[0];\n\t\t\t\t\tif (conn1.__meta && conn2.__meta) {\n\t\t\t\t\t\twaitForNewConnection = true;\n\t\t\t\t\t\tconst sourceNodeName = conn1.__meta.sourceNodeName;\n\t\t\t\t\t\tconst sourceNodeOutputIndex = conn1.__meta.sourceOutputIndex;\n\t\t\t\t\t\tconst targetNodeName = conn2.__meta.targetNodeName;\n\t\t\t\t\t\tconst targetNodeOuputIndex = conn2.__meta.targetOutputIndex;\n\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\t\t\tsourceNodeOutputIndex,\n\t\t\t\t\t\t\t\ttargetNodeName,\n\t\t\t\t\t\t\t\ttargetNodeOuputIndex,\n\t\t\t\t\t\t\t\tNodeConnectionType.Main,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (waitForNewConnection) {\n\t\t\t\t\t\t\t\tthis.instance?.setSuspendDrawing(false, true);\n\t\t\t\t\t\t\t\twaitForNewConnection = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, 100); // just to make it clear to users that this is a new connection\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvoid nextTick(() => {\n\t\t\t\t// Suspend drawing\n\t\t\t\tthis.instance?.setSuspendDrawing(true);\n\t\t\t\t(this.instance?.endpointsByElement[node.id] || [])\n\t\t\t\t\t.flat()\n\t\t\t\t\t.forEach((endpoint) => this.instance?.deleteEndpoint(endpoint));\n\n\t\t\t\t// Remove the connections in data\n\t\t\t\tthis.workflowsStore.removeAllNodeConnection(node);\n\t\t\t\tthis.workflowsStore.removeNode(node);\n\t\t\t\tthis.workflowsStore.clearNodeExecutionData(node.name);\n\n\t\t\t\tif (!waitForNewConnection) {\n\t\t\t\t\t// Now it can draw again\n\t\t\t\t\tthis.instance?.setSuspendDrawing(false, true);\n\t\t\t\t}\n\n\t\t\t\t// Remove node from selected index if found in it\n\t\t\t\tthis.uiStore.removeNodeFromSelection(node);\n\t\t\t\tif (trackHistory) {\n\t\t\t\t\tthis.historyStore.pushCommandToUndo(new RemoveNodeCommand(node));\n\t\t\t\t}\n\t\t\t}); // allow other events to finish like drag stop\n\n\t\t\tif (trackHistory && trackBulk) {\n\t\t\t\tconst recordingTimeout = waitForNewConnection ? 100 : 0;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t\t\t}, recordingTimeout);\n\t\t\t}\n\t\t},\n\t\tasync onSwitchSelectedNode(nodeName: string) {\n\t\t\tthis.nodeSelectedByName(nodeName, true, true);\n\t\t},\n\t\tasync onOpenConnectionNodeCreator(node: string, connectionType: ConnectionTypes) {\n\t\t\tawait this.openSelectiveNodeCreator({\n\t\t\t\tconnectiontype: connectionType,\n\t\t\t\tnode,\n\t\t\t});\n\t\t},\n\t\tasync redrawNode(nodeName: string) {\n\t\t\t// TODO: Improve later\n\t\t\t// For now we redraw the node by simply renaming it. Can for sure be\n\t\t\t// done better later but should be fine for now.\n\t\t\tconst tempName = 'x____XXXX____x';\n\t\t\tawait this.renameNode(nodeName, tempName);\n\t\t\tawait this.renameNode(tempName, nodeName);\n\t\t},\n\t\tvalueChanged(parameterData: IUpdateInformation) {\n\t\t\tif (parameterData.name === 'name' && parameterData.oldValue) {\n\t\t\t\t// The name changed so we have to take care that\n\t\t\t\t// the connections get changed.\n\t\t\t\tvoid this.renameNode(parameterData.oldValue as string, parameterData.value as string);\n\t\t\t}\n\t\t},\n\t\tasync renameNodePrompt(currentName: string) {\n\t\t\ttry {\n\t\t\t\tconst promptResponsePromise = this.prompt(\n\t\t\t\t\tthis.$locale.baseText('nodeView.prompt.newName') + ':',\n\t\t\t\t\tthis.$locale.baseText('nodeView.prompt.renameNode') + `: ${currentName}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tcustomClass: 'rename-prompt',\n\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText('nodeView.prompt.rename'),\n\t\t\t\t\t\tcancelButtonText: this.$locale.baseText('nodeView.prompt.cancel'),\n\t\t\t\t\t\tinputErrorMessage: this.$locale.baseText('nodeView.prompt.invalidName'),\n\t\t\t\t\t\tinputValue: currentName,\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\t// Wait till it had time to display\n\t\t\t\tawait this.$nextTick();\n\n\t\t\t\t// Get the input and select the text in it\n\t\t\t\tconst nameInput = document.querySelector('.rename-prompt .el-input__inner') as\n\t\t\t\t\t| HTMLInputElement\n\t\t\t\t\t| undefined;\n\t\t\t\tif (nameInput) {\n\t\t\t\t\tnameInput.focus();\n\t\t\t\t\tnameInput.select();\n\t\t\t\t}\n\n\t\t\t\tconst promptResponse = (await promptResponsePromise) as MessageBoxInputData;\n\n\t\t\t\tif (promptResponse?.action !== MODAL_CONFIRM) return;\n\n\t\t\t\tawait this.renameNode(currentName, promptResponse.value, true);\n\t\t\t} catch (e) {}\n\t\t},\n\t\tasync renameNode(currentName: string, newName: string, trackHistory = false) {\n\t\t\tif (currentName === newName) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.suspendRecordingDetachedConnections = true;\n\t\t\tif (trackHistory) {\n\t\t\t\tthis.historyStore.startRecordingUndo();\n\t\t\t}\n\n\t\t\tconst activeNodeName = this.activeNode?.name;\n\t\t\tconst isActive = activeNodeName === currentName;\n\t\t\tif (isActive) {\n\t\t\t\tthis.renamingActive = true;\n\t\t\t}\n\n\t\t\tnewName = this.uniqueNodeName(newName);\n\n\t\t\t// Rename the node and update the connections\n\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow(true);\n\t\t\tworkflow.renameNode(currentName, newName);\n\n\t\t\tif (trackHistory) {\n\t\t\t\tthis.historyStore.pushCommandToUndo(new RenameNodeCommand(currentName, newName));\n\t\t\t}\n\n\t\t\t// Update also last selected node and execution data\n\t\t\tthis.workflowsStore.renameNodeSelectedAndExecution({ old: currentName, new: newName });\n\n\t\t\t// Reset all nodes and connections to load the new ones\n\t\t\tthis.deleteEveryEndpoint();\n\n\t\t\tthis.workflowsStore.removeAllConnections({ setStateDirty: false });\n\t\t\tthis.workflowsStore.removeAllNodes({ removePinData: false, setStateDirty: true });\n\n\t\t\t// Wait a tick that the old nodes had time to get removed\n\t\t\tawait this.$nextTick();\n\n\t\t\t// Add the new updated nodes\n\t\t\tawait this.addNodes(Object.values(workflow.nodes), workflow.connectionsBySourceNode, false);\n\n\t\t\t// Make sure that the node is selected again\n\t\t\tthis.deselectAllNodes();\n\t\t\tthis.nodeSelectedByName(newName);\n\n\t\t\tif (isActive) {\n\t\t\t\tthis.ndvStore.activeNodeName = newName;\n\t\t\t\tthis.renamingActive = false;\n\t\t\t}\n\n\t\t\tif (trackHistory) {\n\t\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t\t}\n\t\t\tthis.suspendRecordingDetachedConnections = false;\n\t\t},\n\t\tdeleteEveryEndpoint() {\n\t\t\t// Check as it does not exist on first load\n\t\t\tif (this.instance) {\n\t\t\t\tthis.instance?.reset();\n\t\t\t\tObject.values(this.instance?.endpointsByElement)\n\t\t\t\t\t.flatMap((endpoint) => endpoint)\n\t\t\t\t\t.forEach((endpoint) => endpoint.destroy());\n\n\t\t\t\tthis.instance.deleteEveryConnection({ fireEvent: true });\n\t\t\t}\n\t\t},\n\t\tmatchCredentials(node: INodeUi) {\n\t\t\tif (!node.credentials) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tObject.entries(node.credentials).forEach(\n\t\t\t\t([nodeCredentialType, nodeCredentials]: [string, INodeCredentialsDetails]) => {\n\t\t\t\t\tconst credentialOptions = this.credentialsStore.getCredentialsByType(nodeCredentialType);\n\n\t\t\t\t\t// Check if workflows applies old credentials style\n\t\t\t\t\tif (typeof nodeCredentials === 'string') {\n\t\t\t\t\t\tnodeCredentials = {\n\t\t\t\t\t\t\tid: null,\n\t\t\t\t\t\t\tname: nodeCredentials,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tthis.credentialsUpdated = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (nodeCredentials.id) {\n\t\t\t\t\t\t// Check whether the id is matching with a credential\n\t\t\t\t\t\tconst credentialsId = nodeCredentials.id.toString(); // due to a fixed bug in the migration UpdateWorkflowCredentials (just sqlite) we have to cast to string and check later if it has been a number\n\t\t\t\t\t\tconst credentialsForId = credentialOptions.find(\n\t\t\t\t\t\t\t(optionData: ICredentialsResponse) => optionData.id === credentialsId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (credentialsForId) {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tcredentialsForId.name !== nodeCredentials.name ||\n\t\t\t\t\t\t\t\ttypeof nodeCredentials.id === 'number'\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tnode.credentials![nodeCredentialType] = {\n\t\t\t\t\t\t\t\t\tid: credentialsForId.id,\n\t\t\t\t\t\t\t\t\tname: credentialsForId.name,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tthis.credentialsUpdated = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// No match for id found or old credentials type used\n\t\t\t\t\tnode.credentials![nodeCredentialType] = nodeCredentials;\n\n\t\t\t\t\t// check if only one option with the name would exist\n\t\t\t\t\tconst credentialsForName = credentialOptions.filter(\n\t\t\t\t\t\t(optionData: ICredentialsResponse) => optionData.name === nodeCredentials.name,\n\t\t\t\t\t);\n\n\t\t\t\t\t// only one option exists for the name, take it\n\t\t\t\t\tif (credentialsForName.length === 1) {\n\t\t\t\t\t\tnode.credentials![nodeCredentialType].id = credentialsForName[0].id;\n\t\t\t\t\t\tthis.credentialsUpdated = true;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t\tasync addNodes(nodes: INodeUi[], connections?: IConnections, trackHistory = false) {\n\t\t\tif (!nodes?.length) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.isInsertingNodes = true;\n\t\t\t// Before proceeding we must check if all nodes contain the `properties` attribute.\n\t\t\t// Nodes are loaded without this information so we must make sure that all nodes\n\t\t\t// being added have this information.\n\t\t\tawait this.loadNodesProperties(\n\t\t\t\tnodes.map((node) => ({ name: node.type, version: node.typeVersion })),\n\t\t\t);\n\n\t\t\t// Add the node to the node-list\n\t\t\tlet nodeType: INodeTypeDescription | null;\n\t\t\tnodes.forEach((node) => {\n\t\t\t\tif (!node.id) {\n\t\t\t\t\tnode.id = uuid();\n\t\t\t\t}\n\n\t\t\t\tnodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\n\t\t\t\t// Make sure that some properties always exist\n\t\t\t\tif (!node.hasOwnProperty('disabled')) {\n\t\t\t\t\tnode.disabled = false;\n\t\t\t\t}\n\n\t\t\t\tif (!node.hasOwnProperty('parameters')) {\n\t\t\t\t\tnode.parameters = {};\n\t\t\t\t}\n\n\t\t\t\t// Load the defaul parameter values because only values which differ\n\t\t\t\t// from the defaults get saved\n\t\t\t\tif (nodeType !== null) {\n\t\t\t\t\tlet nodeParameters = null;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tnodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\t\t\tnodeType.properties,\n\t\t\t\t\t\t\tnode.parameters,\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\tnode,\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\tthis.$locale.baseText('nodeView.thereWasAProblemLoadingTheNodeParametersOfNode') +\n\t\t\t\t\t\t\t\t`: \"${node.name}\"`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconsole.error(e);\n\t\t\t\t\t}\n\t\t\t\t\tnode.parameters = nodeParameters !== null ? nodeParameters : {};\n\n\t\t\t\t\t// if it's a webhook and the path is empty set the UUID as the default path\n\t\t\t\t\tif (\n\t\t\t\t\t\t[WEBHOOK_NODE_TYPE, FORM_TRIGGER_NODE_TYPE].includes(node.type) &&\n\t\t\t\t\t\tnode.parameters.path === ''\n\t\t\t\t\t) {\n\t\t\t\t\t\tnode.parameters.path = node.webhookId as string;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// check and match credentials, apply new format if old is used\n\t\t\t\tthis.matchCredentials(node);\n\t\t\t\tthis.workflowsStore.addNode(node);\n\t\t\t\tif (trackHistory) {\n\t\t\t\t\tthis.historyStore.pushCommandToUndo(new AddNodeCommand(node));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Wait for the nodes to be rendered\n\t\t\tawait this.$nextTick();\n\n\t\t\tthis.instance?.setSuspendDrawing(true);\n\n\t\t\tif (connections) {\n\t\t\t\tawait this.addConnections(connections);\n\t\t\t}\n\t\t\t// Add the node issues at the end as the node-connections are required\n\t\t\tthis.nodeHelpers.refreshNodeIssues();\n\t\t\tthis.nodeHelpers.updateNodesInputIssues();\n\t\t\tthis.resetEndpointsErrors();\n\t\t\tthis.isInsertingNodes = false;\n\n\t\t\t// Now it can draw again\n\t\t\tthis.instance?.setSuspendDrawing(false, true);\n\t\t},\n\t\tasync addConnections(connections: IConnections) {\n\t\t\tconst batchedConnectionData: Array<[IConnection, IConnection]> = [];\n\n\t\t\tfor (const sourceNode in connections) {\n\t\t\t\tfor (const type in connections[sourceNode]) {\n\t\t\t\t\tconnections[sourceNode][type].forEach((outwardConnections, sourceIndex) => {\n\t\t\t\t\t\tif (outwardConnections) {\n\t\t\t\t\t\t\toutwardConnections.forEach((targetData) => {\n\t\t\t\t\t\t\t\tbatchedConnectionData.push([\n\t\t\t\t\t\t\t\t\t{ node: sourceNode, type, index: sourceIndex },\n\t\t\t\t\t\t\t\t\t{ node: targetData.node, type: targetData.type, index: targetData.index },\n\t\t\t\t\t\t\t\t]);\n\t\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}\n\n\t\t\t// Process the connections in batches\n\t\t\tawait this.processConnectionBatch(batchedConnectionData);\n\t\t\tsetTimeout(this.addConectionsTestData, 0);\n\t\t},\n\n\t\tasync processConnectionBatch(batchedConnectionData: Array<[IConnection, IConnection]>) {\n\t\t\tconst batchSize = 100;\n\n\t\t\tfor (let i = 0; i < batchedConnectionData.length; i += batchSize) {\n\t\t\t\tconst batch = batchedConnectionData.slice(i, i + batchSize);\n\n\t\t\t\tbatch.forEach((connectionData) => {\n\t\t\t\t\tthis.__addConnection(connectionData);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\tasync addNodesToWorkflow(data: IWorkflowDataUpdate): Promise<IWorkflowDataUpdate> {\n\t\t\t// Because nodes with the same name maybe already exist, it could\n\t\t\t// be needed that they have to be renamed. Also could it be possible\n\t\t\t// that nodes are not allowd to be created because they have a create\n\t\t\t// limit set. So we would then link the new nodes with the already existing ones.\n\t\t\t// In this object all that nodes get saved in the format:\n\t\t\t// old-name -> new-name\n\t\t\tconst nodeNameTable: {\n\t\t\t\t[key: string]: string;\n\t\t\t} = {};\n\t\t\tconst newNodeNames: string[] = [];\n\n\t\t\tif (!data.nodes) {\n\t\t\t\t// No nodes to add\n\t\t\t\tthrow new Error(this.$locale.baseText('nodeView.noNodesGivenToAdd'));\n\t\t\t}\n\n\t\t\t// Get how many of the nodes of the types which have\n\t\t\t// a max limit set already exist\n\t\t\tconst nodeTypesCount = this.workflowHelpers.getNodeTypesMaxCount();\n\n\t\t\tlet oldName: string;\n\t\t\tlet newName: string;\n\t\t\tconst createNodes: INode[] = [];\n\n\t\t\tawait this.loadNodesProperties(\n\t\t\t\tdata.nodes.map((node) => ({ name: node.type, version: node.typeVersion })),\n\t\t\t);\n\n\t\t\tdata.nodes.forEach((node) => {\n\t\t\t\tif (nodeTypesCount[node.type] !== undefined) {\n\t\t\t\t\tif (nodeTypesCount[node.type].exist >= nodeTypesCount[node.type].max) {\n\t\t\t\t\t\t// Node is not allowed to be created so\n\t\t\t\t\t\t// do not add it to the create list but\n\t\t\t\t\t\t// add the name of the existing node\n\t\t\t\t\t\t// that this one gets linked up instead.\n\t\t\t\t\t\tnodeNameTable[node.name] = nodeTypesCount[node.type].nodeNames[0];\n\t\t\t\t\t\treturn;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Node can be created but increment the\n\t\t\t\t\t\t// counter in case multiple ones are\n\t\t\t\t\t\t// supposed to be created\n\t\t\t\t\t\tnodeTypesCount[node.type].exist += 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\toldName = node.name;\n\n\t\t\t\tconst localized = this.locale.localizeNodeName(node.name, node.type);\n\n\t\t\t\tnewName = this.uniqueNodeName(localized, newNodeNames);\n\n\t\t\t\tnewNodeNames.push(newName);\n\t\t\t\tnodeNameTable[oldName] = newName;\n\n\t\t\t\tcreateNodes.push(node);\n\t\t\t});\n\n\t\t\t// Get only the connections of the nodes that get created\n\t\t\tconst newConnections: IConnections = {};\n\t\t\tconst currentConnections = data.connections!;\n\t\t\tconst createNodeNames = createNodes.map((node) => node.name);\n\t\t\tlet sourceNode, type, sourceIndex, connectionIndex, connectionData;\n\t\t\tfor (sourceNode of Object.keys(currentConnections)) {\n\t\t\t\tif (!createNodeNames.includes(sourceNode)) {\n\t\t\t\t\t// Node does not get created so skip output connections\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst connection: INodeConnections = {};\n\n\t\t\t\tfor (type of Object.keys(currentConnections[sourceNode])) {\n\t\t\t\t\tconnection[type] = [];\n\t\t\t\t\tfor (\n\t\t\t\t\t\tsourceIndex = 0;\n\t\t\t\t\t\tsourceIndex < currentConnections[sourceNode][type].length;\n\t\t\t\t\t\tsourceIndex++\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst nodeSourceConnections = [];\n\t\t\t\t\t\tif (currentConnections[sourceNode][type][sourceIndex]) {\n\t\t\t\t\t\t\tfor (\n\t\t\t\t\t\t\t\tconnectionIndex = 0;\n\t\t\t\t\t\t\t\tconnectionIndex < currentConnections[sourceNode][type][sourceIndex].length;\n\t\t\t\t\t\t\t\tconnectionIndex++\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tconnectionData = currentConnections[sourceNode][type][sourceIndex][connectionIndex];\n\t\t\t\t\t\t\t\tif (!createNodeNames.includes(connectionData.node)) {\n\t\t\t\t\t\t\t\t\t// Node does not get created so skip input connection\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tnodeSourceConnections.push(connectionData);\n\t\t\t\t\t\t\t\t// Add connection\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconnection[type].push(nodeSourceConnections);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tnewConnections[sourceNode] = connection;\n\t\t\t}\n\n\t\t\t// Create a workflow with the new nodes and connections that we can use\n\t\t\t// the rename method\n\t\t\tconst tempWorkflow: Workflow = this.workflowHelpers.getWorkflow(createNodes, newConnections);\n\n\t\t\t// Rename all the nodes of which the name changed\n\t\t\tfor (oldName in nodeNameTable) {\n\t\t\t\tif (oldName === nodeNameTable[oldName]) {\n\t\t\t\t\t// Name did not change so skip\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\ttempWorkflow.renameNode(oldName, nodeNameTable[oldName]);\n\t\t\t}\n\n\t\t\tif (data.pinData) {\n\t\t\t\tlet pinDataSuccess = true;\n\t\t\t\tfor (const nodeName of Object.keys(data.pinData)) {\n\t\t\t\t\t// Pin data limit reached\n\t\t\t\t\tif (!pinDataSuccess) {\n\t\t\t\t\t\tthis.showError(\n\t\t\t\t\t\t\tnew Error(this.$locale.baseText('ndv.pinData.error.tooLarge.description')),\n\t\t\t\t\t\t\tthis.$locale.baseText('ndv.pinData.error.tooLarge.title'),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst node = tempWorkflow.nodes[nodeNameTable[nodeName]];\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst pinnedDataForNode = usePinnedData(node);\n\t\t\t\t\t\tpinnedDataForNode.setData(data.pinData[nodeName], 'add-nodes');\n\t\t\t\t\t\tpinDataSuccess = true;\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tpinDataSuccess = false;\n\t\t\t\t\t\tconsole.error(error);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add the nodes with the changed node names, expressions and connections\n\t\t\tthis.historyStore.startRecordingUndo();\n\t\t\tawait this.addNodes(\n\t\t\t\tObject.values(tempWorkflow.nodes),\n\t\t\t\ttempWorkflow.connectionsBySourceNode,\n\t\t\t\ttrue,\n\t\t\t);\n\n\t\t\tthis.historyStore.stopRecordingUndo();\n\n\t\t\tthis.uiStore.stateIsDirty = true;\n\n\t\t\treturn {\n\t\t\t\tnodes: Object.values(tempWorkflow.nodes),\n\t\t\t\tconnections: tempWorkflow.connectionsBySourceNode,\n\t\t\t};\n\t\t},\n\t\tasync getNodesToSave(nodes: INode[]): Promise<IWorkflowData> {\n\t\t\tconst data: IWorkflowData = {\n\t\t\t\tnodes: [],\n\t\t\t\tconnections: {},\n\t\t\t\tpinData: {},\n\t\t\t};\n\n\t\t\t// Get data of all the selected noes\n\t\t\tlet nodeData;\n\t\t\tconst exportNodeNames: string[] = [];\n\n\t\t\tfor (const node of nodes) {\n\t\t\t\tnodeData = this.workflowHelpers.getNodeDataToSave(node);\n\t\t\t\texportNodeNames.push(node.name);\n\n\t\t\t\tdata.nodes.push(nodeData);\n\n\t\t\t\tconst pinDataForNode = this.workflowsStore.pinDataByNodeName(node.name);\n\t\t\t\tif (pinDataForNode) {\n\t\t\t\t\tdata.pinData![node.name] = pinDataForNode;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tnodeData.credentials &&\n\t\t\t\t\tthis.settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Sharing)\n\t\t\t\t) {\n\t\t\t\t\tconst usedCredentials = this.workflowsStore.usedCredentials;\n\t\t\t\t\tnodeData.credentials = Object.fromEntries(\n\t\t\t\t\t\tObject.entries(nodeData.credentials).filter(([_, credential]) => {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\tcredential.id &&\n\t\t\t\t\t\t\t\t(!usedCredentials[credential.id] ||\n\t\t\t\t\t\t\t\t\tusedCredentials[credential.id]?.currentUserHasAccess)\n\t\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}\n\n\t\t\t// Get only connections of exported nodes and ignore all other ones\n\t\t\tlet connectionToKeep,\n\t\t\t\tconnections: INodeConnections,\n\t\t\t\ttype: string,\n\t\t\t\tconnectionIndex: number,\n\t\t\t\tsourceIndex: number,\n\t\t\t\tconnectionData: IConnection,\n\t\t\t\ttypeConnections: INodeConnections;\n\n\t\t\tdata.nodes.forEach((node) => {\n\t\t\t\tconnections = this.workflowsStore.outgoingConnectionsByNodeName(node.name);\n\t\t\t\tif (Object.keys(connections).length === 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Keep only the connection to node which get also exported\n\t\t\t\ttypeConnections = {};\n\t\t\t\tfor (type of Object.keys(connections)) {\n\t\t\t\t\tfor (sourceIndex = 0; sourceIndex < connections[type].length; sourceIndex++) {\n\t\t\t\t\t\tconnectionToKeep = [];\n\t\t\t\t\t\tfor (\n\t\t\t\t\t\t\tconnectionIndex = 0;\n\t\t\t\t\t\t\tconnectionIndex < connections[type][sourceIndex].length;\n\t\t\t\t\t\t\tconnectionIndex++\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconnectionData = connections[type][sourceIndex][connectionIndex];\n\t\t\t\t\t\t\tif (exportNodeNames.indexOf(connectionData.node) !== -1) {\n\t\t\t\t\t\t\t\tconnectionToKeep.push(connectionData);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (connectionToKeep.length) {\n\t\t\t\t\t\t\tif (!typeConnections.hasOwnProperty(type)) {\n\t\t\t\t\t\t\t\ttypeConnections[type] = [];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttypeConnections[type][sourceIndex] = connectionToKeep;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (Object.keys(typeConnections).length) {\n\t\t\t\t\tdata.connections[node.name] = typeConnections;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn data;\n\t\t},\n\t\tresetWorkspace() {\n\t\t\tthis.workflowsStore.resetWorkflow();\n\n\t\t\tthis.onToggleNodeCreator({ createNodeActive: false });\n\t\t\tthis.nodeCreatorStore.setShowScrim(false);\n\t\t\tthis.canvasStore.resetZoom();\n\n\t\t\t// Reset nodes\n\t\t\tthis.unbindEndpointEventListeners();\n\t\t\tthis.deleteEveryEndpoint();\n\n\t\t\t// Make sure that if there is a waiting test-webhook that it gets removed\n\t\t\tif (this.executionWaitingForWebhook) {\n\t\t\t\ttry {\n\t\t\t\t\tvoid this.workflowsStore.removeTestWebhook(this.workflowsStore.workflowId);\n\t\t\t\t} catch (error) {}\n\t\t\t}\n\t\t\tthis.workflowsStore.resetState();\n\t\t\tthis.uiStore.removeActiveAction('workflowRunning');\n\n\t\t\tthis.uiStore.resetSelectedNodes();\n\t\t\tthis.uiStore.nodeViewOffsetPosition = [0, 0];\n\n\t\t\tthis.credentialsUpdated = false;\n\t\t},\n\t\tasync loadActiveWorkflows(): Promise<void> {\n\t\t\tawait this.workflowsStore.fetchActiveWorkflows();\n\t\t},\n\t\tasync loadNodeTypes(): Promise<void> {\n\t\t\tawait this.nodeTypesStore.getNodeTypes();\n\t\t},\n\t\tasync loadCredentialTypes(): Promise<void> {\n\t\t\tawait this.credentialsStore.fetchCredentialTypes(true);\n\t\t},\n\t\tasync loadCredentials(): Promise<void> {\n\t\t\tconst workflow = this.workflowsStore.getWorkflowById(this.currentWorkflow);\n\t\t\tconst projectId =\n\t\t\t\tworkflow?.homeProject?.type === ProjectTypes.Personal\n\t\t\t\t\t? this.projectsStore.personalProject?.id\n\t\t\t\t\t: workflow?.homeProject?.id;\n\t\t\tawait this.credentialsStore.fetchAllCredentials(projectId);\n\t\t},\n\t\tasync loadVariables(): Promise<void> {\n\t\t\tawait this.environmentsStore.fetchAllVariables();\n\t\t},\n\t\tasync loadSecrets(): Promise<void> {\n\t\t\tawait this.externalSecretsStore.fetchAllSecrets();\n\t\t},\n\t\tasync loadNodesProperties(nodeInfos: INodeTypeNameVersion[]): Promise<void> {\n\t\t\tconst allNodes: INodeTypeDescription[] = this.nodeTypesStore.allNodeTypes;\n\n\t\t\tconst nodesToBeFetched: INodeTypeNameVersion[] = [];\n\t\t\tallNodes.forEach((node) => {\n\t\t\t\tconst nodeVersions = Array.isArray(node.version) ? node.version : [node.version];\n\t\t\t\tif (\n\t\t\t\t\t!!nodeInfos.find((n) => n.name === node.name && nodeVersions.includes(n.version)) &&\n\t\t\t\t\t!node.hasOwnProperty('properties')\n\t\t\t\t) {\n\t\t\t\t\tnodesToBeFetched.push({\n\t\t\t\t\t\tname: node.name,\n\t\t\t\t\t\tversion: Array.isArray(node.version) ? node.version.slice(-1)[0] : node.version,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (nodesToBeFetched.length > 0) {\n\t\t\t\t// Only call API if node information is actually missing\n\t\t\t\tthis.canvasStore.startLoading();\n\t\t\t\tawait this.nodeTypesStore.getNodesInformation(nodesToBeFetched);\n\t\t\t\tthis.canvasStore.stopLoading();\n\t\t\t}\n\t\t},\n\t\tasync onPostMessageReceived(message: MessageEvent) {\n\t\t\tif (!message || typeof message.data !== 'string' || !message.data?.includes?.('\"command\"')) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst json = JSON.parse(message.data);\n\t\t\t\tif (json && json.command === 'openWorkflow') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.importWorkflowExact(json);\n\t\t\t\t\t\tthis.canOpenNDV = json.canOpenNDV ?? true;\n\t\t\t\t\t\tthis.hideNodeIssues = json.hideNodeIssues ?? false;\n\t\t\t\t\t\tthis.isExecutionPreview = false;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (window.top) {\n\t\t\t\t\t\t\twindow.top.postMessage(\n\t\t\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\t\t\tcommand: 'error',\n\t\t\t\t\t\t\t\t\tmessage: this.$locale.baseText('openWorkflow.workflowImportError'),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t'*',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\t\ttitle: this.$locale.baseText('openWorkflow.workflowImportError'),\n\t\t\t\t\t\t\tmessage: (e as Error).message,\n\t\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else if (json && json.command === 'openExecution') {\n\t\t\t\t\ttry {\n\t\t\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\t\t// so everything it needs has to be sent using post messages and passed down to child components\n\t\t\t\t\t\tthis.isProductionExecutionPreview = json.executionMode !== 'manual';\n\n\t\t\t\t\t\tawait this.openExecution(json.executionId);\n\t\t\t\t\t\tthis.canOpenNDV = json.canOpenNDV ?? true;\n\t\t\t\t\t\tthis.hideNodeIssues = json.hideNodeIssues ?? false;\n\t\t\t\t\t\tthis.isExecutionPreview = true;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (window.top) {\n\t\t\t\t\t\t\twindow.top.postMessage(\n\t\t\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\t\t\tcommand: 'error',\n\t\t\t\t\t\t\t\t\tmessage: this.$locale.baseText('nodeView.showError.openExecution.title'),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t'*',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showError.openExecution.title'),\n\t\t\t\t\t\t\tmessage: (e as Error).message,\n\t\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else if (json?.command === 'setActiveExecution') {\n\t\t\t\t\tthis.executionsStore.activeExecution = json.execution;\n\t\t\t\t}\n\t\t\t} catch (e) {}\n\t\t},\n\t\tasync onImportWorkflowDataEvent(data: IDataObject) {\n\t\t\tawait this.importWorkflowData(data.data as IWorkflowDataUpdate, 'file');\n\t\t},\n\t\tasync onImportWorkflowUrlEvent(data: IDataObject) {\n\t\t\tconst workflowData = await this.getWorkflowDataFromUrl(data.url as string);\n\t\t\tif (workflowData !== undefined) {\n\t\t\t\tawait this.importWorkflowData(workflowData, 'url');\n\t\t\t}\n\t\t},\n\t\taddPinDataConnections(pinData: IPinData) {\n\t\t\tObject.keys(pinData).forEach((nodeName) => {\n\t\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\t\tif (!node) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst hasRun = this.workflowsStore.getWorkflowResultDataByNodeName(nodeName) !== null;\n\t\t\t\tconst classNames = ['pinned'];\n\n\t\t\t\tif (hasRun) {\n\t\t\t\t\tclassNames.push('has-run');\n\t\t\t\t}\n\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst connections = this.instance?.getConnections({\n\t\t\t\t\tsource: node.id,\n\t\t\t\t}) as Connection[];\n\n\t\t\t\tconnections.forEach((connection) => {\n\t\t\t\t\tNodeViewUtils.addConnectionOutputSuccess(connection, {\n\t\t\t\t\t\ttotal: pinData[nodeName].length,\n\t\t\t\t\t\titerations: 0,\n\t\t\t\t\t\tclassNames,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\tremovePinDataConnections(pinData: IPinData) {\n\t\t\tObject.keys(pinData).forEach((nodeName) => {\n\t\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\t\tif (!node) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst connections = this.instance?.getConnections({\n\t\t\t\t\tsource: node.id,\n\t\t\t\t}) as Connection[];\n\n\t\t\t\tthis.instance.setSuspendDrawing(true);\n\t\t\t\tconnections.forEach(NodeViewUtils.resetConnection);\n\t\t\t\tthis.instance.setSuspendDrawing(false, true);\n\t\t\t});\n\t\t},\n\t\tonToggleNodeCreator({ source, createNodeActive, nodeCreatorView }: ToggleNodeCreatorOptions) {\n\t\t\tif (createNodeActive === this.createNodeActive) return;\n\n\t\t\tif (!nodeCreatorView) {\n\t\t\t\tnodeCreatorView = this.containsTrigger\n\t\t\t\t\t? REGULAR_NODE_CREATOR_VIEW\n\t\t\t\t\t: TRIGGER_NODE_CREATOR_VIEW;\n\t\t\t}\n\n\t\t\t// Default to the trigger tab in node creator if there's no trigger node yet\n\t\t\tthis.nodeCreatorStore.setSelectedView(nodeCreatorView);\n\n\t\t\tthis.createNodeActive = createNodeActive;\n\n\t\t\tlet mode;\n\t\t\tswitch (this.nodeCreatorStore.selectedView) {\n\t\t\t\tcase AI_NODE_CREATOR_VIEW:\n\t\t\t\t\tmode = 'ai';\n\t\t\t\t\tbreak;\n\t\t\t\tcase REGULAR_NODE_CREATOR_VIEW:\n\t\t\t\t\tmode = 'regular';\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tmode = 'regular';\n\t\t\t}\n\n\t\t\tif (createNodeActive) this.nodeCreatorStore.setOpenSource(source);\n\t\t\tvoid this.externalHooks.run('nodeView.createNodeActiveChanged', {\n\t\t\t\tsource,\n\t\t\t\tmode,\n\t\t\t\tcreateNodeActive,\n\t\t\t});\n\t\t\tthis.$telemetry.trackNodesPanel('nodeView.createNodeActiveChanged', {\n\t\t\t\tsource,\n\t\t\t\tmode,\n\t\t\t\tcreateNodeActive,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\t\t},\n\t\tasync onAddNodes(\n\t\t\t{ nodes, connections }: AddedNodesAndConnections,\n\t\t\tdragAndDrop = false,\n\t\t\tposition?: XYPosition,\n\t\t) {\n\t\t\tlet currentPosition = position;\n\t\t\tfor (const { type, isAutoAdd, name, openDetail, position: nodePosition } of nodes) {\n\t\t\t\tawait this.addNode(\n\t\t\t\t\ttype,\n\t\t\t\t\t{ position: nodePosition ?? currentPosition, dragAndDrop, name },\n\t\t\t\t\topenDetail ?? false,\n\t\t\t\t\ttrue,\n\t\t\t\t\tisAutoAdd,\n\t\t\t\t);\n\n\t\t\t\tconst lastAddedNode = this.nodes[this.nodes.length - 1];\n\t\t\t\tcurrentPosition = [\n\t\t\t\t\tlastAddedNode.position[0] + NodeViewUtils.NODE_SIZE * 2 + NodeViewUtils.GRID_SIZE,\n\t\t\t\t\tlastAddedNode.position[1],\n\t\t\t\t];\n\t\t\t}\n\n\t\t\tconst newNodesOffset = this.nodes.length - nodes.length;\n\t\t\tfor (const { from, to } of connections) {\n\t\t\t\tconst fromNode = this.nodes[newNodesOffset + from.nodeIndex];\n\t\t\t\tconst toNode = this.nodes[newNodesOffset + to.nodeIndex];\n\n\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\tfromNode.name,\n\t\t\t\t\tfrom.outputIndex ?? 0,\n\t\t\t\t\ttoNode.name,\n\t\t\t\t\tto.inputIndex ?? 0,\n\t\t\t\t\tNodeConnectionType.Main,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst lastAddedNode = this.nodes[this.nodes.length - 1];\n\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\t\t\tconst lastNodeInputs = workflow.getParentNodesByDepth(lastAddedNode.name, 1);\n\n\t\t\t// If the last added node has multiple inputs, move them down\n\t\t\tif (lastNodeInputs.length > 1) {\n\t\t\t\tlastNodeInputs.slice(1).forEach((node, index) => {\n\t\t\t\t\tconst nodeUi = this.workflowsStore.getNodeByName(node.name);\n\t\t\t\t\tif (!nodeUi) return;\n\n\t\t\t\t\tthis.onMoveNode({\n\t\t\t\t\t\tnodeName: nodeUi.name,\n\t\t\t\t\t\tposition: [nodeUi.position[0], nodeUi.position[1] + 100 * (index + 1)],\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.addPinDataConnections(this.workflowsStore.pinnedWorkflowData || ({} as IPinData));\n\t\t},\n\n\t\tasync saveCurrentWorkflowExternal(callback: () => void) {\n\t\t\tawait this.workflowHelpers.saveCurrentWorkflow();\n\t\t\tcallback?.();\n\t\t},\n\t\tsetSuspendRecordingDetachedConnections(suspend: boolean) {\n\t\t\tthis.suspendRecordingDetachedConnections = suspend;\n\t\t},\n\t\tonMoveNode({ nodeName, position }: { nodeName: string; position: XYPosition }): void {\n\t\t\tthis.workflowsStore.updateNodeProperties({ name: nodeName, properties: { position } });\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (node) {\n\t\t\t\t\tthis.instance?.repaintEverything();\n\t\t\t\t\tthis.onNodeMoved(node);\n\t\t\t\t}\n\t\t\t}, 0);\n\t\t},\n\t\tonRevertAddNode({ node }: { node: INodeUi }): void {\n\t\t\tthis.removeNode(node.name, false);\n\t\t},\n\t\tasync onRevertRemoveNode({ node }: { node: INodeUi }): Promise<void> {\n\t\t\tconst prevNode = this.workflowsStore.workflow.nodes.find((n) => n.id === node.id);\n\t\t\tif (prevNode) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// For some reason, returning node to canvas with old id\n\t\t\t// makes it's endpoint to render at wrong position\n\t\t\tnode.id = uuid();\n\t\t\tawait this.addNodes([node]);\n\t\t},\n\t\tonRevertAddConnection({ connection }: { connection: [IConnection, IConnection] }) {\n\t\t\tthis.suspendRecordingDetachedConnections = true;\n\t\t\tthis.__removeConnection(connection, true);\n\t\t\tthis.suspendRecordingDetachedConnections = false;\n\t\t},\n\t\tasync onRevertRemoveConnection({ connection }: { connection: [IConnection, IConnection] }) {\n\t\t\tthis.suspendRecordingDetachedConnections = true;\n\t\t\tthis.__addConnection(connection);\n\t\t\tthis.suspendRecordingDetachedConnections = false;\n\t\t},\n\t\tasync onRevertNameChange({ currentName, newName }: { currentName: string; newName: string }) {\n\t\t\tawait this.renameNode(newName, currentName);\n\t\t},\n\t\tonRevertEnableToggle({ nodeName, isDisabled }: { nodeName: string; isDisabled: boolean }) {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (node) {\n\t\t\t\tthis.nodeHelpers.disableNodes([node]);\n\t\t\t}\n\t\t},\n\t\tonPageShow(e: PageTransitionEvent) {\n\t\t\t// Page was restored from the bfcache (back-forward cache)\n\t\t\tif (e.persisted) {\n\t\t\t\tthis.canvasStore.stopLoading();\n\t\t\t}\n\t\t},\n\t\treadOnlyEnvRouteCheck() {\n\t\t\tif (\n\t\t\t\tthis.readOnlyEnv &&\n\t\t\t\t[VIEWS.NEW_WORKFLOW, VIEWS.TEMPLATE_IMPORT].includes(this.$route.name)\n\t\t\t) {\n\t\t\t\tvoid this.$nextTick(async () => {\n\t\t\t\t\tthis.resetWorkspace();\n\t\t\t\t\tthis.uiStore.stateIsDirty = false;\n\n\t\t\t\t\tawait this.$router.replace({ name: VIEWS.HOMEPAGE });\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tasync checkAndInitDebugMode() {\n\t\t\tif (this.$route.name === VIEWS.EXECUTION_DEBUG) {\n\t\t\t\tthis.titleSet(this.workflowName, 'DEBUG');\n\t\t\t\tif (!this.workflowsStore.isInDebugMode) {\n\t\t\t\t\tawait this.applyExecutionData(this.$route.params.executionId as string);\n\t\t\t\t\tthis.workflowsStore.isInDebugMode = true;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tonContextMenuAction(action: ContextMenuAction, nodes: INode[]): void {\n\t\t\tswitch (action) {\n\t\t\t\tcase 'copy':\n\t\t\t\t\tthis.copyNodes(nodes);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'delete':\n\t\t\t\t\tthis.deleteNodes(nodes);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'duplicate':\n\t\t\t\t\tvoid this.duplicateNodes(nodes);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'execute':\n\t\t\t\t\tthis.onRunNode(nodes[0].name, 'NodeView.onContextMenuAction');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'open':\n\t\t\t\t\tthis.ndvStore.activeNodeName = nodes[0].name;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'rename':\n\t\t\t\t\tvoid this.renameNodePrompt(nodes[0].name);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'toggle_activation':\n\t\t\t\t\tthis.toggleActivationNodes(nodes);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'toggle_pin':\n\t\t\t\t\tthis.togglePinNodes(nodes, 'context-menu');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'add_node':\n\t\t\t\t\tthis.onToggleNodeCreator({\n\t\t\t\t\t\tsource: NODE_CREATOR_OPEN_SOURCES.CONTEXT_MENU,\n\t\t\t\t\t\tcreateNodeActive: !this.isReadOnlyRoute && !this.readOnlyEnv,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'add_sticky':\n\t\t\t\t\tvoid this.onAddNodes({ nodes: [{ type: STICKY_NODE_TYPE }], connections: [] });\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'select_all':\n\t\t\t\t\tthis.selectAllNodes();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'deselect_all':\n\t\t\t\t\tthis.deselectAllNodes();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t},\n\tasync onSourceControlPull() {\n\t\tlet workflowId = null as string | null;\n\t\tif (this.$route.params.name) {\n\t\t\tworkflowId = this.$route.params.name;\n\t\t}\n\n\t\ttry {\n\t\t\tawait Promise.all([this.loadVariables(), this.tagsStore.fetchAll(), this.loadCredentials()]);\n\n\t\t\tif (workflowId !== null && !this.uiStore.stateIsDirty) {\n\t\t\t\tconst workflow: IWorkflowDb | undefined =\n\t\t\t\t\tawait this.workflowsStore.fetchWorkflow(workflowId);\n\t\t\t\tif (workflow) {\n\t\t\t\t\tthis.titleSet(workflow.name, 'IDLE');\n\t\t\t\t\tawait this.openWorkflow(workflow);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(error);\n\t\t}\n\t},\n});\n</script>\n\n<style scoped lang=\"scss\">\n.node-view-root {\n\tposition: relative;\n\tflex: 1;\n\toverflow: hidden;\n\tbackground-color: var(--color-canvas-background);\n\twidth: 100%;\n\theight: 100%;\n\tposition: relative;\n}\n\n.node-view-wrapper {\n\tposition: fixed;\n}\n\n.node-view {\n\tposition: relative;\n\twidth: 100%;\n\theight: 100%;\n\ttransform-origin: 0 0;\n\tz-index: -1;\n}\n\n.node-view-background {\n\tbackground-color: var(--color-canvas-background);\n\tposition: absolute;\n\twidth: 10000px;\n\theight: 10000px;\n\tz-index: -2;\n}\n\n.move-active {\n\tcursor: grab;\n\tcursor: -moz-grab;\n\tcursor: -webkit-grab;\n\ttouch-action: none;\n}\n\n.move-in-process {\n\tcursor: grabbing;\n\tcursor: -moz-grabbing;\n\tcursor: -webkit-grabbing;\n\ttouch-action: none;\n}\n\n.workflow-execute-wrapper {\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\n/* Makes sure that when selected with mouse it does not select text */\n.do-not-select *,\n.jtk-drag-select * {\n\t-webkit-touch-callout: none;\n\t-webkit-user-select: none;\n\t-khtml-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n</style>\n\n<style lang=\"scss\">\n.node-view-wrapper {\n\t--drag-scope-active-disabled-color: var(--color-foreground-dark);\n\n\t&.connection-drag-scope-active {\n\t\t@each $node-type in $supplemental-node-types {\n\t\t\t// Grey out incompatible node type endpoints\n\t\t\t&:not(.connection-drag-scope-active-type-#{$node-type}) {\n\t\t\t\t.diamond-output-endpoint,\n\t\t\t\t.jtk-connector,\n\t\t\t\t.add-input-endpoint {\n\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t}\n\n\t\t\t\t.node-input-endpoint-label,\n\t\t\t\t.node-output-endpoint-label {\n\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&.connection-drag-scope-active-type-#{$node-type} {\n\t\t\t\t// Dragging input\n\t\t\t\t&.connection-drag-scope-active-connection-target {\n\t\t\t\t\t// Apply style to compatible output endpoints\n\t\t\t\t\t.diamond-output-endpoint[data-jtk-scope-#{$node-type}='true'] {\n\t\t\t\t\t\ttransform: scale(1.5) rotate(45deg);\n\t\t\t\t\t}\n\n\t\t\t\t\t.add-input-endpoint[data-jtk-scope-#{$node-type}='true'] {\n\t\t\t\t\t\t// Apply style to dragged compatible input endpoint\n\t\t\t\t\t\t&.jtk-dragging {\n\t\t\t\t\t\t\t.add-input-endpoint-default {\n\t\t\t\t\t\t\t\ttransform: translate(-5px, -5px) scale(1.5);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Apply style to non-dragged compatible input endpoints\n\t\t\t\t\t\t&:not(.jtk-dragging) {\n\t\t\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t.node-input-endpoint-label {\n\t\t\t\t\t\t&:not(.jtk-dragging) {\n\t\t\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Dragging output\n\t\t\t\t&.connection-drag-scope-active-connection-source {\n\t\t\t\t\t// Apply style to dragged compatible output endpoint\n\t\t\t\t\t.diamond-output-endpoint[data-jtk-scope-#{$node-type}='true'] {\n\t\t\t\t\t\t&.jtk-dragging {\n\t\t\t\t\t\t\ttransform: scale(1.5) rotate(45deg);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Apply style to non-dragged compatible input endpoints\n\t\t\t\t\t\t&:not(.jtk-dragging) {\n\t\t\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Apply style to compatible output endpoints\n\t\t\t\t\t.add-input-endpoint[data-jtk-scope-#{$node-type}='true'] {\n\t\t\t\t\t\t.add-input-endpoint-default {\n\t\t\t\t\t\t\ttransform: translate(-5px, -5px) scale(1.5);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t.node-output-endpoint-label {\n\t\t\t\t\t\t&:not(.jtk-dragging) {\n\t\t\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\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\t}\n}\n\n.drop-add-node-label {\n\tcolor: var(--color-text-dark);\n\tfont-weight: 600;\n\tfont-size: 0.8em;\n\ttext-align: center;\n\tbackground-color: #ffffff55;\n}\n\n.connection-actions {\n\t&:hover {\n\t\tdisplay: block !important;\n\t}\n\n\t> button {\n\t\tcolor: var(--color-foreground-xdark);\n\t\tborder: 2px solid var(--color-foreground-xdark);\n\t\tbackground-color: var(--color-background-xlight);\n\t\tborder-radius: var(--border-radius-base);\n\t\theight: var(--spacing-l);\n\t\twidth: var(--spacing-l);\n\t\tcursor: pointer;\n\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\n\t\tposition: absolute;\n\t\ttop: -12px;\n\n\t\t&.add {\n\t\t\tright: 4px;\n\t\t}\n\n\t\t&.delete {\n\t\t\tleft: 4px;\n\t\t}\n\n\t\t&.delete-single {\n\t\t\tleft: -12px;\n\t\t}\n\n\t\tsvg {\n\t\t\tpointer-events: none;\n\t\t\tfont-size: var(--font-size-2xs);\n\t\t}\n\n\t\t&:hover {\n\t\t\tborder-color: var(--color-primary);\n\t\t\tcolor: var(--color-primary);\n\t\t}\n\t}\n}\n</style>\n\n<style module lang=\"scss\">\n.content {\n\tposition: relative;\n\tdisplay: flex;\n\toverflow: auto;\n\theight: 100%;\n\twidth: 100%;\n}\n\n.shake {\n\tanimation: 1s 200ms shake;\n}\n\n@keyframes shake {\n\t10%,\n\t90% {\n\t\ttransform: translate3d(-1px, 0, 0);\n\t}\n\n\t20%,\n\t80% {\n\t\ttransform: translate3d(2px, 0, 0);\n\t}\n\n\t30%,\n\t50%,\n\t70% {\n\t\ttransform: translate3d(-4px, 0, 0);\n\t}\n\n\t40%,\n\t60% {\n\t\ttransform: translate3d(4px, 0, 0);\n\t}\n}\n\n.setupCredentialsButtonWrapper {\n\tposition: absolute;\n\tleft: var(--spacing-l);\n\ttop: var(--spacing-l);\n}\n</style>\n\n<style lang=\"scss\" scoped>\n@mixin applyColorToConnection($partialSelector, $cssColorVarName, $labelCssColorVarName) {\n\t.jtk-connector#{$partialSelector}:not(.jtk-hover) {\n\t\tpath:not(.jtk-connector-outline) {\n\t\t\tstroke: var(#{$cssColorVarName});\n\t\t}\n\t\tpath[jtk-overlay-id='reverse-arrow'],\n\t\tpath[jtk-overlay-id='endpoint-arrow'],\n\t\tpath[jtk-overlay-id='midpoint-arrow'] {\n\t\t\tfill: var(#{$cssColorVarName});\n\t\t}\n\t}\n\n\t.connection-run-items-label#{$partialSelector} {\n\t\tcolor: var(#{$labelCssColorVarName});\n\t}\n}\n\n:deep(.node-view) {\n\t@include applyColorToConnection('.success', '--color-success-light', '--color-success');\n\t@include applyColorToConnection(\n\t\t'.success.pinned',\n\t\t'--color-foreground-xdark',\n\t\t'--color-foreground-xdark'\n\t);\n\t@include applyColorToConnection(\n\t\t'.success.pinned.has-run',\n\t\t'--color-secondary',\n\t\t'--color-secondary'\n\t);\n}\n</style>\n, IRun, IPushDataExecutionFinished\n"],"file":"assets/NodeView-vh3Qdfdh.js"}