n8n-editor-ui 1.34.1 → 1.34.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +63 -63
- package/dist/assets/{AuthView-94aQ7z4H.js → AuthView-TLL7d7nz.js} +2 -2
- package/dist/assets/{AuthView-94aQ7z4H.js.map → AuthView-TLL7d7nz.js.map} +1 -1
- package/dist/assets/{CanvasControls-A5WBrohY.js → CanvasControls-QMz-txwk.js} +2 -2
- package/dist/assets/{CanvasControls-A5WBrohY.js.map → CanvasControls-QMz-txwk.js.map} +1 -1
- package/dist/assets/{ChangePasswordView-wsEhj8cy.js → ChangePasswordView-BpG2Rx4d.js} +2 -2
- package/dist/assets/{ChangePasswordView-wsEhj8cy.js.map → ChangePasswordView-BpG2Rx4d.js.map} +1 -1
- package/dist/assets/{CollectionParameter-XvPjL77I.js → CollectionParameter-jdGzYeqj.js} +2 -2
- package/dist/assets/CollectionParameter-jdGzYeqj.js.map +1 -0
- package/dist/assets/{CredentialsView-0XJMAGhU.js → CredentialsView-kiuFxEVH.js} +2 -2
- package/dist/assets/{CredentialsView-0XJMAGhU.js.map → CredentialsView-kiuFxEVH.js.map} +1 -1
- package/dist/assets/{ExecutionFilter-bhanFEvf.js → ExecutionFilter-V1l-9ps5.js} +2 -2
- package/dist/assets/{ExecutionFilter-bhanFEvf.js.map → ExecutionFilter-V1l-9ps5.js.map} +1 -1
- package/dist/assets/{ExecutionPreview-OlIAVmt8.js → ExecutionPreview-MPwJjWY4.js} +2 -2
- package/dist/assets/{ExecutionPreview-OlIAVmt8.js.map → ExecutionPreview-MPwJjWY4.js.map} +1 -1
- package/dist/assets/{ExecutionsInfoAccordion-8y0XuFEi.js → ExecutionsInfoAccordion-H3fj26pu.js} +2 -2
- package/dist/assets/{ExecutionsInfoAccordion-8y0XuFEi.js.map → ExecutionsInfoAccordion-H3fj26pu.js.map} +1 -1
- package/dist/assets/{ExecutionsLandingPage-S5UN8vIw.js → ExecutionsLandingPage-7qAKHfBe.js} +2 -2
- package/dist/assets/{ExecutionsLandingPage-S5UN8vIw.js.map → ExecutionsLandingPage-7qAKHfBe.js.map} +1 -1
- package/dist/assets/{ExecutionsList-BU7_tq5x.js → ExecutionsList-Y9rsGvqE.js} +2 -2
- package/dist/assets/{ExecutionsList-BU7_tq5x.js.map → ExecutionsList-Y9rsGvqE.js.map} +1 -1
- package/dist/assets/{ExecutionsView-aBSDNhOw.js → ExecutionsView-hi5NLYKp.js} +2 -2
- package/dist/assets/{ExecutionsView-aBSDNhOw.js.map → ExecutionsView-hi5NLYKp.js.map} +1 -1
- package/dist/assets/{ForgotMyPasswordView-y5xFculD.js → ForgotMyPasswordView-ho6gQT6y.js} +2 -2
- package/dist/assets/{ForgotMyPasswordView-y5xFculD.js.map → ForgotMyPasswordView-ho6gQT6y.js.map} +1 -1
- package/dist/assets/{MainHeader-dPdeQhkH.js → MainHeader-JVxjOJwJ.js} +2 -2
- package/dist/assets/{MainHeader-dPdeQhkH.js.map → MainHeader-JVxjOJwJ.js.map} +1 -1
- package/dist/assets/{MainSidebar-5wv4Ntz3.js → MainSidebar-h-btynOF.js} +2 -2
- package/dist/assets/{MainSidebar-5wv4Ntz3.js.map → MainSidebar-h-btynOF.js.map} +1 -1
- package/dist/assets/{NodeCreation-vCHQm0aM.js → NodeCreation--SFXDuf-.js} +3 -3
- package/dist/assets/{NodeCreation-vCHQm0aM.js.map → NodeCreation--SFXDuf-.js.map} +1 -1
- package/dist/assets/{NodeCreator-Qi3ajhnf.js → NodeCreator-ns8j677p.js} +2 -2
- package/dist/assets/{NodeCreator-Qi3ajhnf.js.map → NodeCreator-ns8j677p.js.map} +1 -1
- package/dist/assets/{NodeList-bi4nWtpD.js → NodeList-f2AyrOck.js} +2 -2
- package/dist/assets/{NodeList-bi4nWtpD.js.map → NodeList-f2AyrOck.js.map} +1 -1
- package/dist/assets/{NodeView-oDPyzajr.js → NodeView-7yZJ9OMj.js} +4 -4
- package/dist/assets/NodeView-7yZJ9OMj.js.map +1 -0
- package/dist/assets/NodeView-pdKhF5kg.css +1 -0
- package/dist/assets/{RunDataAi-DJiuZFJ2.js → RunDataAi-PNu5uqz6.js} +2 -2
- package/dist/assets/{RunDataAi-DJiuZFJ2.js.map → RunDataAi-PNu5uqz6.js.map} +1 -1
- package/dist/assets/{RunDataJson-9PUFQ2iv.js → RunDataJson-s5yVk7VC.js} +3 -3
- package/dist/assets/{RunDataJson-9PUFQ2iv.js.map → RunDataJson-s5yVk7VC.js.map} +1 -1
- package/dist/assets/{RunDataJsonActions-4HpuK2F9.js → RunDataJsonActions-VSs2XNyt.js} +2 -2
- package/dist/assets/{RunDataJsonActions-4HpuK2F9.js.map → RunDataJsonActions-VSs2XNyt.js.map} +1 -1
- package/dist/assets/{RunDataSchema-ezXA1IRJ.js → RunDataSchema-WeaaXm2i.js} +2 -2
- package/dist/assets/{RunDataSchema-ezXA1IRJ.js.map → RunDataSchema-WeaaXm2i.js.map} +1 -1
- package/dist/assets/{RunDataTable-fjkHn30C.js → RunDataTable-2YR4xl8i.js} +2 -2
- package/dist/assets/{RunDataTable-fjkHn30C.js.map → RunDataTable-2YR4xl8i.js.map} +1 -1
- package/dist/assets/{SamlOnboarding-yIx-rRda.js → SamlOnboarding-0ds_5hgl.js} +2 -2
- package/dist/assets/{SamlOnboarding-yIx-rRda.js.map → SamlOnboarding-0ds_5hgl.js.map} +1 -1
- package/dist/assets/{SettingsApiView-EZ0nAdDr.js → SettingsApiView-ZNTmBDeh.js} +2 -2
- package/dist/assets/{SettingsApiView-EZ0nAdDr.js.map → SettingsApiView-ZNTmBDeh.js.map} +1 -1
- package/dist/assets/{SettingsCommunityNodesView-GY7HDfXP.js → SettingsCommunityNodesView-YGybEb0Q.js} +2 -2
- package/dist/assets/{SettingsCommunityNodesView-GY7HDfXP.js.map → SettingsCommunityNodesView-YGybEb0Q.js.map} +1 -1
- package/dist/assets/{SettingsExternalSecrets-XjmxCmxV.js → SettingsExternalSecrets-V6XKdflH.js} +2 -2
- package/dist/assets/{SettingsExternalSecrets-XjmxCmxV.js.map → SettingsExternalSecrets-V6XKdflH.js.map} +1 -1
- package/dist/assets/{SettingsFakeDoorView-pVOCkUpk.js → SettingsFakeDoorView-RT3jHFTZ.js} +2 -2
- package/dist/assets/{SettingsFakeDoorView-pVOCkUpk.js.map → SettingsFakeDoorView-RT3jHFTZ.js.map} +1 -1
- package/dist/assets/{SettingsLdapView-447rSrxc.js → SettingsLdapView-lVhJpXDn.js} +2 -2
- package/dist/assets/{SettingsLdapView-447rSrxc.js.map → SettingsLdapView-lVhJpXDn.js.map} +1 -1
- package/dist/assets/{SettingsLogStreamingView-bUhYaLuP.js → SettingsLogStreamingView-hWjeVuyC.js} +2 -2
- package/dist/assets/{SettingsLogStreamingView-bUhYaLuP.js.map → SettingsLogStreamingView-hWjeVuyC.js.map} +1 -1
- package/dist/assets/{SettingsSourceControl-QbgpyFeh.js → SettingsSourceControl-XOku0dYa.js} +2 -2
- package/dist/assets/{SettingsSourceControl-QbgpyFeh.js.map → SettingsSourceControl-XOku0dYa.js.map} +1 -1
- package/dist/assets/{SettingsSso-1YVWObhc.js → SettingsSso-FfUWpkMk.js} +2 -2
- package/dist/assets/{SettingsSso-1YVWObhc.js.map → SettingsSso-FfUWpkMk.js.map} +1 -1
- package/dist/assets/{SettingsUsageAndPlan-RXRRDXy4.js → SettingsUsageAndPlan-bhK5h4Fc.js} +2 -2
- package/dist/assets/{SettingsUsageAndPlan-RXRRDXy4.js.map → SettingsUsageAndPlan-bhK5h4Fc.js.map} +1 -1
- package/dist/assets/{SettingsUsersView-eHaVB_6L.js → SettingsUsersView-wSBhrK4z.js} +2 -2
- package/dist/assets/{SettingsUsersView-eHaVB_6L.js.map → SettingsUsersView-wSBhrK4z.js.map} +1 -1
- package/dist/assets/{SettingsView-JVUkQw0d.js → SettingsView-k7YCmGxR.js} +2 -2
- package/dist/assets/{SettingsView-JVUkQw0d.js.map → SettingsView-k7YCmGxR.js.map} +1 -1
- package/dist/assets/{SetupView-fQzty7Gp.js → SetupView-q1H9bzQn.js} +2 -2
- package/dist/assets/{SetupView-fQzty7Gp.js.map → SetupView-q1H9bzQn.js.map} +1 -1
- package/dist/assets/{SetupWorkflowCredentialsButton-OiOkf-hI.js → SetupWorkflowCredentialsButton-MXDnpOlJ.js} +2 -2
- package/dist/assets/{SetupWorkflowCredentialsButton-OiOkf-hI.js.map → SetupWorkflowCredentialsButton-MXDnpOlJ.js.map} +1 -1
- package/dist/assets/{SetupWorkflowFromTemplateView-ckehDOej.js → SetupWorkflowFromTemplateView-0HgnF8Wk.js} +2 -2
- package/dist/assets/{SetupWorkflowFromTemplateView-ckehDOej.js.map → SetupWorkflowFromTemplateView-0HgnF8Wk.js.map} +1 -1
- package/dist/assets/{SigninView-6kvI5K04.js → SigninView-ZtC3HJKC.js} +2 -2
- package/dist/assets/{SigninView-6kvI5K04.js.map → SigninView-ZtC3HJKC.js.map} +1 -1
- package/dist/assets/{SignupView-USh4Ng3q.js → SignupView-9jLlb4-m.js} +2 -2
- package/dist/assets/{SignupView-USh4Ng3q.js.map → SignupView-9jLlb4-m.js.map} +1 -1
- package/dist/assets/{TemplateDetails-tXvyDDVg.js → TemplateDetails-w7x_Vgw_.js} +2 -2
- package/dist/assets/{TemplateDetails-tXvyDDVg.js.map → TemplateDetails-w7x_Vgw_.js.map} +1 -1
- package/dist/assets/{TemplateList-rsNRt0qZ.js → TemplateList-0nuqWVBy.js} +2 -2
- package/dist/assets/{TemplateList-rsNRt0qZ.js.map → TemplateList-0nuqWVBy.js.map} +1 -1
- package/dist/assets/{TemplatesCollectionView-lXJ9U359.js → TemplatesCollectionView-Z9UtKR-g.js} +2 -2
- package/dist/assets/{TemplatesCollectionView-lXJ9U359.js.map → TemplatesCollectionView-Z9UtKR-g.js.map} +1 -1
- package/dist/assets/{TemplatesInfoCarousel-P2HZ4dOz.js → TemplatesInfoCarousel-N3l1eTTG.js} +2 -2
- package/dist/assets/{TemplatesInfoCarousel-P2HZ4dOz.js.map → TemplatesInfoCarousel-N3l1eTTG.js.map} +1 -1
- package/dist/assets/{TemplatesSearchView-FN7reyfg.js → TemplatesSearchView-wkSt7PFf.js} +2 -2
- package/dist/assets/{TemplatesSearchView-FN7reyfg.js.map → TemplatesSearchView-wkSt7PFf.js.map} +1 -1
- package/dist/assets/{TemplatesWorkflowView-iRU7xCpM.js → TemplatesWorkflowView-epjsTDT4.js} +2 -2
- package/dist/assets/{TemplatesWorkflowView-iRU7xCpM.js.map → TemplatesWorkflowView-epjsTDT4.js.map} +1 -1
- package/dist/assets/{VariablesView-pWnSAbjy.js → VariablesView-mj7tvP3Z.js} +2 -2
- package/dist/assets/{VariablesView-pWnSAbjy.js.map → VariablesView-mj7tvP3Z.js.map} +1 -1
- package/dist/assets/{WorkerView-8rB6MB_M.js → WorkerView-urDpqCfL.js} +2 -2
- package/dist/assets/{WorkerView-8rB6MB_M.js.map → WorkerView-urDpqCfL.js.map} +1 -1
- package/dist/assets/{WorkflowActivator-hF9F5zIs.js → WorkflowActivator-2LVSrBU4.js} +2 -2
- package/dist/assets/{WorkflowActivator-hF9F5zIs.js.map → WorkflowActivator-2LVSrBU4.js.map} +1 -1
- package/dist/assets/{WorkflowHistory-gHQbqUXH.js → WorkflowHistory-4SEsxR0t.js} +2 -2
- package/dist/assets/{WorkflowHistory-gHQbqUXH.js.map → WorkflowHistory-4SEsxR0t.js.map} +1 -1
- package/dist/assets/{WorkflowOnboardingView-VpQ3P8b_.js → WorkflowOnboardingView-27zExcdN.js} +2 -2
- package/dist/assets/{WorkflowOnboardingView-VpQ3P8b_.js.map → WorkflowOnboardingView-27zExcdN.js.map} +1 -1
- package/dist/assets/{WorkflowsView-bfxfJsmW.js → WorkflowsView-rICV14FU.js} +2 -2
- package/dist/assets/{WorkflowsView-bfxfJsmW.js.map → WorkflowsView-rICV14FU.js.map} +1 -1
- package/dist/assets/{cloud-f74z4VKj.js → cloud-8u4ixH3T.js} +2 -2
- package/dist/assets/{cloud-f74z4VKj.js.map → cloud-8u4ixH3T.js.map} +1 -1
- package/dist/assets/{index-vdh5hVg3.js → index-4C1AxeXk.js} +4 -4
- package/dist/assets/{index-vdh5hVg3.js.map → index-4C1AxeXk.js.map} +1 -1
- package/dist/assets/index-PmN852am.css +1 -0
- package/dist/assets/{pushConnection-j2REJYmc.js → pushConnection-kCBulx2c.js} +2 -2
- package/dist/assets/{pushConnection-j2REJYmc.js.map → pushConnection-kCBulx2c.js.map} +1 -1
- package/dist/assets/{templateActions-iSfFOAhF.js → templateActions-tZeqnIph.js} +2 -2
- package/dist/assets/{templateActions-iSfFOAhF.js.map → templateActions-tZeqnIph.js.map} +1 -1
- package/dist/assets/{useExecutionDebugging-s7lAeIqB.js → useExecutionDebugging-eQjp4txV.js} +2 -2
- package/dist/assets/{useExecutionDebugging-s7lAeIqB.js.map → useExecutionDebugging-eQjp4txV.js.map} +1 -1
- package/dist/assets/{workflowActivate-SIKKLz8V.js → workflowActivate-6jCh92f_.js} +2 -2
- package/dist/assets/{workflowActivate-SIKKLz8V.js.map → workflowActivate-6jCh92f_.js.map} +1 -1
- package/dist/index.html +2 -2
- package/package.json +1 -1
- package/dist/assets/CollectionParameter-XvPjL77I.js.map +0 -1
- package/dist/assets/NodeView-FjGatqri.css +0 -1
- package/dist/assets/NodeView-oDPyzajr.js.map +0 -1
- package/dist/assets/index-suVg9RiN.css +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"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","names":["position","ref","isOpen","target","actions","actionCallback","useContextMenu","onAction","uiStore","useUIStore","nodeTypesStore","useNodeTypesStore","workflowsStore","useWorkflowsStore","sourceControlStore","useSourceControlStore","getInputDataWithPinned","useDataSchema","i18n","useI18n","isReadOnly","computed","targetNodes","selectedNodes","node","currentTarget","canAddNodeOfType","nodeType","sameTypeNodes","n","canDuplicateNode","NOT_DUPLICATABE_NODE_TYPES","canPinNode","dataToPin","PIN_DATA_NODE_TYPES_DENYLIST","hasPinData","close","open","event","menuTarget","getMousePosition","nodes","onlyStickies","STICKY_NODE_TYPE","i18nOptions","selectionActions","nonMainInputs","workflow","workflowNode","inputs","NodeHelpers.getNodeInputs","NodeHelpers.getConnectionTypes","inputName","NodeConnectionType","menuActions","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","_sfc_main$r","defineComponent","NodeIcon","inputRef","_resolveComponent","_openBlock","_createElementBlock","_normalizeClass","_ctx","_cache","args","_createVNode","_component_NodeIcon","_component_n8n_popover","editName","_withCtx","_createElementVNode","modelValue","_createTextVNode","_toDisplayString","$style","editable","_createBlock","_createCommentVNode","_withKeys","_withModifiers","_component_n8n_text","_component_n8n_input","$event","_component_n8n_button","_sfc_main$q","useExternalHooks","mapStores","useNDVStore","utmTags","primaryDocUrl","_d","_c","_a","NPM_PACKAGE_DOCS_BASE_URL","BUILTIN_NODES_DOCS_URL","isCommunityPackageName","options","COMMUNITY_NODES_INSTALLATION_DOCS_URL","pushCogRight","tab","_component_n8n_tabs","onTooltipClick","_sfc_main$p","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","_withScopeId","_pushScopeId","_popScopeId","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_7","_hoisted_8","_hoisted_11","_hoisted_12","visibleWebhookUrls","isMinimized","_component_font_awesome_icon","_component_el_row","_component_el_col","showUrlFor","_component_n8n_radio_buttons","urlOptions","_Fragment","_renderList","_component_n8n_tooltip","_hoisted_9","copyWebhookUrl","getWebhookUrlDisplay","_hoisted_13","_hoisted_15","props","__props","nodeHelpers","useNodeHelpers","debounce","useDebounce","emit","__emit","possibleConnections","expandedGroups","shouldShowNodeInputIssues","nodeData","nodeInputIssues","issues","connectedNodes","connection","getINodesFromNames","getConnectionConfig","connectionType","c","isMultiConnection","connectionConfig","shouldShowConnectionTooltip","expandConnectionGroup","isExpanded","g","names","name","matchedNodeType","stringifiedIssues","NodeHelpers.nodeIssuesToString","hasInputIssues","isNodeInputConfiguration","getPossibleSubInputConnections","input","onNodeClick","nodeName","onPlusClick","connectionNodes","showNodeInputsIssues","__expose","_sfc_main$n","pinnedData","usePinnedData","externalHooks","runWorkflow","useRunWorkflow","useMessage","triggeredNode","MANUAL_TRIGGER_NODE_TYPE","WEBHOOK_NODE_TYPE","waitingOnWebhook","executedNode","activeNode","error","nodeViewEventBus","shouldUnpinAndExecute","MODAL_CONFIRM","telemetryPayload","disabledHint","nodeRunning","disabled","buttonLabel","type","size","isListeningForEvents","isTriggerNode","$locale","_sfc_main$m","NodeTitle","NodeCredentials","ParameterInputList","NodeSettingsTabs","NodeWebhooks","NDVSubConnections","NodeExecuteButton","useHistoryStore","useCredentialsStore","useWorkflowsEEStore","IMPORT_CURL_MODAL_KEY","shortNodeType","item","credential","nodeCredential","CUSTOM_NODES_DOCS_URL","MAIN_NODE_PANEL_WIDTH","newNode","oldNode","newValue","oldValue","parameters","parameter","parameterName","value","nameParts","lastNamePart","isArray","lastNameParts","removedNodeValue","remainingNodeValues","tempValue","get","removedArrayNodeValue","remainingArrayNodeValues","set","deepCopy","updateInformation","RenameNodeCommand","parameterData","nodeNameBefore","sendData","nodeParameters","NodeHelpers.getNodeParameters","oldNodeParameters","parameterPath","parameterPathArray","path","data","unset","key","nodeParameterValues","updatedParameter","prop","displayOptions","showCondition","hideCondition","option","foundNodeSettings","nodeSetting","_hoisted_10","_component_NodeTitle","_component_NodeExecuteButton","outputPanelEditMode","onStopExecution","nodeValid","openPanel","_component_NodeSettingsTabs","sessionId","isCommunityNode","_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","ndvEventBus","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","onFeedback","feedback","useAIStore","defineStore","rootStore","useRootStore","settingsStore","useSettingsStore","isErrorDebuggingEnabled","debugError","payload","aiApi.debugError","toast","telemetry","useTelemetry","ndvStore","aiStore","isLoadingErrorDebugging","errorDebuggingMessage","errorDebuggingFeedback","showErrorDebuggingButton","displayCause","MAX_DISPLAY_DATA_SIZE","n8nVersion","baseUrl","instanceType","nodeDefaultName","prepareRawMessages","returnData","errorMessage","getErrorMessage","message","parts","part","parsed","onDebugError","onDebugErrorRegenerate","onErrorDebuggingFeedback","nodeVersionTag","latestNodeVersion","getErrorDescription","interpolate","parameterDisplayName","baseErrorMessage","fullPath","params","pathParts","currentParameterName","arrayMatch","currentParameter","copyErrorDetails","errorInfo","errorDetails","n8nDetails","_e","_f","copySuccess","locale","visible","RunDataTable","defineAsyncComponent","__vitePreload","RunDataJson","RunDataSchema","RunDataSearch","_sfc_main$b","BinaryDataDisplay","NodeErrorView","JsonEditor","RunDataPinButton","toRef","MAX_DISPLAY_ITEMS_AUTO_ALL","DATA_PINNING_DOCS_URL","DATA_EDITING_DOCS_URL","schemaView","isEmpty","HTML_NODE_TYPE","runData","taskData","pinOrLiveData","offset","executionDataToJson","capitalize","branches","i","totalItemsCount","itemsCount","items","outputName","appendBranchWord","NODE_TYPES_EXCLUDED_FROM_OUTPUT_NAME_APPEND","NodeHelpers.getNodeOutputs","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","prevNode","prevData","isEqual","newData","branchIndex","newSearch","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$a","date","time","convertToDisplayDateComponents","runMetadata","OUTPUT_TYPE","_sfc_main$9","RunData","RunInfo","RunDataAi","storeToRefs","isSubNodeType","useNodeType","resultData","updatedAt","runAt","runDataRef","outputMode","_component_RunData","isNodeRunning","onRunIndexChange","onLinkRun","onUnlinkRun","_createSlots","hasAiMetadata","onUpdateOutputMode","runTaskData","_component_RunInfo","_component_RunDataAi","_sfc_main$7","WireMeUp","toIgnore","START_NODE_TYPE","CRON_NODE_TYPE","INTERVAL_NODE_TYPE","output","executingNode","val","curr","prev","connectedInputs","inputIndex","truncated","mappedNode","isExecutingPrevious","connectedCurrentNodeOutputs","isMappingEnabled","currentNodeDepth","parentNodes","truncate","getMultipleNodesText","isActiveNodeConfig","readOnly","showDraggableHintWithDelay","onNodeExecute","_component_WireMeUp","isMappingMode","_resolveDynamicComponent","_sfc_main$6","CopyInput","createEventBus","hideContent","hideContentValue","getTriggerNodeServiceName","serviceName","VIEWS","WORKFLOW_SETTINGS_MODAL_KEY","_Transition","_component_n8n_pulse","isWebhookNode","webhookHttpMethod","_component_CopyInput","onTestLinkCopied","listeningHint","displayChatButton","header","_component_n8n_heading","activationHint","executionsHelp","_component_n8n_info_accordion","executionsHelpEventBus","onLinkClick","_sfc_main$5","NodeSettings","InputPanel","OutputPanel","NDVDraggablePanels","TriggerPanel","workflowActivate","ctx","override","isWebhookBasedNode","isPollingNode","outgoingConnections","parentNodeName","EXECUTABLE_TRIGGER_NODE_TYPES","BASE_NODE_SURVEY_URL","credentials","usedCredentials","foreignCredentials","EnterpriseEditionFeature","isTooltipVisible","pane","nodeTypeName","_component_el_dialog","showTriggerWaitingWarning","_component_n8n_icon","activeNodeType","onSwitchSelectedNode","_component_OutputPanel","outputRun","linked","blockUi","isProductionExecutionPreview","isOutputPaneActive","activateOutputPane","onLinkRunToOutput","onRunOutputIndexChange","openSettings","onOutputTableMounted","onOutputItemHover","onSearch","settingsEventBus","onWorkflowActivate","featureRequestUrl","showTriggerPanel","_component_TriggerPanel","_component_InputPanel","inputRun","isInputPaneActive","activateInputPane","onLinkRunToInput","onRunInputIndexChange","onInputTableMounted","onInputItemHover","contextMenu","dropdown","onActionSelect","onVisibleChange","createAddInputEndpointSpec","connectionName","color","multiple","NODE_CONNECTION_TYPE_ALLOW_MULTIPLE","createDiamondOutputEndpointSpec","getEndpointLabelLength","length","nodeBase","endpoint","canvas","nodeTypeData","rootTypeIndexData","typeIndexData","sortedInputs","a","b","inputConfiguration","rootCategoryInputName","rootTypeIndex","typeIndex","inputsOfSameRootType","thisInputName","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","deviceSupport","_sfc_main$3","TitledList","FontAwesomeIcon","workflowResultDataNode","eventTriggerDescription","classes","otherOutputs","spacerCount","mainOutputs","nodeExecutionRunData","executionRunData","lastNodeExecuted","waitDate","WAIT_TIME_UNLIMITED","returnStyles","borderColor","shouldShowTriggerTooltip","dataItemsCount","nodeSubtitle","CUSTOM_API_CALL_KEY","EnableNodeToggleCommand","_hoisted_17","_hoisted_19","_hoisted_20","_hoisted_21","_resolveDirective","isTouchActive","disablePointerEvents","_component_FontAwesomeIcon","hasIssues","hideNodeIssues","nodeIssues","waiting","showPinnedDataInfo","nodeExecutionStatus","workflowDataItems","_hoisted_14","showTriggerNodeTooltip","_hoisted_16","touchStart","showDisabledLinethrough","_directive_touch","_hoisted_18","nodeTitle","_hoisted_22","_hoisted_23","executeNode","_sfc_main$2","colorPopoverTrigger","forceActions","setForceActions","content","property","isString","isNumber","edit","link","isOnboardingNote","QUICKSTART_NOTE_NAME","isWelcomeVideo","height","dX","dY","_component_n8n_sticky","defaultText","isActive","gridSize","onEdit","onResize","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","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","itemsBySection","section","s","useNodeCreatorStore","STORES","selectedView","TRIGGER_NODE_CREATOR_VIEW","mergedNodes","showScrim","openSource","allNodeCreatorNodes","setMergeNodes","setActions","setShowScrim","isVisible","setSelectedView","view","setOpenSource","nodeCreatorStore","containerCssVars","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","nextTick","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","to","from","next","getNodeViewTab","MAIN_HEADER_TABS","confirmModal","PLACEHOLDER_EMPTY_WORKFLOW_ID","MODAL_CANCEL","nodeViewRootRef","nodeViewRef","dataSchema","canvasPanning","useGlobalLinkActions","useTitleChange","useExecutionDebugging","currentTab","nodeViewNotInitialized","workflowChanged","isOpeningTemplate","previousDirtyState","containsTrigger","newScale","err","vm","info","useTagsStore","useUsersStore","useEnvironmentsStore","useExternalSecretsStore","useCollaborationStore","usePushConnectionStore","NodeViewUtils.getBackgroundStyles","returnClasses","MANUAL_CHAT_TRIGGER_NODE_TYPE","NodeViewUtils.GRID_SIZE","NODE_CREATOR_OPEN_SOURCES","loadPromises","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","executionId","nodeErrorFound","errorCheck","NodeViewUtils.getFixedNodesList","templateId","tryToParseNumber","selectedExecution","tags","tagIds","tag","ctrlModifier","shiftModifier","ctrlAltModifier","noModifierKeys","lastSelectedNode","connections","parentNode","connectionsParent","siblingNode","lastCheckedNodePosition","nextSelectNode","ouputConnections","ouputConnection","nextStatePinned","pinnedDataForNode","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","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","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","newName","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","nodeInfos","nodesToBeFetched","nodeVersions","classNames","NodeViewUtils.addConnectionOutputSuccess","createNodeActive","nodeCreatorView","mode","dragAndDrop","currentPosition","openDetail","nodePosition","lastAddedNode","newNodesOffset","fromNode","toNode","lastNodeInputs","nodeUi","callback","suspend","isDisabled","canvasAddButtonStyle","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","isManualChatOnly","_component_KeyboardShortcutTooltip","workflowRunning","runButtonText","stopExecutionInProgress","executionWaitingForWebhook","allTriggersDisabled"],"ignoreList":[],"sources":["../../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/Feedback.vue","../../src/stores/ai.store.ts","../../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/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 type { XYPosition } from '@/Interface';\nimport {\n\tNOT_DUPLICATABE_NODE_TYPES,\n\tPIN_DATA_NODE_TYPES_DENYLIST,\n\tSTICKY_NODE_TYPE,\n} 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 { IActionDropdownItem } from 'n8n-design-system/src/components/N8nActionDropdown/ActionDropdown.vue';\nimport { NodeHelpers, NodeConnectionType } from 'n8n-workflow';\nimport type { INode, INodeTypeDescription } from 'n8n-workflow';\nimport { computed, ref, watch } from 'vue';\nimport { getMousePosition } from '../utils/nodeViewUtils';\nimport { useI18n } from './useI18n';\nimport { useDataSchema } from './useDataSchema';\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<IActionDropdownItem[]>([]);\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\tconst { getInputDataWithPinned } = useDataSchema();\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 canPinNode = (node: INode): boolean => {\n\t\tconst nodeType = nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\t\tconst dataToPin = getInputDataWithPinned(node);\n\t\tif (!nodeType || dataToPin.length === 0) return false;\n\t\treturn nodeType.outputs.length === 1 && !PIN_DATA_NODE_TYPES_DENYLIST.includes(node.type);\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 nonMainInputs = (node: INode) => {\n\t\t\t\tconst workflow = workflowsStore.getCurrentWorkflow();\n\t\t\t\tconst workflowNode = workflow.getNode(node.name);\n\t\t\t\tconst nodeType = nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\t\t\t\tconst inputs = NodeHelpers.getNodeInputs(workflow, workflowNode!, nodeType!);\n\t\t\t\tconst inputNames = NodeHelpers.getConnectionTypes(inputs);\n\n\t\t\t\treturn !!inputNames.find((inputName) => inputName !== NodeConnectionType.Main);\n\t\t\t};\n\n\t\t\tconst menuActions: IActionDropdownItem[] = [\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: nodes.some(nonMainInputs) || isReadOnly.value || !nodes.every(canPinNode),\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 IActionDropdownItem[];\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 ]\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 ];\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\"><NodeIcon :node-type=\"nodeType\" :size=\"18\" /></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 lang=\"ts\">\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n\tname: 'NodeTitle',\n\tcomponents: {\n\t\tNodeIcon,\n\t},\n\tprops: {\n\t\tmodelValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tnodeType: {},\n\t\treadOnly: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\teditName: false,\n\t\t\tnewName: '',\n\t\t};\n\t},\n\tcomputed: {\n\t\teditable(): boolean {\n\t\t\treturn !this.readOnly && window === window.parent;\n\t\t},\n\t},\n\tmethods: {\n\t\tasync onEdit() {\n\t\t\tthis.newName = this.modelValue;\n\t\t\tthis.editName = true;\n\t\t\tawait this.$nextTick();\n\t\t\tconst inputRef = this.$refs.input as HTMLInputElement | undefined;\n\t\t\tif (inputRef) {\n\t\t\t\tinputRef.focus();\n\t\t\t}\n\t\t},\n\t\tonRename() {\n\t\t\tif (this.newName.trim() !== '') {\n\t\t\t\tthis.$emit('update:modelValue', this.newName.trim());\n\t\t\t}\n\n\t\t\tthis.editName = false;\n\t\t},\n\t},\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<n8n-tabs\n\t\t:options=\"options\"\n\t\t:model-value=\"modelValue\"\n\t\t@update:modelValue=\"onTabSelect\"\n\t\t@tooltipClick=\"onTooltipClick\"\n\t/>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport {\n\tBUILTIN_NODES_DOCS_URL,\n\tCOMMUNITY_NODES_INSTALLATION_DOCS_URL,\n\tNPM_PACKAGE_DOCS_BASE_URL,\n} from '@/constants';\nimport type { INodeUi, ITab } from '@/Interface';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport { NodeConnectionType } from 'n8n-workflow';\n\nimport { isCommunityPackageName } from '@/utils/nodeTypesUtils';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\n\nexport default defineComponent({\n\tname: 'NodeSettingsTabs',\n\tprops: {\n\t\tmodelValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tnodeType: {},\n\t\tsessionId: {\n\t\t\ttype: String,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst externalHooks = useExternalHooks();\n\t\treturn {\n\t\t\texternalHooks,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNDVStore, useWorkflowsStore),\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tdocumentationUrl(): string {\n\t\t\tconst nodeType = this.nodeType as INodeTypeDescription | null;\n\n\t\t\tif (!nodeType) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tif (nodeType.documentationUrl && nodeType.documentationUrl.startsWith('http')) {\n\t\t\t\treturn nodeType.documentationUrl;\n\t\t\t}\n\n\t\t\tconst utmTags =\n\t\t\t\t'?utm_source=n8n_app&utm_medium=node_settings_modal-credential_link' +\n\t\t\t\t'&utm_campaign=' +\n\t\t\t\tnodeType.name;\n\n\t\t\t// Built-in node documentation available via its codex entry\n\t\t\tconst primaryDocUrl = nodeType.codex?.resources?.primaryDocumentation?.[0]?.url;\n\t\t\tif (primaryDocUrl) {\n\t\t\t\treturn primaryDocUrl + utmTags;\n\t\t\t}\n\n\t\t\tif (this.isCommunityNode) {\n\t\t\t\treturn `${NPM_PACKAGE_DOCS_BASE_URL}${nodeType.name.split('.')[0]}`;\n\t\t\t}\n\n\t\t\t// Fallback to the root of the node documentation\n\t\t\treturn BUILTIN_NODES_DOCS_URL + utmTags;\n\t\t},\n\t\tisCommunityNode(): boolean {\n\t\t\tconst nodeType = this.nodeType as INodeTypeDescription | null;\n\t\t\tif (nodeType) {\n\t\t\t\treturn isCommunityPackageName(nodeType.name);\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tpackageName(): string {\n\t\t\tconst nodeType = this.nodeType as INodeTypeDescription;\n\t\t\treturn nodeType.name.split('.')[0];\n\t\t},\n\t\toptions(): ITab[] {\n\t\t\tconst options: ITab[] = [\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('nodeSettings.parameters'),\n\t\t\t\t\tvalue: 'params',\n\t\t\t\t},\n\t\t\t];\n\t\t\tif (this.documentationUrl) {\n\t\t\t\toptions.push({\n\t\t\t\t\tlabel: this.$locale.baseText('nodeSettings.docs'),\n\t\t\t\t\tvalue: 'docs',\n\t\t\t\t\thref: this.documentationUrl,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (this.isCommunityNode) {\n\t\t\t\toptions.push({\n\t\t\t\t\ticon: 'cube',\n\t\t\t\t\tvalue: 'communityNode',\n\t\t\t\t\talign: 'right',\n\t\t\t\t\ttooltip: this.$locale.baseText('generic.communityNode.tooltip', {\n\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\tdocUrl: COMMUNITY_NODES_INSTALLATION_DOCS_URL,\n\t\t\t\t\t\t\tpackageName: this.packageName,\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// If both tabs have align right, both will have excessive left margin\n\t\t\tconst pushCogRight = this.isCommunityNode ? false : true;\n\t\t\toptions.push({\n\t\t\t\ticon: 'cog',\n\t\t\t\tvalue: 'settings',\n\t\t\t\talign: pushCogRight ? 'right' : undefined,\n\t\t\t});\n\n\t\t\treturn options;\n\t\t},\n\t},\n\tmethods: {\n\t\tonTabSelect(tab: string) {\n\t\t\tif (tab === 'docs' && this.nodeType) {\n\t\t\t\tvoid this.externalHooks.run('dataDisplay.onDocumentationUrlClick', {\n\t\t\t\t\tnodeType: this.nodeType as INodeTypeDescription,\n\t\t\t\t\tdocumentationUrl: this.documentationUrl,\n\t\t\t\t});\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\tsession_id: this.sessionId,\n\t\t\t\t\tpane: NodeConnectionType.Main,\n\t\t\t\t\ttype: 'docs',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (tab === 'settings' && this.nodeType) {\n\t\t\t\tthis.$telemetry.track('User viewed node settings', {\n\t\t\t\t\tnode_type: (this.nodeType as INodeTypeDescription).name,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (tab === 'settings' || tab === 'params') {\n\t\t\t\tthis.$emit('update:modelValue', tab);\n\t\t\t}\n\t\t},\n\t\tonTooltipClick(tab: string, event: MouseEvent) {\n\t\t\tif (tab === 'communityNode' && (event.target as Element).localName === 'a') {\n\t\t\t\tthis.$telemetry.track('user clicked cnr docs link', { source: 'node details view' });\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\">\n#communityNode > div {\n\tcursor: auto;\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\">\n\t\t\t\t\t\t\t\t{{ workflowHelpers.getWebhookExpressionValue(webhook, 'httpMethod') }}<br />\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 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\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\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'\"\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\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 } = useRunWorkflow({ router });\n\n\t\treturn {\n\t\t\texternalHooks,\n\t\t\tpinnedData,\n\t\t\trunWorkflow,\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) || triggeredNode === 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\tthis.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.isDNVDataEmpty('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\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\tsession_id: this.ndvStore.sessionId,\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:modelValue=\"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@stopExecution=\"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\tv-model=\"openPanel\"\n\t\t\t\t:node-type=\"nodeType\"\n\t\t\t\t:session-id=\"sessionId\"\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@valueChanged=\"valueChanged\"\n\t\t\t\t\t@activate=\"onWorkflowActivate\"\n\t\t\t\t\t@parameterBlur=\"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@credentialSelected=\"credentialSelected\"\n\t\t\t\t\t\t@valueChanged=\"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@valueChanged=\"valueChanged\"\n\t\t\t\t\t@parameterBlur=\"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@valueChanged=\"valueChanged\"\n\t\t\t\t\t@parameterBlur=\"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@switchSelectedNode=\"onSwitchSelectedNode\"\n\t\t\t@openConnectionNodeCreator=\"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} from 'n8n-workflow';\nimport { NodeHelpers, NodeConnectionType, deepCopy } 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\tIMPORT_CURL_MODAL_KEY,\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';\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\n\t\treturn {\n\t\t\texternalHooks,\n\t\t\tnodeHelpers,\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\tisCurlImportModalOpen(): boolean {\n\t\t\treturn this.uiStore.isModalOpen(IMPORT_CURL_MODAL_KEY);\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 isCommunityPackageName(this.node?.type);\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\treturn 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 })\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\tsessionId: {\n\t\t\ttype: String,\n\t\t},\n\t\tnodeType: {\n\t\t\ttype: Object as PropType<INodeTypeDescription>,\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',\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\tisCurlImportModalOpen(newValue, oldValue) {\n\t\t\tif (newValue === false) {\n\t\t\t\tlet parameters = this.uiStore.getHttpNodeParameters || '';\n\n\t\t\t\tif (!parameters) return;\n\n\t\t\t\ttry {\n\t\t\t\t\tparameters = JSON.parse(parameters) as {\n\t\t\t\t\t\t[key: string]: unknown;\n\t\t\t\t\t};\n\n\t\t\t\t\t//@ts-ignore\n\t\t\t\t\tthis.valueChanged({\n\t\t\t\t\t\tnode: this.node.name,\n\t\t\t\t\t\tname: 'parameters',\n\t\t\t\t\t\tvalue: parameters,\n\t\t\t\t\t});\n\n\t\t\t\t\tthis.uiStore.setHttpNodeParameters({ name: IMPORT_CURL_MODAL_KEY, parameters: '' });\n\t\t\t\t} catch {}\n\t\t\t}\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},\n\tbeforeUnmount() {\n\t\tthis.eventBus?.off('openSettings', this.openSettings);\n\t},\n\tmethods: {\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\tconst { [lastNamePart]: removedNodeValue, ...remainingNodeValues } = this.nodeValues;\n\t\t\t\t\tthis.nodeValues = remainingNodeValues;\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\tconst { [lastNamePart]: removedNodeValue, ...remainingNodeValues } = tempValue;\n\t\t\t\t\ttempValue = remainingNodeValues;\n\n\t\t\t\t\tif (isArray && (tempValue as INodeParameters[]).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\tconst { [lastNamePart]: removedArrayNodeValue, ...remainingArrayNodeValues } =\n\t\t\t\t\t\t\ttempValue;\n\t\t\t\t\t\ttempValue = remainingArrayNodeValues;\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\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\tfor (const parameterName of Object.keys(parameterData.value)) {\n\t\t\t\t\t//@ts-ignore\n\t\t\t\t\tnewValue = parameterData.value[parameterName];\n\n\t\t\t\t\t// Remove the 'parameters.' from the beginning to just have the\n\t\t\t\t\t// actual parameter name\n\t\t\t\t\tconst parameterPath = parameterName.split('.').slice(1).join('.');\n\n\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// the needed data like path and index\n\t\t\t\t\tconst parameterPathArray = parameterPath.match(/(.*)\\[(\\d+)\\]$/);\n\n\t\t\t\t\t// Apply the new value\n\t\t\t\t\t//@ts-ignore\n\t\t\t\t\tif (parameterData[parameterName] === undefined && parameterPathArray !== null) {\n\t\t\t\t\t\t// Delete array item\n\t\t\t\t\t\tconst path = parameterPathArray[1];\n\t\t\t\t\t\tconst index = parameterPathArray[2];\n\t\t\t\t\t\tconst data = get(nodeParameters, path);\n\n\t\t\t\t\t\tif (Array.isArray(data)) {\n\t\t\t\t\t\t\tdata.splice(parseInt(index, 10), 1);\n\t\t\t\t\t\t\tset(nodeParameters as object, path, data);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (newValue === undefined) {\n\t\t\t\t\t\t\tunset(nodeParameters as object, parameterPath);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tset(nodeParameters as object, parameterPath, newValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tvoid this.externalHooks.run('nodeSettings.valueChanged', {\n\t\t\t\t\t\tparameterPath,\n\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\tparameters: this.parameters,\n\t\t\t\t\t\toldNodeParameters,\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\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 should be hidden\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\t\t\t\t// Every value should be a possible option\n\t\t\t\tconst hasValidOptions = Object.keys(nodeParameterValues).every(\n\t\t\t\t\t(key) => (prop.options ?? []).find((option) => option.name === key) !== undefined,\n\t\t\t\t);\n\t\t\t\tif (\n\t\t\t\t\t!hasValidOptions ||\n\t\t\t\t\tshowCondition !== updatedParameter.value ||\n\t\t\t\t\thideCondition === updatedParameter.value\n\t\t\t\t) {\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},\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},\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@switchSelectedNode=\"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>,\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 type { PropType } from 'vue';\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 as PropType<string>,\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-background-base);\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 type { PropType } from 'vue';\n\nconst emit = defineEmits<{\n\t(e: 'update:modelValue', feedback: 'positive' | 'negative'): void;\n}>();\n\ndefineProps({\n\tmodelValue: {\n\t\ttype: String as PropType<'positive' | 'negative' | undefined>,\n\t\tdefault: undefined,\n\t},\n});\n\nconst i18n = useI18n();\n\nfunction onFeedback(feedback: 'positive' | 'negative') {\n\temit('update:modelValue', feedback);\n}\n</script>\n<template>\n\t<div class=\"feedback\">\n\t\t<N8nText v-if=\"!modelValue\" class=\"mr-2xs\">\n\t\t\t{{ i18n.baseText('feedback.title') }}\n\t\t</N8nText>\n\t\t<N8nText v-else :color=\"modelValue === 'positive' ? 'success' : 'danger'\">\n\t\t\t<FontAwesomeIcon\n\t\t\t\t:icon=\"modelValue === 'positive' ? 'thumbs-up' : 'thumbs-down'\"\n\t\t\t\tclass=\"mr-2xs\"\n\t\t\t/>\n\t\t\t{{ i18n.baseText(`feedback.${modelValue}`) }}\n\t\t</N8nText>\n\t\t<N8nTooltip v-if=\"!modelValue\" :content=\"i18n.baseText('feedback.positive')\">\n\t\t\t<span\n\t\t\t\tclass=\"feedback-button\"\n\t\t\t\tdata-test-id=\"feedback-button-positive\"\n\t\t\t\t@click=\"onFeedback('positive')\"\n\t\t\t>\n\t\t\t\t<FontAwesomeIcon icon=\"thumbs-up\" />\n\t\t\t</span>\n\t\t</N8nTooltip>\n\t\t<N8nTooltip v-if=\"!modelValue\" :content=\"i18n.baseText('feedback.negative')\">\n\t\t\t<span\n\t\t\t\tclass=\"feedback-button\"\n\t\t\t\tdata-test-id=\"feedback-button-negative\"\n\t\t\t\t@click=\"onFeedback('negative')\"\n\t\t\t>\n\t\t\t\t<FontAwesomeIcon icon=\"thumbs-down\" />\n\t\t\t</span>\n\t\t</N8nTooltip>\n\t</div>\n</template>\n\n<style lang=\"scss\">\n.feedback {\n\tdisplay: flex;\n\talign-items: center;\n\n\t.feedback-button {\n\t\tcursor: pointer;\n\t\twidth: var(--spacing-2xl);\n\t\theight: var(--spacing-2xl);\n\t\tdisplay: flex;\n\t\tjustify-content: center;\n\t\talign-items: center;\n\n\t\t&:hover {\n\t\t\tcolor: var(--color-primary);\n\t\t}\n\t}\n}\n</style>\n","import { defineStore } from 'pinia';\nimport * as aiApi from '@/api/ai';\nimport type { DebugErrorPayload } from '@/api/ai';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { computed } from 'vue';\n\nexport const useAIStore = defineStore('ai', () => {\n\tconst rootStore = useRootStore();\n\tconst settingsStore = useSettingsStore();\n\n\tconst isErrorDebuggingEnabled = computed(() => settingsStore.settings.ai.errorDebugging);\n\n\tasync function debugError(payload: DebugErrorPayload) {\n\t\treturn await aiApi.debugError(rootStore.getRestApiContext, payload);\n\t}\n\n\treturn { isErrorDebuggingEnabled, debugError };\n});\n","<script lang=\"ts\" setup>\nimport Feedback from '@/components/Feedback.vue';\nimport { useI18n } from '@/composables/useI18n';\nimport type { PropType } from 'vue';\nimport { computed, ref } from 'vue';\nimport { useTelemetry } from '@/composables/useTelemetry';\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 { useAIStore } from '@/stores/ai.store';\nimport { MAX_DISPLAY_DATA_SIZE } from '@/constants';\nimport VueMarkdown from 'vue-markdown-render';\nimport type { BaseTextKey } from '@/plugins/i18n';\n\nconst props = defineProps({\n\terror: {\n\t\ttype: Object as PropType<NodeError | NodeApiError | NodeOperationError>,\n\t\trequired: true,\n\t},\n});\n\nconst clipboard = useClipboard();\nconst toast = useToast();\nconst i18n = useI18n();\nconst telemetry = useTelemetry();\n\nconst nodeTypesStore = useNodeTypesStore();\nconst ndvStore = useNDVStore();\nconst rootStore = useRootStore();\nconst aiStore = useAIStore();\n\nconst isLoadingErrorDebugging = ref(false);\nconst errorDebuggingMessage = ref('');\nconst errorDebuggingFeedback = ref<'positive' | 'negative' | undefined>();\n\nconst isErrorDebuggingEnabled = computed(() => {\n\treturn aiStore.isErrorDebuggingEnabled;\n});\n\nconst showErrorDebuggingButton = computed(() => {\n\treturn (\n\t\tisErrorDebuggingEnabled.value && !(isLoadingErrorDebugging.value || errorDebuggingMessage.value)\n\t);\n});\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 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\nasync function onDebugError() {\n\ttry {\n\t\tisLoadingErrorDebugging.value = true;\n\t\tconst { message } = await aiStore.debugError({ error: props.error });\n\t\terrorDebuggingMessage.value = message;\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('generic.error'));\n\t} finally {\n\t\tisLoadingErrorDebugging.value = false;\n\t}\n}\n\nasync function onDebugErrorRegenerate() {\n\terrorDebuggingMessage.value = '';\n\terrorDebuggingFeedback.value = undefined;\n\tawait onDebugError();\n\ttelemetry.track('User regenerated error debugging AI hint', {\n\t\tnode_type: props.error.node?.type,\n\t\terror_title: props.error.message,\n\t});\n}\n\nasync function onErrorDebuggingFeedback(feedback: 'positive' | 'negative') {\n\ttelemetry.track('User responded error debugging AI hint', {\n\t\thelpful: feedback === 'positive',\n\t\tnode_type: props.error.node?.type,\n\t\terror_title: props.error.message,\n\t});\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 replacePlaceholders(parameter: string, message: string): string {\n\tconst parameterName = parameterDisplayName(parameter, false);\n\tconst parameterFullName = parameterDisplayName(parameter, true);\n\treturn message\n\t\t.replace(/%%PARAMETER%%/g, parameterName)\n\t\t.replace(/%%PARAMETER_FULL%%/g, parameterFullName);\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 sanitizeHtml(\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 sanitizeHtml(\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 sanitizeHtml(props.error.description ?? '');\n\t}\n\n\tconst parameterName = parameterDisplayName(props.error.context.parameter as string);\n\treturn sanitizeHtml(\n\t\t(props.error.context.descriptionTemplate as string).replace(/%%PARAMETER%%/g, parameterName),\n\t);\n}\n\nfunction getErrorMessage(): string {\n\tconst baseErrorMessage = '';\n\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\tconst baseErrorMessageSubNode = i18n.baseText('nodeErrorView.errorSubNode', {\n\t\t\tinterpolate: { node: props.error.node.name },\n\t\t});\n\t\treturn baseErrorMessageSubNode;\n\t}\n\n\tif (props.error.message === props.error.description) {\n\t\treturn baseErrorMessage;\n\t}\n\tif (!props.error.context?.messageTemplate) {\n\t\treturn baseErrorMessage + props.error.message;\n\t}\n\n\tconst parameterName = parameterDisplayName(props.error.context.parameter as string);\n\n\treturn (\n\t\tbaseErrorMessage +\n\t\t(props.error.context.messageTemplate as string).replace(/%%PARAMETER%%/g, parameterName)\n\t);\n}\n\nfunction parameterDisplayName(path: string, fullPath = true) {\n\ttry {\n\t\tconst params = parameterName(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 parameterName(\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...parameterName((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...parameterName((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\">\n\t\t\t\t<div :class=\"showErrorDebuggingButton ? 'mt-4xs' : ''\">\n\t\t\t\t\t{{ getErrorMessage() }}\n\t\t\t\t</div>\n\t\t\t\t<N8nButton\n\t\t\t\t\tv-if=\"showErrorDebuggingButton\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t@click=\"onDebugError\"\n\t\t\t\t>\n\t\t\t\t\t{{ i18n.baseText('nodeErrorView.debugError.button') }}\n\t\t\t\t</N8nButton>\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\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<N8nCard\n\t\t\tv-if=\"isLoadingErrorDebugging || errorDebuggingMessage\"\n\t\t\tclass=\"node-error-view__debugging mb-s\"\n\t\t>\n\t\t\t<span v-if=\"isLoadingErrorDebugging\">\n\t\t\t\t<N8nSpinner class=\"mr-3xs\" />\n\t\t\t\t{{ i18n.baseText('nodeErrorView.debugError.loading') }}\n\t\t\t</span>\n\t\t\t<VueMarkdown v-else :source=\"errorDebuggingMessage\" />\n\n\t\t\t<div v-if=\"errorDebuggingMessage\" class=\"node-error-view__feedback-toolbar\">\n\t\t\t\t<Feedback v-model=\"errorDebuggingFeedback\" @update:model-value=\"onErrorDebuggingFeedback\" />\n\t\t\t\t<N8nTooltip :content=\"i18n.baseText('nodeErrorView.debugError.feedback.reload')\">\n\t\t\t\t\t<span class=\"node-error-view__feedback-button\" @click=\"onDebugErrorRegenerate\">\n\t\t\t\t\t\t<FontAwesomeIcon icon=\"sync-alt\" />\n\t\t\t\t\t</span>\n\t\t\t\t</N8nTooltip>\n\t\t\t</div>\n\t\t</N8nCard>\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:modelValue=\"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:modelValue=\"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<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:modelValue=\"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@update:modelValue=\"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\n\t\t\t\t\t:error=\"workflowRunData[node.name][runIndex].error\"\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@activeRowChanged=\"onItemHover\"\n\t\t\t\t\t@displayModeChange=\"onDisplayModeChange\"\n\t\t\t\t/>\n\t\t\t</Suspense>\n\n\t\t\t<Suspense v-else-if=\"hasNodeRun && displayMode === 'json'\">\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:sessio-id=\"sessionId\"\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=\"inputDataPage[0].json.html\" />\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:modelValue=\"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} 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 } 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\tdefault: null,\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\tsessionId: {\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},\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,\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\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\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\t// Only \"main\" inputs can pin data\n\n\t\t\tif (this.node === null) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst workflow = this.workflowsStore.getCurrentWorkflow();\n\t\t\tconst workflowNode = workflow.getNode(this.node.name);\n\t\t\tconst inputs = NodeHelpers.getNodeInputs(workflow, workflowNode!, this.nodeType!);\n\t\t\tconst inputNames = NodeHelpers.getConnectionTypes(inputs);\n\n\t\t\tconst nonMainInputs = !!inputNames.find((inputName) => inputName !== NodeConnectionType.Main);\n\n\t\t\treturn (\n\t\t\t\t!nonMainInputs &&\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(): Error | null {\n\t\t\treturn this.workflowsStore.subWorkflowExecutionError;\n\t\t},\n\t\thasSubworkflowExecutionError(): boolean {\n\t\t\treturn Boolean(this.subworkflowExecutionError);\n\t\t},\n\t\thasRunError(): boolean {\n\t\t\treturn Boolean(this.node && this.workflowRunData?.[this.node.name]?.[this.runIndex]?.error);\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\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 })\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 });\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},\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\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\tsession_id: this.sessionId,\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 data = inputData.length > 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\tsession_id: this.sessionId,\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\tsession_id: this.sessionId,\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 }) {\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\tsession_id: this.sessionId,\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\tsession_id: this.sessionId,\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\tsession_id: this.sessionId,\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) {\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\tsession_id: this.sessionId,\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\tsession_id: this.sessionId,\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\tsession_id: this.sessionId,\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 }))\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 ];\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): 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): 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) {\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) {\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};\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\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});\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</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\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:session-id=\"sessionId\"\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@activatePane=\"activatePane\"\n\t\t@runChange=\"onRunIndexChange\"\n\t\t@linkRun=\"onLinkRun\"\n\t\t@unlinkRun=\"onUnlinkRun\"\n\t\t@tableMounted=\"$emit('tableMounted', $event)\"\n\t\t@itemHover=\"$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:modelValue=\"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.value\">\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'\" #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};\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\tsessionId: {\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 | null {\n\t\t\treturn this.ndvStore.activeNode;\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.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 || !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;\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\tsession_id: this.sessionId,\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\tsession_id: this.sessionId,\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: (typeof OUTPUT_TYPE)[string]) {\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\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:session-id=\"sessionId\"\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@activatePane=\"activatePane\"\n\t\t@itemHover=\"$emit('itemHover', $event)\"\n\t\t@linkRun=\"onLinkRun\"\n\t\t@unlinkRun=\"onUnlinkRun\"\n\t\t@runChange=\"onRunIndexChange\"\n\t\t@tableMounted=\"$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:modelValue=\"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) }} </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:modelValue=\"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:modelValue=\"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\tsessionId: {\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\tsession_id: this.sessionId,\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\tsession_id: this.sessionId,\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> \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\tsessionId: {\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\treturn this.workflowHelpers.getWebhookExpressionValue(\n\t\t\t\tthis.nodeType.webhooks[0],\n\t\t\t\t'httpMethod',\n\t\t\t);\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\tsession_id: this.sessionId,\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\tsession_id: this.sessionId,\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@switchSelectedNode=\"onSwitchSelectedNode\"\n\t\t\t\t@openConnectionNodeCreator=\"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:session-id=\"sessionId\"\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:session-id=\"sessionId\"\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@activatePane=\"activateInputPane\"\n\t\t\t\t\t\t@linkRun=\"onLinkRunToInput\"\n\t\t\t\t\t\t@unlinkRun=\"() => onUnlinkRun('input')\"\n\t\t\t\t\t\t@runChange=\"onRunInputIndexChange\"\n\t\t\t\t\t\t@openSettings=\"openSettings\"\n\t\t\t\t\t\t@changeInputNode=\"onInputNodeChange\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\t@tableMounted=\"onInputTableMounted\"\n\t\t\t\t\t\t@itemHover=\"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:session-id=\"sessionId\"\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@activatePane=\"activateOutputPane\"\n\t\t\t\t\t\t@linkRun=\"onLinkRunToOutput\"\n\t\t\t\t\t\t@unlinkRun=\"() => onUnlinkRun('output')\"\n\t\t\t\t\t\t@runChange=\"onRunOutputIndexChange\"\n\t\t\t\t\t\t@openSettings=\"openSettings\"\n\t\t\t\t\t\t@tableMounted=\"onOutputTableMounted\"\n\t\t\t\t\t\t@itemHover=\"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:session-id=\"sessionId\"\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@valueChanged=\"valueChanged\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\t@stopExecution=\"onStopExecution\"\n\t\t\t\t\t\t@redrawRequired=\"redrawRequired = true\"\n\t\t\t\t\t\t@activate=\"onWorkflowActivate\"\n\t\t\t\t\t\t@switchSelectedNode=\"onSwitchSelectedNode\"\n\t\t\t\t\t\t@openConnectionNodeCreator=\"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 } from 'vue';\nimport { mapStores, storeToRefs } from 'pinia';\nimport { createEventBus } from 'n8n-design-system/utils';\nimport type {\n\tINodeConnections,\n\tINodeTypeDescription,\n\tIRunData,\n\tIRunExecutionData,\n\tWorkflow,\n\tConnectionTypes,\n} from 'n8n-workflow';\nimport { jsonParse, NodeHelpers, NodeConnectionType } from 'n8n-workflow';\nimport type { IExecutionResponse, INodeUi, 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 { workflowActivate } from '@/mixins/workflowActivate';\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';\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\tmixins: [workflowActivate],\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\tsetup(props, ctx) {\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\n\t\treturn {\n\t\t\texternalHooks,\n\t\t\tnodeHelpers,\n\t\t\tpinnedData,\n\t\t\tworkflowHelpers,\n\t\t\t...useDeviceSupport(),\n\t\t\t...useMessage(),\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\t\t\t...workflowActivate.setup?.(props, ctx),\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tsettingsEventBus: createEventBus(),\n\t\t\tredrawRequired: false,\n\t\t\trunInputIndex: -1,\n\t\t\trunOutputIndex: -1,\n\t\t\tisLinkingEnabled: true,\n\t\t\tselectedInput: undefined as string | undefined,\n\t\t\ttriggerWaitingWarningEnabled: false,\n\t\t\tisDragging: false,\n\t\t\tmainPanelPosition: 0,\n\t\t\tpinDataDiscoveryTooltipVisible: false,\n\t\t\tavgInputRowHeight: 0,\n\t\t\tavgOutputRowHeight: 0,\n\t\t\tisInputPaneActive: false,\n\t\t\tisOutputPaneActive: false,\n\t\t\tisPairedItemHoveringEnabled: true,\n\t\t};\n\t},\n\tmounted() {\n\t\tdataPinningEventBus.on('data-pinning-discovery', this.setIsTooltipVisible);\n\t},\n\tbeforeUnmount() {\n\t\tdataPinningEventBus.off('data-pinning-discovery', this.setIsTooltipVisible);\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useUIStore, useWorkflowsStore, useSettingsStore),\n\t\tsessionId(): string {\n\t\t\treturn this.ndvStore.sessionId;\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tshowTriggerWaitingWarning(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.triggerWaitingWarningEnabled &&\n\t\t\t\t!!this.activeNodeType &&\n\t\t\t\t!this.activeNodeType.group.includes('trigger') &&\n\t\t\t\tthis.workflowRunning &&\n\t\t\t\tthis.workflowsStore.executionWaitingForWebhook\n\t\t\t);\n\t\t},\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tinputNodeName(): string | undefined {\n\t\t\treturn this.selectedInput || this.parentNode;\n\t\t},\n\t\tinputNode(): INodeUi | null {\n\t\t\tif (this.inputNodeName) {\n\t\t\t\treturn this.workflowsStore.getNodeByName(this.inputNodeName);\n\t\t\t}\n\n\t\t\treturn null;\n\t\t},\n\t\tactiveNodeType(): INodeTypeDescription | null {\n\t\t\tif (this.activeNode) {\n\t\t\t\treturn this.nodeTypesStore.getNodeType(this.activeNode.type, this.activeNode.typeVersion);\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tshowTriggerPanel(): boolean {\n\t\t\tconst override = !!this.activeNodeType?.triggerPanel;\n\t\t\tif (typeof this.activeNodeType?.triggerPanel === 'boolean') {\n\t\t\t\treturn override;\n\t\t\t}\n\n\t\t\tconst isWebhookBasedNode = !!this.activeNodeType?.webhooks?.length;\n\t\t\tconst isPollingNode = this.activeNodeType?.polling;\n\n\t\t\treturn (\n\t\t\t\t!this.readOnly && this.isTriggerNode && (isWebhookBasedNode || isPollingNode || override)\n\t\t\t);\n\t\t},\n\t\tworkflow(): Workflow {\n\t\t\treturn this.workflowHelpers.getCurrentWorkflow();\n\t\t},\n\t\thasOutputConnection() {\n\t\t\tif (!this.activeNode) return false;\n\t\t\tconst outgoingConnections = this.workflowsStore.outgoingConnectionsByNodeName(\n\t\t\t\tthis.activeNode.name,\n\t\t\t) as INodeConnections;\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\t\tparentNodes(): string[] {\n\t\t\tif (this.activeNode) {\n\t\t\t\treturn (\n\t\t\t\t\tthis.workflow.getParentNodesByDepth(this.activeNode.name, 1).map(({ name }) => name) || []\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn [];\n\t\t},\n\t\tparentNode(): string | undefined {\n\t\t\t// Return the first parent node that contains data\n\t\t\tfor (const parentNodeName of this.parentNodes) {\n\t\t\t\t// Check first for pinned data\n\t\t\t\tif (this.workflowsStore.pinnedWorkflowData[parentNodeName]) {\n\t\t\t\t\treturn parentNodeName;\n\t\t\t\t}\n\n\t\t\t\t// Check then the data of the current execution\n\t\t\t\tif (this.workflowRunData?.[parentNodeName]) {\n\t\t\t\t\treturn parentNodeName;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this.parentNodes[0];\n\t\t},\n\t\tisExecutableTriggerNode(): boolean {\n\t\t\tif (!this.activeNodeType) return false;\n\n\t\t\treturn EXECUTABLE_TRIGGER_NODE_TYPES.includes(this.activeNodeType.name);\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\treturn (\n\t\t\t\t!!this.activeNodeType &&\n\t\t\t\t(this.activeNodeType.group.includes('trigger') ||\n\t\t\t\t\tthis.activeNodeType.name === START_NODE_TYPE)\n\t\t\t);\n\t\t},\n\t\tisActiveStickyNode(): boolean {\n\t\t\treturn !!this.ndvStore.activeNode && this.ndvStore.activeNode.type === STICKY_NODE_TYPE;\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\tmaxOutputRun(): number {\n\t\t\tif (this.activeNode === 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.activeNode.name)) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[this.activeNode.name].length) {\n\t\t\t\treturn runData[this.activeNode.name].length - 1;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t},\n\t\toutputRun(): number {\n\t\t\tif (this.runOutputIndex === -1) {\n\t\t\t\treturn this.maxOutputRun;\n\t\t\t}\n\n\t\t\treturn Math.min(this.runOutputIndex, this.maxOutputRun);\n\t\t},\n\t\tmaxInputRun(): number {\n\t\t\tif (this.inputNode === null || this.activeNode === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst workflowNode = this.workflow.getNode(this.activeNode.name);\n\t\t\tconst outputs = NodeHelpers.getNodeOutputs(this.workflow, workflowNode, this.activeNodeType);\n\n\t\t\tlet node = this.inputNode;\n\n\t\t\tconst runData: IRunData | null = this.workflowRunData;\n\n\t\t\tif (outputs.some((output) => output !== NodeConnectionType.Main)) {\n\t\t\t\tnode = this.activeNode;\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\t\tinputRun(): number {\n\t\t\tif (this.isLinkingEnabled && this.maxOutputRun === this.maxInputRun) {\n\t\t\t\treturn this.outputRun;\n\t\t\t}\n\t\t\tif (this.runInputIndex === -1) {\n\t\t\t\treturn this.maxInputRun;\n\t\t\t}\n\n\t\t\treturn Math.min(this.runInputIndex, this.maxInputRun);\n\t\t},\n\t\tcanLinkRuns(): boolean {\n\t\t\treturn this.maxOutputRun > 0 && this.maxOutputRun === this.maxInputRun;\n\t\t},\n\t\tlinked(): boolean {\n\t\t\treturn this.isLinkingEnabled && this.canLinkRuns;\n\t\t},\n\t\tinputPanelMargin(): number {\n\t\t\treturn this.isTriggerNode ? 0 : 80;\n\t\t},\n\t\tfeatureRequestUrl(): string {\n\t\t\tif (!this.activeNodeType) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\treturn `${BASE_NODE_SURVEY_URL}${this.activeNodeType.name}`;\n\t\t},\n\t\toutputPanelEditMode(): { enabled: boolean; value: string } {\n\t\t\treturn this.ndvStore.outputPanelEditMode;\n\t\t},\n\t\tisWorkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tisExecutionWaitingForWebhook(): boolean {\n\t\t\treturn this.workflowsStore.executionWaitingForWebhook;\n\t\t},\n\t\tblockUi(): boolean {\n\t\t\treturn this.isWorkflowRunning || this.isExecutionWaitingForWebhook;\n\t\t},\n\t\tforeignCredentials(): string[] {\n\t\t\tconst credentials = (this.activeNode || {}).credentials;\n\t\t\tconst usedCredentials = this.workflowsStore.usedCredentials;\n\n\t\t\tconst foreignCredentials: string[] = [];\n\t\t\tif (\n\t\t\t\tcredentials &&\n\t\t\t\tthis.settingsStore.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\tforeignCredentials.push(credential.id);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn foreignCredentials;\n\t\t},\n\t\thasForeignCredential(): boolean {\n\t\t\treturn this.foreignCredentials.length > 0;\n\t\t},\n\t},\n\twatch: {\n\t\tactiveNode(node: INodeUi | null, oldNode: INodeUi | null) {\n\t\t\tif (node && node.name !== oldNode?.name && !this.isActiveStickyNode) {\n\t\t\t\tthis.runInputIndex = -1;\n\t\t\t\tthis.runOutputIndex = -1;\n\t\t\t\tthis.isLinkingEnabled = true;\n\t\t\t\tthis.selectedInput = undefined;\n\t\t\t\tthis.triggerWaitingWarningEnabled = false;\n\t\t\t\tthis.avgOutputRowHeight = 0;\n\t\t\t\tthis.avgInputRowHeight = 0;\n\n\t\t\t\tsetTimeout(() => this.ndvStore.setNDVSessionId(), 0);\n\t\t\t\tvoid this.externalHooks.run('dataDisplay.nodeTypeChanged', {\n\t\t\t\t\tnodeSubtitle: this.nodeHelpers.getNodeSubtitle(\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\tthis.activeNodeType,\n\t\t\t\t\t\tthis.workflowHelpers.getCurrentWorkflow(),\n\t\t\t\t\t),\n\t\t\t\t});\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (this.activeNode) {\n\t\t\t\t\t\tconst outgoingConnections = this.workflowsStore.outgoingConnectionsByNodeName(\n\t\t\t\t\t\t\tthis.activeNode.name,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tthis.$telemetry.track('User opened node modal', {\n\t\t\t\t\t\t\tnode_type: this.activeNodeType ? this.activeNodeType.name : '',\n\t\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\t\tsession_id: this.sessionId,\n\t\t\t\t\t\t\tis_editable: !this.hasForeignCredential,\n\t\t\t\t\t\t\tparameters_pane_position: this.mainPanelPosition,\n\t\t\t\t\t\t\tinput_first_connector_runs: this.maxInputRun,\n\t\t\t\t\t\t\toutput_first_connector_runs: this.maxOutputRun,\n\t\t\t\t\t\t\tselected_view_inputs: this.isTriggerNode\n\t\t\t\t\t\t\t\t? 'trigger'\n\t\t\t\t\t\t\t\t: this.ndvStore.inputPanelDisplayMode,\n\t\t\t\t\t\t\tselected_view_outputs: this.ndvStore.outputPanelDisplayMode,\n\t\t\t\t\t\t\tinput_connectors: this.parentNodes.length,\n\t\t\t\t\t\t\toutput_connectors: outgoingConnections?.main?.length,\n\t\t\t\t\t\t\tinput_displayed_run_index: this.inputRun,\n\t\t\t\t\t\t\toutput_displayed_run_index: this.outputRun,\n\t\t\t\t\t\t\tdata_pinning_tooltip_presented: this.pinDataDiscoveryTooltipVisible,\n\t\t\t\t\t\t\tinput_displayed_row_height_avg: this.avgInputRowHeight,\n\t\t\t\t\t\t\toutput_displayed_row_height_avg: this.avgOutputRowHeight,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}, 2000); // wait for RunData to mount and present pindata discovery tooltip\n\t\t\t}\n\t\t\tif (window.top && !this.isActiveStickyNode) {\n\t\t\t\twindow.top.postMessage(JSON.stringify({ command: node ? 'openNDV' : 'closeNDV' }), '*');\n\t\t\t}\n\t\t},\n\t\tmaxOutputRun() {\n\t\t\tthis.runOutputIndex = -1;\n\t\t},\n\t\tmaxInputRun() {\n\t\t\tthis.runInputIndex = -1;\n\t\t},\n\t\tinputNodeName(nodeName: string | undefined) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.ndvStore.setInputNodeName(nodeName);\n\t\t\t}, 0);\n\t\t},\n\t\tinputRun() {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.ndvStore.setInputRunIndex(this.inputRun);\n\t\t\t}, 0);\n\t\t},\n\t},\n\tmethods: {\n\t\tsetIsTooltipVisible({ isTooltipVisible }: { isTooltipVisible: boolean }) {\n\t\t\tthis.pinDataDiscoveryTooltipVisible = isTooltipVisible;\n\t\t},\n\t\tonKeyDown(e: KeyboardEvent) {\n\t\t\tif (e.key === 's' && this.isCtrlKeyPressed(e)) {\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tif (this.readOnly) return;\n\n\t\t\t\tthis.$emit('saveKeyboardShortcut', e);\n\t\t\t}\n\t\t},\n\t\tonInputItemHover(e: { itemIndex: number; outputIndex: number } | null) {\n\t\t\tif (e === null || !this.inputNodeName || !this.isPairedItemHoveringEnabled) {\n\t\t\t\tthis.ndvStore.setHoveringItem(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst item: TargetItem = {\n\t\t\t\tnodeName: this.inputNodeName,\n\t\t\t\trunIndex: this.inputRun,\n\t\t\t\toutputIndex: e.outputIndex,\n\t\t\t\titemIndex: e.itemIndex,\n\t\t\t};\n\t\t\tthis.ndvStore.setHoveringItem(item);\n\t\t},\n\t\tonOutputItemHover(e: { itemIndex: number; outputIndex: number } | null) {\n\t\t\tif (e === null || !this.activeNode || !this.isPairedItemHoveringEnabled) {\n\t\t\t\tthis.ndvStore.setHoveringItem(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst item: TargetItem = {\n\t\t\t\tnodeName: this.activeNode.name,\n\t\t\t\trunIndex: this.outputRun,\n\t\t\t\toutputIndex: e.outputIndex,\n\t\t\t\titemIndex: e.itemIndex,\n\t\t\t};\n\t\t\tthis.ndvStore.setHoveringItem(item);\n\t\t},\n\t\tonInputTableMounted(e: { avgRowHeight: number }) {\n\t\t\tthis.avgInputRowHeight = e.avgRowHeight;\n\t\t},\n\t\tonOutputTableMounted(e: { avgRowHeight: number }) {\n\t\t\tthis.avgOutputRowHeight = e.avgRowHeight;\n\t\t},\n\t\tonWorkflowActivate() {\n\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\tsetTimeout(() => {\n\t\t\t\tvoid this.activateCurrentWorkflow('ndv');\n\t\t\t}, 1000);\n\t\t},\n\t\tonFeatureRequestClick() {\n\t\t\twindow.open(this.featureRequestUrl, '_blank');\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\tsession_id: this.sessionId,\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\t\tonPanelsInit(e: { position: number }) {\n\t\t\tthis.mainPanelPosition = e.position;\n\t\t},\n\t\tonDragStart(e: { position: number }) {\n\t\t\tthis.isDragging = true;\n\t\t\tthis.mainPanelPosition = e.position;\n\t\t},\n\t\tonDragEnd(e: { windowWidth: number; position: number }) {\n\t\t\tthis.isDragging = false;\n\t\t\tthis.$telemetry.track('User moved parameters pane', {\n\t\t\t\twindow_width: e.windowWidth,\n\t\t\t\tstart_position: this.mainPanelPosition,\n\t\t\t\tend_position: e.position,\n\t\t\t\tnode_type: this.activeNodeType ? this.activeNodeType.name : '',\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\t\t\tthis.mainPanelPosition = e.position;\n\t\t},\n\t\tonLinkRunToInput() {\n\t\t\tthis.runOutputIndex = this.runInputIndex;\n\t\t\tthis.isLinkingEnabled = true;\n\t\t\tthis.trackLinking('input');\n\t\t},\n\t\tonLinkRunToOutput() {\n\t\t\tthis.isLinkingEnabled = true;\n\t\t\tthis.trackLinking('output');\n\t\t},\n\t\tonUnlinkRun(pane: string) {\n\t\t\tthis.runInputIndex = this.runOutputIndex;\n\t\t\tthis.isLinkingEnabled = false;\n\t\t\tthis.trackLinking(pane);\n\t\t},\n\t\ttrackLinking(pane: string) {\n\t\t\tthis.$telemetry.track('User changed ndv run linking', {\n\t\t\t\tnode_type: this.activeNodeType ? this.activeNodeType.name : '',\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tlinked: this.linked,\n\t\t\t\tpane,\n\t\t\t});\n\t\t},\n\t\tonNodeExecute() {\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (!this.activeNode || !this.workflowRunning) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.triggerWaitingWarningEnabled = true;\n\t\t\t}, 1000);\n\t\t},\n\t\topenSettings() {\n\t\t\tthis.settingsEventBus.emit('openSettings');\n\t\t},\n\t\tvalueChanged(parameterData: IUpdateInformation) {\n\t\t\tthis.$emit('valueChanged', parameterData);\n\t\t},\n\t\tnodeTypeSelected(nodeTypeName: string) {\n\t\t\tthis.$emit('nodeTypeSelected', nodeTypeName);\n\t\t},\n\t\tonSwitchSelectedNode(nodeTypeName: string) {\n\t\t\tthis.$emit('switchSelectedNode', nodeTypeName);\n\t\t},\n\t\tonOpenConnectionNodeCreator(nodeTypeName: string, connectionType: ConnectionTypes) {\n\t\t\tthis.$emit('openConnectionNodeCreator', nodeTypeName, connectionType);\n\t\t},\n\t\tasync close() {\n\t\t\tif (this.isDragging) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.activeNode &&\n\t\t\t\t(typeof this.activeNodeType?.outputs === 'string' ||\n\t\t\t\t\ttypeof this.activeNodeType?.inputs === 'string' ||\n\t\t\t\t\tthis.redrawRequired)\n\t\t\t) {\n\t\t\t\t// TODO: We should keep track of if it actually changed and only do if required\n\t\t\t\t// Whenever a node with custom inputs and outputs gets closed redraw it in case\n\t\t\t\t// they changed\n\t\t\t\tconst nodeName = this.activeNode.name;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.$emit('redrawNode', nodeName);\n\t\t\t\t}, 1);\n\t\t\t}\n\n\t\t\tif (this.outputPanelEditMode.enabled && this.activeNode) {\n\t\t\t\tconst shouldPinDataBeforeClosing = await this.confirm(\n\t\t\t\t\t'',\n\t\t\t\t\tthis.$locale.baseText('ndv.pinData.beforeClosing.title'),\n\t\t\t\t\t{\n\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText('ndv.pinData.beforeClosing.confirm'),\n\t\t\t\t\t\tcancelButtonText: this.$locale.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 } = this.outputPanelEditMode;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.pinnedData.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\tthis.ndvStore.setOutputPanelEditModeEnabled(false);\n\t\t\t}\n\n\t\t\tawait this.externalHooks.run('dataDisplay.nodeEditingFinished');\n\t\t\tthis.$telemetry.track('User closed node modal', {\n\t\t\t\tnode_type: this.activeNodeType ? this.activeNodeType.name : '',\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\t\t\tthis.triggerWaitingWarningEnabled = false;\n\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\tthis.ndvStore.resetNDVSessionId();\n\t\t},\n\t\tonRunOutputIndexChange(run: number) {\n\t\t\tthis.runOutputIndex = run;\n\t\t\tthis.trackRunChange(run, 'output');\n\t\t},\n\t\tonRunInputIndexChange(run: number) {\n\t\t\tthis.runInputIndex = run;\n\t\t\tif (this.linked) {\n\t\t\t\tthis.runOutputIndex = run;\n\t\t\t}\n\t\t\tthis.trackRunChange(run, 'input');\n\t\t},\n\t\ttrackRunChange(run: number, pane: string) {\n\t\t\tthis.$telemetry.track('User changed ndv run dropdown', {\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\trun_index: run,\n\t\t\t\tnode_type: this.activeNodeType ? this.activeNodeType.name : '',\n\t\t\t\tpane,\n\t\t\t});\n\t\t},\n\t\tonInputNodeChange(value: string, index: number) {\n\t\t\tthis.runInputIndex = -1;\n\t\t\tthis.isLinkingEnabled = true;\n\t\t\tthis.selectedInput = value;\n\n\t\t\tthis.$telemetry.track('User changed ndv input dropdown', {\n\t\t\t\tnode_type: this.activeNode ? this.activeNode.type : '',\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tselection_value: index,\n\t\t\t\tinput_node_type: this.inputNode ? this.inputNode.type : '',\n\t\t\t});\n\t\t},\n\t\tonStopExecution() {\n\t\t\tthis.$emit('stopExecution');\n\t\t},\n\t\tactivateInputPane() {\n\t\t\tthis.isInputPaneActive = true;\n\t\t\tthis.isOutputPaneActive = false;\n\t\t},\n\t\tactivateOutputPane() {\n\t\t\tthis.isInputPaneActive = false;\n\t\t\tthis.isOutputPaneActive = true;\n\t\t},\n\t\tonSearch(search: string) {\n\t\t\tthis.isPairedItemHoveringEnabled = !search;\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@visibleChange=\"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(--node-error-output-color)',\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\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=\"nodeType\"\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\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\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 (\n\t\t\t\tthis.nodeExecutionStatus &&\n\t\t\t\t['crashed', 'error', 'failed'].includes(this.nodeExecutionStatus)\n\t\t\t)\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\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\treturn this.nodeTypesStore.isConfigNode(this.workflow, this.data, this.data?.type ?? '');\n\t\t},\n\t\tisConfigurableNode(): boolean {\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(): object {\n\t\t\tconst classes = {\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(): object {\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(): object {\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},\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\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\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.isModalActive ||\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\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(event: 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(--node-error-output-color);\n\t\t}\n\t\trect {\n\t\t\tstroke: var(--node-error-output-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(--node-error-output-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:modelValue=\"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.deleteNode')\"\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 ? 'templates'\n\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: NodeViewItemSection[],\n): INodeCreateElement[] {\n\tconst itemsBySection = items.reduce((acc: Record<string, INodeCreateElement[]>, item) => {\n\t\tconst section = sections.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[] = sections\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 clics 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","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\ttag?: string;\n\t\tforceIncludeNodes?: string[];\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 }\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(nodes: SimplifiedNodeType[]) {\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?: 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: NodeViewItem | { properties: { title: string; icon: string } } | 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=\"showTriggerCreator(NODE_CREATOR_OPEN_SOURCES.TRIGGER_PLACEHOLDER_BUTTON)\"\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@deselectAllNodes=\"deselectAllNodes\"\n\t\t\t\t\t\t@deselectNode=\"nodeDeselectedByName\"\n\t\t\t\t\t\t@nodeSelected=\"nodeSelectedByName\"\n\t\t\t\t\t\t@runWorkflow=\"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@removeNode=\"(name) => removeNode(name, true)\"\n\t\t\t\t\t\t@toggleDisableNode=\"(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@deselectAllNodes=\"deselectAllNodes\"\n\t\t\t\t\t\t@deselectNode=\"nodeDeselectedByName\"\n\t\t\t\t\t\t@nodeSelected=\"nodeSelectedByName\"\n\t\t\t\t\t\t@removeNode=\"(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@redrawNode=\"redrawNode\"\n\t\t\t\t@switchSelectedNode=\"onSwitchSelectedNode\"\n\t\t\t\t@openConnectionNodeCreator=\"onOpenConnectionNodeCreator\"\n\t\t\t\t@valueChanged=\"valueChanged\"\n\t\t\t\t@stopExecution=\"stopExecution\"\n\t\t\t\t@saveKeyboardShortcut=\"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@toggleNodeCreator=\"onToggleNodeCreator\"\n\t\t\t\t\t@addNodes=\"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<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} 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 { 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\tIRun,\n\tITaskData,\n\tITelemetryTrackProperties,\n\tIWorkflowBase,\n\tWorkflow,\n\tConnectionTypes,\n\tINodeOutputConfiguration,\n} from 'n8n-workflow';\nimport {\n\tdeepCopy,\n\tjsonParse,\n\tNodeConnectionType,\n\tNodeHelpers,\n\tTelemetryHelpers,\n} from 'n8n-workflow';\nimport type {\n\tICredentialsResponse,\n\tIExecutionResponse,\n\tIWorkflowDb,\n\tIWorkflowData,\n\tINodeUi,\n\tIUpdateInformation,\n\tIWorkflowDataUpdate,\n\tXYPosition,\n\tIPushDataExecutionFinished,\n\tITag,\n\tINewWorkflowData,\n\tIWorkflowTemplate,\n\tIWorkflowToShare,\n\tIUser,\n\tINodeUpdatePropertiesInformation,\n\tNodeCreatorOpenSource,\n\tAddedNodesAndConnections,\n\tToggleNodeCreatorOptions,\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 { useCanvasPanning } from '@/composables/useCanvasPanning';\nimport { tryToParseNumber } from '@/utils/typesUtils';\nimport { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';\nimport { useRunWorkflow } from '@/composables/useRunWorkflow';\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},\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 } = 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\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 Promise.all([this.loadCredentials(), 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),\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\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},\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\t\twindow.addEventListener('message', this.onPostMessageReceived);\n\n\t\tthis.clipboard.onPaste.value = this.onClipboardPasteEvent;\n\n\t\tthis.canvasStore.startLoading();\n\t\tconst loadPromises =\n\t\t\tthis.settingsStore.isPreviewMode && this.isDemo\n\t\t\t\t? []\n\t\t\t\t: [\n\t\t\t\t\t\tthis.loadActiveWorkflows(),\n\t\t\t\t\t\tthis.loadCredentials(),\n\t\t\t\t\t\tthis.loadCredentialTypes(),\n\t\t\t\t\t\tthis.loadVariables(),\n\t\t\t\t\t\tthis.loadSecrets(),\n\t\t\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},\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\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 }.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\tsession_id: this.ndvStore.sessionId,\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\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.ownedBy) {\n\t\t\t\tthis.workflowsEEStore.setWorkflowOwnedBy({\n\t\t\t\t\tworkflowId: data.workflowData.id,\n\t\t\t\t\townedBy: data.workflowData.ownedBy,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (data.workflowData.sharedWith) {\n\t\t\t\tthis.workflowsEEStore.setWorkflowSharedWith({\n\t\t\t\t\tworkflowId: data.workflowData.id,\n\t\t\t\t\tsharedWith: data.workflowData.sharedWith,\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.workflowsStore.activeWorkflowExecution = 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 = (await this.workflowsStore.getNewWorkflowData(data.name)) || {};\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.workflowsStore.activeWorkflowExecution;\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.ownedBy) {\n\t\t\t\tthis.workflowsEEStore.setWorkflowOwnedBy({\n\t\t\t\t\tworkflowId: workflow.id,\n\t\t\t\t\townedBy: workflow.ownedBy,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (workflow.sharedWith) {\n\t\t\t\tthis.workflowsEEStore.setWorkflowSharedWith({\n\t\t\t\t\tworkflowId: workflow.id,\n\t\t\t\t\tsharedWith: workflow.sharedWith,\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.workflowsStore.activeWorkflowExecution = null;\n\t\t\t\tthis.workflowsStore.currentWorkflowExecutions = [];\n\t\t\t} else {\n\t\t\t\tthis.workflowsStore.activeWorkflowExecution = 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.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\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.workflowsStore.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\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 (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: {\n\t\t\tsourceId: string;\n\t\t\tindex: number;\n\t\t\teventSource: NodeCreatorOpenSource;\n\t\t\tconnection?: Connection;\n\t\t\tnodeCreatorView?: string;\n\t\t\toutputType?: NodeConnectionType;\n\t\t\tendpointUuid?: string;\n\t\t}) {\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\n\t\t\t\tthis.insertNodeAfterSelected({\n\t\t\t\t\tsourceId: connection.parameters.nodeId,\n\t\t\t\t\tindex: connection.parameters.index,\n\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.NODE_CONNECTION_DROP,\n\t\t\t\t\tconnection,\n\t\t\t\t\toutputType: connection.parameters.type,\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 (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.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});\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\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\tthis.workflowsStore.currentWorkflowExecutions = [];\n\t\t\tthis.workflowsStore.activeWorkflowExecution = 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.workflowsStore.activeWorkflowExecution = null;\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\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\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\tawait this.credentialsStore.fetchAllCredentials();\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.workflowsStore.activeWorkflowExecution = 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.WORKFLOWS });\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.loadCredentials(), this.loadVariables(), this.tagsStore.fetchAll()]);\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"],"file":"assets/NodeView-7yZJ9OMj.js"}
|