n8n-editor-ui 1.101.0 → 1.102.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/dist/assets/{ActionDropdown-BujIG0Jq.js → ActionDropdown-D-JmCYsp.js} +2 -2
  2. package/dist/assets/{AnimatedSpinner-B5cpb6Fs.js → AnimatedSpinner-BiuDg2x2.js} +1 -1
  3. package/dist/assets/{AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-BPigGQTI.js → AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-Bp194Fz4.js} +1 -1
  4. package/dist/assets/{AuthView-BOTPYtpM.js → AuthView-DF-20OPE.js} +2 -2
  5. package/dist/assets/{ChangePasswordView-DbeC55bz.js → ChangePasswordView-DSn8-M1-.js} +3 -3
  6. package/dist/assets/CollectionParameter-Bz5DzZqs.js +4 -0
  7. package/dist/assets/{CredentialsView-DUh5K-2r.js → CredentialsView-IQx76pD4.js} +8 -8
  8. package/dist/assets/{DemoFooter-BXPfbNJE.js → DemoFooter-49OiW0k2.js} +8 -7
  9. package/dist/assets/{EmptySharedSectionActionBox.vue_vue_type_script_setup_true_lang-CDDQIxv5.js → EmptySharedSectionActionBox.vue_vue_type_script_setup_true_lang-FNKd4r6R.js} +1 -1
  10. package/dist/assets/{EntityNotFound-CBUuOOYw.js → EntityNotFound-DScKsOtg.js} +1 -1
  11. package/dist/assets/{EntityUnAuthorised-7xgN3ECo.js → EntityUnAuthorised-DweZmhgI.js} +1 -1
  12. package/dist/assets/{ErrorView-BVfcsoOa.js → ErrorView-CNDVS4gm.js} +4 -4
  13. package/dist/assets/{EvaluationsRootView-BjrpKDj-.js → EvaluationsRootView-81SdPChp.js} +19 -27
  14. package/dist/assets/{EvaluationsView-DdmFZCH-.js → EvaluationsView-BAyQWPF9.js} +7 -7
  15. package/dist/assets/{ExecutionsTime-kMSlccIr.css → ExecutionsTime-DkME6I3E.css} +26 -19
  16. package/dist/assets/{ExecutionsTime.vue_vue_type_script_setup_true_lang-Ctx5Ybnr.js → ExecutionsTime.vue_vue_type_script_setup_true_lang-Qw7S05EC.js} +23 -21
  17. package/dist/assets/{ExecutionsView-8BjGHy2I.js → ExecutionsView--yDyvnL8.js} +15 -16
  18. package/dist/assets/{ExecutionsView-DSsowKj4.css → ExecutionsView-BHBePl1_.css} +1 -1
  19. package/dist/assets/{FileSaver.min-C5wzcK59.js → FileSaver.min-CeGSkamF.js} +1 -1
  20. package/dist/assets/{FixedCollectionParameter-DjlaZyUQ.css → FixedCollectionParameter-CEzpjeQZ.css} +18 -18
  21. package/dist/assets/{FixedCollectionParameter-BrPQ5Vay.js → FixedCollectionParameter-tgbkzIuD.js} +7 -7
  22. package/dist/assets/{ForgotMyPasswordView-L0afefc1.js → ForgotMyPasswordView-CVwKac4K.js} +3 -3
  23. package/dist/assets/{InfoAccordion-CEk3XG5b.js → InfoAccordion-75IQV-_q.js} +1 -1
  24. package/dist/assets/{InsightsChartAverageRuntime-BrwBWr_R.js → InsightsChartAverageRuntime-C4C4zghF.js} +4 -4
  25. package/dist/assets/{InsightsChartFailed-ILKWvikG.js → InsightsChartFailed-DyhWE17m.js} +4 -4
  26. package/dist/assets/{InsightsChartFailureRate-D1AVYwU7.js → InsightsChartFailureRate-B09GcGvY.js} +4 -4
  27. package/dist/assets/{InsightsChartTimeSaved-D49Rwn6-.js → InsightsChartTimeSaved-DGzFyou3.js} +4 -4
  28. package/dist/assets/{InsightsChartTotal-Bs-pUgA3.js → InsightsChartTotal-fIUzF41H.js} +4 -4
  29. package/dist/assets/{InsightsDashboard-BIC4uZpW.js → InsightsDashboard-Qhv7fScv.js} +10 -10
  30. package/dist/assets/{InsightsPaywall-DmwFI-6e.js → InsightsPaywall-C3-la0kD.js} +1 -1
  31. package/dist/assets/{InsightsSummary-D9lEzWNT.js → InsightsSummary-CJgV5s0y.js} +14 -13
  32. package/dist/assets/{InsightsSummary-DzGQpM5h.css → InsightsSummary-DTFIhBF3.css} +25 -27
  33. package/dist/assets/InsightsTableWorkflows-P5OHXu1Y.js +177 -0
  34. package/dist/assets/{Logo-DNxOhbuV.js → Logo-8MWdHUz0.js} +1 -1
  35. package/dist/assets/{LogsPanel-DvWnD7rJ.js → LogsPanel-BabpRONg.js} +279 -212
  36. package/dist/assets/{LogsPanel-D5R6F35L.css → LogsPanel-Bvy4ANV7.css} +106 -61
  37. package/dist/assets/{MainHeader-BVHIuVVT.js → MainHeader-0ppftO6b.js} +10 -10
  38. package/dist/assets/{MainSidebar-CEHr93uL.js → MainSidebar-BnXOkYK4.js} +23 -16
  39. package/dist/assets/{MainSidebar-DqrgzqvZ.css → MainSidebar-CaLHZgDB.css} +2 -2
  40. package/dist/assets/{InsightsTableWorkflows-CC8t-sAL.js → N8nDataTableServer-Cx18Zd1O.js} +9 -181
  41. package/dist/assets/{NodeCreation-Bq5626Ha.js → NodeCreation-DKbc91uY.js} +7 -7
  42. package/dist/assets/{NodeCreator-Dk0sNXFZ.css → NodeCreator-DWE25utr.css} +51 -58
  43. package/dist/assets/{NodeCreator-D7xT3ogw.js → NodeCreator-xRYJHbTG.js} +118 -112
  44. package/dist/assets/NodeDetailsView-CPVE5S8P.js +1155 -0
  45. package/dist/assets/NodeDetailsView-CaTI-1QQ.css +668 -0
  46. package/dist/assets/NodeDetailsViewV2-5pxsZwAo.js +1061 -0
  47. package/dist/assets/NodeDetailsViewV2-BxNx4ZUM.css +506 -0
  48. package/dist/assets/{NodeView-DL8JxnMc.css → NodeView-Cgf2HuDk.css} +263 -110
  49. package/dist/assets/{NodeView-DoR46iB5.js → NodeView-DYjZmKNE.js} +580 -409
  50. package/dist/assets/{ProjectHeader-DSKKwiQ0.js → ProjectHeader-e8JosKaj.js} +5 -5
  51. package/dist/assets/{ProjectSettings-C3sMIDHh.js → ProjectSettings-DNKcVLkd.js} +201 -25
  52. package/dist/assets/{PushConnectionTracker.vue_vue_type_script_setup_true_lang-cnANEo9o.js → PushConnectionTracker.vue_vue_type_script_setup_true_lang-EuKDPqQH.js} +3 -3
  53. package/dist/assets/{ResourcesListLayout-BVbjqFbc.js → ResourcesListLayout-C4y0iPmg.js} +4 -4
  54. package/dist/assets/{RunData-DG20AzLo.js → RunData-D3xzjO33.js} +124 -99
  55. package/dist/assets/{RunData-B5_okvCv.css → RunData-DuKNwYqe.css} +99 -85
  56. package/dist/assets/{RunDataJson-7okRLIES.js → RunDataJson-D5YFtOcJ.js} +16 -20
  57. package/dist/assets/{RunDataJsonActions-DrgwFS0W.css → RunDataJsonActions-B2jW3_UG.css} +3 -5
  58. package/dist/assets/{RunDataJsonActions-Qkg8HmUd.js → RunDataJsonActions-BWvs4coo.js} +15 -16
  59. package/dist/assets/{RunDataParsedAiContent-DRO1Bjsh.js → RunDataParsedAiContent-BYISiW-I.js} +12 -12
  60. package/dist/assets/{RunDataParsedAiContent-9EEUzCKp.css → RunDataParsedAiContent-wfIiKsq7.css} +16 -13
  61. package/dist/assets/{RunDataSearch-R6qtl0Jf.css → RunDataSearch-2eEalFoi.css} +8 -7
  62. package/dist/assets/{RunDataSearch-D5eQUWvi.js → RunDataSearch-oo3_BoLt.js} +4 -4
  63. package/dist/assets/{RunDataTable-CJmmTtEp.js → RunDataTable-6rCOQNCX.js} +126 -54
  64. package/dist/assets/{RunDataTable-CykHIwNT.css → RunDataTable-CTBtmQIs.css} +84 -44
  65. package/dist/assets/{SamlOnboarding-ClxYfm5z.js → SamlOnboarding-BG-gGcbY.js} +3 -3
  66. package/dist/assets/{SettingsApiView-Ds7FYVrN.js → SettingsApiView-Bmlbp7pD.js} +1 -1
  67. package/dist/assets/{SettingsCommunityNodesView-QKvLs6gi.js → SettingsCommunityNodesView-4DWd4UiC.js} +32 -6
  68. package/dist/assets/{SettingsExternalSecrets-d1KDgYYp.css → SettingsExternalSecrets-BAX9ENm9.css} +9 -6
  69. package/dist/assets/{SettingsExternalSecrets-DGRdvsMy.js → SettingsExternalSecrets-hpUcipWw.js} +17 -13
  70. package/dist/assets/{SettingsLdapView-C_LJwixk.js → SettingsLdapView-7p7L95v9.js} +1 -1
  71. package/dist/assets/{SettingsLogStreamingView-CaEJvgJ9.js → SettingsLogStreamingView-4CpWJqj_.js} +1 -1
  72. package/dist/assets/{SettingsPersonalView-DlwXaGDs.js → SettingsPersonalView-9iP06ihA.js} +11 -3
  73. package/dist/assets/{SettingsSourceControl-B6eULOfX.js → SettingsSourceControl-BGjWhqqJ.js} +5 -5
  74. package/dist/assets/{SettingsSso-5zcg-J4E.js → SettingsSso-ChOyD3kc.js} +1 -1
  75. package/dist/assets/{SettingsUsageAndPlan-CMBvYdjo.js → SettingsUsageAndPlan-jP8nn4Rh.js} +1 -1
  76. package/dist/assets/SettingsUsersView-BhfbqjxW.js +861 -0
  77. package/dist/assets/SettingsUsersView-BuZbf1jq.css +446 -0
  78. package/dist/assets/{SettingsView-Bawwm19P.css → SettingsView-4yzof_Pb.css} +4 -4
  79. package/dist/assets/{SettingsView-BuDKhqwZ.js → SettingsView-DTFEdRdj.js} +14 -14
  80. package/dist/assets/{SetupView-DSaQcQDF.js → SetupView-CXuAO6tx.js} +3 -3
  81. package/dist/assets/{SetupWorkflowCredentialsButton-BWISZAxq.js → SetupWorkflowCredentialsButton-Bj4rSqAV.js} +2 -2
  82. package/dist/assets/{SetupWorkflowFromTemplateView-CfDWCwoA.js → SetupWorkflowFromTemplateView-DG8Ml3A0.js} +8 -12
  83. package/dist/assets/{SigninView-BpjyswHb.js → SigninView-KmmptKWN.js} +7 -3
  84. package/dist/assets/{SignoutView-f_CoUl4S.js → SignoutView-8rAPEX_X.js} +1 -1
  85. package/dist/assets/{SignupView-q3f9g3P9.js → SignupView-ZYUP6f-Y.js} +3 -3
  86. package/dist/assets/{TableBase-DruQl-SO.js → TableBase-7XxrB0dw.js} +1 -1
  87. package/dist/assets/{Tags-DbmKHzWo.js → Tags-C8Jnw74N.js} +1 -1
  88. package/dist/assets/{TemplateDetails-DP_5pkzG.js → TemplateDetails-Bk1ixuRQ.js} +2 -2
  89. package/dist/assets/{TemplateList-y8Aumcsb.js → TemplateList-9SAC8OGn.js} +6 -3
  90. package/dist/assets/{TemplatesCollectionView-VdQpHtxs.js → TemplatesCollectionView-CLZDJ4HM.js} +6 -6
  91. package/dist/assets/{TemplatesSearchView-BUcYRVEK.js → TemplatesSearchView-DRzdGp3s.js} +8 -8
  92. package/dist/assets/{TemplatesView-4DUEEEtD.js → TemplatesView-V6ud-nM5.js} +3 -3
  93. package/dist/assets/{TemplatesWorkflowView--zUXMB8f.js → TemplatesWorkflowView-CLb4CuR2.js} +6 -6
  94. package/dist/assets/{NodeDetailsView-DB-5JPUD.js → TriggerPanel-BOC7PYsi.js} +498 -1415
  95. package/dist/assets/{NodeDetailsView-BaIj2qAa.css → TriggerPanel-DRpKKKun.css} +296 -903
  96. package/dist/assets/{VariablesView-DoWb0Vtv.js → VariablesView-BDzhSaxw.js} +6 -6
  97. package/dist/assets/{VariablesView-Kog_9PMT.css → VariablesView-Bh0OeH4s.css} +6 -6
  98. package/dist/assets/{WorkerView-D56d7XJA.js → WorkerView-C2A7cYkr.js} +9 -9
  99. package/dist/assets/{WorkflowActivator-CQxaDCfA.js → WorkflowActivator-BmIzNsA8.js} +8 -8
  100. package/dist/assets/{WorkflowActivator-BJPsIkXE.css → WorkflowActivator-DhLX6i1H.css} +2 -2
  101. package/dist/assets/{WorkflowExecutionsInfoAccordion-D9p_ZqmA.js → WorkflowExecutionsInfoAccordion-Cn4GRGO_.js} +6 -6
  102. package/dist/assets/{WorkflowExecutionsLandingPage-CymYth6K.js → WorkflowExecutionsLandingPage-s-dIgG6D.js} +3 -3
  103. package/dist/assets/{WorkflowExecutionsPreview-DRvf3WQC.js → WorkflowExecutionsPreview-BE7NfRAa.js} +12 -12
  104. package/dist/assets/{WorkflowExecutionsView-DxiIaUKV.js → WorkflowExecutionsView-DFmBdF-B.js} +16 -16
  105. package/dist/assets/{WorkflowHistory-DBPIq2u7.js → WorkflowHistory-3wO0nQYD.js} +4 -4
  106. package/dist/assets/{WorkflowOnboardingView-D4QKSetf.js → WorkflowOnboardingView-mBVE6x-i.js} +1 -1
  107. package/dist/assets/{WorkflowPreview-D3YRZjYi.js → WorkflowPreview-DlNMFCKn.js} +1 -1
  108. package/dist/assets/{WorkflowsView-ipf8KKwB.css → WorkflowsView-CyJbJBc8.css} +25 -21
  109. package/dist/assets/{WorkflowsView-DPADmBVd.js → WorkflowsView-DsAOuPT0.js} +77 -72
  110. package/dist/assets/{chartjs.utils-Cou_ISuU.js → chartjs.utils-BywXqBmg.js} +2 -2
  111. package/dist/assets/{en-DzZibgm_.js → en-CcKAtA8V.js} +45 -5
  112. package/dist/assets/{global-link-actions-olwfH36z.js → global-link-actions-BzAw9ZbO.js} +1 -1
  113. package/dist/assets/{import-curl-DD21H3kK.js → import-curl-1LWAxRTV.js} +1 -1
  114. package/dist/assets/{index-uJOu4Uio.js → index-B6A1nL2x.js} +1 -1
  115. package/dist/assets/{index-BzamKJpD.css → index-C66_v3sX.css} +1302 -1279
  116. package/dist/assets/{index-7S5ADieN.js → index-V0GOmfo8.js} +40721 -34933
  117. package/dist/assets/{pickBy-DPxZbMic.js → pickBy-CtRItcCT.js} +1 -1
  118. package/dist/assets/{templateActions-DJJfyIhq.js → templateActions-DpIzx0ws.js} +2 -2
  119. package/dist/assets/{useBeforeUnload-DveXGtGN.js → useBeforeUnload-B0EP7Q2i.js} +1 -1
  120. package/dist/assets/{useExecutionDebugging-DM4nhx6D.js → useExecutionDebugging-AwlOA2KI.js} +2 -1
  121. package/dist/assets/{useExecutionHelpers-BfF56crp.js → useExecutionHelpers-DvBwGIzz.js} +1 -1
  122. package/dist/assets/{useImportCurlCommand-BAgQhwtE.js → useImportCurlCommand-DIFC7Epr.js} +2 -2
  123. package/dist/assets/{useKeybindings-CV0VsjNP.js → useKeybindings-CduQ2pi5.js} +4 -4
  124. package/dist/assets/{useProjectPages-DgMGWOaO.js → useProjectPages-DmNmAOdq.js} +1 -1
  125. package/dist/assets/{usePushConnection-D8SE-itT.js → usePushConnection-Dyd5__87.js} +6 -12
  126. package/dist/assets/{useWorkflowActivate-BKz3N1SO.js → useWorkflowActivate-z9iwP6OY.js} +1 -1
  127. package/dist/index.html +2 -2
  128. package/package.json +1 -1
  129. package/vite.config.mts +2 -2
  130. package/dist/assets/CollectionParameter-CExdr4jd.js +0 -4
  131. package/dist/assets/SettingsUsersView-BL3TAhT8.js +0 -338
  132. package/dist/assets/SettingsUsersView-By12E2li.css +0 -143
@@ -0,0 +1,1061 @@
1
+ import { d as defineComponent, x as computed, c as useI18n, h as createElementBlock, g as openBlock, j as createBaseVNode, i as createVNode, n as normalizeClass, e as createBlock, f as createCommentVNode, bP as _sfc_main$3, as as InlineRename, l as unref, a1 as N8nLink, w as withCtx, p as N8nText, k as createTextVNode, t as toDisplayString, N as N8nIcon, $ as N8nTooltip, a0 as _sfc_main$4, _ as _export_sfc, r as ref, ip as LOCAL_STORAGE_NDV_PANEL_WIDTH, cX as toValue, cW as useElementSize, aa as watch, bT as toRef, et as jsonParse, hr as Draggable, iq as FontAwesomeIcon, aM as useNDVStore, bB as useNodeHelpers, fn as storeToRefs, bz as usePinnedData, bG as useNodeTypesStore, T as useUIStore, a4 as useWorkflowsStore, v as useSettingsStore, dV as useDeviceSupport, ar as useTemplateRef, e2 as getNodeOutputs, bo as NodeConnectionTypes, bH as START_NODE_TYPE, id as EXECUTABLE_TRIGGER_NODE_TYPES, aS as STICKY_NODE_TYPE, ap as EnterpriseEditionFeature, o as onMounted, gw as dataPinningEventBus, I as onBeforeUnmount, P as normalizeStyle, c9 as useStyles, ed as getNodeIconSource, Q as createEventBus, c8 as N8nResizeWrapper, ie as APP_MODALS_ELEMENT_ID, cC as Teleport, ay as useTelemetry, aA as useMessage, aB as MODAL_CONFIRM, bf as useExternalHooks } from "./index-V0GOmfo8.js";
2
+ import { _ as __unplugin_components_0, T as TriggerPanel, I as InputPanel, O as OutputPanel } from "./TriggerPanel-BOC7PYsi.js";
3
+ import { a as useNodeDocsUrl, N as NodeSettings } from "./NodeView-DYjZmKNE.js";
4
+ import { u as useKeybindings } from "./useKeybindings-CduQ2pi5.js";
5
+ import { u as useWorkflowActivate } from "./useWorkflowActivate-z9iwP6OY.js";
6
+ import "./RunData-D3xzjO33.js";
7
+ import "./FileSaver.min-CeGSkamF.js";
8
+ import "./useExecutionHelpers-DvBwGIzz.js";
9
+ import "./RunDataParsedAiContent-BYISiW-I.js";
10
+ import "./InfoAccordion-75IQV-_q.js";
11
+ import "./ActionDropdown-D-JmCYsp.js";
12
+ import "./import-curl-1LWAxRTV.js";
13
+ import "./global-link-actions-BzAw9ZbO.js";
14
+ import "./useExecutionDebugging-AwlOA2KI.js";
15
+ import "./useBeforeUnload-B0EP7Q2i.js";
16
+ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
17
+ __name: "NDVHeader",
18
+ props: {
19
+ nodeName: {},
20
+ nodeTypeName: {},
21
+ docsUrl: {},
22
+ icon: {},
23
+ readOnly: { type: Boolean }
24
+ },
25
+ emits: ["close", "rename"],
26
+ setup(__props, { emit: __emit }) {
27
+ const props = __props;
28
+ const i18n = useI18n();
29
+ const emit = __emit;
30
+ const hasCustomName = computed(() => props.nodeName !== props.nodeTypeName);
31
+ const docsLabel2 = computed(() => {
32
+ if (!hasCustomName.value) {
33
+ return i18n.baseText("nodeSettings.docs");
34
+ }
35
+ return `${props.nodeTypeName} ${i18n.baseText("nodeSettings.docs")}`;
36
+ });
37
+ function onRename(newNodeName) {
38
+ emit("rename", newNodeName || props.nodeTypeName);
39
+ }
40
+ return (_ctx, _cache) => {
41
+ const _component_NodeIcon = _sfc_main$3;
42
+ const _component_N8nInlineTextEdit = InlineRename;
43
+ const _component_N8nText = N8nText;
44
+ const _component_N8nIcon = N8nIcon;
45
+ const _component_N8nLink = N8nLink;
46
+ const _component_N8nTooltip = N8nTooltip;
47
+ return openBlock(), createElementBlock("header", {
48
+ class: normalizeClass(_ctx.$style.ndvHeader)
49
+ }, [
50
+ createBaseVNode("div", {
51
+ class: normalizeClass(_ctx.$style.content)
52
+ }, [
53
+ _ctx.icon ? (openBlock(), createBlock(_component_NodeIcon, {
54
+ key: 0,
55
+ class: normalizeClass(_ctx.$style.icon),
56
+ size: 20,
57
+ "icon-source": _ctx.icon
58
+ }, null, 8, ["class", "icon-source"])) : createCommentVNode("", true),
59
+ createBaseVNode("div", {
60
+ class: normalizeClass(_ctx.$style.title)
61
+ }, [
62
+ createVNode(_component_N8nInlineTextEdit, {
63
+ "model-value": _ctx.nodeName,
64
+ "min-width": 0,
65
+ "max-width": 500,
66
+ placeholder: unref(i18n).baseText("ndv.title.rename.placeholder"),
67
+ "read-only": _ctx.readOnly,
68
+ "onUpdate:modelValue": onRename
69
+ }, null, 8, ["model-value", "placeholder", "read-only"])
70
+ ], 2),
71
+ _ctx.docsUrl ? (openBlock(), createBlock(_component_N8nLink, {
72
+ key: 1,
73
+ theme: "text",
74
+ target: "_blank",
75
+ href: _ctx.docsUrl
76
+ }, {
77
+ default: withCtx(() => [
78
+ createBaseVNode("span", {
79
+ class: normalizeClass(_ctx.$style.docsLabel)
80
+ }, [
81
+ createVNode(_component_N8nText, {
82
+ size: "small",
83
+ bold: ""
84
+ }, {
85
+ default: withCtx(() => [
86
+ createTextVNode(toDisplayString(docsLabel2.value), 1)
87
+ ]),
88
+ _: 1
89
+ }),
90
+ createVNode(_component_N8nIcon, { icon: "external-link" })
91
+ ], 2)
92
+ ]),
93
+ _: 1
94
+ }, 8, ["href"])) : hasCustomName.value ? (openBlock(), createBlock(_component_N8nText, {
95
+ key: 2,
96
+ size: "small",
97
+ bold: ""
98
+ }, {
99
+ default: withCtx(() => [
100
+ createTextVNode(toDisplayString(_ctx.nodeTypeName), 1)
101
+ ]),
102
+ _: 1
103
+ })) : createCommentVNode("", true)
104
+ ], 2),
105
+ createVNode(_component_N8nTooltip, null, {
106
+ content: withCtx(() => [
107
+ createTextVNode(toDisplayString(unref(i18n).baseText("ndv.close.tooltip")), 1)
108
+ ]),
109
+ default: withCtx(() => [
110
+ createVNode(unref(_sfc_main$4), {
111
+ icon: "x",
112
+ type: "tertiary",
113
+ onClick: _cache[0] || (_cache[0] = ($event) => emit("close"))
114
+ })
115
+ ]),
116
+ _: 1
117
+ })
118
+ ], 2);
119
+ };
120
+ }
121
+ });
122
+ const ndvHeader = "_ndvHeader_q9139_2";
123
+ const content = "_content_q9139_12";
124
+ const title = "_title_q9139_19";
125
+ const subtitle = "_subtitle_q9139_24";
126
+ const docsLabel = "_docsLabel_q9139_31";
127
+ const icon = "_icon_q9139_36";
128
+ const style0$2 = {
129
+ ndvHeader,
130
+ content,
131
+ title,
132
+ subtitle,
133
+ docsLabel,
134
+ icon
135
+ };
136
+ const cssModules$2 = {
137
+ "$style": style0$2
138
+ };
139
+ const __unplugin_components_1 = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__cssModules", cssModules$2]]);
140
+ function useNdvLayout(options) {
141
+ const MIN_MAIN_PANEL_WIDTH_PX = 368;
142
+ const MIN_PANEL_WIDTH_PX = 120;
143
+ const DEFAULT_INPUTLESS_MAIN_WIDTH_PX = 480;
144
+ const DEFAULT_WIDE_MAIN_WIDTH_PX = 640;
145
+ const DEFAULT_REGULAR_MAIN_WIDTH_PX = 420;
146
+ const panelWidthPercentage = ref({ left: 40, main: 20, right: 40 });
147
+ const localStorageKey = computed(
148
+ () => `${LOCAL_STORAGE_NDV_PANEL_WIDTH}_${toValue(options.paneType).toUpperCase()}`
149
+ );
150
+ const containerSize = useElementSize(options.container);
151
+ const containerWidth = computed(() => containerSize.width.value);
152
+ const percentageToPixels = (percentage) => {
153
+ return percentage / 100 * containerWidth.value;
154
+ };
155
+ const pixelsToPercentage = (pixels) => {
156
+ return pixels / containerWidth.value * 100;
157
+ };
158
+ const minMainPanelWidthPercentage = computed(() => pixelsToPercentage(MIN_MAIN_PANEL_WIDTH_PX));
159
+ const panelWidthPixels = computed(() => ({
160
+ left: percentageToPixels(panelWidthPercentage.value.left),
161
+ main: percentageToPixels(panelWidthPercentage.value.main),
162
+ right: percentageToPixels(panelWidthPercentage.value.right)
163
+ }));
164
+ const minPanelWidthPercentage = computed(() => pixelsToPercentage(MIN_PANEL_WIDTH_PX));
165
+ const defaultPanelSize = computed(() => {
166
+ switch (toValue(options.paneType)) {
167
+ case "inputless": {
168
+ const main2 = pixelsToPercentage(DEFAULT_INPUTLESS_MAIN_WIDTH_PX);
169
+ return { left: 0, main: main2, right: 100 - main2 };
170
+ }
171
+ case "wide": {
172
+ const main2 = pixelsToPercentage(DEFAULT_WIDE_MAIN_WIDTH_PX);
173
+ const panels = (100 - main2) / 2;
174
+ return { left: panels, main: main2, right: panels };
175
+ }
176
+ case "dragless":
177
+ case "unknown":
178
+ case "regular":
179
+ default: {
180
+ const main2 = pixelsToPercentage(DEFAULT_REGULAR_MAIN_WIDTH_PX);
181
+ const panels = (100 - main2) / 2;
182
+ return { left: panels, main: main2, right: panels };
183
+ }
184
+ }
185
+ });
186
+ const safePanelWidth = ({ left, main: main2, right }) => {
187
+ const hasInput = toValue(options.hasInputPanel);
188
+ const minLeft = hasInput ? minPanelWidthPercentage.value : 0;
189
+ const minRight = minPanelWidthPercentage.value;
190
+ const minMain = minMainPanelWidthPercentage.value;
191
+ const newPanelWidth = {
192
+ left: Math.max(minLeft, left),
193
+ main: Math.max(minMain, main2),
194
+ right: Math.max(minRight, right)
195
+ };
196
+ const total = newPanelWidth.left + newPanelWidth.main + newPanelWidth.right;
197
+ if (total > 100) {
198
+ const overflow = total - 100;
199
+ const trimLeft = newPanelWidth.left / (newPanelWidth.left + newPanelWidth.right) * overflow;
200
+ const trimRight = overflow - trimLeft;
201
+ newPanelWidth.left = Math.max(minLeft, newPanelWidth.left - trimLeft);
202
+ newPanelWidth.right = Math.max(minRight, newPanelWidth.right - trimRight);
203
+ }
204
+ return newPanelWidth;
205
+ };
206
+ const persistPanelSize = () => {
207
+ localStorage.setItem(localStorageKey.value, JSON.stringify(panelWidthPercentage.value));
208
+ };
209
+ const loadPanelSize = () => {
210
+ const storedPanelSizeString = localStorage.getItem(localStorageKey.value);
211
+ const defaultSize = defaultPanelSize.value;
212
+ if (storedPanelSizeString) {
213
+ const storedPanelSize = jsonParse(storedPanelSizeString, {
214
+ fallbackValue: defaultSize
215
+ });
216
+ panelWidthPercentage.value = safePanelWidth(storedPanelSize ?? defaultSize);
217
+ } else {
218
+ panelWidthPercentage.value = safePanelWidth(defaultSize);
219
+ }
220
+ };
221
+ const onResizeEnd = () => {
222
+ persistPanelSize();
223
+ };
224
+ const onResize = (event) => {
225
+ const newMain = Math.max(minMainPanelWidthPercentage.value, pixelsToPercentage(event.width));
226
+ const initialLeft = panelWidthPercentage.value.left;
227
+ const initialMain = panelWidthPercentage.value.main;
228
+ const initialRight = panelWidthPercentage.value.right;
229
+ const diffMain = newMain - initialMain;
230
+ if (event.direction === "left") {
231
+ const potentialLeft = initialLeft - diffMain;
232
+ if (potentialLeft < minPanelWidthPercentage.value) return;
233
+ const newLeft = Math.max(minPanelWidthPercentage.value, potentialLeft);
234
+ const newRight = initialRight;
235
+ panelWidthPercentage.value = safePanelWidth({
236
+ left: newLeft,
237
+ main: newMain,
238
+ right: newRight
239
+ });
240
+ } else if (event.direction === "right") {
241
+ const potentialRight = initialRight - diffMain;
242
+ if (potentialRight < minPanelWidthPercentage.value) return;
243
+ const newRight = Math.max(minPanelWidthPercentage.value, potentialRight);
244
+ const newLeft = initialLeft;
245
+ panelWidthPercentage.value = safePanelWidth({
246
+ left: newLeft,
247
+ main: newMain,
248
+ right: newRight
249
+ });
250
+ }
251
+ };
252
+ const onDrag = (position) => {
253
+ const newLeft = Math.max(
254
+ minPanelWidthPercentage.value,
255
+ pixelsToPercentage(position[0]) - panelWidthPercentage.value.main / 2
256
+ );
257
+ const newRight = Math.max(
258
+ minPanelWidthPercentage.value,
259
+ 100 - newLeft - panelWidthPercentage.value.main
260
+ );
261
+ if (newLeft + panelWidthPercentage.value.main + newRight > 100) {
262
+ return;
263
+ }
264
+ panelWidthPercentage.value.left = newLeft;
265
+ panelWidthPercentage.value.right = newRight;
266
+ };
267
+ watch(containerWidth, (newWidth, oldWidth) => {
268
+ if (!newWidth) return;
269
+ if (!oldWidth) {
270
+ loadPanelSize();
271
+ } else {
272
+ panelWidthPercentage.value = safePanelWidth(panelWidthPercentage.value);
273
+ }
274
+ });
275
+ watch(
276
+ toRef(options.paneType),
277
+ () => {
278
+ loadPanelSize();
279
+ },
280
+ { immediate: true }
281
+ );
282
+ return {
283
+ containerWidth,
284
+ panelWidthPercentage,
285
+ panelWidthPixels,
286
+ onResize,
287
+ onDrag,
288
+ onResizeEnd
289
+ };
290
+ }
291
+ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
292
+ __name: "PanelDragButtonV2",
293
+ props: {
294
+ canMoveRight: { type: Boolean },
295
+ canMoveLeft: { type: Boolean }
296
+ },
297
+ emits: ["drag", "dragstart", "dragend"],
298
+ setup(__props, { emit: __emit }) {
299
+ const emit = __emit;
300
+ const onDrag = (e) => {
301
+ emit("drag", e);
302
+ };
303
+ const onDragEnd = () => {
304
+ emit("dragend");
305
+ };
306
+ const onDragStart = () => {
307
+ emit("dragstart");
308
+ };
309
+ return (_ctx, _cache) => {
310
+ return openBlock(), createBlock(Draggable, {
311
+ class: normalizeClass(_ctx.$style.dragContainer),
312
+ type: "panel-resize",
313
+ cursor: "ew-resize",
314
+ "data-test-id": "panel-drag-button",
315
+ onDrag,
316
+ onDragstart: onDragStart,
317
+ onDragend: onDragEnd
318
+ }, {
319
+ default: withCtx(({ isDragging }) => [
320
+ createBaseVNode("button", {
321
+ class: normalizeClass([_ctx.$style.dragButton, { [_ctx.$style.dragging]: isDragging }])
322
+ }, [
323
+ _ctx.canMoveLeft ? (openBlock(), createBlock(unref(FontAwesomeIcon), {
324
+ key: 0,
325
+ class: normalizeClass(_ctx.$style.arrow),
326
+ icon: "arrow-left"
327
+ }, null, 8, ["class"])) : createCommentVNode("", true),
328
+ createVNode(unref(FontAwesomeIcon), {
329
+ class: normalizeClass(_ctx.$style.handle),
330
+ icon: "bars"
331
+ }, null, 8, ["class"]),
332
+ _ctx.canMoveRight ? (openBlock(), createBlock(unref(FontAwesomeIcon), {
333
+ key: 1,
334
+ class: normalizeClass(_ctx.$style.arrow),
335
+ icon: "arrow-right"
336
+ }, null, 8, ["class"])) : createCommentVNode("", true)
337
+ ], 2)
338
+ ]),
339
+ _: 1
340
+ }, 8, ["class"]);
341
+ };
342
+ }
343
+ });
344
+ const dragButton = "_dragButton_7p0lm_123";
345
+ const arrow = "_arrow_7p0lm_138";
346
+ const handle = "_handle_7p0lm_142";
347
+ const dragging = "_dragging_7p0lm_146";
348
+ const style0$1 = {
349
+ dragButton,
350
+ arrow,
351
+ handle,
352
+ dragging
353
+ };
354
+ const cssModules$1 = {
355
+ "$style": style0$1
356
+ };
357
+ const PanelDragButtonV2 = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__cssModules", cssModules$1]]);
358
+ const _sfc_main = /* @__PURE__ */ defineComponent({
359
+ __name: "NodeDetailsViewV2",
360
+ props: {
361
+ workflowObject: {},
362
+ readOnly: { type: Boolean, default: false },
363
+ isProductionExecutionPreview: { type: Boolean, default: false }
364
+ },
365
+ emits: ["saveKeyboardShortcut", "valueChanged", "switchSelectedNode", "openConnectionNodeCreator", "renameNode", "stopExecution"],
366
+ setup(__props, { emit: __emit }) {
367
+ const emit = __emit;
368
+ const props = __props;
369
+ const ndvStore = useNDVStore();
370
+ const externalHooks = useExternalHooks();
371
+ const nodeHelpers = useNodeHelpers();
372
+ const { activeNode } = storeToRefs(ndvStore);
373
+ const pinnedData = usePinnedData(activeNode);
374
+ const workflowActivate = useWorkflowActivate();
375
+ const nodeTypesStore = useNodeTypesStore();
376
+ const uiStore = useUIStore();
377
+ const workflowsStore = useWorkflowsStore();
378
+ const settingsStore = useSettingsStore();
379
+ const deviceSupport = useDeviceSupport();
380
+ const telemetry = useTelemetry();
381
+ const i18n = useI18n();
382
+ const message = useMessage();
383
+ const { APP_Z_INDEXES } = useStyles();
384
+ const settingsEventBus = createEventBus();
385
+ const redrawRequired = ref(false);
386
+ const runInputIndex = ref(-1);
387
+ const runOutputIndex = ref(-1);
388
+ const isLinkingEnabled = ref(true);
389
+ const selectedInput = ref();
390
+ const triggerWaitingWarningEnabled = ref(false);
391
+ const isDragging = ref(false);
392
+ const mainPanelPosition = ref(0);
393
+ const pinDataDiscoveryTooltipVisible = ref(false);
394
+ const avgInputRowHeight = ref(0);
395
+ const avgOutputRowHeight = ref(0);
396
+ const isInputPaneActive = ref(false);
397
+ const isOutputPaneActive = ref(false);
398
+ const isPairedItemHoveringEnabled = ref(true);
399
+ const dialogRef = ref();
400
+ const containerRef = useTemplateRef("containerRef");
401
+ const mainPanelRef = useTemplateRef("mainPanelRef");
402
+ const pushRef = computed(() => ndvStore.pushRef);
403
+ const activeNodeType = computed(() => {
404
+ if (activeNode.value) {
405
+ return nodeTypesStore.getNodeType(activeNode.value.type, activeNode.value.typeVersion);
406
+ }
407
+ return null;
408
+ });
409
+ const { docsUrl } = useNodeDocsUrl({ nodeType: activeNodeType });
410
+ const workflowRunning = computed(() => uiStore.isActionActive.workflowRunning);
411
+ const workflowRunData = computed(() => {
412
+ if (workflowExecution.value === null) {
413
+ return null;
414
+ }
415
+ const executionData = workflowExecution.value.data;
416
+ if (executionData?.resultData) {
417
+ return executionData.resultData.runData;
418
+ }
419
+ return null;
420
+ });
421
+ const parentNodes = computed(() => {
422
+ if (activeNode.value) {
423
+ return props.workflowObject.getParentNodesByDepth(activeNode.value.name, 1).map(({ name }) => name) || [];
424
+ } else {
425
+ return [];
426
+ }
427
+ });
428
+ const parentNode = computed(() => {
429
+ for (const parentNodeName of parentNodes.value) {
430
+ if (workflowsStore?.pinnedWorkflowData?.[parentNodeName]) {
431
+ return parentNodeName;
432
+ }
433
+ if (workflowRunData.value?.[parentNodeName]) {
434
+ return parentNodeName;
435
+ }
436
+ }
437
+ return parentNodes.value[0];
438
+ });
439
+ const inputNodeName = computed(() => {
440
+ const nodeOutputs = activeNode.value && activeNodeType.value ? getNodeOutputs(props.workflowObject, activeNode.value, activeNodeType.value) : [];
441
+ const nonMainOutputs = nodeOutputs.filter((output2) => {
442
+ if (typeof output2 === "string") return output2 !== NodeConnectionTypes.Main;
443
+ return output2.type !== NodeConnectionTypes.Main;
444
+ });
445
+ const isSubNode = nonMainOutputs.length > 0;
446
+ if (isSubNode && activeNode.value) {
447
+ const connectedOutputNode = props.workflowObject.getChildNodes(
448
+ activeNode.value.name,
449
+ "ALL_NON_MAIN"
450
+ )?.[0];
451
+ return connectedOutputNode;
452
+ }
453
+ return selectedInput.value || parentNode.value;
454
+ });
455
+ const inputNode = computed(() => {
456
+ if (inputNodeName.value) {
457
+ return workflowsStore.getNodeByName(inputNodeName.value);
458
+ }
459
+ return null;
460
+ });
461
+ const inputSize = computed(() => ndvStore.ndvInputDataWithPinnedData.length);
462
+ const isTriggerNode = computed(
463
+ () => !!activeNodeType.value && (activeNodeType.value.group.includes("trigger") || activeNodeType.value.name === START_NODE_TYPE)
464
+ );
465
+ const showTriggerPanel = computed(() => {
466
+ const override = !!activeNodeType.value?.triggerPanel;
467
+ if (typeof activeNodeType.value?.triggerPanel === "boolean") {
468
+ return override;
469
+ }
470
+ const isWebhookBasedNode = !!activeNodeType.value?.webhooks?.length;
471
+ const isPollingNode = activeNodeType.value?.polling;
472
+ return !props.readOnly && isTriggerNode.value && (isWebhookBasedNode || isPollingNode || override);
473
+ });
474
+ const isExecutableTriggerNode = computed(() => {
475
+ if (!activeNodeType.value) return false;
476
+ return EXECUTABLE_TRIGGER_NODE_TYPES.includes(activeNodeType.value.name);
477
+ });
478
+ const isActiveStickyNode = computed(
479
+ () => !!ndvStore.activeNode && ndvStore.activeNode.type === STICKY_NODE_TYPE
480
+ );
481
+ const workflowExecution = computed(() => workflowsStore.getWorkflowExecution);
482
+ const maxOutputRun = computed(() => {
483
+ if (activeNode.value === null) {
484
+ return 0;
485
+ }
486
+ const runData = workflowRunData.value;
487
+ if (!runData?.[activeNode.value.name]) {
488
+ return 0;
489
+ }
490
+ if (runData[activeNode.value.name].length) {
491
+ return runData[activeNode.value.name].length - 1;
492
+ }
493
+ return 0;
494
+ });
495
+ const outputRun = computed(
496
+ () => runOutputIndex.value === -1 ? maxOutputRun.value : Math.min(runOutputIndex.value, maxOutputRun.value)
497
+ );
498
+ const maxInputRun = computed(() => {
499
+ if (inputNode.value === null || activeNode.value === null) {
500
+ return 0;
501
+ }
502
+ const workflowNode = props.workflowObject.getNode(activeNode.value.name);
503
+ if (!workflowNode || !activeNodeType.value) {
504
+ return 0;
505
+ }
506
+ const outputs = getNodeOutputs(
507
+ props.workflowObject,
508
+ workflowNode,
509
+ activeNodeType.value
510
+ );
511
+ let node = inputNode.value;
512
+ const runData = workflowRunData.value;
513
+ if (outputs.some((output2) => output2 !== NodeConnectionTypes.Main)) {
514
+ node = activeNode.value;
515
+ }
516
+ if (!node || !runData || !runData.hasOwnProperty(node.name)) {
517
+ return 0;
518
+ }
519
+ if (runData[node.name].length) {
520
+ return runData[node.name].length - 1;
521
+ }
522
+ return 0;
523
+ });
524
+ const inputRun = computed(() => {
525
+ if (isLinkingEnabled.value && maxOutputRun.value === maxInputRun.value) {
526
+ return outputRun.value;
527
+ }
528
+ if (runInputIndex.value === -1) {
529
+ return maxInputRun.value;
530
+ }
531
+ return Math.min(runInputIndex.value, maxInputRun.value);
532
+ });
533
+ const canLinkRuns = computed(
534
+ () => maxOutputRun.value > 0 && maxOutputRun.value === maxInputRun.value
535
+ );
536
+ const linked = computed(() => isLinkingEnabled.value && canLinkRuns.value);
537
+ const outputPanelEditMode = computed(() => ndvStore.outputPanelEditMode);
538
+ const isWorkflowRunning = computed(() => uiStore.isActionActive.workflowRunning);
539
+ const isExecutionWaitingForWebhook = computed(() => workflowsStore.executionWaitingForWebhook);
540
+ const blockUi = computed(() => isWorkflowRunning.value || isExecutionWaitingForWebhook.value);
541
+ const foreignCredentials = computed(() => {
542
+ const credentials = activeNode.value?.credentials;
543
+ const usedCredentials = workflowsStore.usedCredentials;
544
+ const foreignCredentialsArray = [];
545
+ if (credentials && settingsStore.isEnterpriseFeatureEnabled[EnterpriseEditionFeature.Sharing]) {
546
+ Object.values(credentials).forEach((credential) => {
547
+ if (credential.id && usedCredentials[credential.id] && !usedCredentials[credential.id].currentUserHasAccess) {
548
+ foreignCredentialsArray.push(credential.id);
549
+ }
550
+ });
551
+ }
552
+ return foreignCredentialsArray;
553
+ });
554
+ const hasForeignCredential = computed(() => foreignCredentials.value.length > 0);
555
+ const inputPanelDisplayMode = computed(() => ndvStore.inputPanelDisplayMode);
556
+ const outputPanelDisplayMode = computed(() => ndvStore.outputPanelDisplayMode);
557
+ const hasInputPanel = computed(() => !isTriggerNode.value || showTriggerPanel.value);
558
+ const supportedResizeDirections = computed(
559
+ () => hasInputPanel.value ? ["left", "right"] : ["right"]
560
+ );
561
+ const currentNodePaneType = computed(() => {
562
+ if (!hasInputPanel.value) return "inputless";
563
+ return activeNodeType.value?.parameterPane ?? "regular";
564
+ });
565
+ const { containerWidth, onDrag, onResize, onResizeEnd, panelWidthPercentage, panelWidthPixels } = useNdvLayout({ container: containerRef, hasInputPanel, paneType: currentNodePaneType });
566
+ const setIsTooltipVisible = ({ isTooltipVisible }) => {
567
+ pinDataDiscoveryTooltipVisible.value = isTooltipVisible;
568
+ };
569
+ const onKeyDown = (e) => {
570
+ if (e.key === "s" && deviceSupport.isCtrlKeyPressed(e)) {
571
+ onSaveWorkflow(e);
572
+ }
573
+ };
574
+ const onSaveWorkflow = (e) => {
575
+ e.stopPropagation();
576
+ e.preventDefault();
577
+ if (props.readOnly) return;
578
+ emit("saveKeyboardShortcut", e);
579
+ };
580
+ const onInputItemHover = (e) => {
581
+ if (e === null || !inputNodeName.value || !isPairedItemHoveringEnabled.value) {
582
+ ndvStore.setHoveringItem(null);
583
+ return;
584
+ }
585
+ const item = {
586
+ nodeName: inputNodeName.value,
587
+ runIndex: inputRun.value,
588
+ outputIndex: e.outputIndex,
589
+ itemIndex: e.itemIndex
590
+ };
591
+ ndvStore.setHoveringItem(item);
592
+ };
593
+ const onInputTableMounted = (e) => {
594
+ avgInputRowHeight.value = e.avgRowHeight;
595
+ };
596
+ const onWorkflowActivate = () => {
597
+ ndvStore.activeNodeName = null;
598
+ setTimeout(() => {
599
+ void workflowActivate.activateCurrentWorkflow("ndv");
600
+ }, 1e3);
601
+ };
602
+ const onOutputItemHover = (e) => {
603
+ if (e === null || !activeNode.value || !isPairedItemHoveringEnabled.value) {
604
+ ndvStore.setHoveringItem(null);
605
+ return;
606
+ }
607
+ const item = {
608
+ nodeName: activeNode.value?.name,
609
+ runIndex: outputRun.value,
610
+ outputIndex: e.outputIndex,
611
+ itemIndex: e.itemIndex
612
+ };
613
+ ndvStore.setHoveringItem(item);
614
+ };
615
+ const onDragEnd = () => {
616
+ onResizeEnd();
617
+ isDragging.value = false;
618
+ telemetry.track("User moved parameters pane", {
619
+ // example method for tracking
620
+ window_width: containerWidth.value,
621
+ start_position: mainPanelPosition.value,
622
+ // TODO:
623
+ // end_position: mainPanelDimensions.value.relativeLeft,
624
+ node_type: activeNodeType.value ? activeNodeType.value.name : "",
625
+ push_ref: pushRef.value,
626
+ workflow_id: workflowsStore.workflowId
627
+ });
628
+ };
629
+ const onDragStart = () => {
630
+ isDragging.value = true;
631
+ };
632
+ const onLinkRunToOutput = () => {
633
+ isLinkingEnabled.value = true;
634
+ trackLinking("output");
635
+ };
636
+ const onUnlinkRun = (pane) => {
637
+ runInputIndex.value = runOutputIndex.value;
638
+ isLinkingEnabled.value = false;
639
+ trackLinking(pane);
640
+ };
641
+ const onNodeExecute = () => {
642
+ setTimeout(() => {
643
+ if (!activeNode.value || !workflowRunning.value) {
644
+ return;
645
+ }
646
+ triggerWaitingWarningEnabled.value = true;
647
+ }, 1e3);
648
+ };
649
+ const openSettings = () => {
650
+ settingsEventBus.emit("openSettings");
651
+ };
652
+ const trackLinking = (pane) => {
653
+ telemetry.track("User changed ndv run linking", {
654
+ node_type: activeNodeType.value ? activeNodeType.value.name : "",
655
+ push_ref: pushRef.value,
656
+ linked: linked.value,
657
+ pane
658
+ });
659
+ };
660
+ const onLinkRunToInput = () => {
661
+ runOutputIndex.value = runInputIndex.value;
662
+ isLinkingEnabled.value = true;
663
+ trackLinking("input");
664
+ };
665
+ const onSwitchSelectedNode = (nodeTypeName) => {
666
+ emit("switchSelectedNode", nodeTypeName);
667
+ };
668
+ const onOpenConnectionNodeCreator = (nodeTypeName, connectionType) => {
669
+ emit("openConnectionNodeCreator", nodeTypeName, connectionType);
670
+ };
671
+ const close = async () => {
672
+ if (isDragging.value) {
673
+ return;
674
+ }
675
+ if (outputPanelEditMode.value.enabled && activeNode.value) {
676
+ const shouldPinDataBeforeClosing = await message.confirm(
677
+ "",
678
+ i18n.baseText("ndv.pinData.beforeClosing.title"),
679
+ {
680
+ confirmButtonText: i18n.baseText("ndv.pinData.beforeClosing.confirm"),
681
+ cancelButtonText: i18n.baseText("ndv.pinData.beforeClosing.cancel")
682
+ }
683
+ );
684
+ if (shouldPinDataBeforeClosing === MODAL_CONFIRM) {
685
+ const { value } = outputPanelEditMode.value;
686
+ try {
687
+ pinnedData.setData(jsonParse(value), "on-ndv-close-modal");
688
+ } catch (error) {
689
+ console.error(error);
690
+ }
691
+ }
692
+ ndvStore.setOutputPanelEditModeEnabled(false);
693
+ }
694
+ await externalHooks.run("dataDisplay.nodeEditingFinished");
695
+ telemetry.track("User closed node modal", {
696
+ node_type: activeNodeType.value ? activeNodeType.value?.name : "",
697
+ push_ref: pushRef.value,
698
+ workflow_id: workflowsStore.workflowId
699
+ });
700
+ triggerWaitingWarningEnabled.value = false;
701
+ ndvStore.activeNodeName = null;
702
+ ndvStore.resetNDVPushRef();
703
+ };
704
+ useKeybindings({ Escape: close });
705
+ const trackRunChange = (run, pane) => {
706
+ telemetry.track("User changed ndv run dropdown", {
707
+ push_ref: pushRef.value,
708
+ run_index: run,
709
+ node_type: activeNodeType.value ? activeNodeType.value?.name : "",
710
+ pane
711
+ });
712
+ };
713
+ const onRunOutputIndexChange = (run) => {
714
+ runOutputIndex.value = run;
715
+ trackRunChange(run, "output");
716
+ };
717
+ const onRunInputIndexChange = (run) => {
718
+ runInputIndex.value = run;
719
+ if (linked.value) {
720
+ runOutputIndex.value = run;
721
+ }
722
+ trackRunChange(run, "input");
723
+ };
724
+ const onOutputTableMounted = (e) => {
725
+ avgOutputRowHeight.value = e.avgRowHeight;
726
+ };
727
+ const onInputNodeChange = (value, index) => {
728
+ runInputIndex.value = -1;
729
+ isLinkingEnabled.value = true;
730
+ selectedInput.value = value;
731
+ telemetry.track("User changed ndv input dropdown", {
732
+ node_type: activeNode.value ? activeNode.value.type : "",
733
+ push_ref: pushRef.value,
734
+ workflow_id: workflowsStore.workflowId,
735
+ selection_value: index,
736
+ input_node_type: inputNode.value ? inputNode.value.type : ""
737
+ });
738
+ };
739
+ const onStopExecution = () => {
740
+ emit("stopExecution");
741
+ };
742
+ const activateInputPane = () => {
743
+ isInputPaneActive.value = true;
744
+ isOutputPaneActive.value = false;
745
+ };
746
+ const activateOutputPane = () => {
747
+ isInputPaneActive.value = false;
748
+ isOutputPaneActive.value = true;
749
+ };
750
+ const onSearch = (search) => {
751
+ isPairedItemHoveringEnabled.value = !search;
752
+ };
753
+ const registerKeyboardListener = () => {
754
+ document.addEventListener("keydown", onKeyDown, true);
755
+ };
756
+ const unregisterKeyboardListener = () => {
757
+ document.removeEventListener("keydown", onKeyDown, true);
758
+ };
759
+ const onRename = (name) => {
760
+ emit("renameNode", name);
761
+ };
762
+ const handleChangeDisplayMode = (pane, mode) => {
763
+ ndvStore.setPanelDisplayMode({ pane, mode });
764
+ };
765
+ watch(
766
+ activeNode,
767
+ (node, oldNode) => {
768
+ if (node && !oldNode) {
769
+ registerKeyboardListener();
770
+ dialogRef.value?.show();
771
+ } else if (!node) {
772
+ unregisterKeyboardListener();
773
+ }
774
+ if (node && node.name !== oldNode?.name && !isActiveStickyNode.value) {
775
+ runInputIndex.value = -1;
776
+ runOutputIndex.value = -1;
777
+ isLinkingEnabled.value = true;
778
+ selectedInput.value = void 0;
779
+ triggerWaitingWarningEnabled.value = false;
780
+ avgOutputRowHeight.value = 0;
781
+ avgInputRowHeight.value = 0;
782
+ setTimeout(() => ndvStore.setNDVPushRef(), 0);
783
+ if (!activeNodeType.value) {
784
+ return;
785
+ }
786
+ void externalHooks.run("dataDisplay.nodeTypeChanged", {
787
+ nodeSubtitle: nodeHelpers.getNodeSubtitle(node, activeNodeType.value, props.workflowObject)
788
+ });
789
+ setTimeout(() => {
790
+ if (activeNode.value) {
791
+ const outgoingConnections = workflowsStore.outgoingConnectionsByNodeName(
792
+ activeNode.value?.name
793
+ );
794
+ telemetry.track("User opened node modal", {
795
+ node_id: activeNode.value?.id,
796
+ node_type: activeNodeType.value ? activeNodeType.value?.name : "",
797
+ workflow_id: workflowsStore.workflowId,
798
+ push_ref: pushRef.value,
799
+ is_editable: !hasForeignCredential.value,
800
+ parameters_pane_position: mainPanelPosition.value,
801
+ input_first_connector_runs: maxInputRun.value,
802
+ output_first_connector_runs: maxOutputRun.value,
803
+ selected_view_inputs: isTriggerNode.value ? "trigger" : ndvStore.inputPanelDisplayMode,
804
+ selected_view_outputs: ndvStore.outputPanelDisplayMode,
805
+ input_connectors: parentNodes.value.length,
806
+ output_connectors: outgoingConnections?.main?.length,
807
+ input_displayed_run_index: inputRun.value,
808
+ output_displayed_run_index: outputRun.value,
809
+ data_pinning_tooltip_presented: pinDataDiscoveryTooltipVisible.value,
810
+ input_displayed_row_height_avg: avgInputRowHeight.value,
811
+ output_displayed_row_height_avg: avgOutputRowHeight.value
812
+ });
813
+ }
814
+ }, 2e3);
815
+ }
816
+ if (window.top && !isActiveStickyNode.value) {
817
+ window.top.postMessage(JSON.stringify({ command: node ? "openNDV" : "closeNDV" }), "*");
818
+ }
819
+ },
820
+ { immediate: true }
821
+ );
822
+ watch(maxOutputRun, () => {
823
+ runOutputIndex.value = -1;
824
+ });
825
+ watch(maxInputRun, () => {
826
+ runInputIndex.value = -1;
827
+ });
828
+ watch(inputNodeName, (nodeName) => {
829
+ setTimeout(() => {
830
+ ndvStore.setInputNodeName(nodeName);
831
+ }, 0);
832
+ });
833
+ watch(inputRun, (run) => {
834
+ setTimeout(() => {
835
+ ndvStore.setInputRunIndex(run);
836
+ }, 0);
837
+ });
838
+ watch(mainPanelRef, (mainPanel) => {
839
+ if (!mainPanel) return;
840
+ function getTabbableCandidates(element) {
841
+ const nodes = [];
842
+ const walker = document.createTreeWalker(element, NodeFilter.SHOW_ELEMENT, {
843
+ acceptNode: (node) => {
844
+ const isHiddenInput = node.tagName === "INPUT" && node.type === "hidden";
845
+ if (node.disabled || node.hidden || isHiddenInput) return NodeFilter.FILTER_SKIP;
846
+ return node.tabIndex >= 0 ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;
847
+ }
848
+ });
849
+ while (walker.nextNode()) nodes.push(walker.currentNode);
850
+ return nodes;
851
+ }
852
+ const firstFocusableElement = getTabbableCandidates(mainPanel)[0];
853
+ if (firstFocusableElement) {
854
+ firstFocusableElement.focus();
855
+ }
856
+ });
857
+ onMounted(() => {
858
+ dialogRef.value?.show();
859
+ dataPinningEventBus.on("data-pinning-discovery", setIsTooltipVisible);
860
+ });
861
+ onBeforeUnmount(() => {
862
+ dataPinningEventBus.off("data-pinning-discovery", setIsTooltipVisible);
863
+ unregisterKeyboardListener();
864
+ });
865
+ return (_ctx, _cache) => {
866
+ const _component_NDVFloatingNodes = __unplugin_components_0;
867
+ const _component_NDVHeader = __unplugin_components_1;
868
+ const _component_N8nResizeWrapper = N8nResizeWrapper;
869
+ return unref(activeNode) && activeNodeType.value ? (openBlock(), createBlock(Teleport, {
870
+ key: 0,
871
+ to: `#${unref(APP_MODALS_ELEMENT_ID)}`
872
+ }, [
873
+ createBaseVNode("div", {
874
+ class: normalizeClass(_ctx.$style.backdrop),
875
+ style: normalizeStyle({ zIndex: unref(APP_Z_INDEXES).NDV }),
876
+ onClick: close
877
+ }, null, 6),
878
+ createBaseVNode("dialog", {
879
+ ref_key: "dialogRef",
880
+ ref: dialogRef,
881
+ open: "",
882
+ "aria-modal": "true",
883
+ "data-test-id": "ndv",
884
+ class: normalizeClass(_ctx.$style.dialog),
885
+ style: normalizeStyle({ zIndex: unref(APP_Z_INDEXES).NDV })
886
+ }, [
887
+ createVNode(_component_NDVFloatingNodes, {
888
+ "root-node": unref(activeNode),
889
+ onSwitchSelectedNode
890
+ }, null, 8, ["root-node"]),
891
+ createBaseVNode("div", {
892
+ ref_key: "containerRef",
893
+ ref: containerRef,
894
+ class: normalizeClass(_ctx.$style.container)
895
+ }, [
896
+ createVNode(_component_NDVHeader, {
897
+ class: normalizeClass(_ctx.$style.header),
898
+ "node-name": unref(activeNode).name,
899
+ "node-type-name": activeNodeType.value.defaults.name ?? activeNodeType.value.displayName,
900
+ icon: unref(getNodeIconSource)(activeNodeType.value),
901
+ "docs-url": unref(docsUrl),
902
+ onClose: close,
903
+ onRename
904
+ }, null, 8, ["class", "node-name", "node-type-name", "icon", "docs-url"]),
905
+ createBaseVNode("main", {
906
+ class: normalizeClass(_ctx.$style.main)
907
+ }, [
908
+ hasInputPanel.value ? (openBlock(), createElementBlock("div", {
909
+ key: 0,
910
+ class: normalizeClass([_ctx.$style.column, _ctx.$style.dataColumn]),
911
+ style: normalizeStyle({ width: `${unref(panelWidthPercentage).left}%` })
912
+ }, [
913
+ showTriggerPanel.value ? (openBlock(), createBlock(TriggerPanel, {
914
+ key: 0,
915
+ "node-name": unref(activeNode).name,
916
+ "push-ref": pushRef.value,
917
+ class: normalizeClass(_ctx.$style.input),
918
+ onExecute: onNodeExecute,
919
+ onActivate: onWorkflowActivate
920
+ }, null, 8, ["node-name", "push-ref", "class"])) : !isTriggerNode.value ? (openBlock(), createBlock(InputPanel, {
921
+ key: 1,
922
+ workflow: _ctx.workflowObject,
923
+ "can-link-runs": canLinkRuns.value,
924
+ "run-index": inputRun.value,
925
+ "linked-runs": linked.value,
926
+ "current-node-name": inputNodeName.value,
927
+ "push-ref": pushRef.value,
928
+ "read-only": _ctx.readOnly || hasForeignCredential.value,
929
+ "is-production-execution-preview": _ctx.isProductionExecutionPreview,
930
+ "is-pane-active": isInputPaneActive.value,
931
+ "display-mode": inputPanelDisplayMode.value,
932
+ class: normalizeClass(_ctx.$style.input),
933
+ onActivatePane: activateInputPane,
934
+ onLinkRun: onLinkRunToInput,
935
+ onUnlinkRun: _cache[0] || (_cache[0] = () => onUnlinkRun("input")),
936
+ onRunChange: onRunInputIndexChange,
937
+ onOpenSettings: openSettings,
938
+ onChangeInputNode: onInputNodeChange,
939
+ onExecute: onNodeExecute,
940
+ onTableMounted: onInputTableMounted,
941
+ onItemHover: onInputItemHover,
942
+ onSearch,
943
+ onDisplayModeChange: _cache[1] || (_cache[1] = ($event) => handleChangeDisplayMode("input", $event))
944
+ }, null, 8, ["workflow", "can-link-runs", "run-index", "linked-runs", "current-node-name", "push-ref", "read-only", "is-production-execution-preview", "is-pane-active", "display-mode", "class"])) : createCommentVNode("", true)
945
+ ], 6)) : createCommentVNode("", true),
946
+ createVNode(_component_N8nResizeWrapper, {
947
+ width: unref(panelWidthPixels).main,
948
+ "min-width": 260,
949
+ "supported-directions": supportedResizeDirections.value,
950
+ "grid-size": 8,
951
+ class: normalizeClass(_ctx.$style.column),
952
+ style: normalizeStyle({ width: `${unref(panelWidthPercentage).main}%` }),
953
+ outset: "",
954
+ onResize: unref(onResize),
955
+ onResizestart: onDragStart,
956
+ onResizeend: onDragEnd
957
+ }, {
958
+ default: withCtx(() => [
959
+ createBaseVNode("div", {
960
+ ref_key: "mainPanelRef",
961
+ ref: mainPanelRef,
962
+ class: normalizeClass(_ctx.$style.main)
963
+ }, [
964
+ hasInputPanel.value ? (openBlock(), createBlock(PanelDragButtonV2, {
965
+ key: 0,
966
+ class: normalizeClass(_ctx.$style.draggable),
967
+ "can-move-left": true,
968
+ "can-move-right": true,
969
+ onDrag: unref(onDrag),
970
+ onDragstart: onDragStart,
971
+ onDragend: onDragEnd
972
+ }, null, 8, ["class", "onDrag"])) : createCommentVNode("", true),
973
+ createVNode(NodeSettings, {
974
+ "event-bus": unref(settingsEventBus),
975
+ dragging: isDragging.value,
976
+ "push-ref": pushRef.value,
977
+ "node-type": activeNodeType.value,
978
+ "foreign-credentials": foreignCredentials.value,
979
+ "read-only": _ctx.readOnly,
980
+ "block-u-i": blockUi.value && showTriggerPanel.value,
981
+ executable: !_ctx.readOnly,
982
+ "input-size": inputSize.value,
983
+ class: normalizeClass(_ctx.$style.settings),
984
+ onExecute: onNodeExecute,
985
+ onStopExecution,
986
+ onRedrawRequired: _cache[2] || (_cache[2] = ($event) => redrawRequired.value = true),
987
+ onActivate: onWorkflowActivate,
988
+ onSwitchSelectedNode,
989
+ onOpenConnectionNodeCreator
990
+ }, null, 8, ["event-bus", "dragging", "push-ref", "node-type", "foreign-credentials", "read-only", "block-u-i", "executable", "input-size", "class"])
991
+ ], 2)
992
+ ]),
993
+ _: 1
994
+ }, 8, ["width", "supported-directions", "class", "style", "onResize"]),
995
+ createBaseVNode("div", {
996
+ class: normalizeClass([_ctx.$style.column, _ctx.$style.dataColumn]),
997
+ style: normalizeStyle({ width: `${unref(panelWidthPercentage).right}%` })
998
+ }, [
999
+ createVNode(OutputPanel, {
1000
+ "data-test-id": "output-panel",
1001
+ workflow: _ctx.workflowObject,
1002
+ "can-link-runs": canLinkRuns.value,
1003
+ "run-index": outputRun.value,
1004
+ "linked-runs": linked.value,
1005
+ "push-ref": pushRef.value,
1006
+ "is-read-only": _ctx.readOnly || hasForeignCredential.value,
1007
+ "block-u-i": blockUi.value && isTriggerNode.value && !isExecutableTriggerNode.value,
1008
+ "is-production-execution-preview": _ctx.isProductionExecutionPreview,
1009
+ "is-pane-active": isOutputPaneActive.value,
1010
+ "display-mode": outputPanelDisplayMode.value,
1011
+ class: normalizeClass(_ctx.$style.output),
1012
+ onActivatePane: activateOutputPane,
1013
+ onLinkRun: onLinkRunToOutput,
1014
+ onUnlinkRun: _cache[3] || (_cache[3] = () => onUnlinkRun("output")),
1015
+ onRunChange: onRunOutputIndexChange,
1016
+ onOpenSettings: openSettings,
1017
+ onTableMounted: onOutputTableMounted,
1018
+ onItemHover: onOutputItemHover,
1019
+ onSearch,
1020
+ onExecute: onNodeExecute,
1021
+ onDisplayModeChange: _cache[4] || (_cache[4] = ($event) => handleChangeDisplayMode("output", $event))
1022
+ }, null, 8, ["workflow", "can-link-runs", "run-index", "linked-runs", "push-ref", "is-read-only", "block-u-i", "is-production-execution-preview", "is-pane-active", "display-mode", "class"])
1023
+ ], 6)
1024
+ ], 2)
1025
+ ], 2)
1026
+ ], 6)
1027
+ ], 8, ["to"])) : createCommentVNode("", true);
1028
+ };
1029
+ }
1030
+ });
1031
+ const backdrop = "_backdrop_49khn_123";
1032
+ const dialog = "_dialog_49khn_132";
1033
+ const container = "_container_49khn_145";
1034
+ const main = "_main_49khn_156";
1035
+ const column = "_column_49khn_163";
1036
+ const input = "_input_49khn_176";
1037
+ const output = "_output_49khn_177";
1038
+ const dataColumn = "_dataColumn_49khn_181";
1039
+ const header = "_header_49khn_185";
1040
+ const settings = "_settings_49khn_199";
1041
+ const draggable = "_draggable_49khn_204";
1042
+ const style0 = {
1043
+ backdrop,
1044
+ dialog,
1045
+ container,
1046
+ main,
1047
+ column,
1048
+ input,
1049
+ output,
1050
+ dataColumn,
1051
+ header,
1052
+ settings,
1053
+ draggable
1054
+ };
1055
+ const cssModules = {
1056
+ "$style": style0
1057
+ };
1058
+ const NodeDetailsViewV2 = /* @__PURE__ */ _export_sfc(_sfc_main, [["__cssModules", cssModules]]);
1059
+ export {
1060
+ NodeDetailsViewV2 as default
1061
+ };