n8n-editor-ui 1.47.1 → 1.47.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.
Files changed (150) hide show
  1. package/.turbo/turbo-build.log +76 -76
  2. package/dist/assets/{AuthView-CMxdNKZJ.js → AuthView-B_jZMnGj.js} +2 -2
  3. package/dist/assets/{AuthView-CMxdNKZJ.js.map → AuthView-B_jZMnGj.js.map} +1 -1
  4. package/dist/assets/{CanvasControls-3FMjwMqA.js → CanvasControls-ns1B0A0j.js} +2 -2
  5. package/dist/assets/{CanvasControls-3FMjwMqA.js.map → CanvasControls-ns1B0A0j.js.map} +1 -1
  6. package/dist/assets/{ChangePasswordView-_NkkcUVb.js → ChangePasswordView-BDsuHv0B.js} +2 -2
  7. package/dist/assets/{ChangePasswordView-_NkkcUVb.js.map → ChangePasswordView-BDsuHv0B.js.map} +1 -1
  8. package/dist/assets/{CollectionParameter-BXMOfisf.js → CollectionParameter-Br-xtutZ.js} +2 -2
  9. package/dist/assets/CollectionParameter-Br-xtutZ.js.map +1 -0
  10. package/dist/assets/{CredentialsView-B2UF3tK_.js → CredentialsView-DnJ_jhDo.js} +2 -2
  11. package/dist/assets/{CredentialsView-B2UF3tK_.js.map → CredentialsView-DnJ_jhDo.js.map} +1 -1
  12. package/dist/assets/{ErrorView-B_lpOlen.js → ErrorView-BfV5e5ko.js} +2 -2
  13. package/dist/assets/{ErrorView-B_lpOlen.js.map → ErrorView-BfV5e5ko.js.map} +1 -1
  14. package/dist/assets/{ExecutionsFilter-dNFZor7l.js → ExecutionsFilter-0XcXH83H.js} +2 -2
  15. package/dist/assets/{ExecutionsFilter-dNFZor7l.js.map → ExecutionsFilter-0XcXH83H.js.map} +1 -1
  16. package/dist/assets/{ExecutionsView-BYe-KERG.js → ExecutionsView-aFiZuLVt.js} +2 -2
  17. package/dist/assets/{ExecutionsView-BYe-KERG.js.map → ExecutionsView-aFiZuLVt.js.map} +1 -1
  18. package/dist/assets/{ForgotMyPasswordView-D97J06wc.js → ForgotMyPasswordView-64X9tXq4.js} +2 -2
  19. package/dist/assets/{ForgotMyPasswordView-D97J06wc.js.map → ForgotMyPasswordView-64X9tXq4.js.map} +1 -1
  20. package/dist/assets/{MainHeader-CT4nF2mY.js → MainHeader-Ch0Iz_7s.js} +2 -2
  21. package/dist/assets/{MainHeader-CT4nF2mY.js.map → MainHeader-Ch0Iz_7s.js.map} +1 -1
  22. package/dist/assets/{MainSidebar-CTg5wPzP.js → MainSidebar-3ee-tTgz.js} +2 -2
  23. package/dist/assets/{MainSidebar-CTg5wPzP.js.map → MainSidebar-3ee-tTgz.js.map} +1 -1
  24. package/dist/assets/{NodeCreation-BF_L2-99.js → NodeCreation-PrQGENrl.js} +3 -3
  25. package/dist/assets/{NodeCreation-BF_L2-99.js.map → NodeCreation-PrQGENrl.js.map} +1 -1
  26. package/dist/assets/{NodeCreator-B_yCtSu6.js → NodeCreator-DlK1669m.js} +2 -2
  27. package/dist/assets/{NodeCreator-B_yCtSu6.js.map → NodeCreator-DlK1669m.js.map} +1 -1
  28. package/dist/assets/{NodeDetailsView-ggolOsHM.js → NodeDetailsView-DcV7LI-g.js} +4 -4
  29. package/dist/assets/{NodeDetailsView-ggolOsHM.js.map → NodeDetailsView-DcV7LI-g.js.map} +1 -1
  30. package/dist/assets/{NodeView-B2MlTl6g.js → NodeView-D_kbUfVN.js} +3 -3
  31. package/dist/assets/{NodeView-B2MlTl6g.js.map → NodeView-D_kbUfVN.js.map} +1 -1
  32. package/dist/assets/{NodeView.v2-D_CKj9CS.js → NodeView.v2-D_Wbnl01.js} +3 -3
  33. package/dist/assets/{NodeView.v2-D_CKj9CS.js.map → NodeView.v2-D_Wbnl01.js.map} +1 -1
  34. package/dist/assets/{ProjectCardBadge.vue_vue_type_script_setup_true_lang-DdHOM703.js → ProjectCardBadge.vue_vue_type_script_setup_true_lang-6oVL0vKx.js} +2 -2
  35. package/dist/assets/{ProjectCardBadge.vue_vue_type_script_setup_true_lang-DdHOM703.js.map → ProjectCardBadge.vue_vue_type_script_setup_true_lang-6oVL0vKx.js.map} +1 -1
  36. package/dist/assets/{ProjectSettings-DpJesEZX.js → ProjectSettings-CfcplqBX.js} +2 -2
  37. package/dist/assets/{ProjectSettings-DpJesEZX.js.map → ProjectSettings-CfcplqBX.js.map} +1 -1
  38. package/dist/assets/{ProjectTabs-D7nNxtFO.js → ProjectTabs-5ZO9YR8J.js} +2 -2
  39. package/dist/assets/{ProjectTabs-D7nNxtFO.js.map → ProjectTabs-5ZO9YR8J.js.map} +1 -1
  40. package/dist/assets/{PushConnectionTracker-YJuy57g2.js → PushConnectionTracker-Bp-RjnYr.js} +2 -2
  41. package/dist/assets/{PushConnectionTracker-YJuy57g2.js.map → PushConnectionTracker-Bp-RjnYr.js.map} +1 -1
  42. package/dist/assets/{ResourcesListLayout-mZ4ijKRB.js → ResourcesListLayout-B4W1PSHT.js} +2 -2
  43. package/dist/assets/{ResourcesListLayout-mZ4ijKRB.js.map → ResourcesListLayout-B4W1PSHT.js.map} +1 -1
  44. package/dist/assets/{RunDataAi-D0m0Vg_p.js → RunDataAi-C3XiqNZa.js} +2 -2
  45. package/dist/assets/{RunDataAi-D0m0Vg_p.js.map → RunDataAi-C3XiqNZa.js.map} +1 -1
  46. package/dist/assets/{RunDataJson-DkHNIqVj.js → RunDataJson-CMcOD-78.js} +3 -3
  47. package/dist/assets/{RunDataJson-DkHNIqVj.js.map → RunDataJson-CMcOD-78.js.map} +1 -1
  48. package/dist/assets/{RunDataJsonActions-Cgxcpw8t.js → RunDataJsonActions-BQBpmtOi.js} +2 -2
  49. package/dist/assets/{RunDataJsonActions-Cgxcpw8t.js.map → RunDataJsonActions-BQBpmtOi.js.map} +1 -1
  50. package/dist/assets/{RunDataSchema-C6aZoC0a.js → RunDataSchema-CF4YH-8y.js} +2 -2
  51. package/dist/assets/{RunDataSchema-C6aZoC0a.js.map → RunDataSchema-CF4YH-8y.js.map} +1 -1
  52. package/dist/assets/{RunDataSearch-D2CDg21N.js → RunDataSearch-DwB8g_cE.js} +2 -2
  53. package/dist/assets/{RunDataSearch-D2CDg21N.js.map → RunDataSearch-DwB8g_cE.js.map} +1 -1
  54. package/dist/assets/{RunDataTable-D597NRFD.js → RunDataTable-BVAuNDP9.js} +2 -2
  55. package/dist/assets/{RunDataTable-D597NRFD.js.map → RunDataTable-BVAuNDP9.js.map} +1 -1
  56. package/dist/assets/{SamlOnboarding-Me669myi.js → SamlOnboarding-Csd8l-7T.js} +2 -2
  57. package/dist/assets/{SamlOnboarding-Me669myi.js.map → SamlOnboarding-Csd8l-7T.js.map} +1 -1
  58. package/dist/assets/{SettingsApiView-DV8pIHDw.js → SettingsApiView-DnvdV7dx.js} +2 -2
  59. package/dist/assets/{SettingsApiView-DV8pIHDw.js.map → SettingsApiView-DnvdV7dx.js.map} +1 -1
  60. package/dist/assets/{SettingsCommunityNodesView-D_gtSdk3.js → SettingsCommunityNodesView-C11a_Ybs.js} +2 -2
  61. package/dist/assets/{SettingsCommunityNodesView-D_gtSdk3.js.map → SettingsCommunityNodesView-C11a_Ybs.js.map} +1 -1
  62. package/dist/assets/{SettingsExternalSecrets-xprYKjAW.js → SettingsExternalSecrets-IIReUcRG.js} +2 -2
  63. package/dist/assets/{SettingsExternalSecrets-xprYKjAW.js.map → SettingsExternalSecrets-IIReUcRG.js.map} +1 -1
  64. package/dist/assets/{SettingsFakeDoorView-CKaSOYh5.js → SettingsFakeDoorView-BOUfBJS8.js} +2 -2
  65. package/dist/assets/{SettingsFakeDoorView-CKaSOYh5.js.map → SettingsFakeDoorView-BOUfBJS8.js.map} +1 -1
  66. package/dist/assets/{SettingsLdapView-BBCv2tmk.js → SettingsLdapView-BaSjQ4cy.js} +2 -2
  67. package/dist/assets/{SettingsLdapView-BBCv2tmk.js.map → SettingsLdapView-BaSjQ4cy.js.map} +1 -1
  68. package/dist/assets/{SettingsLogStreamingView-HRIp8kyL.js → SettingsLogStreamingView-COGhA1hN.js} +2 -2
  69. package/dist/assets/{SettingsLogStreamingView-HRIp8kyL.js.map → SettingsLogStreamingView-COGhA1hN.js.map} +1 -1
  70. package/dist/assets/{SettingsPersonalView-CsUb3SvK.js → SettingsPersonalView-BJGgPTwa.js} +2 -2
  71. package/dist/assets/{SettingsPersonalView-CsUb3SvK.js.map → SettingsPersonalView-BJGgPTwa.js.map} +1 -1
  72. package/dist/assets/{SettingsSourceControl-BkPpVGsk.js → SettingsSourceControl-DkdSLuvp.js} +2 -2
  73. package/dist/assets/{SettingsSourceControl-BkPpVGsk.js.map → SettingsSourceControl-DkdSLuvp.js.map} +1 -1
  74. package/dist/assets/{SettingsSso-BueUV3RH.js → SettingsSso-DA9AOKH5.js} +2 -2
  75. package/dist/assets/{SettingsSso-BueUV3RH.js.map → SettingsSso-DA9AOKH5.js.map} +1 -1
  76. package/dist/assets/{SettingsUsageAndPlan-DzDC9m54.js → SettingsUsageAndPlan-BVPtlthH.js} +2 -2
  77. package/dist/assets/{SettingsUsageAndPlan-DzDC9m54.js.map → SettingsUsageAndPlan-BVPtlthH.js.map} +1 -1
  78. package/dist/assets/{SettingsUsersView-CTd5MQLw.js → SettingsUsersView-BuKt4ZDO.js} +2 -2
  79. package/dist/assets/{SettingsUsersView-CTd5MQLw.js.map → SettingsUsersView-BuKt4ZDO.js.map} +1 -1
  80. package/dist/assets/{SettingsView-DMxqsNh0.js → SettingsView-DJ78VuiY.js} +2 -2
  81. package/dist/assets/{SettingsView-DMxqsNh0.js.map → SettingsView-DJ78VuiY.js.map} +1 -1
  82. package/dist/assets/{SetupView-tkyttChl.js → SetupView-C70Dkfed.js} +2 -2
  83. package/dist/assets/{SetupView-tkyttChl.js.map → SetupView-C70Dkfed.js.map} +1 -1
  84. package/dist/assets/{SetupWorkflowCredentialsButton-B3HZvKQp.js → SetupWorkflowCredentialsButton-CEQ1LrFl.js} +2 -2
  85. package/dist/assets/{SetupWorkflowCredentialsButton-B3HZvKQp.js.map → SetupWorkflowCredentialsButton-CEQ1LrFl.js.map} +1 -1
  86. package/dist/assets/{SetupWorkflowFromTemplateView-DL3b-TZS.js → SetupWorkflowFromTemplateView-BUzzXtBr.js} +2 -2
  87. package/dist/assets/{SetupWorkflowFromTemplateView-DL3b-TZS.js.map → SetupWorkflowFromTemplateView-BUzzXtBr.js.map} +1 -1
  88. package/dist/assets/{SigninView-BPLGsvzz.js → SigninView-B3CNL-yp.js} +2 -2
  89. package/dist/assets/{SigninView-BPLGsvzz.js.map → SigninView-B3CNL-yp.js.map} +1 -1
  90. package/dist/assets/{SignoutView-BySf9D7k.js → SignoutView-svcLavkC.js} +2 -2
  91. package/dist/assets/{SignoutView-BySf9D7k.js.map → SignoutView-svcLavkC.js.map} +1 -1
  92. package/dist/assets/{SignupView-EU3JWt4T.js → SignupView-DJWRTPKF.js} +2 -2
  93. package/dist/assets/{SignupView-EU3JWt4T.js.map → SignupView-DJWRTPKF.js.map} +1 -1
  94. package/dist/assets/{TemplateDetails-Cemx-ozB.js → TemplateDetails-BnbiWxo-.js} +2 -2
  95. package/dist/assets/{TemplateDetails-Cemx-ozB.js.map → TemplateDetails-BnbiWxo-.js.map} +1 -1
  96. package/dist/assets/{TemplateList-h3b91b7e.js → TemplateList-By-t2s0M.js} +2 -2
  97. package/dist/assets/{TemplateList-h3b91b7e.js.map → TemplateList-By-t2s0M.js.map} +1 -1
  98. package/dist/assets/{TemplatesCollectionView-aBX3f7Pp.js → TemplatesCollectionView-D2L1fmSc.js} +2 -2
  99. package/dist/assets/{TemplatesCollectionView-aBX3f7Pp.js.map → TemplatesCollectionView-D2L1fmSc.js.map} +1 -1
  100. package/dist/assets/{TemplatesSearchView-DyoC9WUR.js → TemplatesSearchView-Bmr6Nd6g.js} +2 -2
  101. package/dist/assets/{TemplatesSearchView-DyoC9WUR.js.map → TemplatesSearchView-Bmr6Nd6g.js.map} +1 -1
  102. package/dist/assets/{TemplatesView-GQmC_sY8.js → TemplatesView-BbunSn-s.js} +2 -2
  103. package/dist/assets/{TemplatesView-GQmC_sY8.js.map → TemplatesView-BbunSn-s.js.map} +1 -1
  104. package/dist/assets/{TemplatesWorkflowView-C-0pXdDh.js → TemplatesWorkflowView-XxBIlMWY.js} +2 -2
  105. package/dist/assets/{TemplatesWorkflowView-C-0pXdDh.js.map → TemplatesWorkflowView-XxBIlMWY.js.map} +1 -1
  106. package/dist/assets/{VariablesView-BO5fdkwt.js → VariablesView-ZY5xLmKI.js} +2 -2
  107. package/dist/assets/{VariablesView-BO5fdkwt.js.map → VariablesView-ZY5xLmKI.js.map} +1 -1
  108. package/dist/assets/{WorkerView-C3Rdbsfq.js → WorkerView-DV19-i1-.js} +2 -2
  109. package/dist/assets/{WorkerView-C3Rdbsfq.js.map → WorkerView-DV19-i1-.js.map} +1 -1
  110. package/dist/assets/{WorkflowActivator-DQXSsw0V.js → WorkflowActivator-BXWURYao.js} +2 -2
  111. package/dist/assets/{WorkflowActivator-DQXSsw0V.js.map → WorkflowActivator-BXWURYao.js.map} +1 -1
  112. package/dist/assets/{WorkflowExecutionsInfoAccordion-DJPF47om.js → WorkflowExecutionsInfoAccordion-aldNazgt.js} +2 -2
  113. package/dist/assets/{WorkflowExecutionsInfoAccordion-DJPF47om.js.map → WorkflowExecutionsInfoAccordion-aldNazgt.js.map} +1 -1
  114. package/dist/assets/{WorkflowExecutionsLandingPage-DoSsHWxH.js → WorkflowExecutionsLandingPage-CaAameTk.js} +2 -2
  115. package/dist/assets/{WorkflowExecutionsLandingPage-DoSsHWxH.js.map → WorkflowExecutionsLandingPage-CaAameTk.js.map} +1 -1
  116. package/dist/assets/{WorkflowExecutionsPreview-Dt23N5A4.js → WorkflowExecutionsPreview-Bb-wJtr-.js} +2 -2
  117. package/dist/assets/{WorkflowExecutionsPreview-Dt23N5A4.js.map → WorkflowExecutionsPreview-Bb-wJtr-.js.map} +1 -1
  118. package/dist/assets/{WorkflowExecutionsView-CpAIVxYQ.js → WorkflowExecutionsView-D7nlOP1-.js} +2 -2
  119. package/dist/assets/{WorkflowExecutionsView-CpAIVxYQ.js.map → WorkflowExecutionsView-D7nlOP1-.js.map} +1 -1
  120. package/dist/assets/{WorkflowHistory-D1-E_J_s.js → WorkflowHistory-C6zCGFoY.js} +2 -2
  121. package/dist/assets/{WorkflowHistory-D1-E_J_s.js.map → WorkflowHistory-C6zCGFoY.js.map} +1 -1
  122. package/dist/assets/{WorkflowOnboardingView-fzAZuVh5.js → WorkflowOnboardingView-Bu_Oqtr7.js} +2 -2
  123. package/dist/assets/{WorkflowOnboardingView-fzAZuVh5.js.map → WorkflowOnboardingView-Bu_Oqtr7.js.map} +1 -1
  124. package/dist/assets/{WorkflowPreview-BkL2jDRm.js → WorkflowPreview-CVwpKdpj.js} +2 -2
  125. package/dist/assets/{WorkflowPreview-BkL2jDRm.js.map → WorkflowPreview-CVwpKdpj.js.map} +1 -1
  126. package/dist/assets/{WorkflowsView-rbygROmM.js → WorkflowsView-DVeAZ2zW.js} +2 -2
  127. package/dist/assets/{WorkflowsView-rbygROmM.js.map → WorkflowsView-DVeAZ2zW.js.map} +1 -1
  128. package/dist/assets/{cloud-B90x0-JC.js → cloud-BRhZDk2r.js} +2 -2
  129. package/dist/assets/{cloud-B90x0-JC.js.map → cloud-BRhZDk2r.js.map} +1 -1
  130. package/dist/assets/{collaboration.store-ElxCV91F.js → collaboration.store-Ol7bcCFc.js} +2 -2
  131. package/dist/assets/{collaboration.store-ElxCV91F.js.map → collaboration.store-Ol7bcCFc.js.map} +1 -1
  132. package/dist/assets/{index-BE0Xl-jy.js → index-1OxaEeO3.js} +4 -4
  133. package/dist/assets/{index-BE0Xl-jy.js.map → index-1OxaEeO3.js.map} +1 -1
  134. package/dist/assets/{nodeCreator.store-Q1T99YCl.js → nodeCreator.store-FIsc3SCx.js} +2 -2
  135. package/dist/assets/{nodeCreator.store-Q1T99YCl.js.map → nodeCreator.store-FIsc3SCx.js.map} +1 -1
  136. package/dist/assets/{templateActions-B7R6qRak.js → templateActions-w_1vSarr.js} +2 -2
  137. package/dist/assets/{templateActions-B7R6qRak.js.map → templateActions-w_1vSarr.js.map} +1 -1
  138. package/dist/assets/{useExecutionDebugging-BJ0CgMh8.js → useExecutionDebugging-EHinBq_u.js} +2 -2
  139. package/dist/assets/{useExecutionDebugging-BJ0CgMh8.js.map → useExecutionDebugging-EHinBq_u.js.map} +1 -1
  140. package/dist/assets/{useExecutionHelpers-D3294Pbg.js → useExecutionHelpers-LeKoU_T-.js} +2 -2
  141. package/dist/assets/{useExecutionHelpers-D3294Pbg.js.map → useExecutionHelpers-LeKoU_T-.js.map} +1 -1
  142. package/dist/assets/{usePushConnection-CsYeEXN4.js → usePushConnection-PQgFeT_8.js} +2 -2
  143. package/dist/assets/{usePushConnection-CsYeEXN4.js.map → usePushConnection-PQgFeT_8.js.map} +1 -1
  144. package/dist/assets/{useUserHelpers-CzNhI0vP.js → useUserHelpers-DZtbUAMm.js} +2 -2
  145. package/dist/assets/{useUserHelpers-CzNhI0vP.js.map → useUserHelpers-DZtbUAMm.js.map} +1 -1
  146. package/dist/assets/{useWorkflowActivate-D8iK20ua.js → useWorkflowActivate-npf1npdP.js} +2 -2
  147. package/dist/assets/{useWorkflowActivate-D8iK20ua.js.map → useWorkflowActivate-npf1npdP.js.map} +1 -1
  148. package/dist/index.html +1 -1
  149. package/package.json +1 -1
  150. package/dist/assets/CollectionParameter-BXMOfisf.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"MainHeader-CT4nF2mY.js","sources":["../../src/components/ShortenName.vue","../../src/components/IntersectionObserver.vue","../../src/components/IntersectionObserved.vue","../../src/components/TagsContainer.vue","../../src/components/ExpandableInput/ExpandableInputBase.vue","../../src/components/ExpandableInput/ExpandableInputEdit.vue","../../src/components/InlineTextEdit.vue","../../src/components/BreakpointsObserver.vue","../../src/components/MainHeader/CollaborationPane.vue","../../src/components/MainHeader/WorkflowDetails.vue","../../src/components/MainHeader/TabBar.vue","../../src/components/MainHeader/MainHeader.vue"],"sourcesContent":["<template>\n\t<span :title=\"name\" :data-test-id=\"testId\">\n\t\t<slot :shortened-name=\"shortenedName\"></slot>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { shorten } from '@/utils/typesUtils';\n\nconst DEFAULT_WORKFLOW_NAME_LIMIT = 25;\nconst WORKFLOW_NAME_END_COUNT_TO_KEEP = 4;\n\nexport default defineComponent({\n\tname: 'ShortenName',\n\tprops: ['name', 'limit', 'testId'],\n\tcomputed: {\n\t\tshortenedName(): string {\n\t\t\treturn shorten(\n\t\t\t\tthis.name,\n\t\t\t\tthis.limit || DEFAULT_WORKFLOW_NAME_LIMIT,\n\t\t\t\tWORKFLOW_NAME_END_COUNT_TO_KEEP,\n\t\t\t);\n\t\t},\n\t},\n});\n</script>\n","<template>\n\t<div ref=\"root\">\n\t\t<slot></slot>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EventBus } from 'n8n-design-system/utils';\nimport { createEventBus } from 'n8n-design-system/utils';\n\nexport default defineComponent({\n\tname: 'IntersectionObserver',\n\tprops: {\n\t\tthreshold: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\t\tenabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\teventBus: {\n\t\t\ttype: Object as PropType<EventBus>,\n\t\t\tdefault: () => createEventBus(),\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tobserver: null as IntersectionObserver | null,\n\t\t};\n\t},\n\tmounted() {\n\t\tif (!this.enabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst options = {\n\t\t\troot: this.$refs.root as Element,\n\t\t\trootMargin: '0px',\n\t\t\tthreshold: this.threshold,\n\t\t};\n\n\t\tconst observer = new IntersectionObserver((entries) => {\n\t\t\tentries.forEach(({ target, isIntersecting }) => {\n\t\t\t\tthis.$emit('observed', {\n\t\t\t\t\tel: target,\n\t\t\t\t\tisIntersecting,\n\t\t\t\t});\n\t\t\t});\n\t\t}, options);\n\n\t\tthis.observer = observer;\n\n\t\tthis.eventBus.on('observe', (observed: Element) => {\n\t\t\tif (observed) {\n\t\t\t\tobserver.observe(observed);\n\t\t\t}\n\t\t});\n\n\t\tthis.eventBus.on('unobserve', (observed: Element) => {\n\t\t\tobserver.unobserve(observed);\n\t\t});\n\t},\n\tbeforeUnmount() {\n\t\tif (this.enabled && this.observer) {\n\t\t\tthis.observer.disconnect();\n\t\t}\n\t},\n});\n</script>\n","<template>\n\t<span ref=\"observed\">\n\t\t<slot></slot>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EventBus } from 'n8n-design-system/utils';\nimport { createEventBus } from 'n8n-design-system/utils';\n\nexport default defineComponent({\n\tname: 'IntersectionObserved',\n\tprops: {\n\t\tenabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\teventBus: {\n\t\t\ttype: Object as PropType<EventBus>,\n\t\t\tdefault: () => createEventBus(),\n\t\t},\n\t},\n\tasync mounted() {\n\t\tif (!this.enabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.$nextTick();\n\t\tthis.eventBus.emit('observe', this.$refs.observed);\n\t},\n\tbeforeUnmount() {\n\t\tif (this.enabled) {\n\t\t\tthis.eventBus.emit('unobserve', this.$refs.observed);\n\t\t}\n\t},\n});\n</script>\n","<template>\n\t<IntersectionObserver\n\t\tref=\"tagsContainer\"\n\t\t:threshold=\"1.0\"\n\t\tclass=\"tags-container\"\n\t\t:style=\"style\"\n\t\t:enabled=\"responsive\"\n\t\t:event-bus=\"intersectionEventBus\"\n\t\t@observed=\"onObserved\"\n\t>\n\t\t<span class=\"tags\">\n\t\t\t<span\n\t\t\t\tv-for=\"tag in tags\"\n\t\t\t\t:key=\"tag.id\"\n\t\t\t\t:class=\"{ clickable: !tag.hidden }\"\n\t\t\t\t@click=\"(e) => onClick(e, tag)\"\n\t\t\t>\n\t\t\t\t<el-tag\n\t\t\t\t\tv-if=\"tag.isCount\"\n\t\t\t\t\t:title=\"tag.title\"\n\t\t\t\t\ttype=\"info\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tclass=\"count-container\"\n\t\t\t\t\t:disable-transitions=\"true\"\n\t\t\t\t>\n\t\t\t\t\t{{ tag.name }}\n\t\t\t\t</el-tag>\n\t\t\t\t<IntersectionObserved\n\t\t\t\t\tv-else\n\t\t\t\t\t:class=\"{ hideTag: tag.hidden }\"\n\t\t\t\t\t:data-id=\"tag.id\"\n\t\t\t\t\t:enabled=\"responsive\"\n\t\t\t\t\t:event-bus=\"intersectionEventBus\"\n\t\t\t\t>\n\t\t\t\t\t<el-tag\n\t\t\t\t\t\t:title=\"tag.name\"\n\t\t\t\t\t\ttype=\"info\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t:class=\"{ hoverable }\"\n\t\t\t\t\t\t:disable-transitions=\"true\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ tag.name }}\n\t\t\t\t\t</el-tag>\n\t\t\t\t</IntersectionObserved>\n\t\t\t</span>\n\t\t</span>\n\t</IntersectionObserver>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, type ComponentInstance } from 'vue';\n\nimport type { ITag } from '@/Interface';\nimport IntersectionObserver from './IntersectionObserver.vue';\nimport IntersectionObserved from './IntersectionObserved.vue';\nimport { mapStores } from 'pinia';\nimport { useTagsStore } from '@/stores/tags.store';\nimport { createEventBus } from 'n8n-design-system/utils';\nimport { debounce } from 'lodash-es';\n\n// random upper limit if none is set to minimize performance impact of observers\nconst DEFAULT_MAX_TAGS_LIMIT = 20;\n\ninterface TagEl extends ITag {\n\thidden?: boolean;\n\ttitle?: string;\n\tisCount?: boolean;\n}\n\nexport default defineComponent({\n\tname: 'TagsContainer',\n\tcomponents: { IntersectionObserver, IntersectionObserved },\n\tprops: {\n\t\ttagIds: {\n\t\t\ttype: Array as () => string[],\n\t\t\trequired: true,\n\t\t},\n\t\tlimit: {\n\t\t\ttype: Number,\n\t\t\tdefault: DEFAULT_MAX_TAGS_LIMIT,\n\t\t},\n\t\tclickable: Boolean,\n\t\tresponsive: Boolean,\n\t\thoverable: Boolean,\n\t},\n\temits: {\n\t\tclick: null,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tmaxWidth: 320,\n\t\t\tintersectionEventBus: createEventBus(),\n\t\t\tvisibility: {} as { [id: string]: boolean },\n\t\t\tdebouncedSetMaxWidth: () => {},\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useTagsStore),\n\t\tstyle() {\n\t\t\treturn {\n\t\t\t\t'max-width': `${this.maxWidth}px`,\n\t\t\t};\n\t\t},\n\t\ttags() {\n\t\t\tconst tags = this.tagIds\n\t\t\t\t.map((tagId: string) => this.tagsStore.getTagById(tagId))\n\t\t\t\t.filter(Boolean); // if tag has been deleted from store\n\n\t\t\tlet toDisplay: TagEl[] = this.limit ? tags.slice(0, this.limit) : tags;\n\t\t\ttoDisplay = toDisplay.map((tag: ITag) => ({\n\t\t\t\t...tag,\n\t\t\t\thidden: this.responsive && !this.visibility[tag.id],\n\t\t\t}));\n\n\t\t\tlet visibleCount = toDisplay.length;\n\t\t\tif (this.responsive) {\n\t\t\t\tvisibleCount = Object.values(this.visibility).reduce(\n\t\t\t\t\t(accu, val) => (val ? accu + 1 : accu),\n\t\t\t\t\t0,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (visibleCount < tags.length) {\n\t\t\t\tconst hidden = tags.slice(visibleCount);\n\t\t\t\tconst hiddenTitle = hidden.reduce((accu: string, tag: ITag) => {\n\t\t\t\t\treturn accu ? `${accu}, ${tag.name}` : tag.name;\n\t\t\t\t}, '');\n\n\t\t\t\tconst countTag: TagEl = {\n\t\t\t\t\tid: 'count',\n\t\t\t\t\tname: `+${hidden.length}`,\n\t\t\t\t\ttitle: hiddenTitle,\n\t\t\t\t\tisCount: true,\n\t\t\t\t};\n\t\t\t\ttoDisplay.splice(visibleCount, 0, countTag);\n\t\t\t}\n\n\t\t\treturn toDisplay;\n\t\t},\n\t},\n\tcreated() {\n\t\tthis.debouncedSetMaxWidth = debounce(this.setMaxWidth, 100);\n\t},\n\tmounted() {\n\t\tthis.setMaxWidth();\n\t\twindow.addEventListener('resize', this.debouncedSetMaxWidth);\n\t},\n\tbeforeUnmount() {\n\t\twindow.removeEventListener('resize', this.debouncedSetMaxWidth);\n\t},\n\tmethods: {\n\t\tsetMaxWidth() {\n\t\t\tconst containerEl = this.$refs.tagsContainer as ComponentInstance<IntersectionObserver>;\n\t\t\tconst container = containerEl.$el as HTMLElement;\n\t\t\tconst parent = container.parentNode as HTMLElement;\n\n\t\t\tif (parent) {\n\t\t\t\tthis.maxWidth = 0;\n\t\t\t\tvoid this.$nextTick(() => {\n\t\t\t\t\tthis.maxWidth = parent.clientWidth;\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonObserved({ el, isIntersecting }: { el: HTMLElement; isIntersecting: boolean }) {\n\t\t\tif (el.dataset.id) {\n\t\t\t\tthis.visibility = { ...this.visibility, [el.dataset.id]: isIntersecting };\n\t\t\t}\n\t\t},\n\t\tonClick(e: MouseEvent, tag: TagEl) {\n\t\t\tif (this.clickable) {\n\t\t\t\te.stopPropagation();\n\t\t\t}\n\n\t\t\t// if tag is hidden or not displayed\n\t\t\tif (!tag.hidden) {\n\t\t\t\tthis.$emit('click', tag.id);\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" scoped>\n.tags-container {\n\tdisplay: block;\n\tmax-width: 300px;\n}\n\n.tags {\n\tdisplay: block;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\tmax-width: 100%;\n\n\t> span {\n\t\tpadding-right: 4px; // why not margin? for space between tags to be clickable\n\t}\n}\n\n.hideTag {\n\tvisibility: hidden;\n}\n\n.el-tag.hoverable:hover {\n\tborder-color: $color-primary;\n}\n\n.count-container {\n\tposition: absolute;\n\tmax-width: 40px;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n}\n</style>\n","<template>\n\t<!-- mock el-input element to apply styles -->\n\t<div :class=\"{ 'el-input': true, 'static-size': staticSize }\" :data-value=\"hiddenValue\">\n\t\t<slot></slot>\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\ntype Props = {\n\tmodelValue: string;\n\tplaceholder?: string;\n\tstaticSize?: boolean;\n};\n\nconst props = withDefaults(defineProps<Props>(), { staticSize: false, placeholder: '' });\n\nconst hiddenValue = computed(() => {\n\tlet value = props.modelValue.replace(/\\s/g, '.'); // force input to expand on space chars\n\tif (!value) {\n\t\tvalue = props.placeholder;\n\t}\n\n\treturn `${value}`; // adjust for padding\n});\n</script>\n\n<style lang=\"scss\" scoped>\n$--horiz-padding: 15px;\n\n.el-input {\n\tdisplay: inline-grid;\n\tfont: inherit;\n\tpadding: 10px 0;\n\n\t:deep(input) {\n\t\tborder: 1px solid transparent;\n\t\tpadding: 0 $--horiz-padding - 2px; // -2px for borders\n\t\twidth: 100%;\n\t\tgrid-area: 1 / 2;\n\t\tfont: inherit;\n\t}\n\n\t&::after {\n\t\tgrid-area: 1 / 2;\n\t\tfont: inherit;\n\t\tcontent: attr(data-value) ' ';\n\t\tvisibility: hidden;\n\t\twhite-space: nowrap;\n\t\tpadding: 0 $--horiz-padding;\n\t}\n\n\t&:not(.static-size)::after {\n\t\toverflow: hidden;\n\t}\n\n\t&:hover {\n\t\t:deep(input):not(:focus) {\n\t\t\tborder: 1px solid var(--color-text-lighter);\n\t\t}\n\t}\n\n\t:deep(input):focus {\n\t\tborder: 1px solid var(--color-secondary);\n\t}\n}\n</style>\n","<template>\n\t<ExpandableInputBase :model-value=\"modelValue\" :placeholder=\"placeholder\">\n\t\t<input\n\t\t\tref=\"inputRef\"\n\t\t\tv-on-click-outside=\"onClickOutside\"\n\t\t\tclass=\"el-input__inner\"\n\t\t\t:value=\"modelValue\"\n\t\t\t:placeholder=\"placeholder\"\n\t\t\t:maxlength=\"maxlength\"\n\t\t\tsize=\"4\"\n\t\t\t@input=\"onInput\"\n\t\t\t@keydown.enter=\"onEnter\"\n\t\t\t@keydown.esc=\"onEscape\"\n\t\t/>\n\t</ExpandableInputBase>\n</template>\n\n<script setup lang=\"ts\">\nimport type { EventBus } from 'n8n-design-system';\nimport { onBeforeUnmount, onMounted, ref } from 'vue';\nimport ExpandableInputBase from './ExpandableInputBase.vue';\n\ntype Props = {\n\tmodelValue: string;\n\tplaceholder: string;\n\tmaxlength?: number;\n\tautofocus?: boolean;\n\teventBus?: EventBus;\n};\n\nconst props = defineProps<Props>();\nconst emit = defineEmits<{\n\t(event: 'update:model-value', value: string): void;\n\t(event: 'enter', value: string): void;\n\t(event: 'blur', value: string): void;\n\t(event: 'esc'): void;\n}>();\n\nconst inputRef = ref<HTMLInputElement>();\n\nonMounted(() => {\n\t// autofocus on input element is not reliable\n\tif (props.autofocus && inputRef.value) {\n\t\tfocus();\n\t}\n\tprops.eventBus?.on('focus', focus);\n});\n\nonBeforeUnmount(() => {\n\tprops.eventBus?.off('focus', focus);\n});\n\nfunction focus() {\n\tif (inputRef.value) {\n\t\tinputRef.value.focus();\n\t}\n}\n\nfunction onInput() {\n\tif (inputRef.value) {\n\t\temit('update:model-value', inputRef.value.value);\n\t}\n}\n\nfunction onEnter() {\n\tif (inputRef.value) {\n\t\temit('enter', inputRef.value.value);\n\t}\n}\n\nfunction onClickOutside(e: Event) {\n\tif (e.type === 'click' && inputRef.value) {\n\t\temit('blur', inputRef.value.value);\n\t}\n}\n\nfunction onEscape() {\n\temit('esc');\n}\n</script>\n","<template>\n\t<span class=\"inline-edit\" @keydown.stop>\n\t\t<span v-if=\"isEditEnabled && !isDisabled\">\n\t\t\t<ExpandableInputEdit\n\t\t\t\tv-model=\"newValue\"\n\t\t\t\t:placeholder=\"placeholder\"\n\t\t\t\t:maxlength=\"maxLength\"\n\t\t\t\t:autofocus=\"true\"\n\t\t\t\t:event-bus=\"inputBus\"\n\t\t\t\t@update:model-value=\"onInput\"\n\t\t\t\t@esc=\"onEscape\"\n\t\t\t\t@blur=\"onBlur\"\n\t\t\t\t@enter=\"submit\"\n\t\t\t/>\n\t\t</span>\n\n\t\t<span v-else class=\"preview\" @click=\"onClick\">\n\t\t\t<ExpandableInputPreview :model-value=\"previewValue || modelValue\" />\n\t\t</span>\n\t</span>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, defineProps, defineEmits } from 'vue';\nimport ExpandableInputEdit from '@/components/ExpandableInput/ExpandableInputEdit.vue';\nimport ExpandableInputPreview from '@/components/ExpandableInput/ExpandableInputPreview.vue';\nimport { createEventBus } from 'n8n-design-system/utils';\n\nconst props = withDefaults(\n\tdefineProps<{\n\t\tisEditEnabled: boolean;\n\t\tmodelValue: string;\n\t\tplaceholder: string;\n\t\tmaxLength: number;\n\t\tpreviewValue: string;\n\t\tdisabled: boolean;\n\t}>(),\n\t{\n\t\tisEditEnabled: false,\n\t\tmodelValue: '',\n\t\tplaceholder: '',\n\t\tmaxLength: 0,\n\t\tpreviewValue: '',\n\t\tdisabled: false,\n\t},\n);\n\nconst emit = defineEmits<{\n\t(event: 'toggle'): void;\n\t(event: 'submit', payload: { name: string; onSubmit: (updated: boolean) => void }): void;\n}>();\n\nconst isDisabled = ref(props.disabled);\nconst newValue = ref('');\nconst escPressed = ref(false);\nconst inputBus = ref(createEventBus());\n\nwatch(\n\t() => props.disabled,\n\t(value) => {\n\t\tisDisabled.value = value;\n\t},\n);\n\nfunction onInput(val: string) {\n\tif (isDisabled.value) return;\n\tnewValue.value = val;\n}\n\nfunction onClick() {\n\tif (isDisabled.value) return;\n\tnewValue.value = props.modelValue;\n\temit('toggle');\n}\n\nfunction onBlur() {\n\tif (isDisabled.value) return;\n\tif (!escPressed.value) {\n\t\tsubmit();\n\t}\n\tescPressed.value = false;\n}\n\nfunction submit() {\n\tif (isDisabled.value) return;\n\tconst onSubmit = (updated: boolean) => {\n\t\tisDisabled.value = false;\n\t\tif (!updated) {\n\t\t\tinputBus.value.emit('focus');\n\t\t}\n\t};\n\tisDisabled.value = true;\n\temit('submit', { name: newValue.value, onSubmit });\n}\n\nfunction onEscape() {\n\tif (isDisabled.value) return;\n\tescPressed.value = true;\n\temit('toggle');\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.preview {\n\tcursor: pointer;\n}\n</style>\n","<template>\n\t<span>\n\t\t<slot :bp=\"bp\" :value=\"value\" />\n\t</span>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted, onBeforeUnmount, nextTick } from 'vue';\nimport { BREAKPOINT_SM, BREAKPOINT_MD, BREAKPOINT_LG, BREAKPOINT_XL } from '@/constants';\nimport { useUIStore } from '@/stores/ui.store';\nimport { getBannerRowHeight } from '@/utils/htmlUtils';\nimport { useDebounce } from '@/composables/useDebounce';\n\n/**\n * matching element.io https://element.eleme.io/#/en-US/component/layout#col-attributes\n * xs < 768\n * sm >= 768\n * md >= 992\n * lg >= 1200\n * xl >= 1920\n */\ninterface Props {\n\tvalueXS?: number;\n\tvalueXL?: number;\n\tvalueLG?: number;\n\tvalueMD?: number;\n\tvalueSM?: number;\n\tvalueDefault?: number;\n}\n\nconst props = defineProps<Props>();\n\nconst { callDebounced } = useDebounce();\nconst uiStore = useUIStore();\n\nconst width = ref(window.innerWidth);\n\nconst bp = computed(() => {\n\tif (width.value < BREAKPOINT_SM) {\n\t\treturn 'XS';\n\t}\n\tif (width.value >= BREAKPOINT_XL) {\n\t\treturn 'XL';\n\t}\n\tif (width.value >= BREAKPOINT_LG) {\n\t\treturn 'LG';\n\t}\n\tif (width.value >= BREAKPOINT_MD) {\n\t\treturn 'MD';\n\t}\n\treturn 'SM';\n});\n\nconst value = computed(() => {\n\tif (props.valueXS && width.value < BREAKPOINT_SM) {\n\t\treturn props.valueXS;\n\t}\n\tif (props.valueXL && width.value >= BREAKPOINT_XL) {\n\t\treturn props.valueXL;\n\t}\n\tif (props.valueLG && width.value >= BREAKPOINT_LG) {\n\t\treturn props.valueLG;\n\t}\n\tif (props.valueMD && width.value >= BREAKPOINT_MD) {\n\t\treturn props.valueMD;\n\t}\n\tif (props.valueSM) {\n\t\treturn props.valueSM;\n\t}\n\treturn props.valueDefault;\n});\n\nconst onResize = () => {\n\tvoid callDebounced(onResizeEnd, { debounceTime: 50 });\n};\n\nconst onResizeEnd = async () => {\n\twidth.value = window.innerWidth;\n\tawait nextTick();\n\n\tconst bannerHeight = await getBannerRowHeight();\n\tuiStore.updateBannersHeight(bannerHeight);\n};\n\nonMounted(() => {\n\twindow.addEventListener('resize', onResize);\n});\n\nonBeforeUnmount(() => {\n\twindow.removeEventListener('resize', onResize);\n});\n</script>\n","<script setup lang=\"ts\">\nimport { useUsersStore } from '@/stores/users.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useCollaborationStore } from '@/stores/collaboration.store';\nimport { onBeforeUnmount, onMounted, computed, ref } from 'vue';\nimport { TIME } from '@/constants';\nimport { isUserGlobalOwner } from '@/utils/userUtils';\n\nconst collaborationStore = useCollaborationStore();\nconst usersStore = useUsersStore();\nconst workflowsStore = useWorkflowsStore();\n\nconst HEARTBEAT_INTERVAL = 5 * TIME.MINUTE;\nconst heartbeatTimer = ref<number | null>(null);\n\nconst activeUsersSorted = computed(() => {\n\tconst currentWorkflowUsers = (collaborationStore.getUsersForCurrentWorkflow ?? []).map(\n\t\t(userInfo) => userInfo.user,\n\t);\n\tconst owner = currentWorkflowUsers.find(isUserGlobalOwner);\n\treturn {\n\t\tdefaultGroup: owner\n\t\t\t? [owner, ...currentWorkflowUsers.filter((user) => user.id !== owner.id)]\n\t\t\t: currentWorkflowUsers,\n\t};\n});\n\nconst currentUserEmail = computed(() => {\n\treturn usersStore.currentUser?.email;\n});\n\nconst startHeartbeat = () => {\n\tif (heartbeatTimer.value !== null) {\n\t\tclearInterval(heartbeatTimer.value);\n\t\theartbeatTimer.value = null;\n\t}\n\theartbeatTimer.value = window.setInterval(() => {\n\t\tcollaborationStore.notifyWorkflowOpened(workflowsStore.workflow.id);\n\t}, HEARTBEAT_INTERVAL);\n};\n\nconst stopHeartbeat = () => {\n\tif (heartbeatTimer.value !== null) {\n\t\tclearInterval(heartbeatTimer.value);\n\t}\n};\n\nconst onDocumentVisibilityChange = () => {\n\tif (document.visibilityState === 'hidden') {\n\t\tstopHeartbeat();\n\t} else {\n\t\tstartHeartbeat();\n\t}\n};\n\nonMounted(() => {\n\tcollaborationStore.initialize();\n\tstartHeartbeat();\n\tdocument.addEventListener('visibilitychange', onDocumentVisibilityChange);\n});\n\nonBeforeUnmount(() => {\n\tdocument.removeEventListener('visibilitychange', onDocumentVisibilityChange);\n\tstopHeartbeat();\n\tcollaborationStore.terminate();\n});\n</script>\n\n<template>\n\t<div\n\t\t:class=\"`collaboration-pane-container ${$style.container}`\"\n\t\tdata-test-id=\"collaboration-pane\"\n\t>\n\t\t<n8n-user-stack :users=\"activeUsersSorted\" :current-user-email=\"currentUserEmail\" />\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.container {\n\tmargin: 0 var(--spacing-4xs);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport {\n\tDUPLICATE_MODAL_KEY,\n\tEnterpriseEditionFeature,\n\tMAX_WORKFLOW_NAME_LENGTH,\n\tMODAL_CONFIRM,\n\tPLACEHOLDER_EMPTY_WORKFLOW_ID,\n\tSOURCE_CONTROL_PUSH_MODAL_KEY,\n\tVIEWS,\n\tWORKFLOW_MENU_ACTIONS,\n\tWORKFLOW_SETTINGS_MODAL_KEY,\n\tWORKFLOW_SHARE_MODAL_KEY,\n} from '@/constants';\nimport type { PermissionsMap } from '@/permissions';\nimport type { WorkflowScope } from '@n8n/permissions';\n\nimport ShortenName from '@/components/ShortenName.vue';\nimport TagsContainer from '@/components/TagsContainer.vue';\nimport PushConnectionTracker from '@/components/PushConnectionTracker.vue';\nimport WorkflowActivator from '@/components/WorkflowActivator.vue';\nimport SaveButton from '@/components/SaveButton.vue';\nimport TagsDropdown from '@/components/TagsDropdown.vue';\nimport InlineTextEdit from '@/components/InlineTextEdit.vue';\nimport BreakpointsObserver from '@/components/BreakpointsObserver.vue';\nimport CollaborationPane from '@/components/MainHeader/CollaborationPane.vue';\n\nimport { useRootStore } from '@/stores/root.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useTagsStore } from '@/stores/tags.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useProjectsStore } from '@/stores/projects.store';\n\nimport { saveAs } from 'file-saver';\nimport { useTitleChange } from '@/composables/useTitleChange';\nimport { useMessage } from '@/composables/useMessage';\nimport { useToast } from '@/composables/useToast';\n\nimport { getWorkflowPermissions } from '@/permissions';\nimport { createEventBus } from 'n8n-design-system/utils';\nimport { nodeViewEventBus } from '@/event-bus';\nimport { hasPermission } from '@/utils/rbac/permissions';\nimport { useCanvasStore } from '@/stores/canvas.store';\nimport { useRoute, useRouter } from 'vue-router';\nimport { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';\nimport { computed, ref, useCssModule, watch } from 'vue';\nimport type {\n\tActionDropdownItem,\n\tIWorkflowDataUpdate,\n\tIWorkflowDb,\n\tIWorkflowToShare,\n} from '@/Interface';\nimport { useI18n } from '@/composables/useI18n';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport type { BaseTextKey } from '../../plugins/i18n';\nimport { useNpsSurveyStore } from '@/stores/npsSurvey.store';\n\nconst props = defineProps<{\n\tworkflow: IWorkflowDb;\n\treadOnly?: boolean;\n}>();\n\nconst $style = useCssModule();\n\nconst rootStore = useRootStore();\nconst canvasStore = useCanvasStore();\nconst settingsStore = useSettingsStore();\nconst sourceControlStore = useSourceControlStore();\nconst tagsStore = useTagsStore();\nconst uiStore = useUIStore();\nconst usersStore = useUsersStore();\nconst workflowsStore = useWorkflowsStore();\nconst projectsStore = useProjectsStore();\nconst npsSurveyStore = useNpsSurveyStore();\n\nconst router = useRouter();\nconst route = useRoute();\n\nconst locale = useI18n();\nconst telemetry = useTelemetry();\nconst message = useMessage();\nconst toast = useToast();\nconst titleChange = useTitleChange();\nconst workflowHelpers = useWorkflowHelpers({ router });\n\nconst isTagsEditEnabled = ref(false);\nconst isNameEditEnabled = ref(false);\nconst appliedTagIds = ref<string[]>([]);\nconst tagsSaving = ref(false);\nconst importFileRef = ref<HTMLInputElement | undefined>();\n\nconst tagsEventBus = createEventBus();\nconst sourceControlModalEventBus = createEventBus();\n\nconst hasChanged = (prev: string[], curr: string[]) => {\n\tif (prev.length !== curr.length) {\n\t\treturn true;\n\t}\n\n\tconst set = new Set(prev);\n\treturn curr.reduce((acc, val) => acc || !set.has(val), false);\n};\n\nconst isNewWorkflow = computed(() => {\n\treturn (\n\t\t!props.workflow.id ||\n\t\tprops.workflow.id === PLACEHOLDER_EMPTY_WORKFLOW_ID ||\n\t\tprops.workflow.id === 'new'\n\t);\n});\n\nconst isWorkflowSaving = computed(() => {\n\treturn uiStore.isActionActive('workflowSaving');\n});\n\nconst onWorkflowPage = computed(() => {\n\treturn route.meta && (route.meta.nodeView || route.meta.keepWorkflowAlive === true);\n});\n\nconst onExecutionsTab = computed(() => {\n\treturn [\n\t\tVIEWS.EXECUTION_HOME.toString(),\n\t\tVIEWS.WORKFLOW_EXECUTIONS.toString(),\n\t\tVIEWS.EXECUTION_PREVIEW,\n\t].includes((route.name as string) || '');\n});\n\nconst workflowPermissions = computed<PermissionsMap<WorkflowScope>>(() => {\n\treturn getWorkflowPermissions(workflowsStore.getWorkflowById(props.workflow.id));\n});\n\nconst workflowMenuItems = computed<ActionDropdownItem[]>(() => {\n\tconst actions: ActionDropdownItem[] = [\n\t\t{\n\t\t\tid: WORKFLOW_MENU_ACTIONS.DOWNLOAD,\n\t\t\tlabel: locale.baseText('menuActions.download'),\n\t\t\tdisabled: !onWorkflowPage.value,\n\t\t},\n\t];\n\n\tif (!props.readOnly) {\n\t\tactions.unshift({\n\t\t\tid: WORKFLOW_MENU_ACTIONS.DUPLICATE,\n\t\t\tlabel: locale.baseText('menuActions.duplicate'),\n\t\t\tdisabled: !onWorkflowPage.value || !props.workflow.id,\n\t\t});\n\n\t\tactions.push(\n\t\t\t{\n\t\t\t\tid: WORKFLOW_MENU_ACTIONS.IMPORT_FROM_URL,\n\t\t\t\tlabel: locale.baseText('menuActions.importFromUrl'),\n\t\t\t\tdisabled: !onWorkflowPage.value || onExecutionsTab.value,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: WORKFLOW_MENU_ACTIONS.IMPORT_FROM_FILE,\n\t\t\t\tlabel: locale.baseText('menuActions.importFromFile'),\n\t\t\t\tdisabled: !onWorkflowPage.value || onExecutionsTab.value,\n\t\t\t},\n\t\t);\n\t}\n\n\tif (hasPermission(['rbac'], { rbac: { scope: 'sourceControl:push' } })) {\n\t\tactions.push({\n\t\t\tid: WORKFLOW_MENU_ACTIONS.PUSH,\n\t\t\tlabel: locale.baseText('menuActions.push'),\n\t\t\tdisabled:\n\t\t\t\t!sourceControlStore.isEnterpriseSourceControlEnabled ||\n\t\t\t\t!onWorkflowPage.value ||\n\t\t\t\tonExecutionsTab.value ||\n\t\t\t\tsourceControlStore.preferences.branchReadOnly,\n\t\t});\n\t}\n\n\tactions.push({\n\t\tid: WORKFLOW_MENU_ACTIONS.SETTINGS,\n\t\tlabel: locale.baseText('generic.settings'),\n\t\tdisabled: !onWorkflowPage.value || isNewWorkflow.value,\n\t});\n\n\tif ((workflowPermissions.value.delete && !props.readOnly) || isNewWorkflow.value) {\n\t\tactions.push({\n\t\t\tid: WORKFLOW_MENU_ACTIONS.DELETE,\n\t\t\tlabel: locale.baseText('menuActions.delete'),\n\t\t\tdisabled: !onWorkflowPage.value || isNewWorkflow.value,\n\t\t\tcustomClass: $style.deleteItem,\n\t\t\tdivided: true,\n\t\t});\n\t}\n\n\treturn actions;\n});\n\nconst isWorkflowHistoryFeatureEnabled = computed(() => {\n\treturn settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.WorkflowHistory);\n});\n\nconst workflowHistoryRoute = computed<{ name: string; params: { workflowId: string } }>(() => {\n\treturn {\n\t\tname: VIEWS.WORKFLOW_HISTORY,\n\t\tparams: {\n\t\t\tworkflowId: props.workflow.id,\n\t\t},\n\t};\n});\n\nconst isWorkflowHistoryButtonDisabled = computed(() => {\n\treturn isNewWorkflow.value;\n});\n\nconst workflowTagIds = computed(() => {\n\treturn (props.workflow.tags ?? []).map((tag) => (typeof tag === 'string' ? tag : tag.id));\n});\n\nwatch(\n\t() => props.workflow.id,\n\t() => {\n\t\tisTagsEditEnabled.value = false;\n\t\tisNameEditEnabled.value = false;\n\t},\n);\n\nfunction getWorkflowId(): string | undefined {\n\tlet id: string | undefined = undefined;\n\tif (props.workflow.id !== PLACEHOLDER_EMPTY_WORKFLOW_ID) {\n\t\tid = props.workflow.id;\n\t} else if (route.params.name && route.params.name !== 'new') {\n\t\tid = route.params.name as string;\n\t}\n\n\treturn id;\n}\n\nasync function onSaveButtonClick() {\n\t// If the workflow is saving, do not allow another save\n\tif (isWorkflowSaving.value) {\n\t\treturn;\n\t}\n\n\tconst id = getWorkflowId();\n\n\tconst name = props.workflow.name;\n\tconst tags = props.workflow.tags as string[];\n\n\tconst saved = await workflowHelpers.saveCurrentWorkflow({\n\t\tid,\n\t\tname,\n\t\ttags,\n\t});\n\n\tif (saved) {\n\t\tshowCreateWorkflowSuccessToast(id);\n\n\t\tawait npsSurveyStore.fetchPromptsData();\n\n\t\tif (route.name === VIEWS.EXECUTION_DEBUG) {\n\t\t\tawait router.replace({\n\t\t\t\tname: VIEWS.WORKFLOW,\n\t\t\t\tparams: { name: props.workflow.id },\n\t\t\t});\n\t\t}\n\t}\n}\n\nfunction onShareButtonClick() {\n\tuiStore.openModalWithData({\n\t\tname: WORKFLOW_SHARE_MODAL_KEY,\n\t\tdata: { id: props.workflow.id },\n\t});\n\n\ttelemetry.track('User opened sharing modal', {\n\t\tworkflow_id: props.workflow.id,\n\t\tuser_id_sharer: usersStore.currentUser?.id,\n\t\tsub_view: route.name === VIEWS.WORKFLOWS ? 'Workflows listing' : 'Workflow editor',\n\t});\n}\n\nfunction onTagsEditEnable() {\n\tappliedTagIds.value = (props.workflow.tags ?? []) as string[];\n\tisTagsEditEnabled.value = true;\n\n\tsetTimeout(() => {\n\t\t// allow name update to occur before disabling name edit\n\t\tisNameEditEnabled.value = false;\n\t\ttagsEventBus.emit('focus');\n\t}, 0);\n}\n\nasync function onTagsBlur() {\n\tconst current = (props.workflow.tags ?? []) as string[];\n\tconst tags = appliedTagIds.value;\n\tif (!hasChanged(current, tags)) {\n\t\tisTagsEditEnabled.value = false;\n\n\t\treturn;\n\t}\n\tif (tagsSaving.value) {\n\t\treturn;\n\t}\n\ttagsSaving.value = true;\n\n\tconst saved = await workflowHelpers.saveCurrentWorkflow({ tags });\n\ttelemetry.track('User edited workflow tags', {\n\t\tworkflow_id: props.workflow.id,\n\t\tnew_tag_count: tags.length,\n\t});\n\n\ttagsSaving.value = false;\n\tif (saved) {\n\t\tisTagsEditEnabled.value = false;\n\t}\n}\n\nfunction onTagsEditEsc() {\n\tisTagsEditEnabled.value = false;\n}\n\nfunction onNameToggle() {\n\tisNameEditEnabled.value = !isNameEditEnabled.value;\n\tif (isNameEditEnabled.value) {\n\t\tif (isTagsEditEnabled.value) {\n\t\t\tvoid onTagsBlur();\n\t\t}\n\n\t\tisTagsEditEnabled.value = false;\n\t}\n}\n\nasync function onNameSubmit({\n\tname,\n\tonSubmit,\n}: {\n\tname: string;\n\tonSubmit: (saved: boolean) => void;\n}) {\n\tconst newName = name.trim();\n\tif (!newName) {\n\t\ttoast.showMessage({\n\t\t\ttitle: locale.baseText('workflowDetails.showMessage.title'),\n\t\t\tmessage: locale.baseText('workflowDetails.showMessage.message'),\n\t\t\ttype: 'error',\n\t\t});\n\n\t\tonSubmit(false);\n\t\treturn;\n\t}\n\n\tif (newName === props.workflow.name) {\n\t\tisNameEditEnabled.value = false;\n\n\t\tonSubmit(true);\n\t\treturn;\n\t}\n\n\tuiStore.addActiveAction('workflowSaving');\n\tconst id = getWorkflowId();\n\tconst saved = await workflowHelpers.saveCurrentWorkflow({ name });\n\tif (saved) {\n\t\tisNameEditEnabled.value = false;\n\t\tshowCreateWorkflowSuccessToast(id);\n\t}\n\tuiStore.removeActiveAction('workflowSaving');\n\tonSubmit(saved);\n}\n\nasync function handleFileImport(): Promise<void> {\n\tconst inputRef = importFileRef.value;\n\tif (inputRef?.files && inputRef.files.length !== 0) {\n\t\tconst reader = new FileReader();\n\t\treader.onload = () => {\n\t\t\tlet workflowData: IWorkflowDataUpdate;\n\t\t\ttry {\n\t\t\t\tworkflowData = JSON.parse(reader.result as string);\n\t\t\t} catch (error) {\n\t\t\t\ttoast.showMessage({\n\t\t\t\t\ttitle: locale.baseText('mainSidebar.showMessage.handleFileImport.title'),\n\t\t\t\t\tmessage: locale.baseText('mainSidebar.showMessage.handleFileImport.message'),\n\t\t\t\t\ttype: 'error',\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t} finally {\n\t\t\t\treader.onload = null;\n\t\t\t\tinputRef.value = '';\n\t\t\t}\n\n\t\t\tnodeViewEventBus.emit('importWorkflowData', { data: workflowData });\n\t\t};\n\t\treader.readAsText(inputRef.files[0]);\n\t}\n}\n\nasync function onWorkflowMenuSelect(action: WORKFLOW_MENU_ACTIONS): Promise<void> {\n\tswitch (action) {\n\t\tcase WORKFLOW_MENU_ACTIONS.DUPLICATE: {\n\t\t\tuiStore.openModalWithData({\n\t\t\t\tname: DUPLICATE_MODAL_KEY,\n\t\t\t\tdata: {\n\t\t\t\t\tid: props.workflow.id,\n\t\t\t\t\tname: props.workflow.name,\n\t\t\t\t\ttags: props.workflow.tags,\n\t\t\t\t},\n\t\t\t});\n\t\t\tbreak;\n\t\t}\n\t\tcase WORKFLOW_MENU_ACTIONS.DOWNLOAD: {\n\t\t\tconst workflowData = await workflowHelpers.getWorkflowDataToSave();\n\t\t\tconst { tags, ...data } = workflowData;\n\t\t\tconst exportData: IWorkflowToShare = {\n\t\t\t\t...data,\n\t\t\t\tmeta: {\n\t\t\t\t\t...props.workflow.meta,\n\t\t\t\t\tinstanceId: rootStore.instanceId,\n\t\t\t\t},\n\t\t\t\ttags: (tags ?? []).map((tagId) => {\n\t\t\t\t\tconst { usageCount, ...tag } = tagsStore.getTagById(tagId);\n\n\t\t\t\t\treturn tag;\n\t\t\t\t}),\n\t\t\t};\n\n\t\t\tconst blob = new Blob([JSON.stringify(exportData, null, 2)], {\n\t\t\t\ttype: 'application/json;charset=utf-8',\n\t\t\t});\n\n\t\t\tlet name = props.workflow.name || 'unsaved_workflow';\n\t\t\tname = name.replace(/[^a-z0-9]/gi, '_');\n\n\t\t\ttelemetry.track('User exported workflow', { workflow_id: workflowData.id });\n\t\t\tsaveAs(blob, name + '.json');\n\t\t\tbreak;\n\t\t}\n\t\tcase WORKFLOW_MENU_ACTIONS.IMPORT_FROM_URL: {\n\t\t\ttry {\n\t\t\t\tconst promptResponse = await message.prompt(\n\t\t\t\t\tlocale.baseText('mainSidebar.prompt.workflowUrl') + ':',\n\t\t\t\t\tlocale.baseText('mainSidebar.prompt.importWorkflowFromUrl') + ':',\n\t\t\t\t\t{\n\t\t\t\t\t\tconfirmButtonText: locale.baseText('mainSidebar.prompt.import'),\n\t\t\t\t\t\tcancelButtonText: locale.baseText('mainSidebar.prompt.cancel'),\n\t\t\t\t\t\tinputErrorMessage: locale.baseText('mainSidebar.prompt.invalidUrl'),\n\t\t\t\t\t\tinputPattern: /^http[s]?:\\/\\/.*\\.json$/i,\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tif (promptResponse.action === 'cancel') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tnodeViewEventBus.emit('importWorkflowUrl', { url: promptResponse.value });\n\t\t\t} catch (e) {}\n\t\t\tbreak;\n\t\t}\n\t\tcase WORKFLOW_MENU_ACTIONS.IMPORT_FROM_FILE: {\n\t\t\timportFileRef.value?.click();\n\t\t\tbreak;\n\t\t}\n\t\tcase WORKFLOW_MENU_ACTIONS.PUSH: {\n\t\t\tcanvasStore.startLoading();\n\t\t\ttry {\n\t\t\t\tawait onSaveButtonClick();\n\n\t\t\t\tconst status = await sourceControlStore.getAggregatedStatus();\n\n\t\t\t\tuiStore.openModalWithData({\n\t\t\t\t\tname: SOURCE_CONTROL_PUSH_MODAL_KEY,\n\t\t\t\t\tdata: { eventBus: sourceControlModalEventBus, status },\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\tswitch (error.message) {\n\t\t\t\t\tcase 'source_control_not_connected':\n\t\t\t\t\t\ttoast.showError(\n\t\t\t\t\t\t\t{ ...error, message: '' },\n\t\t\t\t\t\t\tlocale.baseText('settings.sourceControl.error.not.connected.title'),\n\t\t\t\t\t\t\tlocale.baseText('settings.sourceControl.error.not.connected.message'),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\ttoast.showError(error, locale.baseText('error'));\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tcanvasStore.stopLoading();\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\t\tcase WORKFLOW_MENU_ACTIONS.SETTINGS: {\n\t\t\tuiStore.openModal(WORKFLOW_SETTINGS_MODAL_KEY);\n\t\t\tbreak;\n\t\t}\n\t\tcase WORKFLOW_MENU_ACTIONS.DELETE: {\n\t\t\tconst deleteConfirmed = await message.confirm(\n\t\t\t\tlocale.baseText('mainSidebar.confirmMessage.workflowDelete.message', {\n\t\t\t\t\tinterpolate: { workflowName: props.workflow.name },\n\t\t\t\t}),\n\t\t\t\tlocale.baseText('mainSidebar.confirmMessage.workflowDelete.headline'),\n\t\t\t\t{\n\t\t\t\t\ttype: 'warning',\n\t\t\t\t\tconfirmButtonText: locale.baseText(\n\t\t\t\t\t\t'mainSidebar.confirmMessage.workflowDelete.confirmButtonText',\n\t\t\t\t\t),\n\t\t\t\t\tcancelButtonText: locale.baseText(\n\t\t\t\t\t\t'mainSidebar.confirmMessage.workflowDelete.cancelButtonText',\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tif (deleteConfirmed !== MODAL_CONFIRM) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tawait workflowsStore.deleteWorkflow(props.workflow.id);\n\t\t\t} catch (error) {\n\t\t\t\ttoast.showError(error, locale.baseText('generic.deleteWorkflowError'));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tuiStore.stateIsDirty = false;\n\t\t\t// Reset tab title since workflow is deleted.\n\t\t\ttitleChange.titleReset();\n\t\t\ttoast.showMessage({\n\t\t\t\ttitle: locale.baseText('mainSidebar.showMessage.handleSelect1.title'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\n\t\t\tawait router.push({ name: VIEWS.WORKFLOWS });\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nfunction goToUpgrade() {\n\tvoid uiStore.goToUpgrade('workflow_sharing', 'upgrade-workflow-sharing');\n}\n\nfunction showCreateWorkflowSuccessToast(id?: string) {\n\tif (!id || ['new', PLACEHOLDER_EMPTY_WORKFLOW_ID].includes(id)) {\n\t\tlet toastTitle = locale.baseText('workflows.create.personal.toast.title');\n\t\tlet toastText = locale.baseText('workflows.create.personal.toast.text');\n\t\tif (projectsStore.currentProject) {\n\t\t\ttoastTitle = locale.baseText('workflows.create.project.toast.title', {\n\t\t\t\tinterpolate: { projectName: projectsStore.currentProject.name ?? '' },\n\t\t\t});\n\n\t\t\ttoastText = locale.baseText('workflows.create.project.toast.text', {\n\t\t\t\tinterpolate: { projectName: projectsStore.currentProject.name ?? '' },\n\t\t\t});\n\t\t}\n\n\t\ttoast.showMessage({\n\t\t\ttitle: toastTitle,\n\t\t\tmessage: toastText,\n\t\t\ttype: 'success',\n\t\t});\n\t}\n}\n</script>\n\n<template>\n\t<div :class=\"$style.container\">\n\t\t<BreakpointsObserver :value-x-s=\"15\" :value-s-m=\"25\" :value-m-d=\"50\" class=\"name-container\">\n\t\t\t<template #default=\"{ value }\">\n\t\t\t\t<ShortenName\n\t\t\t\t\t:name=\"workflow.name\"\n\t\t\t\t\t:limit=\"value\"\n\t\t\t\t\t:custom=\"true\"\n\t\t\t\t\ttest-id=\"workflow-name-input\"\n\t\t\t\t>\n\t\t\t\t\t<template #default=\"{ shortenedName }\">\n\t\t\t\t\t\t<InlineTextEdit\n\t\t\t\t\t\t\t:model-value=\"workflow.name\"\n\t\t\t\t\t\t\t:preview-value=\"shortenedName\"\n\t\t\t\t\t\t\t:is-edit-enabled=\"isNameEditEnabled\"\n\t\t\t\t\t\t\t:max-length=\"MAX_WORKFLOW_NAME_LENGTH\"\n\t\t\t\t\t\t\t:disabled=\"readOnly\"\n\t\t\t\t\t\t\tplaceholder=\"Enter workflow name\"\n\t\t\t\t\t\t\tclass=\"name\"\n\t\t\t\t\t\t\t@toggle=\"onNameToggle\"\n\t\t\t\t\t\t\t@submit=\"onNameSubmit\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</template>\n\t\t\t\t</ShortenName>\n\t\t\t</template>\n\t\t</BreakpointsObserver>\n\n\t\t<span v-if=\"settingsStore.areTagsEnabled\" class=\"tags\" data-test-id=\"workflow-tags-container\">\n\t\t\t<TagsDropdown\n\t\t\t\tv-if=\"isTagsEditEnabled && !readOnly\"\n\t\t\t\tref=\"dropdown\"\n\t\t\t\tv-model=\"appliedTagIds\"\n\t\t\t\t:create-enabled=\"true\"\n\t\t\t\t:event-bus=\"tagsEventBus\"\n\t\t\t\t:placeholder=\"$locale.baseText('workflowDetails.chooseOrCreateATag')\"\n\t\t\t\tclass=\"tags-edit\"\n\t\t\t\tdata-test-id=\"workflow-tags-dropdown\"\n\t\t\t\t@blur=\"onTagsBlur\"\n\t\t\t\t@esc=\"onTagsEditEsc\"\n\t\t\t/>\n\t\t\t<div v-else-if=\"(workflow.tags ?? []).length === 0 && !readOnly\">\n\t\t\t\t<span class=\"add-tag clickable\" data-test-id=\"new-tag-link\" @click=\"onTagsEditEnable\">\n\t\t\t\t\t+ {{ $locale.baseText('workflowDetails.addTag') }}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<TagsContainer\n\t\t\t\tv-else\n\t\t\t\t:key=\"workflow.id\"\n\t\t\t\t:tag-ids=\"workflowTagIds\"\n\t\t\t\t:clickable=\"true\"\n\t\t\t\t:responsive=\"true\"\n\t\t\t\tdata-test-id=\"workflow-tags\"\n\t\t\t\t@click=\"onTagsEditEnable\"\n\t\t\t/>\n\t\t</span>\n\t\t<span v-else class=\"tags\"></span>\n\n\t\t<PushConnectionTracker class=\"actions\">\n\t\t\t<span :class=\"`activator ${$style.group}`\">\n\t\t\t\t<WorkflowActivator :workflow-active=\"workflow.active\" :workflow-id=\"workflow.id\" />\n\t\t\t</span>\n\t\t\t<EnterpriseEdition :features=\"[EnterpriseEditionFeature.Sharing]\">\n\t\t\t\t<div :class=\"$style.group\">\n\t\t\t\t\t<CollaborationPane />\n\t\t\t\t\t<N8nButton\n\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\tdata-test-id=\"workflow-share-button\"\n\t\t\t\t\t\t@click=\"onShareButtonClick\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ $locale.baseText('workflowDetails.share') }}\n\t\t\t\t\t</N8nButton>\n\t\t\t\t</div>\n\t\t\t\t<template #fallback>\n\t\t\t\t\t<N8nTooltip>\n\t\t\t\t\t\t<N8nButton type=\"secondary\" :class=\"['mr-2xs', $style.disabledShareButton]\">\n\t\t\t\t\t\t\t{{ $locale.baseText('workflowDetails.share') }}\n\t\t\t\t\t\t</N8nButton>\n\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t<i18n-t\n\t\t\t\t\t\t\t\t:keypath=\"\n\t\t\t\t\t\t\t\t\tuiStore.contextBasedTranslationKeys.workflows.sharing.unavailable.description\n\t\t\t\t\t\t\t\t\t\t.tooltip\n\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<template #action>\n\t\t\t\t\t\t\t\t\t<a @click=\"goToUpgrade\">\n\t\t\t\t\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t\t\t\t\t$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t\t\tuiStore.contextBasedTranslationKeys.workflows.sharing.unavailable\n\t\t\t\t\t\t\t\t\t\t\t\t\t.button as BaseTextKey,\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</i18n-t>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</N8nTooltip>\n\t\t\t\t</template>\n\t\t\t</EnterpriseEdition>\n\t\t\t<div :class=\"$style.group\">\n\t\t\t\t<SaveButton\n\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t:saved=\"!uiStore.stateIsDirty && !isNewWorkflow\"\n\t\t\t\t\t:disabled=\"isWorkflowSaving || readOnly\"\n\t\t\t\t\twith-shortcut\n\t\t\t\t\t:shortcut-tooltip=\"$locale.baseText('saveWorkflowButton.hint')\"\n\t\t\t\t\tdata-test-id=\"workflow-save-button\"\n\t\t\t\t\t@click=\"onSaveButtonClick\"\n\t\t\t\t/>\n\t\t\t\t<RouterLink\n\t\t\t\t\tv-if=\"isWorkflowHistoryFeatureEnabled\"\n\t\t\t\t\t:to=\"workflowHistoryRoute\"\n\t\t\t\t\t:class=\"$style.workflowHistoryButton\"\n\t\t\t\t>\n\t\t\t\t\t<N8nIconButton\n\t\t\t\t\t\t:disabled=\"isWorkflowHistoryButtonDisabled\"\n\t\t\t\t\t\tdata-test-id=\"workflow-history-button\"\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\ticon=\"history\"\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\ttext\n\t\t\t\t\t/>\n\t\t\t\t</RouterLink>\n\t\t\t</div>\n\t\t\t<div :class=\"[$style.workflowMenuContainer, $style.group]\">\n\t\t\t\t<input\n\t\t\t\t\tref=\"importFileRef\"\n\t\t\t\t\t:class=\"$style.hiddenInput\"\n\t\t\t\t\ttype=\"file\"\n\t\t\t\t\tdata-test-id=\"workflow-import-input\"\n\t\t\t\t\t@change=\"handleFileImport()\"\n\t\t\t\t/>\n\t\t\t\t<N8nActionDropdown\n\t\t\t\t\t:items=\"workflowMenuItems\"\n\t\t\t\t\tdata-test-id=\"workflow-menu\"\n\t\t\t\t\t@select=\"onWorkflowMenuSelect\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</PushConnectionTracker>\n\t</div>\n</template>\n\n<style scoped lang=\"scss\">\n$--text-line-height: 24px;\n$--header-spacing: 20px;\n\n.name-container {\n\tmargin-right: $--header-spacing;\n}\n\n.name {\n\tcolor: $custom-font-dark;\n\tfont-size: 15px;\n}\n\n.activator {\n\tcolor: $custom-font-dark;\n\tfont-weight: 400;\n\tfont-size: 13px;\n\tline-height: $--text-line-height;\n\tdisplay: flex;\n\talign-items: center;\n\n\t> span {\n\t\tmargin-right: 5px;\n\t}\n}\n\n.add-tag {\n\tfont-size: 12px;\n\tpadding: 20px 0; // to be more clickable\n\tcolor: $custom-font-very-light;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n\n\t&:hover {\n\t\tcolor: $color-primary;\n\t}\n}\n\n.tags {\n\tdisplay: flex;\n\talign-items: center;\n\twidth: 100%;\n\tflex: 1;\n\tmargin-right: $--header-spacing;\n}\n\n.tags-edit {\n\tmin-width: 100px;\n\twidth: 100%;\n\tmax-width: 460px;\n}\n\n.actions {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--spacing-m);\n}\n</style>\n\n<style module lang=\"scss\">\n.container {\n\tposition: relative;\n\ttop: -1px;\n\twidth: 100%;\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.group {\n\tdisplay: flex;\n\tgap: var(--spacing-xs);\n}\n.hiddenInput {\n\tdisplay: none;\n}\n\n.deleteItem {\n\tcolor: var(--color-danger);\n}\n\n.disabledShareButton {\n\tcursor: not-allowed;\n}\n\n.workflowHistoryButton {\n\twidth: 30px;\n\theight: 30px;\n\tcolor: var(--color-text-dark);\n\tborder-radius: var(--border-radius-base);\n\n\t&:hover {\n\t\tbackground-color: var(--color-background-base);\n\t}\n\n\t:disabled {\n\t\tbackground: transparent;\n\t\tborder: none;\n\t\topacity: 0.5;\n\t}\n}\n</style>\n","<template>\n\t<div\n\t\tv-if=\"items\"\n\t\t:class=\"{\n\t\t\t[$style.container]: true,\n\t\t\t['tab-bar-container']: true,\n\t\t}\"\n\t>\n\t\t<N8nRadioButtons\n\t\t\t:model-value=\"modelValue\"\n\t\t\t:options=\"items\"\n\t\t\t@update:model-value=\"onUpdateModelValue\"\n\t\t/>\n\t</div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { MAIN_HEADER_TABS } from '@/constants';\nimport type { ITabBarItem } from '@/Interface';\n\nwithDefaults(\n\tdefineProps<{\n\t\titems: ITabBarItem[];\n\t\tmodelValue?: string;\n\t}>(),\n\t{\n\t\tmodelValue: MAIN_HEADER_TABS.WORKFLOW,\n\t},\n);\n\nconst emit = defineEmits(['update:modelValue']);\n\nfunction onUpdateModelValue(tab: string, event: MouseEvent): void {\n\temit('update:modelValue', tab, event);\n}\n</script>\n\n<style module lang=\"scss\">\n.container {\n\tposition: absolute;\n\ttop: 47px;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tmin-height: 30px;\n\tdisplay: flex;\n\tpadding: var(--spacing-5xs);\n\tbackground-color: var(--color-foreground-base);\n\tborder-radius: var(--border-radius-base);\n\ttransition: all 150ms ease-in-out;\n}\n\n@media screen and (max-width: 430px) {\n\t.container {\n\t\tflex-direction: column;\n\t}\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref, computed, watch, onBeforeMount, onMounted } from 'vue';\nimport type { RouteLocation, RouteLocationRaw } from 'vue-router';\nimport { useRouter, useRoute } from 'vue-router';\nimport WorkflowDetails from '@/components/MainHeader/WorkflowDetails.vue';\nimport TabBar from '@/components/MainHeader/TabBar.vue';\nimport {\n\tMAIN_HEADER_TABS,\n\tPLACEHOLDER_EMPTY_WORKFLOW_ID,\n\tSTICKY_NODE_TYPE,\n\tVIEWS,\n} from '@/constants';\nimport { useI18n } from '@/composables/useI18n';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useExecutionsStore } from '@/stores/executions.store';\nimport { usePushConnection } from '@/composables/usePushConnection';\n\nconst router = useRouter();\nconst route = useRoute();\nconst locale = useI18n();\nconst pushConnection = usePushConnection({ router });\nconst ndvStore = useNDVStore();\nconst uiStore = useUIStore();\nconst sourceControlStore = useSourceControlStore();\nconst workflowsStore = useWorkflowsStore();\nconst executionsStore = useExecutionsStore();\n\nconst activeHeaderTab = ref(MAIN_HEADER_TABS.WORKFLOW);\nconst workflowToReturnTo = ref('');\nconst executionToReturnTo = ref('');\nconst dirtyState = ref(false);\n\nconst tabBarItems = computed(() => [\n\t{ value: MAIN_HEADER_TABS.WORKFLOW, label: locale.baseText('generic.editor') },\n\t{ value: MAIN_HEADER_TABS.EXECUTIONS, label: locale.baseText('generic.executions') },\n]);\n\nconst activeNode = computed(() => ndvStore.activeNode);\nconst hideMenuBar = computed(() =>\n\tBoolean(activeNode.value && activeNode.value.type !== STICKY_NODE_TYPE),\n);\nconst workflow = computed(() => workflowsStore.workflow);\nconst workflowId = computed(() =>\n\tString(router.currentRoute.value.params.name || workflowsStore.workflowId),\n);\nconst onWorkflowPage = computed(() => !!(route.meta.nodeView || route.meta.keepWorkflowAlive));\nconst readOnly = computed(() => sourceControlStore.preferences.branchReadOnly);\n\nwatch(route, (to, from) => {\n\tsyncTabsWithRoute(to, from);\n});\n\nonBeforeMount(() => {\n\tpushConnection.initialize();\n});\n\nonMounted(async () => {\n\tdirtyState.value = uiStore.stateIsDirty;\n\tsyncTabsWithRoute(route);\n});\n\nfunction syncTabsWithRoute(to: RouteLocation, from?: RouteLocation): void {\n\tif (\n\t\tto.name === VIEWS.EXECUTION_HOME ||\n\t\tto.name === VIEWS.WORKFLOW_EXECUTIONS ||\n\t\tto.name === VIEWS.EXECUTION_PREVIEW\n\t) {\n\t\tactiveHeaderTab.value = MAIN_HEADER_TABS.EXECUTIONS;\n\t} else if (\n\t\tto.name === VIEWS.WORKFLOW ||\n\t\tto.name === VIEWS.NEW_WORKFLOW ||\n\t\tto.name === VIEWS.EXECUTION_DEBUG\n\t) {\n\t\tactiveHeaderTab.value = MAIN_HEADER_TABS.WORKFLOW;\n\t}\n\n\tif (to.params.name !== 'new' && typeof to.params.name === 'string') {\n\t\tworkflowToReturnTo.value = to.params.name;\n\t}\n\n\tif (\n\t\tfrom?.name === VIEWS.EXECUTION_PREVIEW &&\n\t\tto.params.name === from.params.name &&\n\t\ttypeof from.params.executionId === 'string'\n\t) {\n\t\texecutionToReturnTo.value = from.params.executionId;\n\t}\n}\n\nfunction onTabSelected(tab: MAIN_HEADER_TABS, event: MouseEvent) {\n\tconst openInNewTab = event.ctrlKey || event.metaKey;\n\n\tswitch (tab) {\n\t\tcase MAIN_HEADER_TABS.WORKFLOW:\n\t\t\tvoid navigateToWorkflowView(openInNewTab);\n\t\t\tbreak;\n\n\t\tcase MAIN_HEADER_TABS.EXECUTIONS:\n\t\t\tvoid navigateToExecutionsView(openInNewTab);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nasync function navigateToWorkflowView(openInNewTab: boolean) {\n\tlet routeToNavigateTo: RouteLocationRaw;\n\tif (!['', 'new', PLACEHOLDER_EMPTY_WORKFLOW_ID].includes(workflowToReturnTo.value)) {\n\t\trouteToNavigateTo = {\n\t\t\tname: VIEWS.WORKFLOW,\n\t\t\tparams: { name: workflowToReturnTo.value },\n\t\t};\n\t} else {\n\t\trouteToNavigateTo = { name: VIEWS.NEW_WORKFLOW };\n\t}\n\n\tif (openInNewTab) {\n\t\tconst { href } = router.resolve(routeToNavigateTo);\n\t\twindow.open(href, '_blank');\n\t} else if (route.name !== routeToNavigateTo.name) {\n\t\tif (route.name === VIEWS.NEW_WORKFLOW) {\n\t\t\tuiStore.stateIsDirty = dirtyState.value;\n\t\t}\n\t\tactiveHeaderTab.value = MAIN_HEADER_TABS.WORKFLOW;\n\t\tawait router.push(routeToNavigateTo);\n\t}\n}\n\nasync function navigateToExecutionsView(openInNewTab: boolean) {\n\tconst routeWorkflowId =\n\t\tworkflowId.value === PLACEHOLDER_EMPTY_WORKFLOW_ID ? 'new' : workflowId.value;\n\tconst executionToReturnToValue = executionsStore.activeExecution?.id || executionToReturnTo.value;\n\tconst routeToNavigateTo: RouteLocationRaw = executionToReturnToValue\n\t\t? {\n\t\t\t\tname: VIEWS.EXECUTION_PREVIEW,\n\t\t\t\tparams: { name: routeWorkflowId, executionId: executionToReturnToValue },\n\t\t\t}\n\t\t: {\n\t\t\t\tname: VIEWS.EXECUTION_HOME,\n\t\t\t\tparams: { name: routeWorkflowId },\n\t\t\t};\n\n\tif (openInNewTab) {\n\t\tconst { href } = router.resolve(routeToNavigateTo);\n\t\twindow.open(href, '_blank');\n\t} else if (route.name !== routeToNavigateTo.name) {\n\t\tdirtyState.value = uiStore.stateIsDirty;\n\t\tworkflowToReturnTo.value = workflowId.value;\n\t\tactiveHeaderTab.value = MAIN_HEADER_TABS.EXECUTIONS;\n\t\tawait router.push(routeToNavigateTo);\n\t}\n}\n</script>\n\n<template>\n\t<div>\n\t\t<div :class=\"{ 'main-header': true, expanded: !uiStore.sidebarMenuCollapsed }\">\n\t\t\t<div v-show=\"!hideMenuBar\" class=\"top-menu\">\n\t\t\t\t<WorkflowDetails v-if=\"workflow?.name\" :workflow=\"workflow\" :read-only=\"readOnly\" />\n\t\t\t\t<TabBar\n\t\t\t\t\tv-if=\"onWorkflowPage\"\n\t\t\t\t\t:items=\"tabBarItems\"\n\t\t\t\t\t:model-value=\"activeHeaderTab\"\n\t\t\t\t\t@update:model-value=\"onTabSelected\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\">\n.main-header {\n\tbackground-color: var(--color-background-xlight);\n\theight: $header-height;\n\twidth: 100%;\n\tbox-sizing: border-box;\n\tborder-bottom: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n}\n\n.top-menu {\n\tposition: relative;\n\tdisplay: flex;\n\talign-items: center;\n\tfont-size: 0.9em;\n\theight: $header-height;\n\tfont-weight: 400;\n\tpadding: 0 var(--spacing-m) 0 var(--spacing-xs);\n}\n</style>\n"],"names":["DEFAULT_WORKFLOW_NAME_LIMIT","WORKFLOW_NAME_END_COUNT_TO_KEEP","_sfc_main$c","defineComponent","shorten","_sfc_render","_ctx","_cache","$props","$setup","$data","$options","_openBlock","_createElementBlock","_sfc_main$b","createEventBus","options","observer","entries","target","isIntersecting","observed","_sfc_main$a","DEFAULT_MAX_TAGS_LIMIT","_sfc_main$9","IntersectionObserver","IntersectionObserved","mapStores","useTagsStore","tags","tagId","toDisplay","tag","visibleCount","accu","val","hidden","hiddenTitle","countTag","debounce","parent","el","e","_component_IntersectionObserver","_resolveComponent","_createBlock","intersectionEventBus","onObserved","_withCtx","_createElementVNode","_hoisted_1","_Fragment","_renderList","_normalizeClass","_component_el_tag","_createTextVNode","_toDisplayString","_component_IntersectionObserved","responsive","_createVNode","props","__props","hiddenValue","computed","value","emit","__emit","inputRef","ref","onMounted","focus","_a","onBeforeUnmount","onInput","onEnter","onClickOutside","onEscape","isDisabled","newValue","escPressed","inputBus","watch","onClick","onBlur","submit","onSubmit","updated","callDebounced","useDebounce","uiStore","useUIStore","width","bp","BREAKPOINT_SM","BREAKPOINT_XL","BREAKPOINT_LG","BREAKPOINT_MD","onResize","onResizeEnd","nextTick","bannerHeight","getBannerRowHeight","collaborationStore","useCollaborationStore","usersStore","useUsersStore","workflowsStore","useWorkflowsStore","HEARTBEAT_INTERVAL","TIME","heartbeatTimer","activeUsersSorted","currentWorkflowUsers","userInfo","owner","isUserGlobalOwner","user","currentUserEmail","startHeartbeat","stopHeartbeat","onDocumentVisibilityChange","$style","useCssModule","rootStore","useRootStore","canvasStore","useCanvasStore","settingsStore","useSettingsStore","sourceControlStore","useSourceControlStore","tagsStore","projectsStore","useProjectsStore","npsSurveyStore","useNpsSurveyStore","router","useRouter","route","useRoute","locale","useI18n","telemetry","useTelemetry","message","useMessage","toast","useToast","titleChange","useTitleChange","workflowHelpers","useWorkflowHelpers","isTagsEditEnabled","isNameEditEnabled","appliedTagIds","tagsSaving","importFileRef","tagsEventBus","sourceControlModalEventBus","hasChanged","prev","curr","set","acc","isNewWorkflow","PLACEHOLDER_EMPTY_WORKFLOW_ID","isWorkflowSaving","onWorkflowPage","onExecutionsTab","VIEWS","workflowPermissions","getWorkflowPermissions","workflowMenuItems","actions","WORKFLOW_MENU_ACTIONS","hasPermission","isWorkflowHistoryFeatureEnabled","EnterpriseEditionFeature","workflowHistoryRoute","isWorkflowHistoryButtonDisabled","workflowTagIds","getWorkflowId","id","onSaveButtonClick","name","showCreateWorkflowSuccessToast","onShareButtonClick","WORKFLOW_SHARE_MODAL_KEY","onTagsEditEnable","onTagsBlur","current","saved","onTagsEditEsc","onNameToggle","onNameSubmit","newName","handleFileImport","reader","workflowData","nodeViewEventBus","onWorkflowMenuSelect","action","DUPLICATE_MODAL_KEY","data","exportData","usageCount","blob","saveAs","promptResponse","status","SOURCE_CONTROL_PUSH_MODAL_KEY","error","WORKFLOW_SETTINGS_MODAL_KEY","MODAL_CONFIRM","goToUpgrade","toastTitle","toastText","onUpdateModelValue","tab","event","pushConnection","usePushConnection","ndvStore","useNDVStore","executionsStore","useExecutionsStore","activeHeaderTab","MAIN_HEADER_TABS","workflowToReturnTo","executionToReturnTo","dirtyState","tabBarItems","activeNode","hideMenuBar","STICKY_NODE_TYPE","workflow","workflowId","readOnly","to","from","syncTabsWithRoute","onBeforeMount","onTabSelected","openInNewTab","navigateToWorkflowView","navigateToExecutionsView","routeToNavigateTo","href","routeWorkflowId","executionToReturnToValue"],"mappings":"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"}
1
+ {"version":3,"file":"MainHeader-Ch0Iz_7s.js","sources":["../../src/components/ShortenName.vue","../../src/components/IntersectionObserver.vue","../../src/components/IntersectionObserved.vue","../../src/components/TagsContainer.vue","../../src/components/ExpandableInput/ExpandableInputBase.vue","../../src/components/ExpandableInput/ExpandableInputEdit.vue","../../src/components/InlineTextEdit.vue","../../src/components/BreakpointsObserver.vue","../../src/components/MainHeader/CollaborationPane.vue","../../src/components/MainHeader/WorkflowDetails.vue","../../src/components/MainHeader/TabBar.vue","../../src/components/MainHeader/MainHeader.vue"],"sourcesContent":["<template>\n\t<span :title=\"name\" :data-test-id=\"testId\">\n\t\t<slot :shortened-name=\"shortenedName\"></slot>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { shorten } from '@/utils/typesUtils';\n\nconst DEFAULT_WORKFLOW_NAME_LIMIT = 25;\nconst WORKFLOW_NAME_END_COUNT_TO_KEEP = 4;\n\nexport default defineComponent({\n\tname: 'ShortenName',\n\tprops: ['name', 'limit', 'testId'],\n\tcomputed: {\n\t\tshortenedName(): string {\n\t\t\treturn shorten(\n\t\t\t\tthis.name,\n\t\t\t\tthis.limit || DEFAULT_WORKFLOW_NAME_LIMIT,\n\t\t\t\tWORKFLOW_NAME_END_COUNT_TO_KEEP,\n\t\t\t);\n\t\t},\n\t},\n});\n</script>\n","<template>\n\t<div ref=\"root\">\n\t\t<slot></slot>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EventBus } from 'n8n-design-system/utils';\nimport { createEventBus } from 'n8n-design-system/utils';\n\nexport default defineComponent({\n\tname: 'IntersectionObserver',\n\tprops: {\n\t\tthreshold: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\t\tenabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\teventBus: {\n\t\t\ttype: Object as PropType<EventBus>,\n\t\t\tdefault: () => createEventBus(),\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tobserver: null as IntersectionObserver | null,\n\t\t};\n\t},\n\tmounted() {\n\t\tif (!this.enabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst options = {\n\t\t\troot: this.$refs.root as Element,\n\t\t\trootMargin: '0px',\n\t\t\tthreshold: this.threshold,\n\t\t};\n\n\t\tconst observer = new IntersectionObserver((entries) => {\n\t\t\tentries.forEach(({ target, isIntersecting }) => {\n\t\t\t\tthis.$emit('observed', {\n\t\t\t\t\tel: target,\n\t\t\t\t\tisIntersecting,\n\t\t\t\t});\n\t\t\t});\n\t\t}, options);\n\n\t\tthis.observer = observer;\n\n\t\tthis.eventBus.on('observe', (observed: Element) => {\n\t\t\tif (observed) {\n\t\t\t\tobserver.observe(observed);\n\t\t\t}\n\t\t});\n\n\t\tthis.eventBus.on('unobserve', (observed: Element) => {\n\t\t\tobserver.unobserve(observed);\n\t\t});\n\t},\n\tbeforeUnmount() {\n\t\tif (this.enabled && this.observer) {\n\t\t\tthis.observer.disconnect();\n\t\t}\n\t},\n});\n</script>\n","<template>\n\t<span ref=\"observed\">\n\t\t<slot></slot>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport type { EventBus } from 'n8n-design-system/utils';\nimport { createEventBus } from 'n8n-design-system/utils';\n\nexport default defineComponent({\n\tname: 'IntersectionObserved',\n\tprops: {\n\t\tenabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\teventBus: {\n\t\t\ttype: Object as PropType<EventBus>,\n\t\t\tdefault: () => createEventBus(),\n\t\t},\n\t},\n\tasync mounted() {\n\t\tif (!this.enabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.$nextTick();\n\t\tthis.eventBus.emit('observe', this.$refs.observed);\n\t},\n\tbeforeUnmount() {\n\t\tif (this.enabled) {\n\t\t\tthis.eventBus.emit('unobserve', this.$refs.observed);\n\t\t}\n\t},\n});\n</script>\n","<template>\n\t<IntersectionObserver\n\t\tref=\"tagsContainer\"\n\t\t:threshold=\"1.0\"\n\t\tclass=\"tags-container\"\n\t\t:style=\"style\"\n\t\t:enabled=\"responsive\"\n\t\t:event-bus=\"intersectionEventBus\"\n\t\t@observed=\"onObserved\"\n\t>\n\t\t<span class=\"tags\">\n\t\t\t<span\n\t\t\t\tv-for=\"tag in tags\"\n\t\t\t\t:key=\"tag.id\"\n\t\t\t\t:class=\"{ clickable: !tag.hidden }\"\n\t\t\t\t@click=\"(e) => onClick(e, tag)\"\n\t\t\t>\n\t\t\t\t<el-tag\n\t\t\t\t\tv-if=\"tag.isCount\"\n\t\t\t\t\t:title=\"tag.title\"\n\t\t\t\t\ttype=\"info\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tclass=\"count-container\"\n\t\t\t\t\t:disable-transitions=\"true\"\n\t\t\t\t>\n\t\t\t\t\t{{ tag.name }}\n\t\t\t\t</el-tag>\n\t\t\t\t<IntersectionObserved\n\t\t\t\t\tv-else\n\t\t\t\t\t:class=\"{ hideTag: tag.hidden }\"\n\t\t\t\t\t:data-id=\"tag.id\"\n\t\t\t\t\t:enabled=\"responsive\"\n\t\t\t\t\t:event-bus=\"intersectionEventBus\"\n\t\t\t\t>\n\t\t\t\t\t<el-tag\n\t\t\t\t\t\t:title=\"tag.name\"\n\t\t\t\t\t\ttype=\"info\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t:class=\"{ hoverable }\"\n\t\t\t\t\t\t:disable-transitions=\"true\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ tag.name }}\n\t\t\t\t\t</el-tag>\n\t\t\t\t</IntersectionObserved>\n\t\t\t</span>\n\t\t</span>\n\t</IntersectionObserver>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, type ComponentInstance } from 'vue';\n\nimport type { ITag } from '@/Interface';\nimport IntersectionObserver from './IntersectionObserver.vue';\nimport IntersectionObserved from './IntersectionObserved.vue';\nimport { mapStores } from 'pinia';\nimport { useTagsStore } from '@/stores/tags.store';\nimport { createEventBus } from 'n8n-design-system/utils';\nimport { debounce } from 'lodash-es';\n\n// random upper limit if none is set to minimize performance impact of observers\nconst DEFAULT_MAX_TAGS_LIMIT = 20;\n\ninterface TagEl extends ITag {\n\thidden?: boolean;\n\ttitle?: string;\n\tisCount?: boolean;\n}\n\nexport default defineComponent({\n\tname: 'TagsContainer',\n\tcomponents: { IntersectionObserver, IntersectionObserved },\n\tprops: {\n\t\ttagIds: {\n\t\t\ttype: Array as () => string[],\n\t\t\trequired: true,\n\t\t},\n\t\tlimit: {\n\t\t\ttype: Number,\n\t\t\tdefault: DEFAULT_MAX_TAGS_LIMIT,\n\t\t},\n\t\tclickable: Boolean,\n\t\tresponsive: Boolean,\n\t\thoverable: Boolean,\n\t},\n\temits: {\n\t\tclick: null,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tmaxWidth: 320,\n\t\t\tintersectionEventBus: createEventBus(),\n\t\t\tvisibility: {} as { [id: string]: boolean },\n\t\t\tdebouncedSetMaxWidth: () => {},\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useTagsStore),\n\t\tstyle() {\n\t\t\treturn {\n\t\t\t\t'max-width': `${this.maxWidth}px`,\n\t\t\t};\n\t\t},\n\t\ttags() {\n\t\t\tconst tags = this.tagIds\n\t\t\t\t.map((tagId: string) => this.tagsStore.getTagById(tagId))\n\t\t\t\t.filter(Boolean); // if tag has been deleted from store\n\n\t\t\tlet toDisplay: TagEl[] = this.limit ? tags.slice(0, this.limit) : tags;\n\t\t\ttoDisplay = toDisplay.map((tag: ITag) => ({\n\t\t\t\t...tag,\n\t\t\t\thidden: this.responsive && !this.visibility[tag.id],\n\t\t\t}));\n\n\t\t\tlet visibleCount = toDisplay.length;\n\t\t\tif (this.responsive) {\n\t\t\t\tvisibleCount = Object.values(this.visibility).reduce(\n\t\t\t\t\t(accu, val) => (val ? accu + 1 : accu),\n\t\t\t\t\t0,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (visibleCount < tags.length) {\n\t\t\t\tconst hidden = tags.slice(visibleCount);\n\t\t\t\tconst hiddenTitle = hidden.reduce((accu: string, tag: ITag) => {\n\t\t\t\t\treturn accu ? `${accu}, ${tag.name}` : tag.name;\n\t\t\t\t}, '');\n\n\t\t\t\tconst countTag: TagEl = {\n\t\t\t\t\tid: 'count',\n\t\t\t\t\tname: `+${hidden.length}`,\n\t\t\t\t\ttitle: hiddenTitle,\n\t\t\t\t\tisCount: true,\n\t\t\t\t};\n\t\t\t\ttoDisplay.splice(visibleCount, 0, countTag);\n\t\t\t}\n\n\t\t\treturn toDisplay;\n\t\t},\n\t},\n\tcreated() {\n\t\tthis.debouncedSetMaxWidth = debounce(this.setMaxWidth, 100);\n\t},\n\tmounted() {\n\t\tthis.setMaxWidth();\n\t\twindow.addEventListener('resize', this.debouncedSetMaxWidth);\n\t},\n\tbeforeUnmount() {\n\t\twindow.removeEventListener('resize', this.debouncedSetMaxWidth);\n\t},\n\tmethods: {\n\t\tsetMaxWidth() {\n\t\t\tconst containerEl = this.$refs.tagsContainer as ComponentInstance<IntersectionObserver>;\n\t\t\tconst container = containerEl.$el as HTMLElement;\n\t\t\tconst parent = container.parentNode as HTMLElement;\n\n\t\t\tif (parent) {\n\t\t\t\tthis.maxWidth = 0;\n\t\t\t\tvoid this.$nextTick(() => {\n\t\t\t\t\tthis.maxWidth = parent.clientWidth;\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonObserved({ el, isIntersecting }: { el: HTMLElement; isIntersecting: boolean }) {\n\t\t\tif (el.dataset.id) {\n\t\t\t\tthis.visibility = { ...this.visibility, [el.dataset.id]: isIntersecting };\n\t\t\t}\n\t\t},\n\t\tonClick(e: MouseEvent, tag: TagEl) {\n\t\t\tif (this.clickable) {\n\t\t\t\te.stopPropagation();\n\t\t\t}\n\n\t\t\t// if tag is hidden or not displayed\n\t\t\tif (!tag.hidden) {\n\t\t\t\tthis.$emit('click', tag.id);\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" scoped>\n.tags-container {\n\tdisplay: block;\n\tmax-width: 300px;\n}\n\n.tags {\n\tdisplay: block;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\tmax-width: 100%;\n\n\t> span {\n\t\tpadding-right: 4px; // why not margin? for space between tags to be clickable\n\t}\n}\n\n.hideTag {\n\tvisibility: hidden;\n}\n\n.el-tag.hoverable:hover {\n\tborder-color: $color-primary;\n}\n\n.count-container {\n\tposition: absolute;\n\tmax-width: 40px;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n}\n</style>\n","<template>\n\t<!-- mock el-input element to apply styles -->\n\t<div :class=\"{ 'el-input': true, 'static-size': staticSize }\" :data-value=\"hiddenValue\">\n\t\t<slot></slot>\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\ntype Props = {\n\tmodelValue: string;\n\tplaceholder?: string;\n\tstaticSize?: boolean;\n};\n\nconst props = withDefaults(defineProps<Props>(), { staticSize: false, placeholder: '' });\n\nconst hiddenValue = computed(() => {\n\tlet value = props.modelValue.replace(/\\s/g, '.'); // force input to expand on space chars\n\tif (!value) {\n\t\tvalue = props.placeholder;\n\t}\n\n\treturn `${value}`; // adjust for padding\n});\n</script>\n\n<style lang=\"scss\" scoped>\n$--horiz-padding: 15px;\n\n.el-input {\n\tdisplay: inline-grid;\n\tfont: inherit;\n\tpadding: 10px 0;\n\n\t:deep(input) {\n\t\tborder: 1px solid transparent;\n\t\tpadding: 0 $--horiz-padding - 2px; // -2px for borders\n\t\twidth: 100%;\n\t\tgrid-area: 1 / 2;\n\t\tfont: inherit;\n\t}\n\n\t&::after {\n\t\tgrid-area: 1 / 2;\n\t\tfont: inherit;\n\t\tcontent: attr(data-value) ' ';\n\t\tvisibility: hidden;\n\t\twhite-space: nowrap;\n\t\tpadding: 0 $--horiz-padding;\n\t}\n\n\t&:not(.static-size)::after {\n\t\toverflow: hidden;\n\t}\n\n\t&:hover {\n\t\t:deep(input):not(:focus) {\n\t\t\tborder: 1px solid var(--color-text-lighter);\n\t\t}\n\t}\n\n\t:deep(input):focus {\n\t\tborder: 1px solid var(--color-secondary);\n\t}\n}\n</style>\n","<template>\n\t<ExpandableInputBase :model-value=\"modelValue\" :placeholder=\"placeholder\">\n\t\t<input\n\t\t\tref=\"inputRef\"\n\t\t\tv-on-click-outside=\"onClickOutside\"\n\t\t\tclass=\"el-input__inner\"\n\t\t\t:value=\"modelValue\"\n\t\t\t:placeholder=\"placeholder\"\n\t\t\t:maxlength=\"maxlength\"\n\t\t\tsize=\"4\"\n\t\t\t@input=\"onInput\"\n\t\t\t@keydown.enter=\"onEnter\"\n\t\t\t@keydown.esc=\"onEscape\"\n\t\t/>\n\t</ExpandableInputBase>\n</template>\n\n<script setup lang=\"ts\">\nimport type { EventBus } from 'n8n-design-system';\nimport { onBeforeUnmount, onMounted, ref } from 'vue';\nimport ExpandableInputBase from './ExpandableInputBase.vue';\n\ntype Props = {\n\tmodelValue: string;\n\tplaceholder: string;\n\tmaxlength?: number;\n\tautofocus?: boolean;\n\teventBus?: EventBus;\n};\n\nconst props = defineProps<Props>();\nconst emit = defineEmits<{\n\t(event: 'update:model-value', value: string): void;\n\t(event: 'enter', value: string): void;\n\t(event: 'blur', value: string): void;\n\t(event: 'esc'): void;\n}>();\n\nconst inputRef = ref<HTMLInputElement>();\n\nonMounted(() => {\n\t// autofocus on input element is not reliable\n\tif (props.autofocus && inputRef.value) {\n\t\tfocus();\n\t}\n\tprops.eventBus?.on('focus', focus);\n});\n\nonBeforeUnmount(() => {\n\tprops.eventBus?.off('focus', focus);\n});\n\nfunction focus() {\n\tif (inputRef.value) {\n\t\tinputRef.value.focus();\n\t}\n}\n\nfunction onInput() {\n\tif (inputRef.value) {\n\t\temit('update:model-value', inputRef.value.value);\n\t}\n}\n\nfunction onEnter() {\n\tif (inputRef.value) {\n\t\temit('enter', inputRef.value.value);\n\t}\n}\n\nfunction onClickOutside(e: Event) {\n\tif (e.type === 'click' && inputRef.value) {\n\t\temit('blur', inputRef.value.value);\n\t}\n}\n\nfunction onEscape() {\n\temit('esc');\n}\n</script>\n","<template>\n\t<span class=\"inline-edit\" @keydown.stop>\n\t\t<span v-if=\"isEditEnabled && !isDisabled\">\n\t\t\t<ExpandableInputEdit\n\t\t\t\tv-model=\"newValue\"\n\t\t\t\t:placeholder=\"placeholder\"\n\t\t\t\t:maxlength=\"maxLength\"\n\t\t\t\t:autofocus=\"true\"\n\t\t\t\t:event-bus=\"inputBus\"\n\t\t\t\t@update:model-value=\"onInput\"\n\t\t\t\t@esc=\"onEscape\"\n\t\t\t\t@blur=\"onBlur\"\n\t\t\t\t@enter=\"submit\"\n\t\t\t/>\n\t\t</span>\n\n\t\t<span v-else class=\"preview\" @click=\"onClick\">\n\t\t\t<ExpandableInputPreview :model-value=\"previewValue || modelValue\" />\n\t\t</span>\n\t</span>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, defineProps, defineEmits } from 'vue';\nimport ExpandableInputEdit from '@/components/ExpandableInput/ExpandableInputEdit.vue';\nimport ExpandableInputPreview from '@/components/ExpandableInput/ExpandableInputPreview.vue';\nimport { createEventBus } from 'n8n-design-system/utils';\n\nconst props = withDefaults(\n\tdefineProps<{\n\t\tisEditEnabled: boolean;\n\t\tmodelValue: string;\n\t\tplaceholder: string;\n\t\tmaxLength: number;\n\t\tpreviewValue: string;\n\t\tdisabled: boolean;\n\t}>(),\n\t{\n\t\tisEditEnabled: false,\n\t\tmodelValue: '',\n\t\tplaceholder: '',\n\t\tmaxLength: 0,\n\t\tpreviewValue: '',\n\t\tdisabled: false,\n\t},\n);\n\nconst emit = defineEmits<{\n\t(event: 'toggle'): void;\n\t(event: 'submit', payload: { name: string; onSubmit: (updated: boolean) => void }): void;\n}>();\n\nconst isDisabled = ref(props.disabled);\nconst newValue = ref('');\nconst escPressed = ref(false);\nconst inputBus = ref(createEventBus());\n\nwatch(\n\t() => props.disabled,\n\t(value) => {\n\t\tisDisabled.value = value;\n\t},\n);\n\nfunction onInput(val: string) {\n\tif (isDisabled.value) return;\n\tnewValue.value = val;\n}\n\nfunction onClick() {\n\tif (isDisabled.value) return;\n\tnewValue.value = props.modelValue;\n\temit('toggle');\n}\n\nfunction onBlur() {\n\tif (isDisabled.value) return;\n\tif (!escPressed.value) {\n\t\tsubmit();\n\t}\n\tescPressed.value = false;\n}\n\nfunction submit() {\n\tif (isDisabled.value) return;\n\tconst onSubmit = (updated: boolean) => {\n\t\tisDisabled.value = false;\n\t\tif (!updated) {\n\t\t\tinputBus.value.emit('focus');\n\t\t}\n\t};\n\tisDisabled.value = true;\n\temit('submit', { name: newValue.value, onSubmit });\n}\n\nfunction onEscape() {\n\tif (isDisabled.value) return;\n\tescPressed.value = true;\n\temit('toggle');\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.preview {\n\tcursor: pointer;\n}\n</style>\n","<template>\n\t<span>\n\t\t<slot :bp=\"bp\" :value=\"value\" />\n\t</span>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted, onBeforeUnmount, nextTick } from 'vue';\nimport { BREAKPOINT_SM, BREAKPOINT_MD, BREAKPOINT_LG, BREAKPOINT_XL } from '@/constants';\nimport { useUIStore } from '@/stores/ui.store';\nimport { getBannerRowHeight } from '@/utils/htmlUtils';\nimport { useDebounce } from '@/composables/useDebounce';\n\n/**\n * matching element.io https://element.eleme.io/#/en-US/component/layout#col-attributes\n * xs < 768\n * sm >= 768\n * md >= 992\n * lg >= 1200\n * xl >= 1920\n */\ninterface Props {\n\tvalueXS?: number;\n\tvalueXL?: number;\n\tvalueLG?: number;\n\tvalueMD?: number;\n\tvalueSM?: number;\n\tvalueDefault?: number;\n}\n\nconst props = defineProps<Props>();\n\nconst { callDebounced } = useDebounce();\nconst uiStore = useUIStore();\n\nconst width = ref(window.innerWidth);\n\nconst bp = computed(() => {\n\tif (width.value < BREAKPOINT_SM) {\n\t\treturn 'XS';\n\t}\n\tif (width.value >= BREAKPOINT_XL) {\n\t\treturn 'XL';\n\t}\n\tif (width.value >= BREAKPOINT_LG) {\n\t\treturn 'LG';\n\t}\n\tif (width.value >= BREAKPOINT_MD) {\n\t\treturn 'MD';\n\t}\n\treturn 'SM';\n});\n\nconst value = computed(() => {\n\tif (props.valueXS && width.value < BREAKPOINT_SM) {\n\t\treturn props.valueXS;\n\t}\n\tif (props.valueXL && width.value >= BREAKPOINT_XL) {\n\t\treturn props.valueXL;\n\t}\n\tif (props.valueLG && width.value >= BREAKPOINT_LG) {\n\t\treturn props.valueLG;\n\t}\n\tif (props.valueMD && width.value >= BREAKPOINT_MD) {\n\t\treturn props.valueMD;\n\t}\n\tif (props.valueSM) {\n\t\treturn props.valueSM;\n\t}\n\treturn props.valueDefault;\n});\n\nconst onResize = () => {\n\tvoid callDebounced(onResizeEnd, { debounceTime: 50 });\n};\n\nconst onResizeEnd = async () => {\n\twidth.value = window.innerWidth;\n\tawait nextTick();\n\n\tconst bannerHeight = await getBannerRowHeight();\n\tuiStore.updateBannersHeight(bannerHeight);\n};\n\nonMounted(() => {\n\twindow.addEventListener('resize', onResize);\n});\n\nonBeforeUnmount(() => {\n\twindow.removeEventListener('resize', onResize);\n});\n</script>\n","<script setup lang=\"ts\">\nimport { useUsersStore } from '@/stores/users.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useCollaborationStore } from '@/stores/collaboration.store';\nimport { onBeforeUnmount, onMounted, computed, ref } from 'vue';\nimport { TIME } from '@/constants';\nimport { isUserGlobalOwner } from '@/utils/userUtils';\n\nconst collaborationStore = useCollaborationStore();\nconst usersStore = useUsersStore();\nconst workflowsStore = useWorkflowsStore();\n\nconst HEARTBEAT_INTERVAL = 5 * TIME.MINUTE;\nconst heartbeatTimer = ref<number | null>(null);\n\nconst activeUsersSorted = computed(() => {\n\tconst currentWorkflowUsers = (collaborationStore.getUsersForCurrentWorkflow ?? []).map(\n\t\t(userInfo) => userInfo.user,\n\t);\n\tconst owner = currentWorkflowUsers.find(isUserGlobalOwner);\n\treturn {\n\t\tdefaultGroup: owner\n\t\t\t? [owner, ...currentWorkflowUsers.filter((user) => user.id !== owner.id)]\n\t\t\t: currentWorkflowUsers,\n\t};\n});\n\nconst currentUserEmail = computed(() => {\n\treturn usersStore.currentUser?.email;\n});\n\nconst startHeartbeat = () => {\n\tif (heartbeatTimer.value !== null) {\n\t\tclearInterval(heartbeatTimer.value);\n\t\theartbeatTimer.value = null;\n\t}\n\theartbeatTimer.value = window.setInterval(() => {\n\t\tcollaborationStore.notifyWorkflowOpened(workflowsStore.workflow.id);\n\t}, HEARTBEAT_INTERVAL);\n};\n\nconst stopHeartbeat = () => {\n\tif (heartbeatTimer.value !== null) {\n\t\tclearInterval(heartbeatTimer.value);\n\t}\n};\n\nconst onDocumentVisibilityChange = () => {\n\tif (document.visibilityState === 'hidden') {\n\t\tstopHeartbeat();\n\t} else {\n\t\tstartHeartbeat();\n\t}\n};\n\nonMounted(() => {\n\tcollaborationStore.initialize();\n\tstartHeartbeat();\n\tdocument.addEventListener('visibilitychange', onDocumentVisibilityChange);\n});\n\nonBeforeUnmount(() => {\n\tdocument.removeEventListener('visibilitychange', onDocumentVisibilityChange);\n\tstopHeartbeat();\n\tcollaborationStore.terminate();\n});\n</script>\n\n<template>\n\t<div\n\t\t:class=\"`collaboration-pane-container ${$style.container}`\"\n\t\tdata-test-id=\"collaboration-pane\"\n\t>\n\t\t<n8n-user-stack :users=\"activeUsersSorted\" :current-user-email=\"currentUserEmail\" />\n\t</div>\n</template>\n\n<style lang=\"scss\" module>\n.container {\n\tmargin: 0 var(--spacing-4xs);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport {\n\tDUPLICATE_MODAL_KEY,\n\tEnterpriseEditionFeature,\n\tMAX_WORKFLOW_NAME_LENGTH,\n\tMODAL_CONFIRM,\n\tPLACEHOLDER_EMPTY_WORKFLOW_ID,\n\tSOURCE_CONTROL_PUSH_MODAL_KEY,\n\tVIEWS,\n\tWORKFLOW_MENU_ACTIONS,\n\tWORKFLOW_SETTINGS_MODAL_KEY,\n\tWORKFLOW_SHARE_MODAL_KEY,\n} from '@/constants';\nimport type { PermissionsMap } from '@/permissions';\nimport type { WorkflowScope } from '@n8n/permissions';\n\nimport ShortenName from '@/components/ShortenName.vue';\nimport TagsContainer from '@/components/TagsContainer.vue';\nimport PushConnectionTracker from '@/components/PushConnectionTracker.vue';\nimport WorkflowActivator from '@/components/WorkflowActivator.vue';\nimport SaveButton from '@/components/SaveButton.vue';\nimport TagsDropdown from '@/components/TagsDropdown.vue';\nimport InlineTextEdit from '@/components/InlineTextEdit.vue';\nimport BreakpointsObserver from '@/components/BreakpointsObserver.vue';\nimport CollaborationPane from '@/components/MainHeader/CollaborationPane.vue';\n\nimport { useRootStore } from '@/stores/root.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useTagsStore } from '@/stores/tags.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useProjectsStore } from '@/stores/projects.store';\n\nimport { saveAs } from 'file-saver';\nimport { useTitleChange } from '@/composables/useTitleChange';\nimport { useMessage } from '@/composables/useMessage';\nimport { useToast } from '@/composables/useToast';\n\nimport { getWorkflowPermissions } from '@/permissions';\nimport { createEventBus } from 'n8n-design-system/utils';\nimport { nodeViewEventBus } from '@/event-bus';\nimport { hasPermission } from '@/utils/rbac/permissions';\nimport { useCanvasStore } from '@/stores/canvas.store';\nimport { useRoute, useRouter } from 'vue-router';\nimport { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';\nimport { computed, ref, useCssModule, watch } from 'vue';\nimport type {\n\tActionDropdownItem,\n\tIWorkflowDataUpdate,\n\tIWorkflowDb,\n\tIWorkflowToShare,\n} from '@/Interface';\nimport { useI18n } from '@/composables/useI18n';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport type { BaseTextKey } from '../../plugins/i18n';\nimport { useNpsSurveyStore } from '@/stores/npsSurvey.store';\n\nconst props = defineProps<{\n\tworkflow: IWorkflowDb;\n\treadOnly?: boolean;\n}>();\n\nconst $style = useCssModule();\n\nconst rootStore = useRootStore();\nconst canvasStore = useCanvasStore();\nconst settingsStore = useSettingsStore();\nconst sourceControlStore = useSourceControlStore();\nconst tagsStore = useTagsStore();\nconst uiStore = useUIStore();\nconst usersStore = useUsersStore();\nconst workflowsStore = useWorkflowsStore();\nconst projectsStore = useProjectsStore();\nconst npsSurveyStore = useNpsSurveyStore();\n\nconst router = useRouter();\nconst route = useRoute();\n\nconst locale = useI18n();\nconst telemetry = useTelemetry();\nconst message = useMessage();\nconst toast = useToast();\nconst titleChange = useTitleChange();\nconst workflowHelpers = useWorkflowHelpers({ router });\n\nconst isTagsEditEnabled = ref(false);\nconst isNameEditEnabled = ref(false);\nconst appliedTagIds = ref<string[]>([]);\nconst tagsSaving = ref(false);\nconst importFileRef = ref<HTMLInputElement | undefined>();\n\nconst tagsEventBus = createEventBus();\nconst sourceControlModalEventBus = createEventBus();\n\nconst hasChanged = (prev: string[], curr: string[]) => {\n\tif (prev.length !== curr.length) {\n\t\treturn true;\n\t}\n\n\tconst set = new Set(prev);\n\treturn curr.reduce((acc, val) => acc || !set.has(val), false);\n};\n\nconst isNewWorkflow = computed(() => {\n\treturn (\n\t\t!props.workflow.id ||\n\t\tprops.workflow.id === PLACEHOLDER_EMPTY_WORKFLOW_ID ||\n\t\tprops.workflow.id === 'new'\n\t);\n});\n\nconst isWorkflowSaving = computed(() => {\n\treturn uiStore.isActionActive('workflowSaving');\n});\n\nconst onWorkflowPage = computed(() => {\n\treturn route.meta && (route.meta.nodeView || route.meta.keepWorkflowAlive === true);\n});\n\nconst onExecutionsTab = computed(() => {\n\treturn [\n\t\tVIEWS.EXECUTION_HOME.toString(),\n\t\tVIEWS.WORKFLOW_EXECUTIONS.toString(),\n\t\tVIEWS.EXECUTION_PREVIEW,\n\t].includes((route.name as string) || '');\n});\n\nconst workflowPermissions = computed<PermissionsMap<WorkflowScope>>(() => {\n\treturn getWorkflowPermissions(workflowsStore.getWorkflowById(props.workflow.id));\n});\n\nconst workflowMenuItems = computed<ActionDropdownItem[]>(() => {\n\tconst actions: ActionDropdownItem[] = [\n\t\t{\n\t\t\tid: WORKFLOW_MENU_ACTIONS.DOWNLOAD,\n\t\t\tlabel: locale.baseText('menuActions.download'),\n\t\t\tdisabled: !onWorkflowPage.value,\n\t\t},\n\t];\n\n\tif (!props.readOnly) {\n\t\tactions.unshift({\n\t\t\tid: WORKFLOW_MENU_ACTIONS.DUPLICATE,\n\t\t\tlabel: locale.baseText('menuActions.duplicate'),\n\t\t\tdisabled: !onWorkflowPage.value || !props.workflow.id,\n\t\t});\n\n\t\tactions.push(\n\t\t\t{\n\t\t\t\tid: WORKFLOW_MENU_ACTIONS.IMPORT_FROM_URL,\n\t\t\t\tlabel: locale.baseText('menuActions.importFromUrl'),\n\t\t\t\tdisabled: !onWorkflowPage.value || onExecutionsTab.value,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: WORKFLOW_MENU_ACTIONS.IMPORT_FROM_FILE,\n\t\t\t\tlabel: locale.baseText('menuActions.importFromFile'),\n\t\t\t\tdisabled: !onWorkflowPage.value || onExecutionsTab.value,\n\t\t\t},\n\t\t);\n\t}\n\n\tif (hasPermission(['rbac'], { rbac: { scope: 'sourceControl:push' } })) {\n\t\tactions.push({\n\t\t\tid: WORKFLOW_MENU_ACTIONS.PUSH,\n\t\t\tlabel: locale.baseText('menuActions.push'),\n\t\t\tdisabled:\n\t\t\t\t!sourceControlStore.isEnterpriseSourceControlEnabled ||\n\t\t\t\t!onWorkflowPage.value ||\n\t\t\t\tonExecutionsTab.value ||\n\t\t\t\tsourceControlStore.preferences.branchReadOnly,\n\t\t});\n\t}\n\n\tactions.push({\n\t\tid: WORKFLOW_MENU_ACTIONS.SETTINGS,\n\t\tlabel: locale.baseText('generic.settings'),\n\t\tdisabled: !onWorkflowPage.value || isNewWorkflow.value,\n\t});\n\n\tif ((workflowPermissions.value.delete && !props.readOnly) || isNewWorkflow.value) {\n\t\tactions.push({\n\t\t\tid: WORKFLOW_MENU_ACTIONS.DELETE,\n\t\t\tlabel: locale.baseText('menuActions.delete'),\n\t\t\tdisabled: !onWorkflowPage.value || isNewWorkflow.value,\n\t\t\tcustomClass: $style.deleteItem,\n\t\t\tdivided: true,\n\t\t});\n\t}\n\n\treturn actions;\n});\n\nconst isWorkflowHistoryFeatureEnabled = computed(() => {\n\treturn settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.WorkflowHistory);\n});\n\nconst workflowHistoryRoute = computed<{ name: string; params: { workflowId: string } }>(() => {\n\treturn {\n\t\tname: VIEWS.WORKFLOW_HISTORY,\n\t\tparams: {\n\t\t\tworkflowId: props.workflow.id,\n\t\t},\n\t};\n});\n\nconst isWorkflowHistoryButtonDisabled = computed(() => {\n\treturn isNewWorkflow.value;\n});\n\nconst workflowTagIds = computed(() => {\n\treturn (props.workflow.tags ?? []).map((tag) => (typeof tag === 'string' ? tag : tag.id));\n});\n\nwatch(\n\t() => props.workflow.id,\n\t() => {\n\t\tisTagsEditEnabled.value = false;\n\t\tisNameEditEnabled.value = false;\n\t},\n);\n\nfunction getWorkflowId(): string | undefined {\n\tlet id: string | undefined = undefined;\n\tif (props.workflow.id !== PLACEHOLDER_EMPTY_WORKFLOW_ID) {\n\t\tid = props.workflow.id;\n\t} else if (route.params.name && route.params.name !== 'new') {\n\t\tid = route.params.name as string;\n\t}\n\n\treturn id;\n}\n\nasync function onSaveButtonClick() {\n\t// If the workflow is saving, do not allow another save\n\tif (isWorkflowSaving.value) {\n\t\treturn;\n\t}\n\n\tconst id = getWorkflowId();\n\n\tconst name = props.workflow.name;\n\tconst tags = props.workflow.tags as string[];\n\n\tconst saved = await workflowHelpers.saveCurrentWorkflow({\n\t\tid,\n\t\tname,\n\t\ttags,\n\t});\n\n\tif (saved) {\n\t\tshowCreateWorkflowSuccessToast(id);\n\n\t\tawait npsSurveyStore.fetchPromptsData();\n\n\t\tif (route.name === VIEWS.EXECUTION_DEBUG) {\n\t\t\tawait router.replace({\n\t\t\t\tname: VIEWS.WORKFLOW,\n\t\t\t\tparams: { name: props.workflow.id },\n\t\t\t});\n\t\t}\n\t}\n}\n\nfunction onShareButtonClick() {\n\tuiStore.openModalWithData({\n\t\tname: WORKFLOW_SHARE_MODAL_KEY,\n\t\tdata: { id: props.workflow.id },\n\t});\n\n\ttelemetry.track('User opened sharing modal', {\n\t\tworkflow_id: props.workflow.id,\n\t\tuser_id_sharer: usersStore.currentUser?.id,\n\t\tsub_view: route.name === VIEWS.WORKFLOWS ? 'Workflows listing' : 'Workflow editor',\n\t});\n}\n\nfunction onTagsEditEnable() {\n\tappliedTagIds.value = (props.workflow.tags ?? []) as string[];\n\tisTagsEditEnabled.value = true;\n\n\tsetTimeout(() => {\n\t\t// allow name update to occur before disabling name edit\n\t\tisNameEditEnabled.value = false;\n\t\ttagsEventBus.emit('focus');\n\t}, 0);\n}\n\nasync function onTagsBlur() {\n\tconst current = (props.workflow.tags ?? []) as string[];\n\tconst tags = appliedTagIds.value;\n\tif (!hasChanged(current, tags)) {\n\t\tisTagsEditEnabled.value = false;\n\n\t\treturn;\n\t}\n\tif (tagsSaving.value) {\n\t\treturn;\n\t}\n\ttagsSaving.value = true;\n\n\tconst saved = await workflowHelpers.saveCurrentWorkflow({ tags });\n\ttelemetry.track('User edited workflow tags', {\n\t\tworkflow_id: props.workflow.id,\n\t\tnew_tag_count: tags.length,\n\t});\n\n\ttagsSaving.value = false;\n\tif (saved) {\n\t\tisTagsEditEnabled.value = false;\n\t}\n}\n\nfunction onTagsEditEsc() {\n\tisTagsEditEnabled.value = false;\n}\n\nfunction onNameToggle() {\n\tisNameEditEnabled.value = !isNameEditEnabled.value;\n\tif (isNameEditEnabled.value) {\n\t\tif (isTagsEditEnabled.value) {\n\t\t\tvoid onTagsBlur();\n\t\t}\n\n\t\tisTagsEditEnabled.value = false;\n\t}\n}\n\nasync function onNameSubmit({\n\tname,\n\tonSubmit,\n}: {\n\tname: string;\n\tonSubmit: (saved: boolean) => void;\n}) {\n\tconst newName = name.trim();\n\tif (!newName) {\n\t\ttoast.showMessage({\n\t\t\ttitle: locale.baseText('workflowDetails.showMessage.title'),\n\t\t\tmessage: locale.baseText('workflowDetails.showMessage.message'),\n\t\t\ttype: 'error',\n\t\t});\n\n\t\tonSubmit(false);\n\t\treturn;\n\t}\n\n\tif (newName === props.workflow.name) {\n\t\tisNameEditEnabled.value = false;\n\n\t\tonSubmit(true);\n\t\treturn;\n\t}\n\n\tuiStore.addActiveAction('workflowSaving');\n\tconst id = getWorkflowId();\n\tconst saved = await workflowHelpers.saveCurrentWorkflow({ name });\n\tif (saved) {\n\t\tisNameEditEnabled.value = false;\n\t\tshowCreateWorkflowSuccessToast(id);\n\t}\n\tuiStore.removeActiveAction('workflowSaving');\n\tonSubmit(saved);\n}\n\nasync function handleFileImport(): Promise<void> {\n\tconst inputRef = importFileRef.value;\n\tif (inputRef?.files && inputRef.files.length !== 0) {\n\t\tconst reader = new FileReader();\n\t\treader.onload = () => {\n\t\t\tlet workflowData: IWorkflowDataUpdate;\n\t\t\ttry {\n\t\t\t\tworkflowData = JSON.parse(reader.result as string);\n\t\t\t} catch (error) {\n\t\t\t\ttoast.showMessage({\n\t\t\t\t\ttitle: locale.baseText('mainSidebar.showMessage.handleFileImport.title'),\n\t\t\t\t\tmessage: locale.baseText('mainSidebar.showMessage.handleFileImport.message'),\n\t\t\t\t\ttype: 'error',\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t} finally {\n\t\t\t\treader.onload = null;\n\t\t\t\tinputRef.value = '';\n\t\t\t}\n\n\t\t\tnodeViewEventBus.emit('importWorkflowData', { data: workflowData });\n\t\t};\n\t\treader.readAsText(inputRef.files[0]);\n\t}\n}\n\nasync function onWorkflowMenuSelect(action: WORKFLOW_MENU_ACTIONS): Promise<void> {\n\tswitch (action) {\n\t\tcase WORKFLOW_MENU_ACTIONS.DUPLICATE: {\n\t\t\tuiStore.openModalWithData({\n\t\t\t\tname: DUPLICATE_MODAL_KEY,\n\t\t\t\tdata: {\n\t\t\t\t\tid: props.workflow.id,\n\t\t\t\t\tname: props.workflow.name,\n\t\t\t\t\ttags: props.workflow.tags,\n\t\t\t\t},\n\t\t\t});\n\t\t\tbreak;\n\t\t}\n\t\tcase WORKFLOW_MENU_ACTIONS.DOWNLOAD: {\n\t\t\tconst workflowData = await workflowHelpers.getWorkflowDataToSave();\n\t\t\tconst { tags, ...data } = workflowData;\n\t\t\tconst exportData: IWorkflowToShare = {\n\t\t\t\t...data,\n\t\t\t\tmeta: {\n\t\t\t\t\t...props.workflow.meta,\n\t\t\t\t\tinstanceId: rootStore.instanceId,\n\t\t\t\t},\n\t\t\t\ttags: (tags ?? []).map((tagId) => {\n\t\t\t\t\tconst { usageCount, ...tag } = tagsStore.getTagById(tagId);\n\n\t\t\t\t\treturn tag;\n\t\t\t\t}),\n\t\t\t};\n\n\t\t\tconst blob = new Blob([JSON.stringify(exportData, null, 2)], {\n\t\t\t\ttype: 'application/json;charset=utf-8',\n\t\t\t});\n\n\t\t\tlet name = props.workflow.name || 'unsaved_workflow';\n\t\t\tname = name.replace(/[^a-z0-9]/gi, '_');\n\n\t\t\ttelemetry.track('User exported workflow', { workflow_id: workflowData.id });\n\t\t\tsaveAs(blob, name + '.json');\n\t\t\tbreak;\n\t\t}\n\t\tcase WORKFLOW_MENU_ACTIONS.IMPORT_FROM_URL: {\n\t\t\ttry {\n\t\t\t\tconst promptResponse = await message.prompt(\n\t\t\t\t\tlocale.baseText('mainSidebar.prompt.workflowUrl') + ':',\n\t\t\t\t\tlocale.baseText('mainSidebar.prompt.importWorkflowFromUrl') + ':',\n\t\t\t\t\t{\n\t\t\t\t\t\tconfirmButtonText: locale.baseText('mainSidebar.prompt.import'),\n\t\t\t\t\t\tcancelButtonText: locale.baseText('mainSidebar.prompt.cancel'),\n\t\t\t\t\t\tinputErrorMessage: locale.baseText('mainSidebar.prompt.invalidUrl'),\n\t\t\t\t\t\tinputPattern: /^http[s]?:\\/\\/.*\\.json$/i,\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tif (promptResponse.action === 'cancel') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tnodeViewEventBus.emit('importWorkflowUrl', { url: promptResponse.value });\n\t\t\t} catch (e) {}\n\t\t\tbreak;\n\t\t}\n\t\tcase WORKFLOW_MENU_ACTIONS.IMPORT_FROM_FILE: {\n\t\t\timportFileRef.value?.click();\n\t\t\tbreak;\n\t\t}\n\t\tcase WORKFLOW_MENU_ACTIONS.PUSH: {\n\t\t\tcanvasStore.startLoading();\n\t\t\ttry {\n\t\t\t\tawait onSaveButtonClick();\n\n\t\t\t\tconst status = await sourceControlStore.getAggregatedStatus();\n\n\t\t\t\tuiStore.openModalWithData({\n\t\t\t\t\tname: SOURCE_CONTROL_PUSH_MODAL_KEY,\n\t\t\t\t\tdata: { eventBus: sourceControlModalEventBus, status },\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\tswitch (error.message) {\n\t\t\t\t\tcase 'source_control_not_connected':\n\t\t\t\t\t\ttoast.showError(\n\t\t\t\t\t\t\t{ ...error, message: '' },\n\t\t\t\t\t\t\tlocale.baseText('settings.sourceControl.error.not.connected.title'),\n\t\t\t\t\t\t\tlocale.baseText('settings.sourceControl.error.not.connected.message'),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\ttoast.showError(error, locale.baseText('error'));\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tcanvasStore.stopLoading();\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\t\tcase WORKFLOW_MENU_ACTIONS.SETTINGS: {\n\t\t\tuiStore.openModal(WORKFLOW_SETTINGS_MODAL_KEY);\n\t\t\tbreak;\n\t\t}\n\t\tcase WORKFLOW_MENU_ACTIONS.DELETE: {\n\t\t\tconst deleteConfirmed = await message.confirm(\n\t\t\t\tlocale.baseText('mainSidebar.confirmMessage.workflowDelete.message', {\n\t\t\t\t\tinterpolate: { workflowName: props.workflow.name },\n\t\t\t\t}),\n\t\t\t\tlocale.baseText('mainSidebar.confirmMessage.workflowDelete.headline'),\n\t\t\t\t{\n\t\t\t\t\ttype: 'warning',\n\t\t\t\t\tconfirmButtonText: locale.baseText(\n\t\t\t\t\t\t'mainSidebar.confirmMessage.workflowDelete.confirmButtonText',\n\t\t\t\t\t),\n\t\t\t\t\tcancelButtonText: locale.baseText(\n\t\t\t\t\t\t'mainSidebar.confirmMessage.workflowDelete.cancelButtonText',\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tif (deleteConfirmed !== MODAL_CONFIRM) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tawait workflowsStore.deleteWorkflow(props.workflow.id);\n\t\t\t} catch (error) {\n\t\t\t\ttoast.showError(error, locale.baseText('generic.deleteWorkflowError'));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tuiStore.stateIsDirty = false;\n\t\t\t// Reset tab title since workflow is deleted.\n\t\t\ttitleChange.titleReset();\n\t\t\ttoast.showMessage({\n\t\t\t\ttitle: locale.baseText('mainSidebar.showMessage.handleSelect1.title'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\n\t\t\tawait router.push({ name: VIEWS.WORKFLOWS });\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nfunction goToUpgrade() {\n\tvoid uiStore.goToUpgrade('workflow_sharing', 'upgrade-workflow-sharing');\n}\n\nfunction showCreateWorkflowSuccessToast(id?: string) {\n\tif (!id || ['new', PLACEHOLDER_EMPTY_WORKFLOW_ID].includes(id)) {\n\t\tlet toastTitle = locale.baseText('workflows.create.personal.toast.title');\n\t\tlet toastText = locale.baseText('workflows.create.personal.toast.text');\n\t\tif (projectsStore.currentProject) {\n\t\t\ttoastTitle = locale.baseText('workflows.create.project.toast.title', {\n\t\t\t\tinterpolate: { projectName: projectsStore.currentProject.name ?? '' },\n\t\t\t});\n\n\t\t\ttoastText = locale.baseText('workflows.create.project.toast.text', {\n\t\t\t\tinterpolate: { projectName: projectsStore.currentProject.name ?? '' },\n\t\t\t});\n\t\t}\n\n\t\ttoast.showMessage({\n\t\t\ttitle: toastTitle,\n\t\t\tmessage: toastText,\n\t\t\ttype: 'success',\n\t\t});\n\t}\n}\n</script>\n\n<template>\n\t<div :class=\"$style.container\">\n\t\t<BreakpointsObserver :value-x-s=\"15\" :value-s-m=\"25\" :value-m-d=\"50\" class=\"name-container\">\n\t\t\t<template #default=\"{ value }\">\n\t\t\t\t<ShortenName\n\t\t\t\t\t:name=\"workflow.name\"\n\t\t\t\t\t:limit=\"value\"\n\t\t\t\t\t:custom=\"true\"\n\t\t\t\t\ttest-id=\"workflow-name-input\"\n\t\t\t\t>\n\t\t\t\t\t<template #default=\"{ shortenedName }\">\n\t\t\t\t\t\t<InlineTextEdit\n\t\t\t\t\t\t\t:model-value=\"workflow.name\"\n\t\t\t\t\t\t\t:preview-value=\"shortenedName\"\n\t\t\t\t\t\t\t:is-edit-enabled=\"isNameEditEnabled\"\n\t\t\t\t\t\t\t:max-length=\"MAX_WORKFLOW_NAME_LENGTH\"\n\t\t\t\t\t\t\t:disabled=\"readOnly\"\n\t\t\t\t\t\t\tplaceholder=\"Enter workflow name\"\n\t\t\t\t\t\t\tclass=\"name\"\n\t\t\t\t\t\t\t@toggle=\"onNameToggle\"\n\t\t\t\t\t\t\t@submit=\"onNameSubmit\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</template>\n\t\t\t\t</ShortenName>\n\t\t\t</template>\n\t\t</BreakpointsObserver>\n\n\t\t<span v-if=\"settingsStore.areTagsEnabled\" class=\"tags\" data-test-id=\"workflow-tags-container\">\n\t\t\t<TagsDropdown\n\t\t\t\tv-if=\"isTagsEditEnabled && !readOnly\"\n\t\t\t\tref=\"dropdown\"\n\t\t\t\tv-model=\"appliedTagIds\"\n\t\t\t\t:create-enabled=\"true\"\n\t\t\t\t:event-bus=\"tagsEventBus\"\n\t\t\t\t:placeholder=\"$locale.baseText('workflowDetails.chooseOrCreateATag')\"\n\t\t\t\tclass=\"tags-edit\"\n\t\t\t\tdata-test-id=\"workflow-tags-dropdown\"\n\t\t\t\t@blur=\"onTagsBlur\"\n\t\t\t\t@esc=\"onTagsEditEsc\"\n\t\t\t/>\n\t\t\t<div v-else-if=\"(workflow.tags ?? []).length === 0 && !readOnly\">\n\t\t\t\t<span class=\"add-tag clickable\" data-test-id=\"new-tag-link\" @click=\"onTagsEditEnable\">\n\t\t\t\t\t+ {{ $locale.baseText('workflowDetails.addTag') }}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<TagsContainer\n\t\t\t\tv-else\n\t\t\t\t:key=\"workflow.id\"\n\t\t\t\t:tag-ids=\"workflowTagIds\"\n\t\t\t\t:clickable=\"true\"\n\t\t\t\t:responsive=\"true\"\n\t\t\t\tdata-test-id=\"workflow-tags\"\n\t\t\t\t@click=\"onTagsEditEnable\"\n\t\t\t/>\n\t\t</span>\n\t\t<span v-else class=\"tags\"></span>\n\n\t\t<PushConnectionTracker class=\"actions\">\n\t\t\t<span :class=\"`activator ${$style.group}`\">\n\t\t\t\t<WorkflowActivator :workflow-active=\"workflow.active\" :workflow-id=\"workflow.id\" />\n\t\t\t</span>\n\t\t\t<EnterpriseEdition :features=\"[EnterpriseEditionFeature.Sharing]\">\n\t\t\t\t<div :class=\"$style.group\">\n\t\t\t\t\t<CollaborationPane />\n\t\t\t\t\t<N8nButton\n\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\tdata-test-id=\"workflow-share-button\"\n\t\t\t\t\t\t@click=\"onShareButtonClick\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ $locale.baseText('workflowDetails.share') }}\n\t\t\t\t\t</N8nButton>\n\t\t\t\t</div>\n\t\t\t\t<template #fallback>\n\t\t\t\t\t<N8nTooltip>\n\t\t\t\t\t\t<N8nButton type=\"secondary\" :class=\"['mr-2xs', $style.disabledShareButton]\">\n\t\t\t\t\t\t\t{{ $locale.baseText('workflowDetails.share') }}\n\t\t\t\t\t\t</N8nButton>\n\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t<i18n-t\n\t\t\t\t\t\t\t\t:keypath=\"\n\t\t\t\t\t\t\t\t\tuiStore.contextBasedTranslationKeys.workflows.sharing.unavailable.description\n\t\t\t\t\t\t\t\t\t\t.tooltip\n\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<template #action>\n\t\t\t\t\t\t\t\t\t<a @click=\"goToUpgrade\">\n\t\t\t\t\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t\t\t\t\t$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t\t\tuiStore.contextBasedTranslationKeys.workflows.sharing.unavailable\n\t\t\t\t\t\t\t\t\t\t\t\t\t.button as BaseTextKey,\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</i18n-t>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</N8nTooltip>\n\t\t\t\t</template>\n\t\t\t</EnterpriseEdition>\n\t\t\t<div :class=\"$style.group\">\n\t\t\t\t<SaveButton\n\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t:saved=\"!uiStore.stateIsDirty && !isNewWorkflow\"\n\t\t\t\t\t:disabled=\"isWorkflowSaving || readOnly\"\n\t\t\t\t\twith-shortcut\n\t\t\t\t\t:shortcut-tooltip=\"$locale.baseText('saveWorkflowButton.hint')\"\n\t\t\t\t\tdata-test-id=\"workflow-save-button\"\n\t\t\t\t\t@click=\"onSaveButtonClick\"\n\t\t\t\t/>\n\t\t\t\t<RouterLink\n\t\t\t\t\tv-if=\"isWorkflowHistoryFeatureEnabled\"\n\t\t\t\t\t:to=\"workflowHistoryRoute\"\n\t\t\t\t\t:class=\"$style.workflowHistoryButton\"\n\t\t\t\t>\n\t\t\t\t\t<N8nIconButton\n\t\t\t\t\t\t:disabled=\"isWorkflowHistoryButtonDisabled\"\n\t\t\t\t\t\tdata-test-id=\"workflow-history-button\"\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\ticon=\"history\"\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\ttext\n\t\t\t\t\t/>\n\t\t\t\t</RouterLink>\n\t\t\t</div>\n\t\t\t<div :class=\"[$style.workflowMenuContainer, $style.group]\">\n\t\t\t\t<input\n\t\t\t\t\tref=\"importFileRef\"\n\t\t\t\t\t:class=\"$style.hiddenInput\"\n\t\t\t\t\ttype=\"file\"\n\t\t\t\t\tdata-test-id=\"workflow-import-input\"\n\t\t\t\t\t@change=\"handleFileImport()\"\n\t\t\t\t/>\n\t\t\t\t<N8nActionDropdown\n\t\t\t\t\t:items=\"workflowMenuItems\"\n\t\t\t\t\tdata-test-id=\"workflow-menu\"\n\t\t\t\t\t@select=\"onWorkflowMenuSelect\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</PushConnectionTracker>\n\t</div>\n</template>\n\n<style scoped lang=\"scss\">\n$--text-line-height: 24px;\n$--header-spacing: 20px;\n\n.name-container {\n\tmargin-right: $--header-spacing;\n}\n\n.name {\n\tcolor: $custom-font-dark;\n\tfont-size: 15px;\n}\n\n.activator {\n\tcolor: $custom-font-dark;\n\tfont-weight: 400;\n\tfont-size: 13px;\n\tline-height: $--text-line-height;\n\tdisplay: flex;\n\talign-items: center;\n\n\t> span {\n\t\tmargin-right: 5px;\n\t}\n}\n\n.add-tag {\n\tfont-size: 12px;\n\tpadding: 20px 0; // to be more clickable\n\tcolor: $custom-font-very-light;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n\n\t&:hover {\n\t\tcolor: $color-primary;\n\t}\n}\n\n.tags {\n\tdisplay: flex;\n\talign-items: center;\n\twidth: 100%;\n\tflex: 1;\n\tmargin-right: $--header-spacing;\n}\n\n.tags-edit {\n\tmin-width: 100px;\n\twidth: 100%;\n\tmax-width: 460px;\n}\n\n.actions {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--spacing-m);\n}\n</style>\n\n<style module lang=\"scss\">\n.container {\n\tposition: relative;\n\ttop: -1px;\n\twidth: 100%;\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.group {\n\tdisplay: flex;\n\tgap: var(--spacing-xs);\n}\n.hiddenInput {\n\tdisplay: none;\n}\n\n.deleteItem {\n\tcolor: var(--color-danger);\n}\n\n.disabledShareButton {\n\tcursor: not-allowed;\n}\n\n.workflowHistoryButton {\n\twidth: 30px;\n\theight: 30px;\n\tcolor: var(--color-text-dark);\n\tborder-radius: var(--border-radius-base);\n\n\t&:hover {\n\t\tbackground-color: var(--color-background-base);\n\t}\n\n\t:disabled {\n\t\tbackground: transparent;\n\t\tborder: none;\n\t\topacity: 0.5;\n\t}\n}\n</style>\n","<template>\n\t<div\n\t\tv-if=\"items\"\n\t\t:class=\"{\n\t\t\t[$style.container]: true,\n\t\t\t['tab-bar-container']: true,\n\t\t}\"\n\t>\n\t\t<N8nRadioButtons\n\t\t\t:model-value=\"modelValue\"\n\t\t\t:options=\"items\"\n\t\t\t@update:model-value=\"onUpdateModelValue\"\n\t\t/>\n\t</div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { MAIN_HEADER_TABS } from '@/constants';\nimport type { ITabBarItem } from '@/Interface';\n\nwithDefaults(\n\tdefineProps<{\n\t\titems: ITabBarItem[];\n\t\tmodelValue?: string;\n\t}>(),\n\t{\n\t\tmodelValue: MAIN_HEADER_TABS.WORKFLOW,\n\t},\n);\n\nconst emit = defineEmits(['update:modelValue']);\n\nfunction onUpdateModelValue(tab: string, event: MouseEvent): void {\n\temit('update:modelValue', tab, event);\n}\n</script>\n\n<style module lang=\"scss\">\n.container {\n\tposition: absolute;\n\ttop: 47px;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tmin-height: 30px;\n\tdisplay: flex;\n\tpadding: var(--spacing-5xs);\n\tbackground-color: var(--color-foreground-base);\n\tborder-radius: var(--border-radius-base);\n\ttransition: all 150ms ease-in-out;\n}\n\n@media screen and (max-width: 430px) {\n\t.container {\n\t\tflex-direction: column;\n\t}\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref, computed, watch, onBeforeMount, onMounted } from 'vue';\nimport type { RouteLocation, RouteLocationRaw } from 'vue-router';\nimport { useRouter, useRoute } from 'vue-router';\nimport WorkflowDetails from '@/components/MainHeader/WorkflowDetails.vue';\nimport TabBar from '@/components/MainHeader/TabBar.vue';\nimport {\n\tMAIN_HEADER_TABS,\n\tPLACEHOLDER_EMPTY_WORKFLOW_ID,\n\tSTICKY_NODE_TYPE,\n\tVIEWS,\n} from '@/constants';\nimport { useI18n } from '@/composables/useI18n';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useExecutionsStore } from '@/stores/executions.store';\nimport { usePushConnection } from '@/composables/usePushConnection';\n\nconst router = useRouter();\nconst route = useRoute();\nconst locale = useI18n();\nconst pushConnection = usePushConnection({ router });\nconst ndvStore = useNDVStore();\nconst uiStore = useUIStore();\nconst sourceControlStore = useSourceControlStore();\nconst workflowsStore = useWorkflowsStore();\nconst executionsStore = useExecutionsStore();\n\nconst activeHeaderTab = ref(MAIN_HEADER_TABS.WORKFLOW);\nconst workflowToReturnTo = ref('');\nconst executionToReturnTo = ref('');\nconst dirtyState = ref(false);\n\nconst tabBarItems = computed(() => [\n\t{ value: MAIN_HEADER_TABS.WORKFLOW, label: locale.baseText('generic.editor') },\n\t{ value: MAIN_HEADER_TABS.EXECUTIONS, label: locale.baseText('generic.executions') },\n]);\n\nconst activeNode = computed(() => ndvStore.activeNode);\nconst hideMenuBar = computed(() =>\n\tBoolean(activeNode.value && activeNode.value.type !== STICKY_NODE_TYPE),\n);\nconst workflow = computed(() => workflowsStore.workflow);\nconst workflowId = computed(() =>\n\tString(router.currentRoute.value.params.name || workflowsStore.workflowId),\n);\nconst onWorkflowPage = computed(() => !!(route.meta.nodeView || route.meta.keepWorkflowAlive));\nconst readOnly = computed(() => sourceControlStore.preferences.branchReadOnly);\n\nwatch(route, (to, from) => {\n\tsyncTabsWithRoute(to, from);\n});\n\nonBeforeMount(() => {\n\tpushConnection.initialize();\n});\n\nonMounted(async () => {\n\tdirtyState.value = uiStore.stateIsDirty;\n\tsyncTabsWithRoute(route);\n});\n\nfunction syncTabsWithRoute(to: RouteLocation, from?: RouteLocation): void {\n\tif (\n\t\tto.name === VIEWS.EXECUTION_HOME ||\n\t\tto.name === VIEWS.WORKFLOW_EXECUTIONS ||\n\t\tto.name === VIEWS.EXECUTION_PREVIEW\n\t) {\n\t\tactiveHeaderTab.value = MAIN_HEADER_TABS.EXECUTIONS;\n\t} else if (\n\t\tto.name === VIEWS.WORKFLOW ||\n\t\tto.name === VIEWS.NEW_WORKFLOW ||\n\t\tto.name === VIEWS.EXECUTION_DEBUG\n\t) {\n\t\tactiveHeaderTab.value = MAIN_HEADER_TABS.WORKFLOW;\n\t}\n\n\tif (to.params.name !== 'new' && typeof to.params.name === 'string') {\n\t\tworkflowToReturnTo.value = to.params.name;\n\t}\n\n\tif (\n\t\tfrom?.name === VIEWS.EXECUTION_PREVIEW &&\n\t\tto.params.name === from.params.name &&\n\t\ttypeof from.params.executionId === 'string'\n\t) {\n\t\texecutionToReturnTo.value = from.params.executionId;\n\t}\n}\n\nfunction onTabSelected(tab: MAIN_HEADER_TABS, event: MouseEvent) {\n\tconst openInNewTab = event.ctrlKey || event.metaKey;\n\n\tswitch (tab) {\n\t\tcase MAIN_HEADER_TABS.WORKFLOW:\n\t\t\tvoid navigateToWorkflowView(openInNewTab);\n\t\t\tbreak;\n\n\t\tcase MAIN_HEADER_TABS.EXECUTIONS:\n\t\t\tvoid navigateToExecutionsView(openInNewTab);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nasync function navigateToWorkflowView(openInNewTab: boolean) {\n\tlet routeToNavigateTo: RouteLocationRaw;\n\tif (!['', 'new', PLACEHOLDER_EMPTY_WORKFLOW_ID].includes(workflowToReturnTo.value)) {\n\t\trouteToNavigateTo = {\n\t\t\tname: VIEWS.WORKFLOW,\n\t\t\tparams: { name: workflowToReturnTo.value },\n\t\t};\n\t} else {\n\t\trouteToNavigateTo = { name: VIEWS.NEW_WORKFLOW };\n\t}\n\n\tif (openInNewTab) {\n\t\tconst { href } = router.resolve(routeToNavigateTo);\n\t\twindow.open(href, '_blank');\n\t} else if (route.name !== routeToNavigateTo.name) {\n\t\tif (route.name === VIEWS.NEW_WORKFLOW) {\n\t\t\tuiStore.stateIsDirty = dirtyState.value;\n\t\t}\n\t\tactiveHeaderTab.value = MAIN_HEADER_TABS.WORKFLOW;\n\t\tawait router.push(routeToNavigateTo);\n\t}\n}\n\nasync function navigateToExecutionsView(openInNewTab: boolean) {\n\tconst routeWorkflowId =\n\t\tworkflowId.value === PLACEHOLDER_EMPTY_WORKFLOW_ID ? 'new' : workflowId.value;\n\tconst executionToReturnToValue = executionsStore.activeExecution?.id || executionToReturnTo.value;\n\tconst routeToNavigateTo: RouteLocationRaw = executionToReturnToValue\n\t\t? {\n\t\t\t\tname: VIEWS.EXECUTION_PREVIEW,\n\t\t\t\tparams: { name: routeWorkflowId, executionId: executionToReturnToValue },\n\t\t\t}\n\t\t: {\n\t\t\t\tname: VIEWS.EXECUTION_HOME,\n\t\t\t\tparams: { name: routeWorkflowId },\n\t\t\t};\n\n\tif (openInNewTab) {\n\t\tconst { href } = router.resolve(routeToNavigateTo);\n\t\twindow.open(href, '_blank');\n\t} else if (route.name !== routeToNavigateTo.name) {\n\t\tdirtyState.value = uiStore.stateIsDirty;\n\t\tworkflowToReturnTo.value = workflowId.value;\n\t\tactiveHeaderTab.value = MAIN_HEADER_TABS.EXECUTIONS;\n\t\tawait router.push(routeToNavigateTo);\n\t}\n}\n</script>\n\n<template>\n\t<div>\n\t\t<div :class=\"{ 'main-header': true, expanded: !uiStore.sidebarMenuCollapsed }\">\n\t\t\t<div v-show=\"!hideMenuBar\" class=\"top-menu\">\n\t\t\t\t<WorkflowDetails v-if=\"workflow?.name\" :workflow=\"workflow\" :read-only=\"readOnly\" />\n\t\t\t\t<TabBar\n\t\t\t\t\tv-if=\"onWorkflowPage\"\n\t\t\t\t\t:items=\"tabBarItems\"\n\t\t\t\t\t:model-value=\"activeHeaderTab\"\n\t\t\t\t\t@update:model-value=\"onTabSelected\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\">\n.main-header {\n\tbackground-color: var(--color-background-xlight);\n\theight: $header-height;\n\twidth: 100%;\n\tbox-sizing: border-box;\n\tborder-bottom: var(--border-width-base) var(--border-style-base) var(--color-foreground-base);\n}\n\n.top-menu {\n\tposition: relative;\n\tdisplay: flex;\n\talign-items: center;\n\tfont-size: 0.9em;\n\theight: $header-height;\n\tfont-weight: 400;\n\tpadding: 0 var(--spacing-m) 0 var(--spacing-xs);\n}\n</style>\n"],"names":["DEFAULT_WORKFLOW_NAME_LIMIT","WORKFLOW_NAME_END_COUNT_TO_KEEP","_sfc_main$c","defineComponent","shorten","_sfc_render","_ctx","_cache","$props","$setup","$data","$options","_openBlock","_createElementBlock","_sfc_main$b","createEventBus","options","observer","entries","target","isIntersecting","observed","_sfc_main$a","DEFAULT_MAX_TAGS_LIMIT","_sfc_main$9","IntersectionObserver","IntersectionObserved","mapStores","useTagsStore","tags","tagId","toDisplay","tag","visibleCount","accu","val","hidden","hiddenTitle","countTag","debounce","parent","el","e","_component_IntersectionObserver","_resolveComponent","_createBlock","intersectionEventBus","onObserved","_withCtx","_createElementVNode","_hoisted_1","_Fragment","_renderList","_normalizeClass","_component_el_tag","_createTextVNode","_toDisplayString","_component_IntersectionObserved","responsive","_createVNode","props","__props","hiddenValue","computed","value","emit","__emit","inputRef","ref","onMounted","focus","_a","onBeforeUnmount","onInput","onEnter","onClickOutside","onEscape","isDisabled","newValue","escPressed","inputBus","watch","onClick","onBlur","submit","onSubmit","updated","callDebounced","useDebounce","uiStore","useUIStore","width","bp","BREAKPOINT_SM","BREAKPOINT_XL","BREAKPOINT_LG","BREAKPOINT_MD","onResize","onResizeEnd","nextTick","bannerHeight","getBannerRowHeight","collaborationStore","useCollaborationStore","usersStore","useUsersStore","workflowsStore","useWorkflowsStore","HEARTBEAT_INTERVAL","TIME","heartbeatTimer","activeUsersSorted","currentWorkflowUsers","userInfo","owner","isUserGlobalOwner","user","currentUserEmail","startHeartbeat","stopHeartbeat","onDocumentVisibilityChange","$style","useCssModule","rootStore","useRootStore","canvasStore","useCanvasStore","settingsStore","useSettingsStore","sourceControlStore","useSourceControlStore","tagsStore","projectsStore","useProjectsStore","npsSurveyStore","useNpsSurveyStore","router","useRouter","route","useRoute","locale","useI18n","telemetry","useTelemetry","message","useMessage","toast","useToast","titleChange","useTitleChange","workflowHelpers","useWorkflowHelpers","isTagsEditEnabled","isNameEditEnabled","appliedTagIds","tagsSaving","importFileRef","tagsEventBus","sourceControlModalEventBus","hasChanged","prev","curr","set","acc","isNewWorkflow","PLACEHOLDER_EMPTY_WORKFLOW_ID","isWorkflowSaving","onWorkflowPage","onExecutionsTab","VIEWS","workflowPermissions","getWorkflowPermissions","workflowMenuItems","actions","WORKFLOW_MENU_ACTIONS","hasPermission","isWorkflowHistoryFeatureEnabled","EnterpriseEditionFeature","workflowHistoryRoute","isWorkflowHistoryButtonDisabled","workflowTagIds","getWorkflowId","id","onSaveButtonClick","name","showCreateWorkflowSuccessToast","onShareButtonClick","WORKFLOW_SHARE_MODAL_KEY","onTagsEditEnable","onTagsBlur","current","saved","onTagsEditEsc","onNameToggle","onNameSubmit","newName","handleFileImport","reader","workflowData","nodeViewEventBus","onWorkflowMenuSelect","action","DUPLICATE_MODAL_KEY","data","exportData","usageCount","blob","saveAs","promptResponse","status","SOURCE_CONTROL_PUSH_MODAL_KEY","error","WORKFLOW_SETTINGS_MODAL_KEY","MODAL_CONFIRM","goToUpgrade","toastTitle","toastText","onUpdateModelValue","tab","event","pushConnection","usePushConnection","ndvStore","useNDVStore","executionsStore","useExecutionsStore","activeHeaderTab","MAIN_HEADER_TABS","workflowToReturnTo","executionToReturnTo","dirtyState","tabBarItems","activeNode","hideMenuBar","STICKY_NODE_TYPE","workflow","workflowId","readOnly","to","from","syncTabsWithRoute","onBeforeMount","onTabSelected","openInNewTab","navigateToWorkflowView","navigateToExecutionsView","routeToNavigateTo","href","routeWorkflowId","executionToReturnToValue"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{_ as L,b as Z}from"./n8n-4UEsHtUL.js";import{ag as m,l as h,m as T,U as l,p as b,I as a,G as R,e as x,O as i,S as E,T as _,u as n,R as $,r as j,aH as W,M as I,J as ee,n as q,b as te,F as se,a7 as oe,az as ae,a9 as ne}from"./vendor-Dv5OeN6t.js";import{O as U,e as O,Q as re,R as le,U as G,l as F,X as ie,x as V,G as ce,Y as ue,n as Y,u as K,t as z,D as de,Z as pe,_ as me,o as ge,V as M,d as be,H as he,$ as _e,j as fe,a0 as Ce,a as Se,b as ve,a1 as ye,a2 as Te,a3 as ke}from"./index-BE0Xl-jy.js";import{u as xe}from"./useUserHelpers-CzNhI0vP.js";import{d as Ee,m as $e}from"./pinia-sugP77Im.js";import{D}from"./luxon-CLwAIbs0.js";import"./axios-Mm4CS0gO.js";import"./esprima-next-nhoSXAeq.js";import"./lodash-es-CZ1inz46.js";import"./flatted-DN8lQ2XG.js";import"./@vueuse/core-BBHtM40w.js";import"./@n8n/permissions-BxxteU-C.js";import"./dateformat-CIxnBJXX.js";import"./vue-i18n-Delvyc9x.js";import"./uuid-SoommWqA.js";import"./@n8n/codemirror-lang-sql-DBO6T13I.js";import"./@lezer/common-B6ct0j_v.js";import"./prettier-bS6l4Vb1.js";import"./@jsplumb/util-DS-9vq_E.js";import"./@jsplumb/core-CVBraiyY.js";import"./@jsplumb/common-CF-b-6-M.js";import"./@jsplumb/connector-bezier-BGU0Ovbw.js";import"./@jsplumb/browser-ui-BVF2KoJK.js";import"./codemirror-lang-html-n8n-CWDO6_kP.js";import"./@n8n/codemirror-lang-Dl0FW_KM.js";import"./fast-json-stable-stringify-BOfzoJX1.js";import"./timeago.js-CiyKClrF.js";import"./qrcode.vue-BGkPba5A.js";import"./vue3-touch-events-mV0oX_Sl.js";import"./chart.js-343vZi4M.js";const we="_notification_197jx_8",Me={"gift-icon":"_gift-icon_197jx_1",notification:we},Pe={},Ie=b("div",null,null,-1),Ae=[Ie];function Be(e,t){const c=m("font-awesome-icon");return h(),T("div",{class:a(e.$style["gift-icon"])},[l(c,{icon:"gift"}),b("div",{class:a(e.$style.notification)},Ae,2)],2)}const Ne={$style:Me},Ue=L(Pe,[["render",Be],["__cssModules",Ne]]),De=["value","max"],Le=8,je=R({__name:"ExecutionsUsage",props:{cloudPlanData:{}},setup(e){const t=e,c=D.utc(),d=x(()=>{const{days:o=0}=r().diff(c,["days"]).toObject();return Math.ceil(o)}),p=x(()=>{var f;if(!((f=t.cloudPlanData)!=null&&f.expirationDate))return!1;const o=D.fromISO(t.cloudPlanData.expirationDate);return c.toMillis()>o.toMillis()}),r=()=>{var o;return D.fromISO(((o=t==null?void 0:t.cloudPlanData)==null?void 0:o.expirationDate)??"")},u=x(()=>{var o;return(o=t.cloudPlanData)!=null&&o.usage?t.cloudPlanData.usage.executions<t.cloudPlanData.monthlyExecutionsLimit:0}),y=x(()=>{var s;if(!((s=t.cloudPlanData)!=null&&s.usage))return 0;const o=t.cloudPlanData.usage.executions,f=t.cloudPlanData.monthlyExecutionsLimit;return o>f?f:o}),k=x(()=>{var C;if(!((C=t.cloudPlanData)!=null&&C.usage))return 0;const o=t.cloudPlanData.usage.executions,f=t.cloudPlanData.monthlyExecutionsLimit,s=Le*f/100;return o<s?s:o}),w=x(()=>{var o;return(o=t.cloudPlanData)!=null&&o.monthlyExecutionsLimit?t.cloudPlanData.monthlyExecutionsLimit:0}),P=()=>{O().goToUpgrade("canvas-nav","upgrade-canvas-nav","redirect")};return(o,f)=>{const s=m("n8n-text"),C=m("i18n-t"),S=m("n8n-button");return h(),T("div",{class:a(o.$style.container)},[p.value?(h(),T("div",{key:0,class:a(o.$style.usageText)},[l(s,{size:"small",color:"danger"},{default:i(()=>[E(_(n(U).baseText("executionUsage.expired.text")),1)]),_:1})],2)):!p.value&&u.value?(h(),T("div",{key:1,class:a(o.$style.usageText)},[l(C,{tag:"span",keypath:"executionUsage.currentUsage"},{text:i(()=>[l(s,{size:"small",color:"text-dark"},{default:i(()=>[E(_(n(U).baseText("executionUsage.currentUsage.text")),1)]),_:1})]),count:i(()=>[l(s,{size:"small",bold:!0,color:"warning"},{default:i(()=>[E(_(n(U).baseText("executionUsage.currentUsage.count",{adjustToNumber:d.value||0})),1)]),_:1})]),_:1})],2)):u.value?$("",!0):(h(),T("div",{key:2,class:a(o.$style.usageText)},[l(s,{size:"small"},{default:i(()=>[E(_(n(U).baseText("executionUsage.ranOutOfExecutions.text")),1)]),_:1})],2)),p.value?$("",!0):(h(),T("div",{key:3,class:a(o.$style.usageCounter)},[b("div",{class:a(o.$style.progressBarDiv)},[b("progress",{class:a([u.value?o.$style.progressBarSuccess:o.$style.progressBarDanger,o.$style.progressBar]),value:k.value,max:w.value},null,10,De)],2),b("div",{class:a(o.$style.executionsCountSection)},[l(s,{size:"xsmall",color:u.value?"text-dark":"danger"},{default:i(()=>[E(_(y.value)+"/"+_(w.value),1)]),_:1},8,["color"]),l(s,{size:"xsmall",color:u.value?"text-dark":"danger"},{default:i(()=>[E(_(n(U).baseText("executionUsage.label.executions")),1)]),_:1},8,["color"])],2)],2)),b("div",{class:a(o.$style.upgradeButtonSection)},[l(S,{label:n(U).baseText("executionUsage.button.upgrade"),size:"xmini",icon:"gem",type:"success",block:!0,onClick:P},null,8,["label"])],2)],2)}}}),Re="_container_19ive_1",Oe="_progressBarDiv_19ive_9",ze="_progressBar_19ive_9",We="_progressBarSuccess_19ive_38",Ve="_progressBarDanger_19ive_48",He="_usageText_19ive_57",qe="_usageCounter_19ive_64",Ge="_danger_19ive_73",Fe="_executionsCountSection_19ive_77",Ye="_upgradeButtonSection_19ive_81",Ke={container:Re,progressBarDiv:Oe,progressBar:ze,progressBarSuccess:We,progressBarDanger:Ve,usageText:He,usageCounter:qe,danger:Ge,executionsCountSection:Fe,upgradeButtonSection:Ye},Je={$style:Ke},Qe=L(je,[["__cssModules",Je]]);async function Xe(e){return await re(e.baseUrl,"/cta/become-creator")}const Ze="N8N_BECOME_TEMPLATE_CREATOR_CTA_DISMISSED_AT",et=30,tt=15*60*1e3,J=Ee(le.BECOME_TEMPLATE_CREATOR,()=>{const e=G(),t=F(),c=ie(Ze),d=j(!1),p=j(null),r=x(()=>c.value?!st(c.value):!1),u=x(()=>d.value&&!e.userIsTrialing&&!r.value),y=()=>{c.value=D.now().toISO()},k=async()=>{const f=await Xe(t.restApiContext);d.value=f},w=async()=>{r.value||e.userIsTrialing||d.value||await k()};return{showBecomeCreatorCta:u,dismissCta:y,startMonitoringCta:()=>{p.value||(setTimeout(w,1e3),p.value=setInterval(w,tt))},stopMonitoringCta:()=>{p.value&&(clearInterval(p.value),p.value=null)}}});function st(e){return D.fromISO(e).plus({days:et})<=D.now()}const ot=R({__name:"BecomeTemplateCreatorCta",setup(e){const t=V(),c=J(),d=ce(),p=()=>{d.track("User clicked become creator CTA")};return(r,u)=>{const y=m("n8n-icon"),k=m("n8n-button");return n(c).showBecomeCreatorCta?(h(),T("div",{key:0,class:a(r.$style.container),"data-test-id":"become-template-creator-cta"},[b("div",{class:a(r.$style.textAndCloseButton)},[b("p",{class:a(r.$style.text)},_(n(t).baseText("becomeCreator.text")),3),b("button",{class:a(r.$style.closeButton),"data-test-id":"close-become-template-creator-cta",onClick:u[0]||(u[0]=w=>n(c).dismissCta())},[l(y,{icon:"times",size:"xsmall",title:n(t).baseText("generic.close")},null,8,["title"])],2)],2),l(k,{class:a(r.$style.becomeCreatorButton),label:n(t).baseText("becomeCreator.buttonText"),size:"xmini",type:"secondary",element:"a",href:"https://creators.n8n.io/hub",target:"_blank",onClick:p},null,8,["class","label"])],2)):$("",!0)}}}),at="_container_92ffs_1",nt="_textAndCloseButton_92ffs_9",rt="_text_92ffs_9",lt="_closeButton_92ffs_22",it="_becomeCreatorButton_92ffs_35",ct={container:at,textAndCloseButton:nt,text:rt,closeButton:lt,becomeCreatorButton:it},ut={$style:ct},dt=L(ot,[["__cssModules",ut]]),pt=R({__name:"MainSidebarSourceControl",props:{isCollapsed:{type:Boolean}},setup(e){const t={CONFLICT:409};W();const c=ue(),d=O(),p=Y(),r=K(),u=V(),y=Z(),k=j(300),w=x(()=>p.preferences.branchName),P=x(()=>p.isEnterpriseSourceControlEnabled&&z(["rbac"],{rbac:{scope:"sourceControl:manage"}}));async function o(){c.startLoading(),c.setLoadingText(u.baseText("settings.sourceControl.loading.checkingForChanges"));try{const s=await p.getAggregatedStatus();d.openModalWithData({name:de,data:{eventBus:y,status:s}})}catch(s){r.showError(s,u.baseText("error"))}finally{c.stopLoading(),c.setLoadingText(u.baseText("genericHelpers.loading"))}}async function f(){c.startLoading(),c.setLoadingText(u.baseText("settings.sourceControl.loading.pull"));try{const s=await p.pullWorkfolder(!1)||[];if(s.filter(S=>!(S.type==="workflow"&&S.status==="created"&&S.location==="local")).length===0)r.showMessage({title:u.baseText("settings.sourceControl.pull.upToDate.title"),message:u.baseText("settings.sourceControl.pull.upToDate.description"),type:"success"});else{r.showMessage({title:u.baseText("settings.sourceControl.pull.success.title"),type:"success"});const S=["variables","credential"];(s||[]).some(g=>S.includes(g.type))&&q(()=>{r.showMessage({message:u.baseText("settings.sourceControl.pull.oneLastStep.description"),title:u.baseText("settings.sourceControl.pull.oneLastStep.title"),type:"info",duration:0,showClose:!0,offset:0})})}pe.emit("pull")}catch(s){const C=s.response;(C==null?void 0:C.status)===t.CONFLICT?d.openModalWithData({name:me,data:{eventBus:y,status:C.data.data}}):r.showError(s,"Error")}finally{c.stopLoading(),c.setLoadingText(u.baseText("genericHelpers.loading"))}}return(s,C)=>{const S=m("n8n-icon"),A=m("n8n-button"),g=m("n8n-tooltip");return P.value?(h(),T("div",{key:0,class:a({[s.$style.sync]:!0,[s.$style.collapsed]:s.isCollapsed,[s.$style.isConnected]:n(p).isEnterpriseSourceControlEnabled}),style:ee({borderLeftColor:n(p).preferences.branchColor}),"data-test-id":"main-sidebar-source-control"},[n(p).preferences.connected&&n(p).preferences.branchName?(h(),T("div",{key:0,class:a(s.$style.connected),"data-test-id":"main-sidebar-source-control-connected"},[b("span",{class:a(s.$style.branchName)},[l(S,{icon:"code-branch"}),E(" "+_(w.value),1)],2),b("div",{class:a({"pt-xs":!s.isCollapsed})},[l(g,{disabled:!s.isCollapsed,"show-after":k.value,placement:"right"},{content:i(()=>[b("div",null,_(n(u).baseText("settings.sourceControl.button.pull")),1)]),default:i(()=>[l(A,{class:a({"mr-2xs":!s.isCollapsed,"mb-2xs":s.isCollapsed&&!n(p).preferences.branchReadOnly}),icon:"arrow-down",type:"tertiary",size:"mini",square:s.isCollapsed,label:s.isCollapsed?"":n(u).baseText("settings.sourceControl.button.pull"),onClick:f},null,8,["class","square","label"])]),_:1},8,["disabled","show-after"]),n(p).preferences.branchReadOnly?$("",!0):(h(),I(g,{key:0,disabled:!s.isCollapsed,"show-after":k.value,placement:"right"},{content:i(()=>[b("div",null,_(n(u).baseText("settings.sourceControl.button.push")),1)]),default:i(()=>[l(A,{square:s.isCollapsed,label:s.isCollapsed?"":n(u).baseText("settings.sourceControl.button.push"),icon:"arrow-up",type:"tertiary",size:"mini",onClick:o},null,8,["square","label"])]),_:1},8,["disabled","show-after"]))],2)],2)):$("",!0)],6)):$("",!0)}}}),mt="_sync_15zv3_1",gt="_isConnected_15zv3_8",bt="_collapsed_15zv3_12",ht="_branchName_15zv3_22",_t="_connected_15zv3_32",ft={sync:mt,isConnected:gt,collapsed:bt,branchName:ht,connected:_t},Ct={$style:ft},St=L(pt,[["__cssModules",Ct]]),vt={key:0,class:"mt-m mb-m"},yt={key:2,class:"mt-m mb-m"},Tt=R({__name:"ProjectNavigation",props:{collapsed:{type:Boolean},planName:{}},setup(e){const t=e,c=W(),d=V(),p=K(),r=ge(),u=O(),y=j(!1),k=j(!1),w=x(()=>({id:"home",label:d.baseText("projects.menu.home"),icon:"home",route:{to:{name:M.HOMEPAGE}}})),P=x(()=>({id:"addProject",label:d.baseText("projects.menu.addProject"),icon:"plus",disabled:!k.value||y.value||!r.canCreateProjects,isLoading:y.value})),o=g=>({id:g.id,label:g.name,route:{to:{name:M.PROJECTS_WORKFLOWS,params:{projectId:g.id}}}}),f=()=>{},s=()=>{},C=async()=>{y.value=!0;try{const g=await r.createProject({name:d.baseText("projects.settings.newProjectName")});await c.push({name:M.PROJECT_SETTINGS,params:{projectId:g.id}}),p.showMessage({title:d.baseText("projects.settings.save.successful.title",{interpolate:{projectName:g.name??""}}),type:"success"})}catch(g){p.showError(g,d.baseText("projects.error.title"))}finally{y.value=!1}},S=x(()=>r.myProjects.filter(g=>g.type==="team").toSorted((g,B)=>!g.name||!B.name?0:g.name>B.name?1:g.name<B.name?-1:0)),A=async()=>{await u.goToUpgrade("rbac","upgrade-rbac")};return te(async()=>{await q(),k.value=!0}),(g,B)=>{const v=m("N8nMenuItem"),N=m("ElMenu"),Q=m("i18n-t"),X=m("N8nTooltip");return h(),T("div",{class:a(g.$style.projects)},[l(N,{collapse:t.collapsed,class:"home"},{default:i(()=>[l(v,{item:w.value,compact:t.collapsed,"handle-select":f,"active-tab":n(r).projectNavActiveId,mode:"tabs","data-test-id":"project-home-menu-item"},null,8,["item","compact","active-tab"])]),_:1},8,["collapse"]),S.value.length||n(r).hasPermissionToCreateProjects&&n(r).teamProjectsAvailable?(h(),T("hr",vt)):$("",!0),S.value.length?(h(),I(N,{key:1,collapse:t.collapsed,class:a(g.$style.projectItems)},{default:i(()=>[(h(!0),T(se,null,oe(S.value,H=>(h(),I(v,{key:H.id,item:o(H),compact:t.collapsed,"handle-select":s,"active-tab":n(r).projectNavActiveId,mode:"tabs","data-test-id":"project-menu-item"},null,8,["item","compact","active-tab"]))),128))]),_:1},8,["collapse","class"])):$("",!0),l(X,{placement:"right",disabled:n(r).canCreateProjects},{content:i(()=>[l(Q,{keypath:"projects.create.limitReached"},{planName:i(()=>[E(_(t.planName),1)]),limit:i(()=>[E(_(n(d).baseText("projects.create.limit",{adjustToNumber:n(r).teamProjectsLimit,interpolate:{num:String(n(r).teamProjectsLimit)}})),1)]),link:i(()=>[b("a",{class:a(g.$style.upgradeLink),href:"#",onClick:A},_(n(d).baseText("projects.create.limitReached.link")),3)]),_:1})]),default:i(()=>[n(r).hasPermissionToCreateProjects&&n(r).teamProjectsAvailable?(h(),I(N,{key:0,collapse:t.collapsed,class:"pl-xs pr-xs"},{default:i(()=>[l(v,{item:P.value,compact:t.collapsed,"handle-select":C,mode:"tabs","data-test-id":"add-project-menu-item"},null,8,["item","compact"])]),_:1},8,["collapse"])):$("",!0)]),_:1},8,["disabled"]),S.value.length||n(r).hasPermissionToCreateProjects&&n(r).teamProjectsAvailable?(h(),T("hr",yt)):$("",!0)],2)}}}),kt="_projects_7ap69_1",xt="_projectItems_7ap69_9",Et="_upgradeLink_7ap69_15",$t={projects:kt,projectItems:xt,upgradeLink:Et},wt={$style:$t},Mt=L(Tt,[["__cssModules",wt],["__scopeId","data-v-94afe4bb"]]),Pt=R({name:"MainSidebar",components:{GiftNotificationIcon:Ue,ExecutionsUsage:Qe,MainSidebarSourceControl:St,BecomeTemplateCreatorCta:dt,ProjectNavigation:Mt},setup(){const e=ke(),{callDebounced:t}=be(),c=W(),d=ae();return{externalHooks:e,callDebounced:t,...he(),...xe(c,d)}},data(){return{basePath:"",fullyExpanded:!1}},computed:{...$e(F,ve,O,Se,Ce,fe,G,Y,J,_e),logoPath(){return this.basePath+(this.isCollapsed?"static/logo/collapsed.svg":this.uiStore.logo)},hasVersionUpdates(){return this.settingsStore.settings.releaseChannel==="stable"&&this.versionsStore.hasVersionUpdates},nextVersions(){return this.versionsStore.nextVersions},isCollapsed(){return this.uiStore.sidebarMenuCollapsed},canUserAccessSettings(){return this.findFirstAccessibleSettingsRoute()!==null},showUserArea(){return z(["authenticated"])},workflowExecution(){return this.workflowsStore.getWorkflowExecution},userMenuItems(){return[{id:"settings",label:this.$locale.baseText("settings")},{id:"logout",label:this.$locale.baseText("auth.signout")}]},mainMenuItems(){const e=[],t=this.findFirstAccessibleSettingsRoute(),c=[{id:"cloud-admin",position:"bottom",label:"Admin Panel",icon:"cloud",available:this.settingsStore.isCloudDeployment&&z(["instanceOwner"])},{id:"templates",icon:"box-open",label:this.$locale.baseText("mainSidebar.templates"),position:"bottom",available:this.settingsStore.isTemplatesEnabled&&this.templatesStore.hasCustomTemplatesHost,route:{to:{name:M.TEMPLATES}}},{id:"templates",icon:"box-open",label:this.$locale.baseText("mainSidebar.templates"),position:"bottom",available:this.settingsStore.isTemplatesEnabled&&!this.templatesStore.hasCustomTemplatesHost,link:{href:this.templatesStore.websiteTemplateRepositoryURL,target:"_blank"}},{id:"variables",icon:"variable",label:this.$locale.baseText("mainSidebar.variables"),customIconSize:"medium",position:"bottom",route:{to:{name:M.VARIABLES}}},{id:"executions",icon:"tasks",label:this.$locale.baseText("mainSidebar.executions"),position:"bottom",route:{to:{name:M.EXECUTIONS}}},{id:"settings",icon:"cog",label:this.$locale.baseText("settings"),position:"bottom",available:this.canUserAccessSettings&&this.usersStore.currentUser!==null,activateOnRouteNames:[M.USERS_SETTINGS,M.API_SETTINGS,M.PERSONAL_SETTINGS],route:{to:t}},{id:"help",icon:"question",label:this.$locale.baseText("mainSidebar.help"),position:"bottom",children:[{id:"quickstart",icon:"video",label:this.$locale.baseText("mainSidebar.helpMenuItems.quickstart"),link:{href:"https://www.youtube.com/watch?v=1MwSoB0gnM4",target:"_blank"}},{id:"docs",icon:"book",label:this.$locale.baseText("mainSidebar.helpMenuItems.documentation"),link:{href:"https://docs.n8n.io?utm_source=n8n_app&utm_medium=app_sidebar",target:"_blank"}},{id:"forum",icon:"users",label:this.$locale.baseText("mainSidebar.helpMenuItems.forum"),link:{href:"https://community.n8n.io?utm_source=n8n_app&utm_medium=app_sidebar",target:"_blank"}},{id:"examples",icon:"graduation-cap",label:this.$locale.baseText("mainSidebar.helpMenuItems.course"),link:{href:"https://www.youtube.com/watch?v=1MwSoB0gnM4",target:"_blank"}},{id:"about",icon:"info",label:this.$locale.baseText("mainSidebar.aboutN8n"),position:"bottom"}]}];return[...e,...c]},userIsTrialing(){return this.cloudPlanStore.userIsTrialing},currentPlanAndUsageData(){const e=this.cloudPlanStore.currentPlanData,t=this.cloudPlanStore.currentUsageData;return!e||!t?null:{...e,usage:t}}},async mounted(){this.basePath=this.rootStore.baseUrl,this.$refs.user&&this.externalHooks.run("mainSidebar.mounted",{userRef:this.$refs.user}),this.$nextTick(()=>{window.innerWidth<900||this.uiStore.isNodeView?this.uiStore.sidebarMenuCollapsed=!0:this.uiStore.sidebarMenuCollapsed=!1,this.fullyExpanded=!this.isCollapsed}),this.becomeTemplateCreatorStore.startMonitoringCta()},created(){window.addEventListener("resize",this.onResize)},beforeUnmount(){this.becomeTemplateCreatorStore.stopMonitoringCta(),window.removeEventListener("resize",this.onResize)},methods:{trackHelpItemClick(e){this.$telemetry.track("User clicked help resource",{type:e,workflow_id:this.workflowsStore.workflowId})},trackTemplatesClick(){var e;this.$telemetry.track("User clicked on templates",{role:(e=this.usersStore.currentUserCloudInfo)==null?void 0:e.role,active_workflow_count:this.workflowsStore.activeWorkflows.length})},async onUserActionToggle(e){switch(e){case"logout":this.onLogout();break;case"settings":this.$router.push({name:M.PERSONAL_SETTINGS});break}},onLogout(){this.$router.push({name:M.SIGNOUT})},toggleCollapse(){this.uiStore.toggleSidebarMenuCollapse(),this.isCollapsed?this.fullyExpanded=!this.isCollapsed:setTimeout(()=>{this.fullyExpanded=!this.isCollapsed},300)},openUpdatesPanel(){this.uiStore.openModal(ye)},async handleSelect(e){switch(e){case"templates":this.settingsStore.isTemplatesEnabled&&!this.templatesStore.hasCustomTemplatesHost&&this.trackTemplatesClick();break;case"about":{this.trackHelpItemClick("about"),this.uiStore.openModal(Te);break}case"cloud-admin":{this.cloudPlanStore.redirectToDashboard();break}case"quickstart":case"docs":case"forum":case"examples":{this.trackHelpItemClick(e);break}}},findFirstAccessibleSettingsRoute(){var c;const e=(c=this.$router.getRoutes().find(d=>d.path==="/settings"))==null?void 0:c.children.map(d=>d.name??"");let t={name:M.USERS_SETTINGS};for(const d of e??[])if(this.canUserAccessRouteByName(d.toString())){t={name:d.toString()};break}return t},onResize(e){this.callDebounced(this.onResizeEnd,{debounceTime:100},e)},async onResizeEnd(e){const t=e.target.outerWidth;await this.checkWidthAndAdjustSidebar(t)},async checkWidthAndAdjustSidebar(e){e<900&&(this.uiStore.sidebarMenuCollapsed=!0,await this.$nextTick(),this.fullyExpanded=!this.isCollapsed)}}}),It="_sideMenu_1qnza_1",At="_logo_1qnza_8",Bt="_sideMenuCollapsed_1qnza_19",Nt="_sideMenuCollapseButton_1qnza_26",Ut="_updates_1qnza_45",Dt="_expanded_1qnza_58",Lt="_userArea_1qnza_65",jt="_userName_1qnza_72",Rt="_userActions_1qnza_86",Ot={sideMenu:It,logo:At,sideMenuCollapsed:Bt,sideMenuCollapseButton:Nt,updates:Ut,expanded:Dt,userArea:Lt,userName:jt,userActions:Rt},zt=["src"],Wt={class:"ml-3xs","data-test-id":"main-sidebar-user-menu"};function Vt(e,t,c,d,p,r){const u=m("n8n-icon"),y=m("ProjectNavigation"),k=m("BecomeTemplateCreatorCta"),w=m("ExecutionsUsage"),P=m("GiftNotificationIcon"),o=m("n8n-text"),f=m("MainSidebarSourceControl"),s=m("n8n-avatar"),C=m("el-dropdown-item"),S=m("el-dropdown-menu"),A=m("el-dropdown"),g=m("n8n-action-dropdown"),B=m("n8n-menu");return h(),T("div",{id:"side-menu",class:a({"side-menu":!0,[e.$style.sideMenu]:!0,[e.$style.sideMenuCollapsed]:e.isCollapsed})},[b("div",{id:"collapse-change-button",class:a(["clickable",e.$style.sideMenuCollapseButton]),onClick:t[0]||(t[0]=(...v)=>e.toggleCollapse&&e.toggleCollapse(...v))},[e.isCollapsed?(h(),I(u,{key:0,icon:"chevron-right",size:"xsmall",class:"ml-5xs"})):(h(),I(u,{key:1,icon:"chevron-left",size:"xsmall",class:"mr-5xs"}))],2),l(B,{items:e.mainMenuItems,collapsed:e.isCollapsed,onSelect:e.handleSelect},ne({header:i(()=>{var v;return[b("div",{class:a(e.$style.logo)},[b("img",{src:e.logoPath,"data-test-id":"n8n-logo",class:a(e.$style.icon),alt:"n8n"},null,10,zt)],2),l(y,{collapsed:e.isCollapsed,"plan-name":(v=e.cloudPlanStore.currentPlanData)==null?void 0:v.displayName},null,8,["collapsed","plan-name"])]}),beforeLowerMenu:i(()=>[e.fullyExpanded&&!e.userIsTrialing?(h(),I(k,{key:0})):$("",!0),e.fullyExpanded&&e.userIsTrialing?(h(),I(w,{key:1,"cloud-plan-data":e.currentPlanAndUsageData},null,8,["cloud-plan-data"])):$("",!0)]),menuSuffix:i(()=>[b("div",null,[e.hasVersionUpdates?(h(),T("div",{key:0,"data-test-id":"version-updates-panel-button",class:a(e.$style.updates),onClick:t[1]||(t[1]=(...v)=>e.openUpdatesPanel&&e.openUpdatesPanel(...v))},[b("div",{class:a(e.$style.giftContainer)},[l(P)],2),l(o,{class:a({"ml-xs":!0,[e.$style.expanded]:e.fullyExpanded}),color:"text-base"},{default:i(()=>[E(_(e.nextVersions.length>99?"99+":e.nextVersions.length)+" update"+_(e.nextVersions.length>1?"s":""),1)]),_:1},8,["class"])],2)):$("",!0),l(f,{"is-collapsed":e.isCollapsed},null,8,["is-collapsed"])])]),_:2},[e.showUserArea?{name:"footer",fn:i(()=>[b("div",{class:a(e.$style.userArea)},[b("div",Wt,[l(A,{disabled:!e.isCollapsed,placement:"right-end",trigger:"click",onCommand:e.onUserActionToggle},{dropdown:i(()=>[l(S,null,{default:i(()=>[l(C,{command:"settings"},{default:i(()=>[E(_(e.$locale.baseText("settings")),1)]),_:1}),l(C,{command:"logout"},{default:i(()=>[E(_(e.$locale.baseText("auth.signout")),1)]),_:1})]),_:1})]),default:i(()=>{var v,N;return[b("div",{class:a({[e.$style.avatar]:!0,clickable:e.isCollapsed})},[l(s,{"first-name":(v=e.usersStore.currentUser)==null?void 0:v.firstName,"last-name":(N=e.usersStore.currentUser)==null?void 0:N.lastName,size:"small"},null,8,["first-name","last-name"])],2)]}),_:1},8,["disabled","onCommand"])]),b("div",{class:a({"ml-2xs":!0,[e.$style.userName]:!0,[e.$style.expanded]:e.fullyExpanded})},[l(o,{size:"small",bold:!0,color:"text-dark"},{default:i(()=>{var v;return[E(_((v=e.usersStore.currentUser)==null?void 0:v.fullName),1)]}),_:1})],2),b("div",{class:a({[e.$style.userActions]:!0,[e.$style.expanded]:e.fullyExpanded})},[l(g,{items:e.userMenuItems,placement:"top-start","data-test-id":"user-menu",onSelect:e.onUserActionToggle},null,8,["items","onSelect"])],2)],2)]),key:"0"}:void 0]),1032,["items","collapsed","onSelect"])],2)}const Ht={$style:Ot},vs=L(Pt,[["render",Vt],["__cssModules",Ht]]);export{vs as default};
2
- //# sourceMappingURL=MainSidebar-CTg5wPzP.js.map
1
+ import{_ as L,b as Z}from"./n8n-4UEsHtUL.js";import{ag as m,l as h,m as T,U as l,p as b,I as a,G as R,e as x,O as i,S as E,T as _,u as n,R as $,r as j,aH as W,M as I,J as ee,n as q,b as te,F as se,a7 as oe,az as ae,a9 as ne}from"./vendor-Dv5OeN6t.js";import{O as U,e as O,Q as re,R as le,U as G,l as F,X as ie,x as V,G as ce,Y as ue,n as Y,u as K,t as z,D as de,Z as pe,_ as me,o as ge,V as M,d as be,H as he,$ as _e,j as fe,a0 as Ce,a as Se,b as ve,a1 as ye,a2 as Te,a3 as ke}from"./index-1OxaEeO3.js";import{u as xe}from"./useUserHelpers-DZtbUAMm.js";import{d as Ee,m as $e}from"./pinia-sugP77Im.js";import{D}from"./luxon-CLwAIbs0.js";import"./axios-Mm4CS0gO.js";import"./esprima-next-nhoSXAeq.js";import"./lodash-es-CZ1inz46.js";import"./flatted-DN8lQ2XG.js";import"./@vueuse/core-BBHtM40w.js";import"./@n8n/permissions-BxxteU-C.js";import"./dateformat-CIxnBJXX.js";import"./vue-i18n-Delvyc9x.js";import"./uuid-SoommWqA.js";import"./@n8n/codemirror-lang-sql-DBO6T13I.js";import"./@lezer/common-B6ct0j_v.js";import"./prettier-bS6l4Vb1.js";import"./@jsplumb/util-DS-9vq_E.js";import"./@jsplumb/core-CVBraiyY.js";import"./@jsplumb/common-CF-b-6-M.js";import"./@jsplumb/connector-bezier-BGU0Ovbw.js";import"./@jsplumb/browser-ui-BVF2KoJK.js";import"./codemirror-lang-html-n8n-CWDO6_kP.js";import"./@n8n/codemirror-lang-Dl0FW_KM.js";import"./fast-json-stable-stringify-BOfzoJX1.js";import"./timeago.js-CiyKClrF.js";import"./qrcode.vue-BGkPba5A.js";import"./vue3-touch-events-mV0oX_Sl.js";import"./chart.js-343vZi4M.js";const we="_notification_197jx_8",Me={"gift-icon":"_gift-icon_197jx_1",notification:we},Pe={},Ie=b("div",null,null,-1),Ae=[Ie];function Be(e,t){const c=m("font-awesome-icon");return h(),T("div",{class:a(e.$style["gift-icon"])},[l(c,{icon:"gift"}),b("div",{class:a(e.$style.notification)},Ae,2)],2)}const Ne={$style:Me},Ue=L(Pe,[["render",Be],["__cssModules",Ne]]),De=["value","max"],Le=8,je=R({__name:"ExecutionsUsage",props:{cloudPlanData:{}},setup(e){const t=e,c=D.utc(),d=x(()=>{const{days:o=0}=r().diff(c,["days"]).toObject();return Math.ceil(o)}),p=x(()=>{var f;if(!((f=t.cloudPlanData)!=null&&f.expirationDate))return!1;const o=D.fromISO(t.cloudPlanData.expirationDate);return c.toMillis()>o.toMillis()}),r=()=>{var o;return D.fromISO(((o=t==null?void 0:t.cloudPlanData)==null?void 0:o.expirationDate)??"")},u=x(()=>{var o;return(o=t.cloudPlanData)!=null&&o.usage?t.cloudPlanData.usage.executions<t.cloudPlanData.monthlyExecutionsLimit:0}),y=x(()=>{var s;if(!((s=t.cloudPlanData)!=null&&s.usage))return 0;const o=t.cloudPlanData.usage.executions,f=t.cloudPlanData.monthlyExecutionsLimit;return o>f?f:o}),k=x(()=>{var C;if(!((C=t.cloudPlanData)!=null&&C.usage))return 0;const o=t.cloudPlanData.usage.executions,f=t.cloudPlanData.monthlyExecutionsLimit,s=Le*f/100;return o<s?s:o}),w=x(()=>{var o;return(o=t.cloudPlanData)!=null&&o.monthlyExecutionsLimit?t.cloudPlanData.monthlyExecutionsLimit:0}),P=()=>{O().goToUpgrade("canvas-nav","upgrade-canvas-nav","redirect")};return(o,f)=>{const s=m("n8n-text"),C=m("i18n-t"),S=m("n8n-button");return h(),T("div",{class:a(o.$style.container)},[p.value?(h(),T("div",{key:0,class:a(o.$style.usageText)},[l(s,{size:"small",color:"danger"},{default:i(()=>[E(_(n(U).baseText("executionUsage.expired.text")),1)]),_:1})],2)):!p.value&&u.value?(h(),T("div",{key:1,class:a(o.$style.usageText)},[l(C,{tag:"span",keypath:"executionUsage.currentUsage"},{text:i(()=>[l(s,{size:"small",color:"text-dark"},{default:i(()=>[E(_(n(U).baseText("executionUsage.currentUsage.text")),1)]),_:1})]),count:i(()=>[l(s,{size:"small",bold:!0,color:"warning"},{default:i(()=>[E(_(n(U).baseText("executionUsage.currentUsage.count",{adjustToNumber:d.value||0})),1)]),_:1})]),_:1})],2)):u.value?$("",!0):(h(),T("div",{key:2,class:a(o.$style.usageText)},[l(s,{size:"small"},{default:i(()=>[E(_(n(U).baseText("executionUsage.ranOutOfExecutions.text")),1)]),_:1})],2)),p.value?$("",!0):(h(),T("div",{key:3,class:a(o.$style.usageCounter)},[b("div",{class:a(o.$style.progressBarDiv)},[b("progress",{class:a([u.value?o.$style.progressBarSuccess:o.$style.progressBarDanger,o.$style.progressBar]),value:k.value,max:w.value},null,10,De)],2),b("div",{class:a(o.$style.executionsCountSection)},[l(s,{size:"xsmall",color:u.value?"text-dark":"danger"},{default:i(()=>[E(_(y.value)+"/"+_(w.value),1)]),_:1},8,["color"]),l(s,{size:"xsmall",color:u.value?"text-dark":"danger"},{default:i(()=>[E(_(n(U).baseText("executionUsage.label.executions")),1)]),_:1},8,["color"])],2)],2)),b("div",{class:a(o.$style.upgradeButtonSection)},[l(S,{label:n(U).baseText("executionUsage.button.upgrade"),size:"xmini",icon:"gem",type:"success",block:!0,onClick:P},null,8,["label"])],2)],2)}}}),Re="_container_19ive_1",Oe="_progressBarDiv_19ive_9",ze="_progressBar_19ive_9",We="_progressBarSuccess_19ive_38",Ve="_progressBarDanger_19ive_48",He="_usageText_19ive_57",qe="_usageCounter_19ive_64",Ge="_danger_19ive_73",Fe="_executionsCountSection_19ive_77",Ye="_upgradeButtonSection_19ive_81",Ke={container:Re,progressBarDiv:Oe,progressBar:ze,progressBarSuccess:We,progressBarDanger:Ve,usageText:He,usageCounter:qe,danger:Ge,executionsCountSection:Fe,upgradeButtonSection:Ye},Je={$style:Ke},Qe=L(je,[["__cssModules",Je]]);async function Xe(e){return await re(e.baseUrl,"/cta/become-creator")}const Ze="N8N_BECOME_TEMPLATE_CREATOR_CTA_DISMISSED_AT",et=30,tt=15*60*1e3,J=Ee(le.BECOME_TEMPLATE_CREATOR,()=>{const e=G(),t=F(),c=ie(Ze),d=j(!1),p=j(null),r=x(()=>c.value?!st(c.value):!1),u=x(()=>d.value&&!e.userIsTrialing&&!r.value),y=()=>{c.value=D.now().toISO()},k=async()=>{const f=await Xe(t.restApiContext);d.value=f},w=async()=>{r.value||e.userIsTrialing||d.value||await k()};return{showBecomeCreatorCta:u,dismissCta:y,startMonitoringCta:()=>{p.value||(setTimeout(w,1e3),p.value=setInterval(w,tt))},stopMonitoringCta:()=>{p.value&&(clearInterval(p.value),p.value=null)}}});function st(e){return D.fromISO(e).plus({days:et})<=D.now()}const ot=R({__name:"BecomeTemplateCreatorCta",setup(e){const t=V(),c=J(),d=ce(),p=()=>{d.track("User clicked become creator CTA")};return(r,u)=>{const y=m("n8n-icon"),k=m("n8n-button");return n(c).showBecomeCreatorCta?(h(),T("div",{key:0,class:a(r.$style.container),"data-test-id":"become-template-creator-cta"},[b("div",{class:a(r.$style.textAndCloseButton)},[b("p",{class:a(r.$style.text)},_(n(t).baseText("becomeCreator.text")),3),b("button",{class:a(r.$style.closeButton),"data-test-id":"close-become-template-creator-cta",onClick:u[0]||(u[0]=w=>n(c).dismissCta())},[l(y,{icon:"times",size:"xsmall",title:n(t).baseText("generic.close")},null,8,["title"])],2)],2),l(k,{class:a(r.$style.becomeCreatorButton),label:n(t).baseText("becomeCreator.buttonText"),size:"xmini",type:"secondary",element:"a",href:"https://creators.n8n.io/hub",target:"_blank",onClick:p},null,8,["class","label"])],2)):$("",!0)}}}),at="_container_92ffs_1",nt="_textAndCloseButton_92ffs_9",rt="_text_92ffs_9",lt="_closeButton_92ffs_22",it="_becomeCreatorButton_92ffs_35",ct={container:at,textAndCloseButton:nt,text:rt,closeButton:lt,becomeCreatorButton:it},ut={$style:ct},dt=L(ot,[["__cssModules",ut]]),pt=R({__name:"MainSidebarSourceControl",props:{isCollapsed:{type:Boolean}},setup(e){const t={CONFLICT:409};W();const c=ue(),d=O(),p=Y(),r=K(),u=V(),y=Z(),k=j(300),w=x(()=>p.preferences.branchName),P=x(()=>p.isEnterpriseSourceControlEnabled&&z(["rbac"],{rbac:{scope:"sourceControl:manage"}}));async function o(){c.startLoading(),c.setLoadingText(u.baseText("settings.sourceControl.loading.checkingForChanges"));try{const s=await p.getAggregatedStatus();d.openModalWithData({name:de,data:{eventBus:y,status:s}})}catch(s){r.showError(s,u.baseText("error"))}finally{c.stopLoading(),c.setLoadingText(u.baseText("genericHelpers.loading"))}}async function f(){c.startLoading(),c.setLoadingText(u.baseText("settings.sourceControl.loading.pull"));try{const s=await p.pullWorkfolder(!1)||[];if(s.filter(S=>!(S.type==="workflow"&&S.status==="created"&&S.location==="local")).length===0)r.showMessage({title:u.baseText("settings.sourceControl.pull.upToDate.title"),message:u.baseText("settings.sourceControl.pull.upToDate.description"),type:"success"});else{r.showMessage({title:u.baseText("settings.sourceControl.pull.success.title"),type:"success"});const S=["variables","credential"];(s||[]).some(g=>S.includes(g.type))&&q(()=>{r.showMessage({message:u.baseText("settings.sourceControl.pull.oneLastStep.description"),title:u.baseText("settings.sourceControl.pull.oneLastStep.title"),type:"info",duration:0,showClose:!0,offset:0})})}pe.emit("pull")}catch(s){const C=s.response;(C==null?void 0:C.status)===t.CONFLICT?d.openModalWithData({name:me,data:{eventBus:y,status:C.data.data}}):r.showError(s,"Error")}finally{c.stopLoading(),c.setLoadingText(u.baseText("genericHelpers.loading"))}}return(s,C)=>{const S=m("n8n-icon"),A=m("n8n-button"),g=m("n8n-tooltip");return P.value?(h(),T("div",{key:0,class:a({[s.$style.sync]:!0,[s.$style.collapsed]:s.isCollapsed,[s.$style.isConnected]:n(p).isEnterpriseSourceControlEnabled}),style:ee({borderLeftColor:n(p).preferences.branchColor}),"data-test-id":"main-sidebar-source-control"},[n(p).preferences.connected&&n(p).preferences.branchName?(h(),T("div",{key:0,class:a(s.$style.connected),"data-test-id":"main-sidebar-source-control-connected"},[b("span",{class:a(s.$style.branchName)},[l(S,{icon:"code-branch"}),E(" "+_(w.value),1)],2),b("div",{class:a({"pt-xs":!s.isCollapsed})},[l(g,{disabled:!s.isCollapsed,"show-after":k.value,placement:"right"},{content:i(()=>[b("div",null,_(n(u).baseText("settings.sourceControl.button.pull")),1)]),default:i(()=>[l(A,{class:a({"mr-2xs":!s.isCollapsed,"mb-2xs":s.isCollapsed&&!n(p).preferences.branchReadOnly}),icon:"arrow-down",type:"tertiary",size:"mini",square:s.isCollapsed,label:s.isCollapsed?"":n(u).baseText("settings.sourceControl.button.pull"),onClick:f},null,8,["class","square","label"])]),_:1},8,["disabled","show-after"]),n(p).preferences.branchReadOnly?$("",!0):(h(),I(g,{key:0,disabled:!s.isCollapsed,"show-after":k.value,placement:"right"},{content:i(()=>[b("div",null,_(n(u).baseText("settings.sourceControl.button.push")),1)]),default:i(()=>[l(A,{square:s.isCollapsed,label:s.isCollapsed?"":n(u).baseText("settings.sourceControl.button.push"),icon:"arrow-up",type:"tertiary",size:"mini",onClick:o},null,8,["square","label"])]),_:1},8,["disabled","show-after"]))],2)],2)):$("",!0)],6)):$("",!0)}}}),mt="_sync_15zv3_1",gt="_isConnected_15zv3_8",bt="_collapsed_15zv3_12",ht="_branchName_15zv3_22",_t="_connected_15zv3_32",ft={sync:mt,isConnected:gt,collapsed:bt,branchName:ht,connected:_t},Ct={$style:ft},St=L(pt,[["__cssModules",Ct]]),vt={key:0,class:"mt-m mb-m"},yt={key:2,class:"mt-m mb-m"},Tt=R({__name:"ProjectNavigation",props:{collapsed:{type:Boolean},planName:{}},setup(e){const t=e,c=W(),d=V(),p=K(),r=ge(),u=O(),y=j(!1),k=j(!1),w=x(()=>({id:"home",label:d.baseText("projects.menu.home"),icon:"home",route:{to:{name:M.HOMEPAGE}}})),P=x(()=>({id:"addProject",label:d.baseText("projects.menu.addProject"),icon:"plus",disabled:!k.value||y.value||!r.canCreateProjects,isLoading:y.value})),o=g=>({id:g.id,label:g.name,route:{to:{name:M.PROJECTS_WORKFLOWS,params:{projectId:g.id}}}}),f=()=>{},s=()=>{},C=async()=>{y.value=!0;try{const g=await r.createProject({name:d.baseText("projects.settings.newProjectName")});await c.push({name:M.PROJECT_SETTINGS,params:{projectId:g.id}}),p.showMessage({title:d.baseText("projects.settings.save.successful.title",{interpolate:{projectName:g.name??""}}),type:"success"})}catch(g){p.showError(g,d.baseText("projects.error.title"))}finally{y.value=!1}},S=x(()=>r.myProjects.filter(g=>g.type==="team").toSorted((g,B)=>!g.name||!B.name?0:g.name>B.name?1:g.name<B.name?-1:0)),A=async()=>{await u.goToUpgrade("rbac","upgrade-rbac")};return te(async()=>{await q(),k.value=!0}),(g,B)=>{const v=m("N8nMenuItem"),N=m("ElMenu"),Q=m("i18n-t"),X=m("N8nTooltip");return h(),T("div",{class:a(g.$style.projects)},[l(N,{collapse:t.collapsed,class:"home"},{default:i(()=>[l(v,{item:w.value,compact:t.collapsed,"handle-select":f,"active-tab":n(r).projectNavActiveId,mode:"tabs","data-test-id":"project-home-menu-item"},null,8,["item","compact","active-tab"])]),_:1},8,["collapse"]),S.value.length||n(r).hasPermissionToCreateProjects&&n(r).teamProjectsAvailable?(h(),T("hr",vt)):$("",!0),S.value.length?(h(),I(N,{key:1,collapse:t.collapsed,class:a(g.$style.projectItems)},{default:i(()=>[(h(!0),T(se,null,oe(S.value,H=>(h(),I(v,{key:H.id,item:o(H),compact:t.collapsed,"handle-select":s,"active-tab":n(r).projectNavActiveId,mode:"tabs","data-test-id":"project-menu-item"},null,8,["item","compact","active-tab"]))),128))]),_:1},8,["collapse","class"])):$("",!0),l(X,{placement:"right",disabled:n(r).canCreateProjects},{content:i(()=>[l(Q,{keypath:"projects.create.limitReached"},{planName:i(()=>[E(_(t.planName),1)]),limit:i(()=>[E(_(n(d).baseText("projects.create.limit",{adjustToNumber:n(r).teamProjectsLimit,interpolate:{num:String(n(r).teamProjectsLimit)}})),1)]),link:i(()=>[b("a",{class:a(g.$style.upgradeLink),href:"#",onClick:A},_(n(d).baseText("projects.create.limitReached.link")),3)]),_:1})]),default:i(()=>[n(r).hasPermissionToCreateProjects&&n(r).teamProjectsAvailable?(h(),I(N,{key:0,collapse:t.collapsed,class:"pl-xs pr-xs"},{default:i(()=>[l(v,{item:P.value,compact:t.collapsed,"handle-select":C,mode:"tabs","data-test-id":"add-project-menu-item"},null,8,["item","compact"])]),_:1},8,["collapse"])):$("",!0)]),_:1},8,["disabled"]),S.value.length||n(r).hasPermissionToCreateProjects&&n(r).teamProjectsAvailable?(h(),T("hr",yt)):$("",!0)],2)}}}),kt="_projects_7ap69_1",xt="_projectItems_7ap69_9",Et="_upgradeLink_7ap69_15",$t={projects:kt,projectItems:xt,upgradeLink:Et},wt={$style:$t},Mt=L(Tt,[["__cssModules",wt],["__scopeId","data-v-94afe4bb"]]),Pt=R({name:"MainSidebar",components:{GiftNotificationIcon:Ue,ExecutionsUsage:Qe,MainSidebarSourceControl:St,BecomeTemplateCreatorCta:dt,ProjectNavigation:Mt},setup(){const e=ke(),{callDebounced:t}=be(),c=W(),d=ae();return{externalHooks:e,callDebounced:t,...he(),...xe(c,d)}},data(){return{basePath:"",fullyExpanded:!1}},computed:{...$e(F,ve,O,Se,Ce,fe,G,Y,J,_e),logoPath(){return this.basePath+(this.isCollapsed?"static/logo/collapsed.svg":this.uiStore.logo)},hasVersionUpdates(){return this.settingsStore.settings.releaseChannel==="stable"&&this.versionsStore.hasVersionUpdates},nextVersions(){return this.versionsStore.nextVersions},isCollapsed(){return this.uiStore.sidebarMenuCollapsed},canUserAccessSettings(){return this.findFirstAccessibleSettingsRoute()!==null},showUserArea(){return z(["authenticated"])},workflowExecution(){return this.workflowsStore.getWorkflowExecution},userMenuItems(){return[{id:"settings",label:this.$locale.baseText("settings")},{id:"logout",label:this.$locale.baseText("auth.signout")}]},mainMenuItems(){const e=[],t=this.findFirstAccessibleSettingsRoute(),c=[{id:"cloud-admin",position:"bottom",label:"Admin Panel",icon:"cloud",available:this.settingsStore.isCloudDeployment&&z(["instanceOwner"])},{id:"templates",icon:"box-open",label:this.$locale.baseText("mainSidebar.templates"),position:"bottom",available:this.settingsStore.isTemplatesEnabled&&this.templatesStore.hasCustomTemplatesHost,route:{to:{name:M.TEMPLATES}}},{id:"templates",icon:"box-open",label:this.$locale.baseText("mainSidebar.templates"),position:"bottom",available:this.settingsStore.isTemplatesEnabled&&!this.templatesStore.hasCustomTemplatesHost,link:{href:this.templatesStore.websiteTemplateRepositoryURL,target:"_blank"}},{id:"variables",icon:"variable",label:this.$locale.baseText("mainSidebar.variables"),customIconSize:"medium",position:"bottom",route:{to:{name:M.VARIABLES}}},{id:"executions",icon:"tasks",label:this.$locale.baseText("mainSidebar.executions"),position:"bottom",route:{to:{name:M.EXECUTIONS}}},{id:"settings",icon:"cog",label:this.$locale.baseText("settings"),position:"bottom",available:this.canUserAccessSettings&&this.usersStore.currentUser!==null,activateOnRouteNames:[M.USERS_SETTINGS,M.API_SETTINGS,M.PERSONAL_SETTINGS],route:{to:t}},{id:"help",icon:"question",label:this.$locale.baseText("mainSidebar.help"),position:"bottom",children:[{id:"quickstart",icon:"video",label:this.$locale.baseText("mainSidebar.helpMenuItems.quickstart"),link:{href:"https://www.youtube.com/watch?v=1MwSoB0gnM4",target:"_blank"}},{id:"docs",icon:"book",label:this.$locale.baseText("mainSidebar.helpMenuItems.documentation"),link:{href:"https://docs.n8n.io?utm_source=n8n_app&utm_medium=app_sidebar",target:"_blank"}},{id:"forum",icon:"users",label:this.$locale.baseText("mainSidebar.helpMenuItems.forum"),link:{href:"https://community.n8n.io?utm_source=n8n_app&utm_medium=app_sidebar",target:"_blank"}},{id:"examples",icon:"graduation-cap",label:this.$locale.baseText("mainSidebar.helpMenuItems.course"),link:{href:"https://www.youtube.com/watch?v=1MwSoB0gnM4",target:"_blank"}},{id:"about",icon:"info",label:this.$locale.baseText("mainSidebar.aboutN8n"),position:"bottom"}]}];return[...e,...c]},userIsTrialing(){return this.cloudPlanStore.userIsTrialing},currentPlanAndUsageData(){const e=this.cloudPlanStore.currentPlanData,t=this.cloudPlanStore.currentUsageData;return!e||!t?null:{...e,usage:t}}},async mounted(){this.basePath=this.rootStore.baseUrl,this.$refs.user&&this.externalHooks.run("mainSidebar.mounted",{userRef:this.$refs.user}),this.$nextTick(()=>{window.innerWidth<900||this.uiStore.isNodeView?this.uiStore.sidebarMenuCollapsed=!0:this.uiStore.sidebarMenuCollapsed=!1,this.fullyExpanded=!this.isCollapsed}),this.becomeTemplateCreatorStore.startMonitoringCta()},created(){window.addEventListener("resize",this.onResize)},beforeUnmount(){this.becomeTemplateCreatorStore.stopMonitoringCta(),window.removeEventListener("resize",this.onResize)},methods:{trackHelpItemClick(e){this.$telemetry.track("User clicked help resource",{type:e,workflow_id:this.workflowsStore.workflowId})},trackTemplatesClick(){var e;this.$telemetry.track("User clicked on templates",{role:(e=this.usersStore.currentUserCloudInfo)==null?void 0:e.role,active_workflow_count:this.workflowsStore.activeWorkflows.length})},async onUserActionToggle(e){switch(e){case"logout":this.onLogout();break;case"settings":this.$router.push({name:M.PERSONAL_SETTINGS});break}},onLogout(){this.$router.push({name:M.SIGNOUT})},toggleCollapse(){this.uiStore.toggleSidebarMenuCollapse(),this.isCollapsed?this.fullyExpanded=!this.isCollapsed:setTimeout(()=>{this.fullyExpanded=!this.isCollapsed},300)},openUpdatesPanel(){this.uiStore.openModal(ye)},async handleSelect(e){switch(e){case"templates":this.settingsStore.isTemplatesEnabled&&!this.templatesStore.hasCustomTemplatesHost&&this.trackTemplatesClick();break;case"about":{this.trackHelpItemClick("about"),this.uiStore.openModal(Te);break}case"cloud-admin":{this.cloudPlanStore.redirectToDashboard();break}case"quickstart":case"docs":case"forum":case"examples":{this.trackHelpItemClick(e);break}}},findFirstAccessibleSettingsRoute(){var c;const e=(c=this.$router.getRoutes().find(d=>d.path==="/settings"))==null?void 0:c.children.map(d=>d.name??"");let t={name:M.USERS_SETTINGS};for(const d of e??[])if(this.canUserAccessRouteByName(d.toString())){t={name:d.toString()};break}return t},onResize(e){this.callDebounced(this.onResizeEnd,{debounceTime:100},e)},async onResizeEnd(e){const t=e.target.outerWidth;await this.checkWidthAndAdjustSidebar(t)},async checkWidthAndAdjustSidebar(e){e<900&&(this.uiStore.sidebarMenuCollapsed=!0,await this.$nextTick(),this.fullyExpanded=!this.isCollapsed)}}}),It="_sideMenu_1qnza_1",At="_logo_1qnza_8",Bt="_sideMenuCollapsed_1qnza_19",Nt="_sideMenuCollapseButton_1qnza_26",Ut="_updates_1qnza_45",Dt="_expanded_1qnza_58",Lt="_userArea_1qnza_65",jt="_userName_1qnza_72",Rt="_userActions_1qnza_86",Ot={sideMenu:It,logo:At,sideMenuCollapsed:Bt,sideMenuCollapseButton:Nt,updates:Ut,expanded:Dt,userArea:Lt,userName:jt,userActions:Rt},zt=["src"],Wt={class:"ml-3xs","data-test-id":"main-sidebar-user-menu"};function Vt(e,t,c,d,p,r){const u=m("n8n-icon"),y=m("ProjectNavigation"),k=m("BecomeTemplateCreatorCta"),w=m("ExecutionsUsage"),P=m("GiftNotificationIcon"),o=m("n8n-text"),f=m("MainSidebarSourceControl"),s=m("n8n-avatar"),C=m("el-dropdown-item"),S=m("el-dropdown-menu"),A=m("el-dropdown"),g=m("n8n-action-dropdown"),B=m("n8n-menu");return h(),T("div",{id:"side-menu",class:a({"side-menu":!0,[e.$style.sideMenu]:!0,[e.$style.sideMenuCollapsed]:e.isCollapsed})},[b("div",{id:"collapse-change-button",class:a(["clickable",e.$style.sideMenuCollapseButton]),onClick:t[0]||(t[0]=(...v)=>e.toggleCollapse&&e.toggleCollapse(...v))},[e.isCollapsed?(h(),I(u,{key:0,icon:"chevron-right",size:"xsmall",class:"ml-5xs"})):(h(),I(u,{key:1,icon:"chevron-left",size:"xsmall",class:"mr-5xs"}))],2),l(B,{items:e.mainMenuItems,collapsed:e.isCollapsed,onSelect:e.handleSelect},ne({header:i(()=>{var v;return[b("div",{class:a(e.$style.logo)},[b("img",{src:e.logoPath,"data-test-id":"n8n-logo",class:a(e.$style.icon),alt:"n8n"},null,10,zt)],2),l(y,{collapsed:e.isCollapsed,"plan-name":(v=e.cloudPlanStore.currentPlanData)==null?void 0:v.displayName},null,8,["collapsed","plan-name"])]}),beforeLowerMenu:i(()=>[e.fullyExpanded&&!e.userIsTrialing?(h(),I(k,{key:0})):$("",!0),e.fullyExpanded&&e.userIsTrialing?(h(),I(w,{key:1,"cloud-plan-data":e.currentPlanAndUsageData},null,8,["cloud-plan-data"])):$("",!0)]),menuSuffix:i(()=>[b("div",null,[e.hasVersionUpdates?(h(),T("div",{key:0,"data-test-id":"version-updates-panel-button",class:a(e.$style.updates),onClick:t[1]||(t[1]=(...v)=>e.openUpdatesPanel&&e.openUpdatesPanel(...v))},[b("div",{class:a(e.$style.giftContainer)},[l(P)],2),l(o,{class:a({"ml-xs":!0,[e.$style.expanded]:e.fullyExpanded}),color:"text-base"},{default:i(()=>[E(_(e.nextVersions.length>99?"99+":e.nextVersions.length)+" update"+_(e.nextVersions.length>1?"s":""),1)]),_:1},8,["class"])],2)):$("",!0),l(f,{"is-collapsed":e.isCollapsed},null,8,["is-collapsed"])])]),_:2},[e.showUserArea?{name:"footer",fn:i(()=>[b("div",{class:a(e.$style.userArea)},[b("div",Wt,[l(A,{disabled:!e.isCollapsed,placement:"right-end",trigger:"click",onCommand:e.onUserActionToggle},{dropdown:i(()=>[l(S,null,{default:i(()=>[l(C,{command:"settings"},{default:i(()=>[E(_(e.$locale.baseText("settings")),1)]),_:1}),l(C,{command:"logout"},{default:i(()=>[E(_(e.$locale.baseText("auth.signout")),1)]),_:1})]),_:1})]),default:i(()=>{var v,N;return[b("div",{class:a({[e.$style.avatar]:!0,clickable:e.isCollapsed})},[l(s,{"first-name":(v=e.usersStore.currentUser)==null?void 0:v.firstName,"last-name":(N=e.usersStore.currentUser)==null?void 0:N.lastName,size:"small"},null,8,["first-name","last-name"])],2)]}),_:1},8,["disabled","onCommand"])]),b("div",{class:a({"ml-2xs":!0,[e.$style.userName]:!0,[e.$style.expanded]:e.fullyExpanded})},[l(o,{size:"small",bold:!0,color:"text-dark"},{default:i(()=>{var v;return[E(_((v=e.usersStore.currentUser)==null?void 0:v.fullName),1)]}),_:1})],2),b("div",{class:a({[e.$style.userActions]:!0,[e.$style.expanded]:e.fullyExpanded})},[l(g,{items:e.userMenuItems,placement:"top-start","data-test-id":"user-menu",onSelect:e.onUserActionToggle},null,8,["items","onSelect"])],2)],2)]),key:"0"}:void 0]),1032,["items","collapsed","onSelect"])],2)}const Ht={$style:Ot},vs=L(Pt,[["render",Vt],["__cssModules",Ht]]);export{vs as default};
2
+ //# sourceMappingURL=MainSidebar-3ee-tTgz.js.map