n8n-editor-ui 1.45.0 → 1.45.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/.turbo/turbo-build.log +75 -75
  2. package/dist/assets/{AuthView-sBgr4ab5.js → AuthView-Bpw90ooz.js} +2 -2
  3. package/dist/assets/{AuthView-sBgr4ab5.js.map → AuthView-Bpw90ooz.js.map} +1 -1
  4. package/dist/assets/{CanvasControls-WQFq3IW7.js → CanvasControls-CQPytmej.js} +2 -2
  5. package/dist/assets/{CanvasControls-WQFq3IW7.js.map → CanvasControls-CQPytmej.js.map} +1 -1
  6. package/dist/assets/{ChangePasswordView-RoWelfJE.js → ChangePasswordView-tMFb4WIn.js} +2 -2
  7. package/dist/assets/{ChangePasswordView-RoWelfJE.js.map → ChangePasswordView-tMFb4WIn.js.map} +1 -1
  8. package/dist/assets/{CollectionParameter-o9-pyF-D.js → CollectionParameter-CwgJAh2M.js} +2 -2
  9. package/dist/assets/CollectionParameter-CwgJAh2M.js.map +1 -0
  10. package/dist/assets/{CredentialsView-loSi714I.js → CredentialsView-lvIyWvdA.js} +2 -2
  11. package/dist/assets/{CredentialsView-loSi714I.js.map → CredentialsView-lvIyWvdA.js.map} +1 -1
  12. package/dist/assets/{ExecutionsFilter-BwFUjELc.js → ExecutionsFilter-BSWo4-vK.js} +2 -2
  13. package/dist/assets/{ExecutionsFilter-BwFUjELc.js.map → ExecutionsFilter-BSWo4-vK.js.map} +1 -1
  14. package/dist/assets/{ExecutionsView-ClvBwy6K.js → ExecutionsView-Bztejjur.js} +2 -2
  15. package/dist/assets/{ExecutionsView-ClvBwy6K.js.map → ExecutionsView-Bztejjur.js.map} +1 -1
  16. package/dist/assets/{ForgotMyPasswordView-Da9ejE05.js → ForgotMyPasswordView-n_x-L3AV.js} +2 -2
  17. package/dist/assets/{ForgotMyPasswordView-Da9ejE05.js.map → ForgotMyPasswordView-n_x-L3AV.js.map} +1 -1
  18. package/dist/assets/{MainHeader-DCqd1GFf.js → MainHeader-P2afzgJI.js} +2 -2
  19. package/dist/assets/{MainHeader-DCqd1GFf.js.map → MainHeader-P2afzgJI.js.map} +1 -1
  20. package/dist/assets/{MainSidebar-D0hPq1hI.js → MainSidebar-CAwsaKp9.js} +2 -2
  21. package/dist/assets/{MainSidebar-D0hPq1hI.js.map → MainSidebar-CAwsaKp9.js.map} +1 -1
  22. package/dist/assets/{NodeCreation-Dv1vHhp7.js → NodeCreation-DHuCOx3T.js} +3 -3
  23. package/dist/assets/{NodeCreation-Dv1vHhp7.js.map → NodeCreation-DHuCOx3T.js.map} +1 -1
  24. package/dist/assets/{NodeCreator-CTyp0oWz.js → NodeCreator-CRVECYnB.js} +2 -2
  25. package/dist/assets/{NodeCreator-CTyp0oWz.js.map → NodeCreator-CRVECYnB.js.map} +1 -1
  26. package/dist/assets/{NodeView-D7js-jl0.js → NodeView-_cMwqhWw.js} +4 -4
  27. package/dist/assets/{NodeView-D7js-jl0.js.map → NodeView-_cMwqhWw.js.map} +1 -1
  28. package/dist/assets/{NodeView.v2-Db0N2ZpD.js → NodeView.v2-B5Hn0oJ1.js} +3 -3
  29. package/dist/assets/{NodeView.v2-Db0N2ZpD.js.map → NodeView.v2-B5Hn0oJ1.js.map} +1 -1
  30. package/dist/assets/{ProjectCardBadge.vue_vue_type_script_setup_true_lang-kI8CSFPH.js → ProjectCardBadge.vue_vue_type_script_setup_true_lang-BzALVLd6.js} +2 -2
  31. package/dist/assets/{ProjectCardBadge.vue_vue_type_script_setup_true_lang-kI8CSFPH.js.map → ProjectCardBadge.vue_vue_type_script_setup_true_lang-BzALVLd6.js.map} +1 -1
  32. package/dist/assets/{ProjectSettings-DV97_QgF.js → ProjectSettings-D3HQdHi6.js} +2 -2
  33. package/dist/assets/{ProjectSettings-DV97_QgF.js.map → ProjectSettings-D3HQdHi6.js.map} +1 -1
  34. package/dist/assets/{ProjectTabs-BiGImjZC.js → ProjectTabs-BjpVZIIc.js} +2 -2
  35. package/dist/assets/{ProjectTabs-BiGImjZC.js.map → ProjectTabs-BjpVZIIc.js.map} +1 -1
  36. package/dist/assets/{PushConnectionTracker-DzVbTLAw.js → PushConnectionTracker-Dt9-l7zj.js} +2 -2
  37. package/dist/assets/{PushConnectionTracker-DzVbTLAw.js.map → PushConnectionTracker-Dt9-l7zj.js.map} +1 -1
  38. package/dist/assets/{ResourcesListLayout-__5Cg0A9.js → ResourcesListLayout-CjzGJ-eS.js} +2 -2
  39. package/dist/assets/{ResourcesListLayout-__5Cg0A9.js.map → ResourcesListLayout-CjzGJ-eS.js.map} +1 -1
  40. package/dist/assets/{RunDataAi-BbEWhRis.js → RunDataAi-D3971Kwm.js} +2 -2
  41. package/dist/assets/{RunDataAi-BbEWhRis.js.map → RunDataAi-D3971Kwm.js.map} +1 -1
  42. package/dist/assets/{RunDataJson-7eRqOET2.js → RunDataJson-BLrjtyKU.js} +3 -3
  43. package/dist/assets/{RunDataJson-7eRqOET2.js.map → RunDataJson-BLrjtyKU.js.map} +1 -1
  44. package/dist/assets/{RunDataJsonActions-MHoSLGDw.js → RunDataJsonActions-CucOcrrR.js} +2 -2
  45. package/dist/assets/{RunDataJsonActions-MHoSLGDw.js.map → RunDataJsonActions-CucOcrrR.js.map} +1 -1
  46. package/dist/assets/{RunDataSchema-C2mrihIi.js → RunDataSchema-B-52gDNr.js} +2 -2
  47. package/dist/assets/{RunDataSchema-C2mrihIi.js.map → RunDataSchema-B-52gDNr.js.map} +1 -1
  48. package/dist/assets/{RunDataSearch-CzdgZA0H.js → RunDataSearch-ZA9rLECQ.js} +2 -2
  49. package/dist/assets/{RunDataSearch-CzdgZA0H.js.map → RunDataSearch-ZA9rLECQ.js.map} +1 -1
  50. package/dist/assets/{RunDataTable-DmxJXvGM.js → RunDataTable-DQx4IB1X.js} +2 -2
  51. package/dist/assets/{RunDataTable-DmxJXvGM.js.map → RunDataTable-DQx4IB1X.js.map} +1 -1
  52. package/dist/assets/{SamlOnboarding-c0vvdXcj.js → SamlOnboarding-DS2hMTul.js} +2 -2
  53. package/dist/assets/{SamlOnboarding-c0vvdXcj.js.map → SamlOnboarding-DS2hMTul.js.map} +1 -1
  54. package/dist/assets/{SettingsApiView-BSPOTc-1.js → SettingsApiView-BEBQwqa4.js} +2 -2
  55. package/dist/assets/{SettingsApiView-BSPOTc-1.js.map → SettingsApiView-BEBQwqa4.js.map} +1 -1
  56. package/dist/assets/{SettingsCommunityNodesView-3uiMscEF.js → SettingsCommunityNodesView-Zb5NN5TR.js} +2 -2
  57. package/dist/assets/{SettingsCommunityNodesView-3uiMscEF.js.map → SettingsCommunityNodesView-Zb5NN5TR.js.map} +1 -1
  58. package/dist/assets/{SettingsExternalSecrets-C5fphQOi.js → SettingsExternalSecrets-BrQz9Rn5.js} +2 -2
  59. package/dist/assets/{SettingsExternalSecrets-C5fphQOi.js.map → SettingsExternalSecrets-BrQz9Rn5.js.map} +1 -1
  60. package/dist/assets/{SettingsFakeDoorView-Df4Rs6o0.js → SettingsFakeDoorView-BEtA0RJZ.js} +2 -2
  61. package/dist/assets/{SettingsFakeDoorView-Df4Rs6o0.js.map → SettingsFakeDoorView-BEtA0RJZ.js.map} +1 -1
  62. package/dist/assets/{SettingsLdapView-C4lLeRwF.js → SettingsLdapView-BCqjlrE9.js} +2 -2
  63. package/dist/assets/{SettingsLdapView-C4lLeRwF.js.map → SettingsLdapView-BCqjlrE9.js.map} +1 -1
  64. package/dist/assets/{SettingsLogStreamingView-bLlhacNh.js → SettingsLogStreamingView-B3vDd25l.js} +2 -2
  65. package/dist/assets/{SettingsLogStreamingView-bLlhacNh.js.map → SettingsLogStreamingView-B3vDd25l.js.map} +1 -1
  66. package/dist/assets/{SettingsPersonalView-BgQQgYy0.js → SettingsPersonalView-BxS-VIeh.js} +2 -2
  67. package/dist/assets/{SettingsPersonalView-BgQQgYy0.js.map → SettingsPersonalView-BxS-VIeh.js.map} +1 -1
  68. package/dist/assets/{SettingsSourceControl-C2BP11mH.js → SettingsSourceControl-BBk56DIZ.js} +2 -2
  69. package/dist/assets/{SettingsSourceControl-C2BP11mH.js.map → SettingsSourceControl-BBk56DIZ.js.map} +1 -1
  70. package/dist/assets/{SettingsSso-CK7JB3Vy.js → SettingsSso-c-njHRi9.js} +2 -2
  71. package/dist/assets/{SettingsSso-CK7JB3Vy.js.map → SettingsSso-c-njHRi9.js.map} +1 -1
  72. package/dist/assets/{SettingsUsageAndPlan-Cwa-TbVs.js → SettingsUsageAndPlan-DEnejDAt.js} +2 -2
  73. package/dist/assets/{SettingsUsageAndPlan-Cwa-TbVs.js.map → SettingsUsageAndPlan-DEnejDAt.js.map} +1 -1
  74. package/dist/assets/{SettingsUsersView-CbWtmro6.js → SettingsUsersView-CGkw80Ef.js} +2 -2
  75. package/dist/assets/{SettingsUsersView-CbWtmro6.js.map → SettingsUsersView-CGkw80Ef.js.map} +1 -1
  76. package/dist/assets/{SettingsView-Big9eFwZ.js → SettingsView-DGukO3mQ.js} +2 -2
  77. package/dist/assets/{SettingsView-Big9eFwZ.js.map → SettingsView-DGukO3mQ.js.map} +1 -1
  78. package/dist/assets/{SetupView-fjlw9brZ.js → SetupView-kY1bAskX.js} +2 -2
  79. package/dist/assets/{SetupView-fjlw9brZ.js.map → SetupView-kY1bAskX.js.map} +1 -1
  80. package/dist/assets/{SetupWorkflowCredentialsButton-Q123cR2R.js → SetupWorkflowCredentialsButton-DkvMQv2u.js} +2 -2
  81. package/dist/assets/{SetupWorkflowCredentialsButton-Q123cR2R.js.map → SetupWorkflowCredentialsButton-DkvMQv2u.js.map} +1 -1
  82. package/dist/assets/{SetupWorkflowFromTemplateView-BcaIdEbq.js → SetupWorkflowFromTemplateView-M7-z0Ko5.js} +2 -2
  83. package/dist/assets/{SetupWorkflowFromTemplateView-BcaIdEbq.js.map → SetupWorkflowFromTemplateView-M7-z0Ko5.js.map} +1 -1
  84. package/dist/assets/{SigninView-BqRZRDIW.js → SigninView-CsK0r98m.js} +2 -2
  85. package/dist/assets/{SigninView-BqRZRDIW.js.map → SigninView-CsK0r98m.js.map} +1 -1
  86. package/dist/assets/{SignoutView-Ds-XMHbB.js → SignoutView-BST1uR2G.js} +2 -2
  87. package/dist/assets/{SignoutView-Ds-XMHbB.js.map → SignoutView-BST1uR2G.js.map} +1 -1
  88. package/dist/assets/{SignupView-Du4cZWtz.js → SignupView-BKYxxBni.js} +2 -2
  89. package/dist/assets/{SignupView-Du4cZWtz.js.map → SignupView-BKYxxBni.js.map} +1 -1
  90. package/dist/assets/{TemplateDetails-DYa2o-Sg.js → TemplateDetails-D0r_U1xF.js} +2 -2
  91. package/dist/assets/{TemplateDetails-DYa2o-Sg.js.map → TemplateDetails-D0r_U1xF.js.map} +1 -1
  92. package/dist/assets/{TemplateList-BMaBMl6x.js → TemplateList-CDA5KNLL.js} +2 -2
  93. package/dist/assets/{TemplateList-BMaBMl6x.js.map → TemplateList-CDA5KNLL.js.map} +1 -1
  94. package/dist/assets/{TemplatesCollectionView-g5_48W2g.js → TemplatesCollectionView-Sd-VkM2v.js} +2 -2
  95. package/dist/assets/{TemplatesCollectionView-g5_48W2g.js.map → TemplatesCollectionView-Sd-VkM2v.js.map} +1 -1
  96. package/dist/assets/{TemplatesSearchView-CUEpPGLS.js → TemplatesSearchView-H6B_YHdj.js} +2 -2
  97. package/dist/assets/{TemplatesSearchView-CUEpPGLS.js.map → TemplatesSearchView-H6B_YHdj.js.map} +1 -1
  98. package/dist/assets/{TemplatesView-Dt7Yj05N.js → TemplatesView-C1e1VOA1.js} +2 -2
  99. package/dist/assets/{TemplatesView-Dt7Yj05N.js.map → TemplatesView-C1e1VOA1.js.map} +1 -1
  100. package/dist/assets/{TemplatesWorkflowView-NUQng_ec.js → TemplatesWorkflowView-EDlr8NNs.js} +2 -2
  101. package/dist/assets/{TemplatesWorkflowView-NUQng_ec.js.map → TemplatesWorkflowView-EDlr8NNs.js.map} +1 -1
  102. package/dist/assets/{VariablesView-CNbX7qiw.js → VariablesView-uUyY5gqA.js} +2 -2
  103. package/dist/assets/{VariablesView-CNbX7qiw.js.map → VariablesView-uUyY5gqA.js.map} +1 -1
  104. package/dist/assets/{WorkerView-6sYjvVRB.js → WorkerView-f9W1Yivk.js} +2 -2
  105. package/dist/assets/{WorkerView-6sYjvVRB.js.map → WorkerView-f9W1Yivk.js.map} +1 -1
  106. package/dist/assets/{WorkflowActivator-BofJdorM.js → WorkflowActivator-Bh0oXchL.js} +2 -2
  107. package/dist/assets/{WorkflowActivator-BofJdorM.js.map → WorkflowActivator-Bh0oXchL.js.map} +1 -1
  108. package/dist/assets/{WorkflowExecutionsInfoAccordion-QgKEaHPH.js → WorkflowExecutionsInfoAccordion-DvgpWxaO.js} +2 -2
  109. package/dist/assets/{WorkflowExecutionsInfoAccordion-QgKEaHPH.js.map → WorkflowExecutionsInfoAccordion-DvgpWxaO.js.map} +1 -1
  110. package/dist/assets/{WorkflowExecutionsLandingPage-C8PoBPw1.js → WorkflowExecutionsLandingPage-DiqNejyi.js} +2 -2
  111. package/dist/assets/{WorkflowExecutionsLandingPage-C8PoBPw1.js.map → WorkflowExecutionsLandingPage-DiqNejyi.js.map} +1 -1
  112. package/dist/assets/{WorkflowExecutionsPreview-DXRMfRl4.js → WorkflowExecutionsPreview-BJqdf9CJ.js} +2 -2
  113. package/dist/assets/{WorkflowExecutionsPreview-DXRMfRl4.js.map → WorkflowExecutionsPreview-BJqdf9CJ.js.map} +1 -1
  114. package/dist/assets/{WorkflowExecutionsView-BFIJLItj.js → WorkflowExecutionsView-CY5alI5S.js} +2 -2
  115. package/dist/assets/{WorkflowExecutionsView-BFIJLItj.js.map → WorkflowExecutionsView-CY5alI5S.js.map} +1 -1
  116. package/dist/assets/{WorkflowHistory-DrJO6HE6.js → WorkflowHistory-BCAvzdJ2.js} +2 -2
  117. package/dist/assets/{WorkflowHistory-DrJO6HE6.js.map → WorkflowHistory-BCAvzdJ2.js.map} +1 -1
  118. package/dist/assets/{WorkflowOnboardingView-CWudc9OX.js → WorkflowOnboardingView-CZaNfPmP.js} +2 -2
  119. package/dist/assets/{WorkflowOnboardingView-CWudc9OX.js.map → WorkflowOnboardingView-CZaNfPmP.js.map} +1 -1
  120. package/dist/assets/{WorkflowPreview-CP6H-zD6.js → WorkflowPreview-CLfcNQ-Q.js} +2 -2
  121. package/dist/assets/{WorkflowPreview-CP6H-zD6.js.map → WorkflowPreview-CLfcNQ-Q.js.map} +1 -1
  122. package/dist/assets/{WorkflowsView-B8hr4JdS.js → WorkflowsView-BMDRVCFf.js} +2 -2
  123. package/dist/assets/{WorkflowsView-B8hr4JdS.js.map → WorkflowsView-BMDRVCFf.js.map} +1 -1
  124. package/dist/assets/{cloud-Nipuweza.js → cloud-D1wkxTEm.js} +2 -2
  125. package/dist/assets/{cloud-Nipuweza.js.map → cloud-D1wkxTEm.js.map} +1 -1
  126. package/dist/assets/{collaboration.store-CeJXF3gO.js → collaboration.store-zz8xH0zY.js} +2 -2
  127. package/dist/assets/{collaboration.store-CeJXF3gO.js.map → collaboration.store-zz8xH0zY.js.map} +1 -1
  128. package/dist/assets/{index-DeNtBxiT.js → index-DEwaaDne.js} +4 -4
  129. package/dist/assets/{index-DeNtBxiT.js.map → index-DEwaaDne.js.map} +1 -1
  130. package/dist/assets/{nodeCreator.store-D1MAzn2w.js → nodeCreator.store-DR3dfsvW.js} +2 -2
  131. package/dist/assets/{nodeCreator.store-D1MAzn2w.js.map → nodeCreator.store-DR3dfsvW.js.map} +1 -1
  132. package/dist/assets/{templateActions-DLB6SLyS.js → templateActions-DTyOnhvj.js} +2 -2
  133. package/dist/assets/{templateActions-DLB6SLyS.js.map → templateActions-DTyOnhvj.js.map} +1 -1
  134. package/dist/assets/{useExecutionDebugging-B_eoI-oc.js → useExecutionDebugging-vMuoV-iO.js} +2 -2
  135. package/dist/assets/{useExecutionDebugging-B_eoI-oc.js.map → useExecutionDebugging-vMuoV-iO.js.map} +1 -1
  136. package/dist/assets/{useExecutionHelpers-BAwOWjv8.js → useExecutionHelpers-C0lzavRV.js} +2 -2
  137. package/dist/assets/{useExecutionHelpers-BAwOWjv8.js.map → useExecutionHelpers-C0lzavRV.js.map} +1 -1
  138. package/dist/assets/{usePushConnection-1-1myIro.js → usePushConnection-3xfZ5wSJ.js} +2 -2
  139. package/dist/assets/{usePushConnection-1-1myIro.js.map → usePushConnection-3xfZ5wSJ.js.map} +1 -1
  140. package/dist/assets/{useViewStacks-D8rg90P0.js → useViewStacks-BSagsijV.js} +2 -2
  141. package/dist/assets/{useViewStacks-D8rg90P0.js.map → useViewStacks-BSagsijV.js.map} +1 -1
  142. package/dist/assets/{useWorkflowActivate-DrsL0BLR.js → useWorkflowActivate-BLjS7M0I.js} +2 -2
  143. package/dist/assets/{useWorkflowActivate-DrsL0BLR.js.map → useWorkflowActivate-BLjS7M0I.js.map} +1 -1
  144. package/dist/index.html +1 -1
  145. package/package.json +1 -1
  146. package/dist/assets/CollectionParameter-o9-pyF-D.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"MainHeader-DCqd1GFf.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/ExpandableInput/ExpandableInputPreview.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 lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n\tname: 'ExpandableInputBase',\n\tprops: ['modelValue', 'placeholder', 'staticSize'],\n\tcomputed: {\n\t\thiddenValue() {\n\t\t\tlet value = (this.modelValue as string).replace(/\\s/g, '.'); // force input to expand on space chars\n\t\t\tif (!value) {\n\t\t\t\t// @ts-ignore\n\t\t\t\tvalue = this.placeholder;\n\t\t\t}\n\n\t\t\treturn `${value}`; // adjust for padding\n\t\t},\n\t},\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=\"input\"\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 lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport ExpandableInputBase from './ExpandableInputBase.vue';\nimport type { PropType } from 'vue';\nimport type { EventBus } from 'n8n-design-system';\n\nexport default defineComponent({\n\tname: 'ExpandableInputEdit',\n\tcomponents: { ExpandableInputBase },\n\tprops: {\n\t\tmodelValue: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tplaceholder: { type: String, required: true },\n\t\tmaxlength: { type: Number },\n\t\tautofocus: { type: Boolean },\n\t\teventBus: {\n\t\t\ttype: Object as PropType<EventBus>,\n\t\t},\n\t},\n\temits: ['update:modelValue', 'enter', 'blur', 'esc'],\n\tmounted() {\n\t\t// autofocus on input element is not reliable\n\t\tif (this.autofocus && this.$refs.input) {\n\t\t\tthis.focus();\n\t\t}\n\t\tthis.eventBus?.on('focus', this.focus);\n\t},\n\tbeforeUnmount() {\n\t\tthis.eventBus?.off('focus', this.focus);\n\t},\n\tmethods: {\n\t\tfocus() {\n\t\t\tif (this.$refs.input) {\n\t\t\t\t(this.$refs.input as HTMLInputElement).focus();\n\t\t\t}\n\t\t},\n\t\tonInput() {\n\t\t\tthis.$emit('update:modelValue', (this.$refs.input as HTMLInputElement).value);\n\t\t},\n\t\tonEnter() {\n\t\t\tthis.$emit('enter', (this.$refs.input as HTMLInputElement).value);\n\t\t},\n\t\tonClickOutside(e: Event) {\n\t\t\tif (e.type === 'click') {\n\t\t\t\tthis.$emit('blur', (this.$refs.input as HTMLInputElement).value);\n\t\t\t}\n\t\t},\n\t\tonEscape() {\n\t\t\tthis.$emit('esc');\n\t\t},\n\t},\n});\n</script>\n","<template>\n\t<ExpandableInputBase :model-value=\"modelValue\" :static-size=\"true\">\n\t\t<input\n\t\t\t:class=\"{ 'el-input__inner': true, clickable: true }\"\n\t\t\t:value=\"modelValue\"\n\t\t\t:disabled=\"true\"\n\t\t\tsize=\"4\"\n\t\t/>\n\t</ExpandableInputBase>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport ExpandableInputBase from './ExpandableInputBase.vue';\n\nexport default defineComponent({\n\tname: 'ExpandableInputPreview',\n\tcomponents: { ExpandableInputBase },\n\tprops: ['modelValue'],\n});\n</script>\n\n<style lang=\"scss\" scoped>\ninput,\ninput:hover {\n\tbackground-color: unset;\n\ttransition: unset;\n\tpointer-events: none; // fix firefox bug\n}\n\ninput[disabled] {\n\tcolor: $custom-font-black;\n\n\t// override safari colors\n\t-webkit-text-fill-color: $custom-font-black;\n\t-webkit-opacity: 1;\n}\n</style>\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\t:placeholder=\"placeholder\"\n\t\t\t\t:model-value=\"newValue\"\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 lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport ExpandableInputEdit from '@/components/ExpandableInput/ExpandableInputEdit.vue';\nimport ExpandableInputPreview from '@/components/ExpandableInput/ExpandableInputPreview.vue';\nimport { createEventBus } from 'n8n-design-system/utils';\n\nexport default defineComponent({\n\tname: 'InlineTextEdit',\n\tcomponents: { ExpandableInputEdit, ExpandableInputPreview },\n\tprops: {\n\t\tisEditEnabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tmodelValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tplaceholder: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tmaxLength: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\t\tpreviewValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisDisabled: this.disabled,\n\t\t\tnewValue: '',\n\t\t\tescPressed: false,\n\t\t\tinputBus: createEventBus(),\n\t\t};\n\t},\n\twatch: {\n\t\tdisabled(value) {\n\t\t\tthis.isDisabled = value;\n\t\t},\n\t},\n\tmethods: {\n\t\tonInput(newValue: string) {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.newValue = newValue;\n\t\t},\n\t\tonClick() {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.newValue = this.modelValue;\n\t\t\tthis.$emit('toggle');\n\t\t},\n\t\tonBlur() {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this.escPressed) {\n\t\t\t\tthis.submit();\n\t\t\t}\n\t\t\tthis.escPressed = false;\n\t\t},\n\t\tsubmit() {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst onSubmit = (updated: boolean) => {\n\t\t\t\tthis.isDisabled = false;\n\n\t\t\t\tif (!updated) {\n\t\t\t\t\tthis.inputBus.emit('focus');\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis.isDisabled = true;\n\t\t\tthis.$emit('submit', { name: this.newValue, onSubmit });\n\t\t},\n\t\tonEscape() {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.escPressed = true;\n\t\t\tthis.$emit('toggle');\n\t\t},\n\t},\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 lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { BREAKPOINT_SM, BREAKPOINT_MD, BREAKPOINT_LG, BREAKPOINT_XL } from '@/constants';\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 */\n\nimport { useUIStore } from '@/stores/ui.store';\nimport { getBannerRowHeight } from '@/utils/htmlUtils';\nimport { useDebounce } from '@/composables/useDebounce';\n\nexport default defineComponent({\n\tname: 'BreakpointsObserver',\n\tprops: ['valueXS', 'valueXL', 'valueLG', 'valueMD', 'valueSM', 'valueDefault'],\n\tsetup() {\n\t\tconst { callDebounced } = useDebounce();\n\t\treturn { callDebounced };\n\t},\n\tdata() {\n\t\treturn {\n\t\t\twidth: window.innerWidth,\n\t\t};\n\t},\n\tcomputed: {\n\t\tbp(): string {\n\t\t\tif (this.width < BREAKPOINT_SM) {\n\t\t\t\treturn 'XS';\n\t\t\t}\n\n\t\t\tif (this.width >= BREAKPOINT_XL) {\n\t\t\t\treturn 'XL';\n\t\t\t}\n\n\t\t\tif (this.width >= BREAKPOINT_LG) {\n\t\t\t\treturn 'LG';\n\t\t\t}\n\n\t\t\tif (this.width >= BREAKPOINT_MD) {\n\t\t\t\treturn 'MD';\n\t\t\t}\n\n\t\t\treturn 'SM';\n\t\t},\n\n\t\tvalue(): number | undefined {\n\t\t\tif (this.valueXS !== undefined && this.width < BREAKPOINT_SM) {\n\t\t\t\treturn this.valueXS;\n\t\t\t}\n\n\t\t\tif (this.valueXL !== undefined && this.width >= BREAKPOINT_XL) {\n\t\t\t\treturn this.valueXL;\n\t\t\t}\n\n\t\t\tif (this.valueLG !== undefined && this.width >= BREAKPOINT_LG) {\n\t\t\t\treturn this.valueLG;\n\t\t\t}\n\n\t\t\tif (this.valueMD !== undefined && this.width >= BREAKPOINT_MD) {\n\t\t\t\treturn this.valueMD;\n\t\t\t}\n\n\t\t\tif (this.valueSM !== undefined) {\n\t\t\t\treturn this.valueSM;\n\t\t\t}\n\n\t\t\treturn this.valueDefault;\n\t\t},\n\t},\n\tcreated() {\n\t\twindow.addEventListener('resize', this.onResize);\n\t},\n\tbeforeUnmount() {\n\t\twindow.removeEventListener('resize', this.onResize);\n\t},\n\tmethods: {\n\t\tonResize() {\n\t\t\tvoid this.callDebounced(this.onResizeEnd, { debounceTime: 50 });\n\t\t},\n\t\tasync onResizeEnd() {\n\t\t\tthis.width = window.innerWidth;\n\t\t\tawait this.$nextTick();\n\n\t\t\tconst bannerHeight = await getBannerRowHeight();\n\t\t\tuseUIStore().updateBannersHeight(bannerHeight);\n\t\t},\n\t},\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/n8nRoot.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 '@/features/projects/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 '@/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';\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();\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\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 settingsStore.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=\"workflow.tags\"\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","<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<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { RouteLocation, RouteLocationRaw } from 'vue-router';\nimport { useRouter } from 'vue-router';\nimport { mapStores } from 'pinia';\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 type { INodeUi, ITabBarItem, IWorkflowDb } from '@/Interface';\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\nexport default defineComponent({\n\tname: 'MainHeader',\n\tcomponents: {\n\t\tWorkflowDetails,\n\t\tTabBar,\n\t},\n\tsetup() {\n\t\tconst router = useRouter();\n\t\tconst pushConnection = usePushConnection({ router });\n\n\t\treturn {\n\t\t\tpushConnection,\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tactiveHeaderTab: MAIN_HEADER_TABS.WORKFLOW,\n\t\t\tworkflowToReturnTo: '',\n\t\t\texecutionToReturnTo: '',\n\t\t\tdirtyState: false,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(\n\t\t\tuseNDVStore,\n\t\t\tuseUIStore,\n\t\t\tuseSourceControlStore,\n\t\t\tuseWorkflowsStore,\n\t\t\tuseExecutionsStore,\n\t\t),\n\t\ttabBarItems(): ITabBarItem[] {\n\t\t\treturn [\n\t\t\t\t{ value: MAIN_HEADER_TABS.WORKFLOW, label: this.$locale.baseText('generic.editor') },\n\t\t\t\t{ value: MAIN_HEADER_TABS.EXECUTIONS, label: this.$locale.baseText('generic.executions') },\n\t\t\t];\n\t\t},\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\thideMenuBar(): boolean {\n\t\t\treturn Boolean(this.activeNode && this.activeNode.type !== STICKY_NODE_TYPE);\n\t\t},\n\t\tworkflow(): IWorkflowDb {\n\t\t\treturn this.workflowsStore.workflow;\n\t\t},\n\t\tcurrentWorkflow(): string {\n\t\t\treturn String(this.$route.params.name || this.workflowsStore.workflowId);\n\t\t},\n\t\tonWorkflowPage(): boolean {\n\t\t\treturn !!(this.$route.meta.nodeView || this.$route.meta.keepWorkflowAlive);\n\t\t},\n\t\treadOnly(): boolean {\n\t\t\treturn this.sourceControlStore.preferences.branchReadOnly;\n\t\t},\n\t},\n\twatch: {\n\t\t$route(to, from) {\n\t\t\tthis.syncTabsWithRoute(to, from);\n\t\t},\n\t},\n\tbeforeMount() {\n\t\tthis.pushConnection.initialize();\n\t},\n\tmounted() {\n\t\tthis.dirtyState = this.uiStore.stateIsDirty;\n\t\tthis.syncTabsWithRoute(this.$route);\n\t},\n\tbeforeUnmount() {\n\t\tthis.pushConnection.terminate();\n\t},\n\tmethods: {\n\t\tsyncTabsWithRoute(to: RouteLocation, from?: RouteLocation): void {\n\t\t\tif (\n\t\t\t\tto.name === VIEWS.EXECUTION_HOME ||\n\t\t\t\tto.name === VIEWS.WORKFLOW_EXECUTIONS ||\n\t\t\t\tto.name === VIEWS.EXECUTION_PREVIEW\n\t\t\t) {\n\t\t\t\tthis.activeHeaderTab = MAIN_HEADER_TABS.EXECUTIONS;\n\t\t\t} else if (\n\t\t\t\tto.name === VIEWS.WORKFLOW ||\n\t\t\t\tto.name === VIEWS.NEW_WORKFLOW ||\n\t\t\t\tto.name === VIEWS.EXECUTION_DEBUG\n\t\t\t) {\n\t\t\t\tthis.activeHeaderTab = MAIN_HEADER_TABS.WORKFLOW;\n\t\t\t}\n\n\t\t\tif (to.params.name !== 'new' && typeof to.params.name === 'string') {\n\t\t\t\tthis.workflowToReturnTo = to.params.name;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tfrom?.name === VIEWS.EXECUTION_PREVIEW &&\n\t\t\t\tto.params.name === from.params.name &&\n\t\t\t\ttypeof from.params.executionId === 'string'\n\t\t\t) {\n\t\t\t\tthis.executionToReturnTo = from.params.executionId;\n\t\t\t}\n\t\t},\n\t\tonTabSelected(tab: MAIN_HEADER_TABS, event: MouseEvent) {\n\t\t\tconst openInNewTab = event.ctrlKey || event.metaKey;\n\n\t\t\tswitch (tab) {\n\t\t\t\tcase MAIN_HEADER_TABS.WORKFLOW:\n\t\t\t\t\tvoid this.navigateToWorkflowView(openInNewTab);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MAIN_HEADER_TABS.EXECUTIONS:\n\t\t\t\t\tvoid this.navigateToExecutionsView(openInNewTab);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\n\t\tasync navigateToWorkflowView(openInNewTab: boolean) {\n\t\t\tlet routeToNavigateTo: RouteLocationRaw;\n\t\t\tif (!['', 'new', PLACEHOLDER_EMPTY_WORKFLOW_ID].includes(this.workflowToReturnTo)) {\n\t\t\t\trouteToNavigateTo = {\n\t\t\t\t\tname: VIEWS.WORKFLOW,\n\t\t\t\t\tparams: { name: this.workflowToReturnTo },\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\trouteToNavigateTo = { name: VIEWS.NEW_WORKFLOW };\n\t\t\t}\n\n\t\t\tif (openInNewTab) {\n\t\t\t\tconst { href } = this.$router.resolve(routeToNavigateTo);\n\t\t\t\twindow.open(href, '_blank');\n\t\t\t} else if (this.$route.name !== routeToNavigateTo.name) {\n\t\t\t\tif (this.$route.name === VIEWS.NEW_WORKFLOW) {\n\t\t\t\t\tthis.uiStore.stateIsDirty = this.dirtyState;\n\t\t\t\t}\n\t\t\t\tthis.activeHeaderTab = MAIN_HEADER_TABS.WORKFLOW;\n\t\t\t\tawait this.$router.push(routeToNavigateTo);\n\t\t\t}\n\t\t},\n\n\t\tasync navigateToExecutionsView(openInNewTab: boolean) {\n\t\t\tconst routeWorkflowId =\n\t\t\t\tthis.currentWorkflow === PLACEHOLDER_EMPTY_WORKFLOW_ID ? 'new' : this.currentWorkflow;\n\t\t\tconst executionToReturnTo =\n\t\t\t\tthis.executionsStore.activeExecution?.id || this.executionToReturnTo;\n\t\t\tconst routeToNavigateTo: RouteLocationRaw = executionToReturnTo\n\t\t\t\t? {\n\t\t\t\t\t\tname: VIEWS.EXECUTION_PREVIEW,\n\t\t\t\t\t\tparams: { name: routeWorkflowId, executionId: executionToReturnTo },\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\tname: VIEWS.EXECUTION_HOME,\n\t\t\t\t\t\tparams: { name: routeWorkflowId },\n\t\t\t\t\t};\n\n\t\t\tif (openInNewTab) {\n\t\t\t\tconst { href } = this.$router.resolve(routeToNavigateTo);\n\t\t\t\twindow.open(href, '_blank');\n\t\t\t} else if (this.$route.name !== routeToNavigateTo.name) {\n\t\t\t\tthis.dirtyState = this.uiStore.stateIsDirty;\n\t\t\t\tthis.workflowToReturnTo = this.currentWorkflow;\n\t\t\t\tthis.activeHeaderTab = MAIN_HEADER_TABS.EXECUTIONS;\n\t\t\t\tawait this.$router.push(routeToNavigateTo);\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\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","_component_IntersectionObserver","_resolveComponent","_createBlock","intersectionEventBus","onObserved","_withCtx","_createElementVNode","_hoisted_1","_Fragment","_renderList","_normalizeClass","e","_component_el_tag","_createTextVNode","_toDisplayString","_component_IntersectionObserved","responsive","_createVNode","_sfc_main$8","value","staticSize","_sfc_main$7","ExpandableInputBase","_a","_directive_on_click_outside","_resolveDirective","_component_ExpandableInputBase","_withDirectives","maxlength","args","_withKeys","_sfc_main$6","modelValue","_sfc_main$5","ExpandableInputEdit","ExpandableInputPreview","newValue","onSubmit","updated","_component_ExpandableInputPreview","isEditEnabled","isDisabled","_withModifiers","_component_ExpandableInputEdit","maxLength","inputBus","onEscape","submit","_sfc_main$4","callDebounced","useDebounce","BREAKPOINT_SM","BREAKPOINT_XL","BREAKPOINT_LG","BREAKPOINT_MD","bannerHeight","getBannerRowHeight","useUIStore","bp","_renderSlot","collaborationStore","useCollaborationStore","usersStore","useUsersStore","workflowsStore","useWorkflowsStore","HEARTBEAT_INTERVAL","TIME","heartbeatTimer","ref","activeUsersSorted","computed","currentWorkflowUsers","userInfo","owner","isUserGlobalOwner","user","currentUserEmail","startHeartbeat","stopHeartbeat","onDocumentVisibilityChange","onMounted","onBeforeUnmount","props","__props","$style","useCssModule","rootStore","useRootStore","canvasStore","useCanvasStore","settingsStore","useSettingsStore","sourceControlStore","useSourceControlStore","tagsStore","uiStore","projectsStore","useProjectsStore","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","watch","getWorkflowId","id","onSaveButtonClick","name","showCreateWorkflowSuccessToast","onShareButtonClick","WORKFLOW_SHARE_MODAL_KEY","onTagsEditEnable","onTagsBlur","current","saved","onTagsEditEsc","onNameToggle","onNameSubmit","newName","handleFileImport","inputRef","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","emit","__emit","onUpdateModelValue","tab","event","_sfc_main","WorkflowDetails","TabBar","usePushConnection","MAIN_HEADER_TABS","useNDVStore","useExecutionsStore","STICKY_NODE_TYPE","to","from","openInNewTab","routeToNavigateTo","href","routeWorkflowId","executionToReturnTo","_component_WorkflowDetails","_component_TabBar","_createCommentVNode","hideMenuBar"],"mappings":"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"}
1
+ {"version":3,"file":"MainHeader-P2afzgJI.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/ExpandableInput/ExpandableInputPreview.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 lang=\"ts\">\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n\tname: 'ExpandableInputBase',\n\tprops: ['modelValue', 'placeholder', 'staticSize'],\n\tcomputed: {\n\t\thiddenValue() {\n\t\t\tlet value = (this.modelValue as string).replace(/\\s/g, '.'); // force input to expand on space chars\n\t\t\tif (!value) {\n\t\t\t\t// @ts-ignore\n\t\t\t\tvalue = this.placeholder;\n\t\t\t}\n\n\t\t\treturn `${value}`; // adjust for padding\n\t\t},\n\t},\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=\"input\"\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 lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport ExpandableInputBase from './ExpandableInputBase.vue';\nimport type { PropType } from 'vue';\nimport type { EventBus } from 'n8n-design-system';\n\nexport default defineComponent({\n\tname: 'ExpandableInputEdit',\n\tcomponents: { ExpandableInputBase },\n\tprops: {\n\t\tmodelValue: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tplaceholder: { type: String, required: true },\n\t\tmaxlength: { type: Number },\n\t\tautofocus: { type: Boolean },\n\t\teventBus: {\n\t\t\ttype: Object as PropType<EventBus>,\n\t\t},\n\t},\n\temits: ['update:modelValue', 'enter', 'blur', 'esc'],\n\tmounted() {\n\t\t// autofocus on input element is not reliable\n\t\tif (this.autofocus && this.$refs.input) {\n\t\t\tthis.focus();\n\t\t}\n\t\tthis.eventBus?.on('focus', this.focus);\n\t},\n\tbeforeUnmount() {\n\t\tthis.eventBus?.off('focus', this.focus);\n\t},\n\tmethods: {\n\t\tfocus() {\n\t\t\tif (this.$refs.input) {\n\t\t\t\t(this.$refs.input as HTMLInputElement).focus();\n\t\t\t}\n\t\t},\n\t\tonInput() {\n\t\t\tthis.$emit('update:modelValue', (this.$refs.input as HTMLInputElement).value);\n\t\t},\n\t\tonEnter() {\n\t\t\tthis.$emit('enter', (this.$refs.input as HTMLInputElement).value);\n\t\t},\n\t\tonClickOutside(e: Event) {\n\t\t\tif (e.type === 'click') {\n\t\t\t\tthis.$emit('blur', (this.$refs.input as HTMLInputElement).value);\n\t\t\t}\n\t\t},\n\t\tonEscape() {\n\t\t\tthis.$emit('esc');\n\t\t},\n\t},\n});\n</script>\n","<template>\n\t<ExpandableInputBase :model-value=\"modelValue\" :static-size=\"true\">\n\t\t<input\n\t\t\t:class=\"{ 'el-input__inner': true, clickable: true }\"\n\t\t\t:value=\"modelValue\"\n\t\t\t:disabled=\"true\"\n\t\t\tsize=\"4\"\n\t\t/>\n\t</ExpandableInputBase>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport ExpandableInputBase from './ExpandableInputBase.vue';\n\nexport default defineComponent({\n\tname: 'ExpandableInputPreview',\n\tcomponents: { ExpandableInputBase },\n\tprops: ['modelValue'],\n});\n</script>\n\n<style lang=\"scss\" scoped>\ninput,\ninput:hover {\n\tbackground-color: unset;\n\ttransition: unset;\n\tpointer-events: none; // fix firefox bug\n}\n\ninput[disabled] {\n\tcolor: $custom-font-black;\n\n\t// override safari colors\n\t-webkit-text-fill-color: $custom-font-black;\n\t-webkit-opacity: 1;\n}\n</style>\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\t:placeholder=\"placeholder\"\n\t\t\t\t:model-value=\"newValue\"\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 lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport ExpandableInputEdit from '@/components/ExpandableInput/ExpandableInputEdit.vue';\nimport ExpandableInputPreview from '@/components/ExpandableInput/ExpandableInputPreview.vue';\nimport { createEventBus } from 'n8n-design-system/utils';\n\nexport default defineComponent({\n\tname: 'InlineTextEdit',\n\tcomponents: { ExpandableInputEdit, ExpandableInputPreview },\n\tprops: {\n\t\tisEditEnabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tmodelValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tplaceholder: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tmaxLength: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\t\tpreviewValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisDisabled: this.disabled,\n\t\t\tnewValue: '',\n\t\t\tescPressed: false,\n\t\t\tinputBus: createEventBus(),\n\t\t};\n\t},\n\twatch: {\n\t\tdisabled(value) {\n\t\t\tthis.isDisabled = value;\n\t\t},\n\t},\n\tmethods: {\n\t\tonInput(newValue: string) {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.newValue = newValue;\n\t\t},\n\t\tonClick() {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.newValue = this.modelValue;\n\t\t\tthis.$emit('toggle');\n\t\t},\n\t\tonBlur() {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this.escPressed) {\n\t\t\t\tthis.submit();\n\t\t\t}\n\t\t\tthis.escPressed = false;\n\t\t},\n\t\tsubmit() {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst onSubmit = (updated: boolean) => {\n\t\t\t\tthis.isDisabled = false;\n\n\t\t\t\tif (!updated) {\n\t\t\t\t\tthis.inputBus.emit('focus');\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis.isDisabled = true;\n\t\t\tthis.$emit('submit', { name: this.newValue, onSubmit });\n\t\t},\n\t\tonEscape() {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.escPressed = true;\n\t\t\tthis.$emit('toggle');\n\t\t},\n\t},\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 lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { BREAKPOINT_SM, BREAKPOINT_MD, BREAKPOINT_LG, BREAKPOINT_XL } from '@/constants';\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 */\n\nimport { useUIStore } from '@/stores/ui.store';\nimport { getBannerRowHeight } from '@/utils/htmlUtils';\nimport { useDebounce } from '@/composables/useDebounce';\n\nexport default defineComponent({\n\tname: 'BreakpointsObserver',\n\tprops: ['valueXS', 'valueXL', 'valueLG', 'valueMD', 'valueSM', 'valueDefault'],\n\tsetup() {\n\t\tconst { callDebounced } = useDebounce();\n\t\treturn { callDebounced };\n\t},\n\tdata() {\n\t\treturn {\n\t\t\twidth: window.innerWidth,\n\t\t};\n\t},\n\tcomputed: {\n\t\tbp(): string {\n\t\t\tif (this.width < BREAKPOINT_SM) {\n\t\t\t\treturn 'XS';\n\t\t\t}\n\n\t\t\tif (this.width >= BREAKPOINT_XL) {\n\t\t\t\treturn 'XL';\n\t\t\t}\n\n\t\t\tif (this.width >= BREAKPOINT_LG) {\n\t\t\t\treturn 'LG';\n\t\t\t}\n\n\t\t\tif (this.width >= BREAKPOINT_MD) {\n\t\t\t\treturn 'MD';\n\t\t\t}\n\n\t\t\treturn 'SM';\n\t\t},\n\n\t\tvalue(): number | undefined {\n\t\t\tif (this.valueXS !== undefined && this.width < BREAKPOINT_SM) {\n\t\t\t\treturn this.valueXS;\n\t\t\t}\n\n\t\t\tif (this.valueXL !== undefined && this.width >= BREAKPOINT_XL) {\n\t\t\t\treturn this.valueXL;\n\t\t\t}\n\n\t\t\tif (this.valueLG !== undefined && this.width >= BREAKPOINT_LG) {\n\t\t\t\treturn this.valueLG;\n\t\t\t}\n\n\t\t\tif (this.valueMD !== undefined && this.width >= BREAKPOINT_MD) {\n\t\t\t\treturn this.valueMD;\n\t\t\t}\n\n\t\t\tif (this.valueSM !== undefined) {\n\t\t\t\treturn this.valueSM;\n\t\t\t}\n\n\t\t\treturn this.valueDefault;\n\t\t},\n\t},\n\tcreated() {\n\t\twindow.addEventListener('resize', this.onResize);\n\t},\n\tbeforeUnmount() {\n\t\twindow.removeEventListener('resize', this.onResize);\n\t},\n\tmethods: {\n\t\tonResize() {\n\t\t\tvoid this.callDebounced(this.onResizeEnd, { debounceTime: 50 });\n\t\t},\n\t\tasync onResizeEnd() {\n\t\t\tthis.width = window.innerWidth;\n\t\t\tawait this.$nextTick();\n\n\t\t\tconst bannerHeight = await getBannerRowHeight();\n\t\t\tuseUIStore().updateBannersHeight(bannerHeight);\n\t\t},\n\t},\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/n8nRoot.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 '@/features/projects/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 '@/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';\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();\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\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 settingsStore.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=\"workflow.tags\"\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","<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<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { RouteLocation, RouteLocationRaw } from 'vue-router';\nimport { useRouter } from 'vue-router';\nimport { mapStores } from 'pinia';\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 type { INodeUi, ITabBarItem, IWorkflowDb } from '@/Interface';\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\nexport default defineComponent({\n\tname: 'MainHeader',\n\tcomponents: {\n\t\tWorkflowDetails,\n\t\tTabBar,\n\t},\n\tsetup() {\n\t\tconst router = useRouter();\n\t\tconst pushConnection = usePushConnection({ router });\n\n\t\treturn {\n\t\t\tpushConnection,\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tactiveHeaderTab: MAIN_HEADER_TABS.WORKFLOW,\n\t\t\tworkflowToReturnTo: '',\n\t\t\texecutionToReturnTo: '',\n\t\t\tdirtyState: false,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(\n\t\t\tuseNDVStore,\n\t\t\tuseUIStore,\n\t\t\tuseSourceControlStore,\n\t\t\tuseWorkflowsStore,\n\t\t\tuseExecutionsStore,\n\t\t),\n\t\ttabBarItems(): ITabBarItem[] {\n\t\t\treturn [\n\t\t\t\t{ value: MAIN_HEADER_TABS.WORKFLOW, label: this.$locale.baseText('generic.editor') },\n\t\t\t\t{ value: MAIN_HEADER_TABS.EXECUTIONS, label: this.$locale.baseText('generic.executions') },\n\t\t\t];\n\t\t},\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\thideMenuBar(): boolean {\n\t\t\treturn Boolean(this.activeNode && this.activeNode.type !== STICKY_NODE_TYPE);\n\t\t},\n\t\tworkflow(): IWorkflowDb {\n\t\t\treturn this.workflowsStore.workflow;\n\t\t},\n\t\tcurrentWorkflow(): string {\n\t\t\treturn String(this.$route.params.name || this.workflowsStore.workflowId);\n\t\t},\n\t\tonWorkflowPage(): boolean {\n\t\t\treturn !!(this.$route.meta.nodeView || this.$route.meta.keepWorkflowAlive);\n\t\t},\n\t\treadOnly(): boolean {\n\t\t\treturn this.sourceControlStore.preferences.branchReadOnly;\n\t\t},\n\t},\n\twatch: {\n\t\t$route(to, from) {\n\t\t\tthis.syncTabsWithRoute(to, from);\n\t\t},\n\t},\n\tbeforeMount() {\n\t\tthis.pushConnection.initialize();\n\t},\n\tmounted() {\n\t\tthis.dirtyState = this.uiStore.stateIsDirty;\n\t\tthis.syncTabsWithRoute(this.$route);\n\t},\n\tbeforeUnmount() {\n\t\tthis.pushConnection.terminate();\n\t},\n\tmethods: {\n\t\tsyncTabsWithRoute(to: RouteLocation, from?: RouteLocation): void {\n\t\t\tif (\n\t\t\t\tto.name === VIEWS.EXECUTION_HOME ||\n\t\t\t\tto.name === VIEWS.WORKFLOW_EXECUTIONS ||\n\t\t\t\tto.name === VIEWS.EXECUTION_PREVIEW\n\t\t\t) {\n\t\t\t\tthis.activeHeaderTab = MAIN_HEADER_TABS.EXECUTIONS;\n\t\t\t} else if (\n\t\t\t\tto.name === VIEWS.WORKFLOW ||\n\t\t\t\tto.name === VIEWS.NEW_WORKFLOW ||\n\t\t\t\tto.name === VIEWS.EXECUTION_DEBUG\n\t\t\t) {\n\t\t\t\tthis.activeHeaderTab = MAIN_HEADER_TABS.WORKFLOW;\n\t\t\t}\n\n\t\t\tif (to.params.name !== 'new' && typeof to.params.name === 'string') {\n\t\t\t\tthis.workflowToReturnTo = to.params.name;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tfrom?.name === VIEWS.EXECUTION_PREVIEW &&\n\t\t\t\tto.params.name === from.params.name &&\n\t\t\t\ttypeof from.params.executionId === 'string'\n\t\t\t) {\n\t\t\t\tthis.executionToReturnTo = from.params.executionId;\n\t\t\t}\n\t\t},\n\t\tonTabSelected(tab: MAIN_HEADER_TABS, event: MouseEvent) {\n\t\t\tconst openInNewTab = event.ctrlKey || event.metaKey;\n\n\t\t\tswitch (tab) {\n\t\t\t\tcase MAIN_HEADER_TABS.WORKFLOW:\n\t\t\t\t\tvoid this.navigateToWorkflowView(openInNewTab);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MAIN_HEADER_TABS.EXECUTIONS:\n\t\t\t\t\tvoid this.navigateToExecutionsView(openInNewTab);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\n\t\tasync navigateToWorkflowView(openInNewTab: boolean) {\n\t\t\tlet routeToNavigateTo: RouteLocationRaw;\n\t\t\tif (!['', 'new', PLACEHOLDER_EMPTY_WORKFLOW_ID].includes(this.workflowToReturnTo)) {\n\t\t\t\trouteToNavigateTo = {\n\t\t\t\t\tname: VIEWS.WORKFLOW,\n\t\t\t\t\tparams: { name: this.workflowToReturnTo },\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\trouteToNavigateTo = { name: VIEWS.NEW_WORKFLOW };\n\t\t\t}\n\n\t\t\tif (openInNewTab) {\n\t\t\t\tconst { href } = this.$router.resolve(routeToNavigateTo);\n\t\t\t\twindow.open(href, '_blank');\n\t\t\t} else if (this.$route.name !== routeToNavigateTo.name) {\n\t\t\t\tif (this.$route.name === VIEWS.NEW_WORKFLOW) {\n\t\t\t\t\tthis.uiStore.stateIsDirty = this.dirtyState;\n\t\t\t\t}\n\t\t\t\tthis.activeHeaderTab = MAIN_HEADER_TABS.WORKFLOW;\n\t\t\t\tawait this.$router.push(routeToNavigateTo);\n\t\t\t}\n\t\t},\n\n\t\tasync navigateToExecutionsView(openInNewTab: boolean) {\n\t\t\tconst routeWorkflowId =\n\t\t\t\tthis.currentWorkflow === PLACEHOLDER_EMPTY_WORKFLOW_ID ? 'new' : this.currentWorkflow;\n\t\t\tconst executionToReturnTo =\n\t\t\t\tthis.executionsStore.activeExecution?.id || this.executionToReturnTo;\n\t\t\tconst routeToNavigateTo: RouteLocationRaw = executionToReturnTo\n\t\t\t\t? {\n\t\t\t\t\t\tname: VIEWS.EXECUTION_PREVIEW,\n\t\t\t\t\t\tparams: { name: routeWorkflowId, executionId: executionToReturnTo },\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\tname: VIEWS.EXECUTION_HOME,\n\t\t\t\t\t\tparams: { name: routeWorkflowId },\n\t\t\t\t\t};\n\n\t\t\tif (openInNewTab) {\n\t\t\t\tconst { href } = this.$router.resolve(routeToNavigateTo);\n\t\t\t\twindow.open(href, '_blank');\n\t\t\t} else if (this.$route.name !== routeToNavigateTo.name) {\n\t\t\t\tthis.dirtyState = this.uiStore.stateIsDirty;\n\t\t\t\tthis.workflowToReturnTo = this.currentWorkflow;\n\t\t\t\tthis.activeHeaderTab = MAIN_HEADER_TABS.EXECUTIONS;\n\t\t\t\tawait this.$router.push(routeToNavigateTo);\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\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","_component_IntersectionObserver","_resolveComponent","_createBlock","intersectionEventBus","onObserved","_withCtx","_createElementVNode","_hoisted_1","_Fragment","_renderList","_normalizeClass","e","_component_el_tag","_createTextVNode","_toDisplayString","_component_IntersectionObserved","responsive","_createVNode","_sfc_main$8","value","staticSize","_sfc_main$7","ExpandableInputBase","_a","_directive_on_click_outside","_resolveDirective","_component_ExpandableInputBase","_withDirectives","maxlength","args","_withKeys","_sfc_main$6","modelValue","_sfc_main$5","ExpandableInputEdit","ExpandableInputPreview","newValue","onSubmit","updated","_component_ExpandableInputPreview","isEditEnabled","isDisabled","_withModifiers","_component_ExpandableInputEdit","maxLength","inputBus","onEscape","submit","_sfc_main$4","callDebounced","useDebounce","BREAKPOINT_SM","BREAKPOINT_XL","BREAKPOINT_LG","BREAKPOINT_MD","bannerHeight","getBannerRowHeight","useUIStore","bp","_renderSlot","collaborationStore","useCollaborationStore","usersStore","useUsersStore","workflowsStore","useWorkflowsStore","HEARTBEAT_INTERVAL","TIME","heartbeatTimer","ref","activeUsersSorted","computed","currentWorkflowUsers","userInfo","owner","isUserGlobalOwner","user","currentUserEmail","startHeartbeat","stopHeartbeat","onDocumentVisibilityChange","onMounted","onBeforeUnmount","props","__props","$style","useCssModule","rootStore","useRootStore","canvasStore","useCanvasStore","settingsStore","useSettingsStore","sourceControlStore","useSourceControlStore","tagsStore","uiStore","projectsStore","useProjectsStore","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","watch","getWorkflowId","id","onSaveButtonClick","name","showCreateWorkflowSuccessToast","onShareButtonClick","WORKFLOW_SHARE_MODAL_KEY","onTagsEditEnable","onTagsBlur","current","saved","onTagsEditEsc","onNameToggle","onNameSubmit","newName","handleFileImport","inputRef","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","emit","__emit","onUpdateModelValue","tab","event","_sfc_main","WorkflowDetails","TabBar","usePushConnection","MAIN_HEADER_TABS","useNDVStore","useExecutionsStore","STICKY_NODE_TYPE","to","from","openInNewTab","routeToNavigateTo","href","routeWorkflowId","executionToReturnTo","_component_WorkflowDetails","_component_TabBar","_createCommentVNode","hideMenuBar"],"mappings":"g6DAUA,MAAMA,GAA8B,GAC9BC,GAAkC,EAExCC,GAAeC,EAAgB,CAC9B,KAAM,cACN,MAAO,CAAC,OAAQ,QAAS,QAAQ,EACjC,SAAU,CACT,eAAwB,CAChB,OAAAC,GACN,KAAK,KACL,KAAK,OAASJ,GACdC,EAAA,CAEF,CACD,CACD,CAAC,uCAxBYI,GAAMC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,CAAG,OAAAC,EAAA,EAAoBC,EAAA,OAAA,CAAA,MAAAP,EAAA,KACxC,eAA6CA,EAAA,MAAA,EAAA,6FCU/CQ,GAAeX,EAAgB,CAC9B,KAAM,uBACN,MAAO,CACN,UAAW,CACV,KAAM,OACN,QAAS,CACV,EACA,QAAS,CACR,KAAM,QACN,QAAS,EACV,EACA,SAAU,CACT,KAAM,OACN,QAAS,IAAMY,EAAe,CAC/B,CACD,EACA,MAAO,CACC,MAAA,CACN,SAAU,IAAA,CAEZ,EACA,SAAU,CACL,GAAA,CAAC,KAAK,QACT,OAGD,MAAMC,EAAU,CACf,KAAM,KAAK,MAAM,KACjB,WAAY,MACZ,UAAW,KAAK,SAAA,EAGXC,EAAW,IAAI,qBAAsBC,GAAY,CACtDA,EAAQ,QAAQ,CAAC,CAAE,OAAAC,EAAQ,eAAAC,KAAqB,CAC/C,KAAK,MAAM,WAAY,CACtB,GAAID,EACJ,eAAAC,CAAA,CACA,CAAA,CACD,GACCJ,CAAO,EAEV,KAAK,SAAWC,EAEhB,KAAK,SAAS,GAAG,UAAYI,GAAsB,CAC9CA,GACHJ,EAAS,QAAQI,CAAQ,CAC1B,CACA,EAED,KAAK,SAAS,GAAG,YAAcA,GAAsB,CACpDJ,EAAS,UAAUI,CAAQ,CAAA,CAC3B,CACF,EACA,eAAgB,CACX,KAAK,SAAW,KAAK,UACxB,KAAK,SAAS,YAEhB,CACD,CAAC,2BApEChB,GAAaC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,mFCUfW,GAAenB,EAAgB,CAC9B,KAAM,uBACN,MAAO,CACN,QAAS,CACR,KAAM,QACN,QAAS,EACV,EACA,SAAU,CACT,KAAM,OACN,QAAS,IAAMY,EAAe,CAC/B,CACD,EACA,MAAM,SAAU,CACV,KAAK,UAIV,MAAM,KAAK,YACX,KAAK,SAAS,KAAK,UAAW,KAAK,MAAM,QAAQ,EAClD,EACA,eAAgB,CACX,KAAK,SACR,KAAK,SAAS,KAAK,YAAa,KAAK,MAAM,QAAQ,CAErD,CACD,CAAC,+BAnCCV,GAAaC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,oFC2DTY,GAAyB,GAQ/BC,GAAerB,EAAgB,CAC9B,KAAM,gBACN,WAAY,CAAA,qBAAEsB,GAAsB,qBAAAC,EAAqB,EACzD,MAAO,CACN,OAAQ,CACP,KAAM,MACN,SAAU,EACX,EACA,MAAO,CACN,KAAM,OACN,QAASH,EACV,EACA,UAAW,QACX,WAAY,QACZ,UAAW,OACZ,EACA,MAAO,CACN,MAAO,IACR,EACA,MAAO,CACC,MAAA,CACN,SAAU,IACV,qBAAsBR,EAAe,EACrC,WAAY,CAAC,EACb,qBAAsB,IAAM,CAAC,CAAA,CAE/B,EACA,SAAU,CACT,GAAGY,GAAUC,EAAY,EACzB,OAAQ,CACA,MAAA,CACN,YAAa,GAAG,KAAK,QAAQ,IAAA,CAE/B,EACA,MAAO,CACN,MAAMC,EAAO,KAAK,OAChB,IAAKC,GAAkB,KAAK,UAAU,WAAWA,CAAK,CAAC,EACvD,OAAO,OAAO,EAEZ,IAAAC,EAAqB,KAAK,MAAQF,EAAK,MAAM,EAAG,KAAK,KAAK,EAAIA,EACtDE,EAAAA,EAAU,IAAKC,IAAe,CACzC,GAAGA,EACH,OAAQ,KAAK,YAAc,CAAC,KAAK,WAAWA,EAAI,EAAE,CACjD,EAAA,EAEF,IAAIC,EAAeF,EAAU,OAQzB,GAPA,KAAK,aACRE,EAAe,OAAO,OAAO,KAAK,UAAU,EAAE,OAC7C,CAACC,EAAMC,IAASA,EAAMD,EAAO,EAAIA,EACjC,CAAA,GAIED,EAAeJ,EAAK,OAAQ,CACzB,MAAAO,EAASP,EAAK,MAAMI,CAAY,EAChCI,EAAcD,EAAO,OAAO,CAACF,EAAcF,IACzCE,EAAO,GAAGA,CAAI,KAAKF,EAAI,IAAI,GAAKA,EAAI,KACzC,EAAE,EAECM,EAAkB,CACvB,GAAI,QACJ,KAAM,IAAIF,EAAO,MAAM,GACvB,MAAOC,EACP,QAAS,EAAA,EAEAN,EAAA,OAAOE,EAAc,EAAGK,CAAQ,CAC3C,CAEO,OAAAP,CACR,CACD,EACA,SAAU,CACT,KAAK,qBAAuBQ,GAAS,KAAK,YAAa,GAAG,CAC3D,EACA,SAAU,CACT,KAAK,YAAY,EACV,OAAA,iBAAiB,SAAU,KAAK,oBAAoB,CAC5D,EACA,eAAgB,CACR,OAAA,oBAAoB,SAAU,KAAK,oBAAoB,CAC/D,EACA,QAAS,CACR,aAAc,CAGb,MAAMC,EAFc,KAAK,MAAM,cACD,IACL,WAErBA,IACH,KAAK,SAAW,EACX,KAAK,UAAU,IAAM,CACzB,KAAK,SAAWA,EAAO,WAAA,CACvB,EAEH,EACA,WAAW,CAAE,GAAAC,EAAI,eAAArB,GAAgE,CAC5EqB,EAAG,QAAQ,KACT,KAAA,WAAa,CAAE,GAAG,KAAK,WAAY,CAACA,EAAG,QAAQ,EAAE,EAAGrB,GAE3D,EACA,QAAQ,EAAeY,EAAY,CAC9B,KAAK,WACR,EAAE,gBAAgB,EAIdA,EAAI,QACH,KAAA,MAAM,QAASA,EAAI,EAAE,CAE5B,CACD,CACD,CAAC,4GArIuBU,EAAAC,EAAA,sBAAA,SA3CrB/B,EAAc,EAAAgC,EAAAF,EAAA,CACf,IAAK,gBACJ,UALH,EAMG,MAAO,iBACP,MAAWG,GAAAA,EAAAA,KAAAA,EACX,QAAUC,EAAAA,WAAAA,YAAAA,EAAAA,qBARb,WAAAxC,EAAA,UAAA,EAAA,CAWG,QAAAyC,EAAA,IAAA,CAAAC,EAAA,OAAAC,GAAA,EAAArC,EAEU,EAAG,EAAAC,EAAAqC,GAAA,KAAAC,GAAA7C,EAAA,KAAA0B,IACNpB,EAAA,IAAmB,OAAO,CAC/B,IAAKoB,EAAA,GAAA,MAAAoB,EAAA,CAAA,UAAA,CAAApB,EAAA,MAAA,CAAA,UAGYqB,GAAA/C,EAAA,QAAA+C,EAAArB,CAAA,CAAA,EAAA,CACNA,EAAA,SAAApB,IAACgC,EAAKU,EAAA,CACjB,IAAI,EACJ,MAAKtB,EAAA,MACL,KAAK,OACJ,KAAA,QAAA,MAAA,kBAvBN,sBAyBmB,EAAA,EAAA,gBAzBnBuB,EAAAC,EAAAxB,EAAA,IAAA,EAAA,CAAA,CAAA,CAAA,OAAA,KA6BkC,CAAA,OAAA,CAAA,IAAApB,EAAA,EAAAgC,EAAAa,EAAA,CAC5B,IAAA,EACA,MAAOL,EAAEM,CAAU,QAAA1B,EAAA,MAAA,CAAA,EACnB,UAASA,EAAEa,GAAAA,QAAAA,EAAAA,WAhCjB,YAkCKvC,EAAA,oBAAA,EAAA,CACO,QAAAyC,EAAM,IAAI,CAAAY,EACXL,EAAM,CACX,MAAKtB,EAAA,KACJ,KAAK,OACL,KAAA,QAAA,MAAAoB,EAAA,CAAA,UAAA9C,EAAA,SAAA,CAAA,EAvCP,sBAyCoB,EAAA,EAAA,gBAzCpBiD,EAAAC,EAAAxB,EAAA,IAAA,EAAA,CAAA,CAAA,CAAA,KAAA,EAAA,KAAA,CAAA,QAAA,OAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,EAAA,KAAA,CAAA,QAAA,UAAA,UAAA,WAAA,CAAA,kBAAA,CAAA,CAAA,CAAA,sHCUA4B,GAAezD,EAAgB,CAC9B,KAAM,sBACN,MAAO,CAAC,aAAc,cAAe,YAAY,EACjD,SAAU,CACT,aAAc,CACb,IAAI0D,EAAS,KAAK,WAAsB,QAAQ,MAAO,GAAG,EAC1D,OAAKA,IAEJA,EAAQ,KAAK,aAGP,GAAGA,CAAK,EAChB,CACD,CACD,CAAC,oBAtBW,SAAAxD,GAFZC,EAEiDwD,EAAAA,EAAAA,EAAAA,EAAAA,EAAAA,CAAe,OAAAlD,EAAA,EAAuBC,EAAA,MAAA,CAAA,MAAAuC,EAAA,CAAA,WAAA,GAAA,cAAA9C,EAAA,WAAA,EACrF,aAAaA,EAAA,WAAA,EAAA,2GCoBfyD,GAAe5D,EAAgB,CAC9B,KAAM,sBACN,WAAY,CAAE,oBAAA6D,EAAoB,EAClC,MAAO,CACN,WAAY,CACX,KAAM,OACN,SAAU,EACX,EACA,YAAa,CAAE,KAAM,OAAQ,SAAU,EAAK,EAC5C,UAAW,CAAE,KAAM,MAAO,EAC1B,UAAW,CAAE,KAAM,OAAQ,EAC3B,SAAU,CACT,KAAM,MACP,CACD,EACA,MAAO,CAAC,oBAAqB,QAAS,OAAQ,KAAK,EACnD,SAAU,OAEL,KAAK,WAAa,KAAK,MAAM,OAChC,KAAK,MAAM,GAEZC,EAAA,KAAK,WAAL,MAAAA,EAAe,GAAG,QAAS,KAAK,MACjC,EACA,eAAgB,QACfA,EAAA,KAAK,WAAL,MAAAA,EAAe,IAAI,QAAS,KAAK,MAClC,EACA,QAAS,CACR,OAAQ,CACH,KAAK,MAAM,OACb,KAAK,MAAM,MAA2B,OAEzC,EACA,SAAU,CACT,KAAK,MAAM,oBAAsB,KAAK,MAAM,MAA2B,KAAK,CAC7E,EACA,SAAU,CACT,KAAK,MAAM,QAAU,KAAK,MAAM,MAA2B,KAAK,CACjE,EACA,eAAe,EAAU,CACpB,EAAE,OAAS,SACd,KAAK,MAAM,OAAS,KAAK,MAAM,MAA2B,KAAK,CAEjE,EACA,UAAW,CACV,KAAK,MAAM,KAAK,CACjB,CACD,CACD,CAAC,mGAxDsBC,EAAAC,GAAA,kBAAA,EAb0B,OAAAvD,EAAA,EAAwBgC,EAAAwB,EAAA,CAAA,cAAA9D,EAAA,WADzE,YAEEA,EAAA,WAAA,EAAA,SACKyC,EAAO,IAAA,CAAAsB,GAELrB,EAAiB,QAAA,CACtB,IAAK,QACL,MAAA,kBACA,MAAWsB,EAAAA,WACZ,YAAQhE,EAAA,YACP,UAAKA,EAAA,UACL,KAAA,IAAA,QAAAC,EAAA,CAAA,IAAAA,EAXJ,CAWmB,EAAA,IAAAgE,IAAAjE,EAAA,SAAAA,EAAA,QAAA,GAAAiE,CAAA,GAAA,UAAA,+DAXnBhE,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAiE,GAAA,IAAAD,IAAAjE,EAAA,UAAAA,EAAA,SAAA,GAAAiE,CAAA,EAAA,CAAA,KAAA,CAAA,EAAA,oCAAA,CAAA,CAAA,CAAA,uECeAE,GAAetE,EAAgB,CAC9B,KAAM,yBACN,WAAY,CAAE,oBAAA6D,EAAoB,EAClC,MAAO,CAAC,YAAY,CACrB,CAAC,wCAXsB,MAAAI,EAAAzB,EAAA,qBAAA,EAP0B,OAAA/B,EAAA,EAAiBgC,EAAAwB,EAAA,CAAA,cAAA9D,EAAA,WADlE,cAAA,EAAA,EAAA,SAGSyC,EAHT,IAAA,CAAAC,EAIW0B,QAAU,CACjB,MAActB,EAAA,CAAA,kBAAA,GAAA,UAAA,GAAA,EACf,MAAK9C,EAAG,WANX,SAAA,GAAA,KAAA,GAAA,EAAA,KAAA,EAAA2C,EAAA,CAAA,CAAA,yFC4BA0B,GAAexE,EAAgB,CAC9B,KAAM,iBACN,WAAY,CAAE,oBAAAyE,GAAqB,uBAAAC,EAAuB,EAC1D,MAAO,CACN,cAAe,CACd,KAAM,QACN,QAAS,EACV,EACA,WAAY,CACX,KAAM,OACN,QAAS,EACV,EACA,YAAa,CACZ,KAAM,OACN,QAAS,EACV,EACA,UAAW,CACV,KAAM,OACN,QAAS,CACV,EACA,aAAc,CACb,KAAM,OACN,QAAS,EACV,EACA,SAAU,CACT,KAAM,QACN,QAAS,EACV,CACD,EACA,MAAO,CACC,MAAA,CACN,WAAY,KAAK,SACjB,SAAU,GACV,WAAY,GACZ,SAAU9D,EAAe,CAAA,CAE3B,EACA,MAAO,CACN,SAAS8C,EAAO,CACf,KAAK,WAAaA,CACnB,CACD,EACA,QAAS,CACR,QAAQiB,EAAkB,CACrB,KAAK,WAIT,KAAK,SAAWA,EACjB,EACA,SAAU,CACL,KAAK,WAIT,KAAK,SAAW,KAAK,WACrB,KAAK,MAAM,QAAQ,EACpB,EACA,QAAS,CACJ,KAAK,WAIJ,KAAK,YACT,KAAK,OAAO,EAEb,KAAK,WAAa,GACnB,EACA,QAAS,CACR,GAAI,KAAK,SACR,OAGK,MAAAC,EAAYC,GAAqB,CACtC,KAAK,WAAa,GAEbA,GACC,KAAA,SAAS,KAAK,OAAO,CAC3B,EAGD,KAAK,WAAa,GAClB,KAAK,MAAM,SAAU,CAAE,KAAM,KAAK,SAAU,SAAAD,EAAU,CACvD,EACA,UAAW,CACN,KAAK,WAIT,KAAK,WAAa,GAClB,KAAK,MAAM,QAAQ,EACpB,CACD,CACD,CAAC,uEAtGOE,EAAAtC,EAAA,wBAAA,EAlBoB,OAAA/B,EAAA,EAD5BC,EAAA,OAAA,CAAA,MAAA,cAEcqE,UAAAA,EAAAA,CAAa,IAAKC,EAAU,CAAA,EAAAC,GAAA,IAAA,CAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,GACvC,eAUE,CAAA9E,EAAA,YAAAM,IATWC,EAAa,OAAAoC,GAAA,CAAAU,EACxB0B,EAAqB,CACrB,YAAWC,EAAAA,YACX,cAAehF,EAAA,SACf,UAASA,EAAEiF,UACX,UAAA,GACA,YAAKC,EAAAA,SACL,sBAAYlF,EAAA,QACZ,MAAKA,EAAEmF,SAAAA,OAAAA,EAAAA,iCAIV,cAEO,cAAA,YAAA,YAAA,sBAAA,QAAA,SAAA,SAAA,CAAA,CAAA,CAAA,IAAA7E,EAAA,EAFqBC,EAAA,OAAA,CAAE,IAAA,EAAA,MAAA,UAC7B,QAAoEN,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,IAAAgE,IAAAjE,EAAA,SAAAA,EAAA,QAAA,GAAAiE,CAAA,EAAA,EAAA,iJCMvEmB,GAAevF,EAAgB,CAC9B,KAAM,sBACN,MAAO,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,cAAc,EAC7E,OAAQ,CACD,KAAA,CAAE,cAAAwF,GAAkBC,KAC1B,MAAO,CAAE,cAAAD,CAAc,CACxB,EACA,MAAO,CACC,MAAA,CACN,MAAO,OAAO,UAAA,CAEhB,EACA,SAAU,CACT,IAAa,CACR,OAAA,KAAK,MAAQE,GACT,KAGJ,KAAK,OAASC,GACV,KAGJ,KAAK,OAASC,GACV,KAGJ,KAAK,OAASC,GACV,KAGD,IACR,EAEA,OAA4B,CAC3B,OAAI,KAAK,UAAY,QAAa,KAAK,MAAQH,GACvC,KAAK,QAGT,KAAK,UAAY,QAAa,KAAK,OAASC,GACxC,KAAK,QAGT,KAAK,UAAY,QAAa,KAAK,OAASC,GACxC,KAAK,QAGT,KAAK,UAAY,QAAa,KAAK,OAASC,GACxC,KAAK,QAGT,KAAK,UAAY,OACb,KAAK,QAGN,KAAK,YACb,CACD,EACA,SAAU,CACF,OAAA,iBAAiB,SAAU,KAAK,QAAQ,CAChD,EACA,eAAgB,CACR,OAAA,oBAAoB,SAAU,KAAK,QAAQ,CACnD,EACA,QAAS,CACR,UAAW,CACL,KAAK,cAAc,KAAK,YAAa,CAAE,aAAc,GAAI,CAC/D,EACA,MAAM,aAAc,CACnB,KAAK,MAAQ,OAAO,WACpB,MAAM,KAAK,YAEL,MAAAC,EAAe,MAAMC,KAChBC,GAAA,EAAE,oBAAoBF,CAAY,CAC9C,CACD,CACD,CAAC,WAhGC5F,GAAgCC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,QAArByF,EAAE,EAAAvF,EAAA,OAAA,KAAA,CAAAwF,EAAUxC,EAAK,OAAA,UAAA,CAAA,GAAAvD,EAAA,8FCM9B,MAAMgG,EAAqBC,KACrBC,EAAaC,KACbC,EAAiBC,KAEjBC,EAAqB,EAAIC,GAAK,OAC9BC,EAAiBC,EAAmB,IAAI,EAExCC,EAAoBC,EAAS,IAAM,CACxC,MAAMC,GAAwBZ,EAAmB,4BAA8B,CAAI,GAAA,IACjFa,GAAaA,EAAS,IAAA,EAElBC,EAAQF,EAAqB,KAAKG,EAAiB,EAClD,MAAA,CACN,aAAcD,EACX,CAACA,EAAO,GAAGF,EAAqB,OAAQI,GAASA,EAAK,KAAOF,EAAM,EAAE,CAAC,EACtEF,CAAA,CACJ,CACA,EAEKK,EAAmBN,EAAS,IAAM,OACvC,OAAOhD,EAAAuC,EAAW,cAAX,YAAAvC,EAAwB,KAAA,CAC/B,EAEKuD,EAAiB,IAAM,CACxBV,EAAe,QAAU,OAC5B,cAAcA,EAAe,KAAK,EAClCA,EAAe,MAAQ,MAETA,EAAA,MAAQ,OAAO,YAAY,IAAM,CAC5BR,EAAA,qBAAqBI,EAAe,SAAS,EAAE,GAChEE,CAAkB,CAAA,EAGhBa,EAAgB,IAAM,CACvBX,EAAe,QAAU,MAC5B,cAAcA,EAAe,KAAK,CACnC,EAGKY,EAA6B,IAAM,CACpC,SAAS,kBAAoB,SAClBD,IAECD,GAChB,EAGD,OAAAG,GAAU,IAAM,CACfrB,EAAmB,WAAW,EACfkB,IACN,SAAA,iBAAiB,mBAAoBE,CAA0B,CAAA,CACxE,EAEDE,GAAgB,IAAM,CACZ,SAAA,oBAAoB,mBAAoBF,CAA0B,EAC7DD,IACdnB,EAAmB,UAAU,CAAA,CAC7B,8gBCPD,MAAMuB,EAAQC,EAKRC,EAASC,KAETC,EAAYC,KACZC,EAAcC,KACdC,EAAgBC,KAChBC,EAAqBC,KACrBC,EAAY7G,KACZ8G,EAAUvC,KACVK,EAAaC,KACbC,EAAiBC,KACjBgC,EAAgBC,KAEhBC,EAASC,KACTC,EAAQC,KAERC,EAASC,KACTC,EAAYC,KACZC,GAAUC,KACVC,EAAQC,KACRC,GAAcC,KACdC,EAAkBC,GAAmB,CAAE,OAAAf,CAAQ,CAAA,EAE/CgB,EAAoB9C,EAAI,EAAK,EAC7B+C,EAAoB/C,EAAI,EAAK,EAC7BgD,EAAgBhD,EAAc,CAAA,CAAE,EAChCiD,EAAajD,EAAI,EAAK,EACtBkD,EAAgBlD,IAEhBmD,GAAenJ,IACfoJ,GAA6BpJ,IAE7BqJ,GAAa,CAACC,EAAgBC,IAAmB,CAClD,GAAAD,EAAK,SAAWC,EAAK,OACjB,MAAA,GAGF,MAAAC,EAAM,IAAI,IAAIF,CAAI,EACjB,OAAAC,EAAK,OAAO,CAACE,EAAKrI,IAAQqI,GAAO,CAACD,EAAI,IAAIpI,CAAG,EAAG,EAAK,CAAA,EAGvDsI,EAAgBxD,EAAS,IAE7B,CAACY,EAAM,SAAS,IAChBA,EAAM,SAAS,KAAO6C,GACtB7C,EAAM,SAAS,KAAO,KAEvB,EAEK8C,GAAmB1D,EAAS,IAC1ByB,EAAQ,eAAe,gBAAgB,CAC9C,EAEKkC,EAAiB3D,EAAS,IACxB8B,EAAM,OAASA,EAAM,KAAK,UAAYA,EAAM,KAAK,oBAAsB,GAC9E,EAEK8B,GAAkB5D,EAAS,IACzB,CACN6D,EAAM,eAAe,SAAS,EAC9BA,EAAM,oBAAoB,SAAS,EACnCA,EAAM,iBACL,EAAA,SAAU/B,EAAM,MAAmB,EAAE,CACvC,EAEKgC,GAAsB9D,EAAwC,IAC5D+D,GAAuBtE,EAAe,gBAAgBmB,EAAM,SAAS,EAAE,CAAC,CAC/E,EAEKoD,GAAoBhE,EAA+B,IAAM,CAC9D,MAAMiE,EAAgC,CACrC,CACC,GAAIC,EAAsB,SAC1B,MAAOlC,EAAO,SAAS,sBAAsB,EAC7C,SAAU,CAAC2B,EAAe,KAC3B,CAAA,EAGG,OAAC/C,EAAM,WACVqD,EAAQ,QAAQ,CACf,GAAIC,EAAsB,UAC1B,MAAOlC,EAAO,SAAS,uBAAuB,EAC9C,SAAU,CAAC2B,EAAe,OAAS,CAAC/C,EAAM,SAAS,EAAA,CACnD,EAEOqD,EAAA,KACP,CACC,GAAIC,EAAsB,gBAC1B,MAAOlC,EAAO,SAAS,2BAA2B,EAClD,SAAU,CAAC2B,EAAe,OAASC,GAAgB,KACpD,EACA,CACC,GAAIM,EAAsB,iBAC1B,MAAOlC,EAAO,SAAS,4BAA4B,EACnD,SAAU,CAAC2B,EAAe,OAASC,GAAgB,KACpD,CAAA,GAIEO,GAAc,CAAC,MAAM,EAAG,CAAE,KAAM,CAAE,MAAO,oBAAuB,CAAA,CAAC,GACpEF,EAAQ,KAAK,CACZ,GAAIC,EAAsB,KAC1B,MAAOlC,EAAO,SAAS,kBAAkB,EACzC,SACC,CAACV,EAAmB,kCACpB,CAACqC,EAAe,OAChBC,GAAgB,OAChBtC,EAAmB,YAAY,cAAA,CAChC,EAGF2C,EAAQ,KAAK,CACZ,GAAIC,EAAsB,SAC1B,MAAOlC,EAAO,SAAS,kBAAkB,EACzC,SAAU,CAAC2B,EAAe,OAASH,EAAc,KAAA,CACjD,GAEIM,GAAoB,MAAM,QAAU,CAAClD,EAAM,UAAa4C,EAAc,QAC1ES,EAAQ,KAAK,CACZ,GAAIC,EAAsB,OAC1B,MAAOlC,EAAO,SAAS,oBAAoB,EAC3C,SAAU,CAAC2B,EAAe,OAASH,EAAc,MACjD,YAAa1C,EAAO,WACpB,QAAS,EAAA,CACT,EAGKmD,CAAA,CACP,EAEKG,GAAkCpE,EAAS,IACzCoB,EAAc,2BAA2BiD,GAAyB,eAAe,CACxF,EAEKC,GAAuBtE,EAA2D,KAChF,CACN,KAAM6D,EAAM,iBACZ,OAAQ,CACP,WAAYjD,EAAM,SAAS,EAC5B,CAAA,EAED,EAEK2D,GAAkCvE,EAAS,IACzCwD,EAAc,KACrB,EAEDgB,GACC,IAAM5D,EAAM,SAAS,GACrB,IAAM,CACLgC,EAAkB,MAAQ,GAC1BC,EAAkB,MAAQ,EAC3B,CAAA,EAGD,SAAS4B,IAAoC,CAC5C,IAAIC,EACA,OAAA9D,EAAM,SAAS,KAAO6C,EACzBiB,EAAK9D,EAAM,SAAS,GACVkB,EAAM,OAAO,MAAQA,EAAM,OAAO,OAAS,QACrD4C,EAAK5C,EAAM,OAAO,MAGZ4C,CACR,CAEA,eAAeC,IAAoB,CAElC,GAAIjB,GAAiB,MACpB,OAGD,MAAMgB,EAAKD,KAELG,EAAOhE,EAAM,SAAS,KACtBhG,EAAOgG,EAAM,SAAS,KAEd,MAAM8B,EAAgB,oBAAoB,CACvD,GAAAgC,EACA,KAAAE,EACA,KAAAhK,CAAA,CACA,IAGAiK,GAA+BH,CAAE,EAEjC,MAAMtD,EAAc,mBAEhBU,EAAM,OAAS+B,EAAM,iBACxB,MAAMjC,EAAO,QAAQ,CACpB,KAAMiC,EAAM,SACZ,OAAQ,CAAE,KAAMjD,EAAM,SAAS,EAAG,CAAA,CAClC,EAGJ,CAEA,SAASkE,IAAqB,OAC7BrD,EAAQ,kBAAkB,CACzB,KAAMsD,GACN,KAAM,CAAE,GAAInE,EAAM,SAAS,EAAG,CAAA,CAC9B,EAEDsB,EAAU,MAAM,4BAA6B,CAC5C,YAAatB,EAAM,SAAS,GAC5B,gBAAgB5D,EAAAuC,EAAW,cAAX,YAAAvC,EAAwB,GACxC,SAAU8E,EAAM,OAAS+B,EAAM,UAAY,oBAAsB,iBAAA,CACjE,CACF,CAEA,SAASmB,IAAmB,CAC3BlC,EAAc,MAASlC,EAAM,SAAS,MAAQ,CAAA,EAC9CgC,EAAkB,MAAQ,GAE1B,WAAW,IAAM,CAEhBC,EAAkB,MAAQ,GAC1BI,GAAa,KAAK,OAAO,GACvB,CAAC,CACL,CAEA,eAAegC,IAAa,CAC3B,MAAMC,EAAWtE,EAAM,SAAS,MAAQ,CAAA,EAClChG,EAAOkI,EAAc,MAC3B,GAAI,CAACK,GAAW+B,EAAStK,CAAI,EAAG,CAC/BgI,EAAkB,MAAQ,GAE1B,MACD,CACA,GAAIG,EAAW,MACd,OAEDA,EAAW,MAAQ,GAEnB,MAAMoC,EAAQ,MAAMzC,EAAgB,oBAAoB,CAAE,KAAA9H,CAAM,CAAA,EAChEsH,EAAU,MAAM,4BAA6B,CAC5C,YAAatB,EAAM,SAAS,GAC5B,cAAehG,EAAK,MAAA,CACpB,EAEDmI,EAAW,MAAQ,GACfoC,IACHvC,EAAkB,MAAQ,GAE5B,CAEA,SAASwC,IAAgB,CACxBxC,EAAkB,MAAQ,EAC3B,CAEA,SAASyC,IAAe,CACLxC,EAAA,MAAQ,CAACA,EAAkB,MACzCA,EAAkB,QACjBD,EAAkB,OAChBqC,GAAW,EAGjBrC,EAAkB,MAAQ,GAE5B,CAEA,eAAe0C,GAAa,CAC3B,KAAAV,EACA,SAAA9G,CAAA,EAIE,CACI,MAAAyH,EAAUX,EAAK,OACrB,GAAI,CAACW,EAAS,CACbjD,EAAM,YAAY,CACjB,MAAON,EAAO,SAAS,mCAAmC,EAC1D,QAASA,EAAO,SAAS,qCAAqC,EAC9D,KAAM,OAAA,CACN,EAEDlE,EAAS,EAAK,EACd,MACD,CAEI,GAAAyH,IAAY3E,EAAM,SAAS,KAAM,CACpCiC,EAAkB,MAAQ,GAE1B/E,EAAS,EAAI,EACb,MACD,CAEA2D,EAAQ,gBAAgB,gBAAgB,EACxC,MAAMiD,EAAKD,KACLU,EAAQ,MAAMzC,EAAgB,oBAAoB,CAAE,KAAAkC,CAAM,CAAA,EAC5DO,IACHtC,EAAkB,MAAQ,GAC1BgC,GAA+BH,CAAE,GAElCjD,EAAQ,mBAAmB,gBAAgB,EAC3C3D,EAASqH,CAAK,CACf,CAEA,eAAeK,IAAkC,CAChD,MAAMC,EAAWzC,EAAc,MAC/B,GAAIyC,GAAA,MAAAA,EAAU,OAASA,EAAS,MAAM,SAAW,EAAG,CAC7C,MAAAC,EAAS,IAAI,WACnBA,EAAO,OAAS,IAAM,CACjB,IAAAC,EACA,GAAA,CACYA,EAAA,KAAK,MAAMD,EAAO,MAAgB,OAClC,CACfpD,EAAM,YAAY,CACjB,MAAON,EAAO,SAAS,gDAAgD,EACvE,QAASA,EAAO,SAAS,kDAAkD,EAC3E,KAAM,OAAA,CACN,EACD,MAAA,QACC,CACD0D,EAAO,OAAS,KAChBD,EAAS,MAAQ,EAClB,CAEAG,GAAiB,KAAK,qBAAsB,CAAE,KAAMD,CAAc,CAAA,CAAA,EAEnED,EAAO,WAAWD,EAAS,MAAM,CAAC,CAAC,CACpC,CACD,CAEA,eAAeI,GAAqBC,EAA8C,OACjF,OAAQA,EAAQ,CACf,KAAK5B,EAAsB,UAAW,CACrCzC,EAAQ,kBAAkB,CACzB,KAAMsE,GACN,KAAM,CACL,GAAInF,EAAM,SAAS,GACnB,KAAMA,EAAM,SAAS,KACrB,KAAMA,EAAM,SAAS,IACtB,CAAA,CACA,EACD,KACD,CACA,KAAKsD,EAAsB,SAAU,CAC9B,MAAAyB,EAAe,MAAMjD,EAAgB,wBACrC,CAAE,KAAA9H,EAAM,GAAGoL,CAAA,EAASL,EACpBM,GAA+B,CACpC,GAAGD,EACH,KAAM,CACL,GAAIpF,EAAM,SAAS,MAAQ,CAAC,EAC5B,WAAYI,EAAU,UACvB,EACA,MAAOpG,GAAQ,CAAI,GAAA,IAAKC,IAAU,CACjC,KAAM,CAAE,WAAAqL,EAAY,GAAGnL,IAAQyG,EAAU,WAAW3G,EAAK,EAElD,OAAAE,EAAA,CACP,CAAA,EAGIoL,GAAO,IAAI,KAAK,CAAC,KAAK,UAAUF,GAAY,KAAM,CAAC,CAAC,EAAG,CAC5D,KAAM,gCAAA,CACN,EAEG,IAAArB,EAAOhE,EAAM,SAAS,MAAQ,mBAC3BgE,EAAAA,EAAK,QAAQ,cAAe,GAAG,EAEtC1C,EAAU,MAAM,yBAA0B,CAAE,YAAayD,EAAa,GAAI,EACnES,GAAAA,OAAAD,GAAMvB,EAAO,OAAO,EAC3B,KACD,CACA,KAAKV,EAAsB,gBAAiB,CACvC,GAAA,CACG,MAAAmC,EAAiB,MAAMjE,GAAQ,OACpCJ,EAAO,SAAS,gCAAgC,EAAI,IACpDA,EAAO,SAAS,0CAA0C,EAAI,IAC9D,CACC,kBAAmBA,EAAO,SAAS,2BAA2B,EAC9D,iBAAkBA,EAAO,SAAS,2BAA2B,EAC7D,kBAAmBA,EAAO,SAAS,+BAA+B,EAClE,aAAc,0BACf,CAAA,EAGG,GAAAqE,EAAe,SAAW,SAC7B,OAGDT,GAAiB,KAAK,oBAAqB,CAAE,IAAKS,EAAe,MAAO,OAC7D,CAAC,CACb,KACD,CACA,KAAKnC,EAAsB,iBAAkB,EAC5ClH,EAAAgG,EAAc,QAAd,MAAAhG,EAAqB,QACrB,KACD,CACA,KAAKkH,EAAsB,KAAM,CAChChD,EAAY,aAAa,EACrB,GAAA,CACH,MAAMyD,GAAkB,EAElB,MAAA2B,EAAS,MAAMhF,EAAmB,sBAExCG,EAAQ,kBAAkB,CACzB,KAAM8E,GACN,KAAM,CAAE,SAAUrD,GAA4B,OAAAoD,CAAO,CAAA,CACrD,QACOE,EAAO,CAEf,OAAQA,EAAM,QAAS,CACtB,IAAK,+BACElE,EAAA,UACL,CAAE,GAAGkE,EAAO,QAAS,EAAG,EACxBxE,EAAO,SAAS,kDAAkD,EAClEA,EAAO,SAAS,oDAAoD,CAAA,EAErE,MACD,QACCM,EAAM,UAAUkE,EAAOxE,EAAO,SAAS,OAAO,CAAC,CACjD,CAAA,QACC,CACDd,EAAY,YAAY,CACzB,CAEA,KACD,CACA,KAAKgD,EAAsB,SAAU,CACpCzC,EAAQ,UAAUgF,EAA2B,EAC7C,KACD,CACA,KAAKvC,EAAsB,OAAQ,CAiBlC,GAhBwB,MAAM9B,GAAQ,QACrCJ,EAAO,SAAS,oDAAqD,CACpE,YAAa,CAAE,aAAcpB,EAAM,SAAS,IAAK,CAAA,CACjD,EACDoB,EAAO,SAAS,oDAAoD,EACpE,CACC,KAAM,UACN,kBAAmBA,EAAO,SACzB,6DACD,EACA,iBAAkBA,EAAO,SACxB,4DACD,CACD,CAAA,IAGuB0E,GACvB,OAGG,GAAA,CACH,MAAMjH,EAAe,eAAemB,EAAM,SAAS,EAAE,QAC7C4F,EAAO,CACflE,EAAM,UAAUkE,EAAOxE,EAAO,SAAS,6BAA6B,CAAC,EACrE,MACD,CACAP,EAAQ,aAAe,GAEvBe,GAAY,WAAW,EACvBF,EAAM,YAAY,CACjB,MAAON,EAAO,SAAS,6CAA6C,EACpE,KAAM,SAAA,CACN,EAED,MAAMJ,EAAO,KAAK,CAAE,KAAMiC,EAAM,UAAW,EAC3C,KACD,CAGD,CACD,CAEA,SAAS8C,IAAc,CACjBlF,EAAQ,YAAY,mBAAoB,0BAA0B,CACxE,CAEA,SAASoD,GAA+BH,EAAa,CAChD,GAAA,CAACA,GAAM,CAAC,MAAOjB,CAA6B,EAAE,SAASiB,CAAE,EAAG,CAC3D,IAAAkC,EAAa5E,EAAO,SAAS,uCAAuC,EACpE6E,EAAY7E,EAAO,SAAS,sCAAsC,EAClEN,EAAc,iBACJkF,EAAA5E,EAAO,SAAS,uCAAwC,CACpE,YAAa,CAAE,YAAaN,EAAc,eAAe,MAAQ,EAAG,CAAA,CACpE,EAEWmF,EAAA7E,EAAO,SAAS,sCAAuC,CAClE,YAAa,CAAE,YAAaN,EAAc,eAAe,MAAQ,EAAG,CAAA,CACpE,GAGFY,EAAM,YAAY,CACjB,MAAOsE,EACP,QAASC,EACT,KAAM,SAAA,CACN,CACF,CACD,utHC1gBA,MAAMC,EAAOC,EAEJ,SAAAC,EAAmBC,EAAaC,EAAyB,CAC5DJ,EAAA,oBAAqBG,EAAKC,CAAK,CACrC,gWCGAC,GAAejO,EAAgB,CAC9B,KAAM,aACN,WAAY,CACX,gBAAAkO,GACA,OAAAC,EACD,EACA,OAAQ,CACP,MAAMzF,EAASC,KAGR,MAAA,CACN,eAHsByF,GAAkB,CAAE,OAAA1F,CAAQ,CAAA,CAGlD,CAEF,EACA,MAAO,CACC,MAAA,CACN,gBAAiB2F,EAAiB,SAClC,mBAAoB,GACpB,oBAAqB,GACrB,WAAY,EAAA,CAEd,EACA,SAAU,CACT,GAAG7M,GACF8M,GACAtI,GACAqC,GACA7B,GACA+H,EACD,EACA,aAA6B,CACrB,MAAA,CACN,CAAE,MAAOF,EAAiB,SAAU,MAAO,KAAK,QAAQ,SAAS,gBAAgB,CAAE,EACnF,CAAE,MAAOA,EAAiB,WAAY,MAAO,KAAK,QAAQ,SAAS,oBAAoB,CAAE,CAAA,CAE3F,EACA,YAA6B,CAC5B,OAAO,KAAK,SAAS,UACtB,EACA,aAAuB,CACtB,MAAO,GAAQ,KAAK,YAAc,KAAK,WAAW,OAASG,GAC5D,EACA,UAAwB,CACvB,OAAO,KAAK,eAAe,QAC5B,EACA,iBAA0B,CACzB,OAAO,OAAO,KAAK,OAAO,OAAO,MAAQ,KAAK,eAAe,UAAU,CACxE,EACA,gBAA0B,CAClB,MAAA,CAAC,EAAE,KAAK,OAAO,KAAK,UAAY,KAAK,OAAO,KAAK,kBACzD,EACA,UAAoB,CACZ,OAAA,KAAK,mBAAmB,YAAY,cAC5C,CACD,EACA,MAAO,CACN,OAAOC,EAAIC,EAAM,CACX,KAAA,kBAAkBD,EAAIC,CAAI,CAChC,CACD,EACA,aAAc,CACb,KAAK,eAAe,YACrB,EACA,SAAU,CACJ,KAAA,WAAa,KAAK,QAAQ,aAC1B,KAAA,kBAAkB,KAAK,MAAM,CACnC,EACA,eAAgB,CACf,KAAK,eAAe,WACrB,EACA,QAAS,CACR,kBAAkBD,EAAmBC,EAA4B,CAE/DD,EAAG,OAAS9D,EAAM,gBAClB8D,EAAG,OAAS9D,EAAM,qBAClB8D,EAAG,OAAS9D,EAAM,kBAElB,KAAK,gBAAkB0D,EAAiB,YAExCI,EAAG,OAAS9D,EAAM,UAClB8D,EAAG,OAAS9D,EAAM,cAClB8D,EAAG,OAAS9D,EAAM,mBAElB,KAAK,gBAAkB0D,EAAiB,UAGrCI,EAAG,OAAO,OAAS,OAAS,OAAOA,EAAG,OAAO,MAAS,WACpD,KAAA,mBAAqBA,EAAG,OAAO,OAIpCC,GAAA,YAAAA,EAAM,QAAS/D,EAAM,mBACrB8D,EAAG,OAAO,OAASC,EAAK,OAAO,MAC/B,OAAOA,EAAK,OAAO,aAAgB,WAE9B,KAAA,oBAAsBA,EAAK,OAAO,YAEzC,EACA,cAAcX,EAAuBC,EAAmB,CACjD,MAAAW,EAAeX,EAAM,SAAWA,EAAM,QAE5C,OAAQD,EAAK,CACZ,KAAKM,EAAiB,SAChB,KAAK,uBAAuBM,CAAY,EAC7C,MAED,KAAKN,EAAiB,WAChB,KAAK,yBAAyBM,CAAY,EAC/C,KAIF,CACD,EAEA,MAAM,uBAAuBA,EAAuB,CAC/C,IAAAC,EAUJ,GATK,CAAC,GAAI,MAAOrE,CAA6B,EAAE,SAAS,KAAK,kBAAkB,EAM3DqE,EAAA,CAAE,KAAMjE,EAAM,YAAa,EAL3BiE,EAAA,CACnB,KAAMjE,EAAM,SACZ,OAAQ,CAAE,KAAM,KAAK,kBAAmB,CAAA,EAMtCgE,EAAc,CACjB,KAAM,CAAE,KAAAE,CAAK,EAAI,KAAK,QAAQ,QAAQD,CAAiB,EAChD,OAAA,KAAKC,EAAM,QAAQ,CAChB,MAAA,KAAK,OAAO,OAASD,EAAkB,OAC7C,KAAK,OAAO,OAASjE,EAAM,eACzB,KAAA,QAAQ,aAAe,KAAK,YAElC,KAAK,gBAAkB0D,EAAiB,SAClC,MAAA,KAAK,QAAQ,KAAKO,CAAiB,EAE3C,EAEA,MAAM,yBAAyBD,EAAuB,OACrD,MAAMG,EACL,KAAK,kBAAoBvE,EAAgC,MAAQ,KAAK,gBACjEwE,IACLjL,EAAA,KAAK,gBAAgB,kBAArB,YAAAA,EAAsC,KAAM,KAAK,oBAC5C8K,EAAsCG,EACzC,CACA,KAAMpE,EAAM,kBACZ,OAAQ,CAAE,KAAMmE,EAAiB,YAAaC,CAAoB,CAAA,EAElE,CACA,KAAMpE,EAAM,eACZ,OAAQ,CAAE,KAAMmE,CAAgB,CAAA,EAGnC,GAAIH,EAAc,CACjB,KAAM,CAAE,KAAAE,CAAK,EAAI,KAAK,QAAQ,QAAQD,CAAiB,EAChD,OAAA,KAAKC,EAAM,QAAQ,CAChB,MAAA,KAAK,OAAO,OAASD,EAAkB,OAC5C,KAAA,WAAa,KAAK,QAAQ,aAC/B,KAAK,mBAAqB,KAAK,gBAC/B,KAAK,gBAAkBP,EAAiB,WAClC,MAAA,KAAK,QAAQ,KAAKO,CAAiB,EAE3C,CACD,CACD,CAAC,sFAxMApM,EAYM,QAAA,SAXC/B,EAFR,EAAAC,EAAA,MAAA,KAAA,CAAAmC,EAAA,MAAA,CAGG,MAAAI,EAAA,CAAA,cAQM,GARN,SAQM,CAAA9C,EAAA,QAAA,qBAAA,CAAA,EAAA,CAP+E+D,GAAArB,EAAA,MAAAC,GAAA,EAAAgB,EAAA3D,EAJxF,WAIwF,MAAA2D,YAA1BrB,EAAAuM,EAAA,CAAG,IAAA,EAAA,SAAA7O,EAAA,SAJjE,YAAAA,EAAA,QAAA,EAMWsK,KAAAA,EAAAA,CAAAA,WAAc,iBADrB,GAKE,EAAA,EAAAtK,EAVN,oBAOwBsC,EAAAwM,EAAA,CAClB,IAAA,EACA,MAAA9O,EAAA,YAAA,cAAAA,EAAA,gBATN,sBAAAA,EAAA,aAAA,EAAA,KAAA,EAAA,CAAA,QAAA,cAAA,qBAAA,CAAA,GAAA+O,EAGiBC,GAAW,EAAA,CAAA,EAAA,GAAA,EAAA"}
@@ -1,2 +1,2 @@
1
- import{_ as L,b as Z}from"./n8n-B6cfQsVX.js";import{l as h,m as T,U as r,p as b,I as a,ag as m,G as R,e as x,O as i,S as E,T as _,u as n,R as $,r as j,aH as H,M as I,J as ee,n as q,b as te,F as se,a7 as oe,a9 as ae}from"./vendor-Dv5OeN6t.js";import{N as U,i as O,O as ne,Q as le,R as G,l as F,U as re,w as W,F as ie,X as ce,n as Y,u as K,r as z,C as ue,Y as de,Z as pe,o as me,V as M,_ as ge,d as be,G 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-DeNtBxiT.js";import{d as xe,m as Ee}from"./pinia-BAhPp3pQ.js";import{D}from"./luxon-CLwAIbs0.js";import"./axios-Mm4CS0gO.js";import"./esprima-next-nhoSXAeq.js";import"./lodash-es-BxV-E8rt.js";import"./flatted-DN8lQ2XG.js";import"./@vueuse/core-9E8Shwsg.js";import"./@n8n/permissions-BxxteU-C.js";import"./dateformat-B9ocXky7.js";import"./vue-i18n-Delvyc9x.js";import"./uuid-SoommWqA.js";import"./@n8n/codemirror-lang-sql-x14jMqbG.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-DcTmlMkf.js";import"./@n8n/codemirror-lang-Qkdx7NoQ.js";import"./fast-json-stable-stringify-LluJPcs3.js";import"./timeago.js-CiyKClrF.js";import"./qrcode.vue-BGkPba5A.js";import"./vue3-touch-events-mV0oX_Sl.js";import"./chart.js-343vZi4M.js";const $e="_notification_197jx_8",we={"gift-icon":"_gift-icon_197jx_1",notification:$e},Me={},Pe=b("div",null,null,-1),Ie=[Pe];function Ae(e,t){const u=m("font-awesome-icon");return h(),T("div",{class:a(e.$style["gift-icon"])},[r(u,{icon:"gift"}),b("div",{class:a(e.$style.notification)},Ie,2)],2)}const Ne={$style:we},Be=L(Me,[["render",Ae],["__cssModules",Ne]]),Ue=["value","max"],De=8,Le=R({__name:"ExecutionsUsage",props:{cloudPlanData:{}},setup(e){const t=e,u=D.utc(),d=x(()=>{const{days:o=0}=l().diff(u,["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 u.toMillis()>o.toMillis()}),l=()=>{var o;return D.fromISO(((o=t==null?void 0:t.cloudPlanData)==null?void 0:o.expirationDate)??"")},c=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=De*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)},[r(s,{size:"small",color:"danger"},{default:i(()=>[E(_(n(U).baseText("executionUsage.expired.text")),1)]),_:1})],2)):!p.value&&c.value?(h(),T("div",{key:1,class:a(o.$style.usageText)},[r(C,{tag:"span",keypath:"executionUsage.currentUsage"},{text:i(()=>[r(s,{size:"small",color:"text-dark"},{default:i(()=>[E(_(n(U).baseText("executionUsage.currentUsage.text")),1)]),_:1})]),count:i(()=>[r(s,{size:"small",bold:!0,color:"warning"},{default:i(()=>[E(_(n(U).baseText("executionUsage.currentUsage.count",{adjustToNumber:d.value||0})),1)]),_:1})]),_:1})],2)):c.value?$("",!0):(h(),T("div",{key:2,class:a(o.$style.usageText)},[r(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([c.value?o.$style.progressBarSuccess:o.$style.progressBarDanger,o.$style.progressBar]),value:k.value,max:w.value},null,10,Ue)],2),b("div",{class:a(o.$style.executionsCountSection)},[r(s,{size:"xsmall",color:c.value?"text-dark":"danger"},{default:i(()=>[E(_(y.value)+"/"+_(w.value),1)]),_:1},8,["color"]),r(s,{size:"xsmall",color:c.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)},[r(S,{label:n(U).baseText("executionUsage.button.upgrade"),size:"xmini",icon:"gem",type:"success",block:!0,onClick:P},null,8,["label"])],2)],2)}}}),je="_container_19ive_1",Re="_progressBarDiv_19ive_9",Oe="_progressBar_19ive_9",ze="_progressBarSuccess_19ive_38",We="_progressBarDanger_19ive_48",Ve="_usageText_19ive_57",He="_usageCounter_19ive_64",qe="_danger_19ive_73",Ge="_executionsCountSection_19ive_77",Fe="_upgradeButtonSection_19ive_81",Ye={container:je,progressBarDiv:Re,progressBar:Oe,progressBarSuccess:ze,progressBarDanger:We,usageText:Ve,usageCounter:He,danger:qe,executionsCountSection:Ge,upgradeButtonSection:Fe},Ke={$style:Ye},Je=L(Le,[["__cssModules",Ke]]);async function Qe(e){return await ne(e.baseUrl,"/cta/become-creator")}const Xe="N8N_BECOME_TEMPLATE_CREATOR_CTA_DISMISSED_AT",Ze=30,et=15*60*1e3,J=xe(le.BECOME_TEMPLATE_CREATOR,()=>{const e=G(),t=F(),u=re(Xe),d=j(!1),p=j(null),l=x(()=>u.value?!tt(u.value):!1),c=x(()=>d.value&&!e.userIsTrialing&&!l.value),y=()=>{u.value=D.now().toISO()},k=async()=>{const f=await Qe(t.getRestApiContext);d.value=f},w=async()=>{l.value||e.userIsTrialing||d.value||await k()};return{showBecomeCreatorCta:c,dismissCta:y,startMonitoringCta:()=>{p.value||(setTimeout(w,1e3),p.value=setInterval(w,et))},stopMonitoringCta:()=>{p.value&&(clearInterval(p.value),p.value=null)}}});function tt(e){return D.fromISO(e).plus({days:Ze})<=D.now()}const st=R({__name:"BecomeTemplateCreatorCta",setup(e){const t=W(),u=J(),d=ie(),p=()=>{d.track("User clicked become creator CTA")};return(l,c)=>{const y=m("n8n-icon"),k=m("n8n-button");return n(u).showBecomeCreatorCta?(h(),T("div",{key:0,class:a(l.$style.container),"data-test-id":"become-template-creator-cta"},[b("div",{class:a(l.$style.textAndCloseButton)},[b("p",{class:a(l.$style.text)},_(n(t).baseText("becomeCreator.text")),3),b("button",{class:a(l.$style.closeButton),"data-test-id":"close-become-template-creator-cta",onClick:c[0]||(c[0]=w=>n(u).dismissCta())},[r(y,{icon:"times",size:"xsmall",title:n(t).baseText("generic.close")},null,8,["title"])],2)],2),r(k,{class:a(l.$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)}}}),ot="_container_92ffs_1",at="_textAndCloseButton_92ffs_9",nt="_text_92ffs_9",lt="_closeButton_92ffs_22",rt="_becomeCreatorButton_92ffs_35",it={container:ot,textAndCloseButton:at,text:nt,closeButton:lt,becomeCreatorButton:rt},ct={$style:it},ut=L(st,[["__cssModules",ct]]),dt=R({__name:"MainSidebarSourceControl",props:{isCollapsed:{type:Boolean}},setup(e){const t={CONFLICT:409};H();const u=ce(),d=O(),p=Y(),l=K(),c=W(),y=Z(),k=j(300),w=x(()=>p.preferences.branchName),P=x(()=>p.isEnterpriseSourceControlEnabled&&z(["rbac"],{rbac:{scope:"sourceControl:manage"}}));async function o(){u.startLoading(),u.setLoadingText(c.baseText("settings.sourceControl.loading.checkingForChanges"));try{const s=await p.getAggregatedStatus();d.openModalWithData({name:ue,data:{eventBus:y,status:s}})}catch(s){l.showError(s,c.baseText("error"))}finally{u.stopLoading(),u.setLoadingText(c.baseText("genericHelpers.loading"))}}async function f(){u.startLoading(),u.setLoadingText(c.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)l.showMessage({title:c.baseText("settings.sourceControl.pull.upToDate.title"),message:c.baseText("settings.sourceControl.pull.upToDate.description"),type:"success"});else{l.showMessage({title:c.baseText("settings.sourceControl.pull.success.title"),type:"success"});const S=["variables","credential"];(s||[]).some(g=>S.includes(g.type))&&q(()=>{l.showMessage({message:c.baseText("settings.sourceControl.pull.oneLastStep.description"),title:c.baseText("settings.sourceControl.pull.oneLastStep.title"),type:"info",duration:0,showClose:!0,offset:0})})}de.emit("pull")}catch(s){const C=s.response;(C==null?void 0:C.status)===t.CONFLICT?d.openModalWithData({name:pe,data:{eventBus:y,status:C.data.data}}):l.showError(s,"Error")}finally{u.stopLoading(),u.setLoadingText(c.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)},[r(S,{icon:"code-branch"}),E(" "+_(w.value),1)],2),b("div",{class:a({"pt-xs":!s.isCollapsed})},[r(g,{disabled:!s.isCollapsed,"show-after":k.value,placement:"right"},{content:i(()=>[b("div",null,_(n(c).baseText("settings.sourceControl.button.pull")),1)]),default:i(()=>[r(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(c).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(c).baseText("settings.sourceControl.button.push")),1)]),default:i(()=>[r(A,{square:s.isCollapsed,label:s.isCollapsed?"":n(c).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)}}}),pt="_sync_15zv3_1",mt="_isConnected_15zv3_8",gt="_collapsed_15zv3_12",bt="_branchName_15zv3_22",ht="_connected_15zv3_32",_t={sync:pt,isConnected:mt,collapsed:gt,branchName:bt,connected:ht},ft={$style:_t},Ct=L(dt,[["__cssModules",ft]]),St={key:0,class:"mt-m mb-m"},vt={key:2,class:"mt-m mb-m"},yt=R({__name:"ProjectNavigation",props:{collapsed:{type:Boolean},planName:{}},setup(e){const t=e,u=H(),d=W(),p=K(),l=me(),c=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||!l.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 l.createProject({name:d.baseText("projects.settings.newProjectName")});await u.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(()=>l.myProjects.filter(g=>g.type==="team").toSorted((g,N)=>!g.name||!N.name?0:g.name>N.name?1:g.name<N.name?-1:0)),A=async()=>{await c.goToUpgrade("rbac","upgrade-rbac")};return te(async()=>{await q(),k.value=!0}),(g,N)=>{const v=m("N8nMenuItem"),B=m("ElMenu"),Q=m("i18n-t"),X=m("N8nTooltip");return h(),T("div",{class:a(g.$style.projects)},[r(B,{collapse:t.collapsed,class:"home"},{default:i(()=>[r(v,{item:w.value,compact:t.collapsed,"handle-select":f,"active-tab":n(l).projectNavActiveId,mode:"tabs","data-test-id":"project-home-menu-item"},null,8,["item","compact","active-tab"])]),_:1},8,["collapse"]),S.value.length||n(l).hasPermissionToCreateProjects&&n(l).teamProjectsAvailable?(h(),T("hr",St)):$("",!0),S.value.length?(h(),I(B,{key:1,collapse:t.collapsed,class:a(g.$style.projectItems)},{default:i(()=>[(h(!0),T(se,null,oe(S.value,V=>(h(),I(v,{key:V.id,item:o(V),compact:t.collapsed,"handle-select":s,"active-tab":n(l).projectNavActiveId,mode:"tabs","data-test-id":"project-menu-item"},null,8,["item","compact","active-tab"]))),128))]),_:1},8,["collapse","class"])):$("",!0),r(X,{placement:"right",disabled:n(l).canCreateProjects},{content:i(()=>[r(Q,{keypath:"projects.create.limitReached"},{planName:i(()=>[E(_(t.planName),1)]),limit:i(()=>[E(_(n(d).baseText("projects.create.limit",{adjustToNumber:n(l).teamProjectsLimit,interpolate:{num:String(n(l).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(l).hasPermissionToCreateProjects&&n(l).teamProjectsAvailable?(h(),I(B,{key:0,collapse:t.collapsed,class:"pl-xs pr-xs"},{default:i(()=>[r(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(l).hasPermissionToCreateProjects&&n(l).teamProjectsAvailable?(h(),T("hr",vt)):$("",!0)],2)}}}),Tt="_projects_7ap69_1",kt="_projectItems_7ap69_9",xt="_upgradeLink_7ap69_15",Et={projects:Tt,projectItems:kt,upgradeLink:xt},$t={$style:Et},wt=L(yt,[["__cssModules",$t],["__scopeId","data-v-cc7001f7"]]),Mt=R({name:"MainSidebar",components:{GiftNotificationIcon:Be,ExecutionsUsage:Je,MainSidebarSourceControl:Ct,BecomeTemplateCreatorCta:ut,ProjectNavigation:wt},mixins:[ge],setup(){const e=ke(),{callDebounced:t}=be();return{externalHooks:e,callDebounced:t,...he()}},data(){return{basePath:"",fullyExpanded:!1}},computed:{...Ee(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(),u=[{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:"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,...u]},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 u;const e=(u=this.$router.getRoutes().find(d=>d.path==="/settings"))==null?void 0:u.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)}}}),Pt="_sideMenu_1qnza_1",It="_logo_1qnza_8",At="_sideMenuCollapsed_1qnza_19",Nt="_sideMenuCollapseButton_1qnza_26",Bt="_updates_1qnza_45",Ut="_expanded_1qnza_58",Dt="_userArea_1qnza_65",Lt="_userName_1qnza_72",jt="_userActions_1qnza_86",Rt={sideMenu:Pt,logo:It,sideMenuCollapsed:At,sideMenuCollapseButton:Nt,updates:Bt,expanded:Ut,userArea:Dt,userName:Lt,userActions:jt},Ot=["src"],zt={class:"ml-3xs","data-test-id":"main-sidebar-user-menu"};function Wt(e,t,u,d,p,l){const c=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"),N=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(c,{key:0,icon:"chevron-right",size:"xsmall",class:"ml-5xs"})):(h(),I(c,{key:1,icon:"chevron-left",size:"xsmall",class:"mr-5xs"}))],2),r(N,{items:e.mainMenuItems,collapsed:e.isCollapsed,onSelect:e.handleSelect},ae({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,Ot)],2),r(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)},[r(P)],2),r(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),r(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",zt,[r(A,{disabled:!e.isCollapsed,placement:"right-end",trigger:"click",onCommand:e.onUserActionToggle},{dropdown:i(()=>[r(S,null,{default:i(()=>[r(C,{command:"settings"},{default:i(()=>[E(_(e.$locale.baseText("settings")),1)]),_:1}),r(C,{command:"logout"},{default:i(()=>[E(_(e.$locale.baseText("auth.signout")),1)]),_:1})]),_:1})]),default:i(()=>{var v,B;return[b("div",{class:a({[e.$style.avatar]:!0,clickable:e.isCollapsed})},[r(s,{"first-name":(v=e.usersStore.currentUser)==null?void 0:v.firstName,"last-name":(B=e.usersStore.currentUser)==null?void 0:B.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})},[r(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})},[r(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 Vt={$style:Rt},Cs=L(Mt,[["render",Wt],["__cssModules",Vt]]);export{Cs as default};
2
- //# sourceMappingURL=MainSidebar-D0hPq1hI.js.map
1
+ import{_ as L,b as Z}from"./n8n-B6cfQsVX.js";import{l as h,m as T,U as r,p as b,I as a,ag as m,G as R,e as x,O as i,S as E,T as _,u as n,R as $,r as j,aH as H,M as I,J as ee,n as q,b as te,F as se,a7 as oe,a9 as ae}from"./vendor-Dv5OeN6t.js";import{N as U,i as O,O as ne,Q as le,R as G,l as F,U as re,w as W,F as ie,X as ce,n as Y,u as K,r as z,C as ue,Y as de,Z as pe,o as me,V as M,_ as ge,d as be,G 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-DEwaaDne.js";import{d as xe,m as Ee}from"./pinia-BAhPp3pQ.js";import{D}from"./luxon-CLwAIbs0.js";import"./axios-Mm4CS0gO.js";import"./esprima-next-nhoSXAeq.js";import"./lodash-es-BxV-E8rt.js";import"./flatted-DN8lQ2XG.js";import"./@vueuse/core-9E8Shwsg.js";import"./@n8n/permissions-BxxteU-C.js";import"./dateformat-B9ocXky7.js";import"./vue-i18n-Delvyc9x.js";import"./uuid-SoommWqA.js";import"./@n8n/codemirror-lang-sql-x14jMqbG.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-DcTmlMkf.js";import"./@n8n/codemirror-lang-Qkdx7NoQ.js";import"./fast-json-stable-stringify-LluJPcs3.js";import"./timeago.js-CiyKClrF.js";import"./qrcode.vue-BGkPba5A.js";import"./vue3-touch-events-mV0oX_Sl.js";import"./chart.js-343vZi4M.js";const $e="_notification_197jx_8",we={"gift-icon":"_gift-icon_197jx_1",notification:$e},Me={},Pe=b("div",null,null,-1),Ie=[Pe];function Ae(e,t){const u=m("font-awesome-icon");return h(),T("div",{class:a(e.$style["gift-icon"])},[r(u,{icon:"gift"}),b("div",{class:a(e.$style.notification)},Ie,2)],2)}const Ne={$style:we},Be=L(Me,[["render",Ae],["__cssModules",Ne]]),Ue=["value","max"],De=8,Le=R({__name:"ExecutionsUsage",props:{cloudPlanData:{}},setup(e){const t=e,u=D.utc(),d=x(()=>{const{days:o=0}=l().diff(u,["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 u.toMillis()>o.toMillis()}),l=()=>{var o;return D.fromISO(((o=t==null?void 0:t.cloudPlanData)==null?void 0:o.expirationDate)??"")},c=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=De*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)},[r(s,{size:"small",color:"danger"},{default:i(()=>[E(_(n(U).baseText("executionUsage.expired.text")),1)]),_:1})],2)):!p.value&&c.value?(h(),T("div",{key:1,class:a(o.$style.usageText)},[r(C,{tag:"span",keypath:"executionUsage.currentUsage"},{text:i(()=>[r(s,{size:"small",color:"text-dark"},{default:i(()=>[E(_(n(U).baseText("executionUsage.currentUsage.text")),1)]),_:1})]),count:i(()=>[r(s,{size:"small",bold:!0,color:"warning"},{default:i(()=>[E(_(n(U).baseText("executionUsage.currentUsage.count",{adjustToNumber:d.value||0})),1)]),_:1})]),_:1})],2)):c.value?$("",!0):(h(),T("div",{key:2,class:a(o.$style.usageText)},[r(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([c.value?o.$style.progressBarSuccess:o.$style.progressBarDanger,o.$style.progressBar]),value:k.value,max:w.value},null,10,Ue)],2),b("div",{class:a(o.$style.executionsCountSection)},[r(s,{size:"xsmall",color:c.value?"text-dark":"danger"},{default:i(()=>[E(_(y.value)+"/"+_(w.value),1)]),_:1},8,["color"]),r(s,{size:"xsmall",color:c.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)},[r(S,{label:n(U).baseText("executionUsage.button.upgrade"),size:"xmini",icon:"gem",type:"success",block:!0,onClick:P},null,8,["label"])],2)],2)}}}),je="_container_19ive_1",Re="_progressBarDiv_19ive_9",Oe="_progressBar_19ive_9",ze="_progressBarSuccess_19ive_38",We="_progressBarDanger_19ive_48",Ve="_usageText_19ive_57",He="_usageCounter_19ive_64",qe="_danger_19ive_73",Ge="_executionsCountSection_19ive_77",Fe="_upgradeButtonSection_19ive_81",Ye={container:je,progressBarDiv:Re,progressBar:Oe,progressBarSuccess:ze,progressBarDanger:We,usageText:Ve,usageCounter:He,danger:qe,executionsCountSection:Ge,upgradeButtonSection:Fe},Ke={$style:Ye},Je=L(Le,[["__cssModules",Ke]]);async function Qe(e){return await ne(e.baseUrl,"/cta/become-creator")}const Xe="N8N_BECOME_TEMPLATE_CREATOR_CTA_DISMISSED_AT",Ze=30,et=15*60*1e3,J=xe(le.BECOME_TEMPLATE_CREATOR,()=>{const e=G(),t=F(),u=re(Xe),d=j(!1),p=j(null),l=x(()=>u.value?!tt(u.value):!1),c=x(()=>d.value&&!e.userIsTrialing&&!l.value),y=()=>{u.value=D.now().toISO()},k=async()=>{const f=await Qe(t.getRestApiContext);d.value=f},w=async()=>{l.value||e.userIsTrialing||d.value||await k()};return{showBecomeCreatorCta:c,dismissCta:y,startMonitoringCta:()=>{p.value||(setTimeout(w,1e3),p.value=setInterval(w,et))},stopMonitoringCta:()=>{p.value&&(clearInterval(p.value),p.value=null)}}});function tt(e){return D.fromISO(e).plus({days:Ze})<=D.now()}const st=R({__name:"BecomeTemplateCreatorCta",setup(e){const t=W(),u=J(),d=ie(),p=()=>{d.track("User clicked become creator CTA")};return(l,c)=>{const y=m("n8n-icon"),k=m("n8n-button");return n(u).showBecomeCreatorCta?(h(),T("div",{key:0,class:a(l.$style.container),"data-test-id":"become-template-creator-cta"},[b("div",{class:a(l.$style.textAndCloseButton)},[b("p",{class:a(l.$style.text)},_(n(t).baseText("becomeCreator.text")),3),b("button",{class:a(l.$style.closeButton),"data-test-id":"close-become-template-creator-cta",onClick:c[0]||(c[0]=w=>n(u).dismissCta())},[r(y,{icon:"times",size:"xsmall",title:n(t).baseText("generic.close")},null,8,["title"])],2)],2),r(k,{class:a(l.$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)}}}),ot="_container_92ffs_1",at="_textAndCloseButton_92ffs_9",nt="_text_92ffs_9",lt="_closeButton_92ffs_22",rt="_becomeCreatorButton_92ffs_35",it={container:ot,textAndCloseButton:at,text:nt,closeButton:lt,becomeCreatorButton:rt},ct={$style:it},ut=L(st,[["__cssModules",ct]]),dt=R({__name:"MainSidebarSourceControl",props:{isCollapsed:{type:Boolean}},setup(e){const t={CONFLICT:409};H();const u=ce(),d=O(),p=Y(),l=K(),c=W(),y=Z(),k=j(300),w=x(()=>p.preferences.branchName),P=x(()=>p.isEnterpriseSourceControlEnabled&&z(["rbac"],{rbac:{scope:"sourceControl:manage"}}));async function o(){u.startLoading(),u.setLoadingText(c.baseText("settings.sourceControl.loading.checkingForChanges"));try{const s=await p.getAggregatedStatus();d.openModalWithData({name:ue,data:{eventBus:y,status:s}})}catch(s){l.showError(s,c.baseText("error"))}finally{u.stopLoading(),u.setLoadingText(c.baseText("genericHelpers.loading"))}}async function f(){u.startLoading(),u.setLoadingText(c.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)l.showMessage({title:c.baseText("settings.sourceControl.pull.upToDate.title"),message:c.baseText("settings.sourceControl.pull.upToDate.description"),type:"success"});else{l.showMessage({title:c.baseText("settings.sourceControl.pull.success.title"),type:"success"});const S=["variables","credential"];(s||[]).some(g=>S.includes(g.type))&&q(()=>{l.showMessage({message:c.baseText("settings.sourceControl.pull.oneLastStep.description"),title:c.baseText("settings.sourceControl.pull.oneLastStep.title"),type:"info",duration:0,showClose:!0,offset:0})})}de.emit("pull")}catch(s){const C=s.response;(C==null?void 0:C.status)===t.CONFLICT?d.openModalWithData({name:pe,data:{eventBus:y,status:C.data.data}}):l.showError(s,"Error")}finally{u.stopLoading(),u.setLoadingText(c.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)},[r(S,{icon:"code-branch"}),E(" "+_(w.value),1)],2),b("div",{class:a({"pt-xs":!s.isCollapsed})},[r(g,{disabled:!s.isCollapsed,"show-after":k.value,placement:"right"},{content:i(()=>[b("div",null,_(n(c).baseText("settings.sourceControl.button.pull")),1)]),default:i(()=>[r(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(c).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(c).baseText("settings.sourceControl.button.push")),1)]),default:i(()=>[r(A,{square:s.isCollapsed,label:s.isCollapsed?"":n(c).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)}}}),pt="_sync_15zv3_1",mt="_isConnected_15zv3_8",gt="_collapsed_15zv3_12",bt="_branchName_15zv3_22",ht="_connected_15zv3_32",_t={sync:pt,isConnected:mt,collapsed:gt,branchName:bt,connected:ht},ft={$style:_t},Ct=L(dt,[["__cssModules",ft]]),St={key:0,class:"mt-m mb-m"},vt={key:2,class:"mt-m mb-m"},yt=R({__name:"ProjectNavigation",props:{collapsed:{type:Boolean},planName:{}},setup(e){const t=e,u=H(),d=W(),p=K(),l=me(),c=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||!l.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 l.createProject({name:d.baseText("projects.settings.newProjectName")});await u.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(()=>l.myProjects.filter(g=>g.type==="team").toSorted((g,N)=>!g.name||!N.name?0:g.name>N.name?1:g.name<N.name?-1:0)),A=async()=>{await c.goToUpgrade("rbac","upgrade-rbac")};return te(async()=>{await q(),k.value=!0}),(g,N)=>{const v=m("N8nMenuItem"),B=m("ElMenu"),Q=m("i18n-t"),X=m("N8nTooltip");return h(),T("div",{class:a(g.$style.projects)},[r(B,{collapse:t.collapsed,class:"home"},{default:i(()=>[r(v,{item:w.value,compact:t.collapsed,"handle-select":f,"active-tab":n(l).projectNavActiveId,mode:"tabs","data-test-id":"project-home-menu-item"},null,8,["item","compact","active-tab"])]),_:1},8,["collapse"]),S.value.length||n(l).hasPermissionToCreateProjects&&n(l).teamProjectsAvailable?(h(),T("hr",St)):$("",!0),S.value.length?(h(),I(B,{key:1,collapse:t.collapsed,class:a(g.$style.projectItems)},{default:i(()=>[(h(!0),T(se,null,oe(S.value,V=>(h(),I(v,{key:V.id,item:o(V),compact:t.collapsed,"handle-select":s,"active-tab":n(l).projectNavActiveId,mode:"tabs","data-test-id":"project-menu-item"},null,8,["item","compact","active-tab"]))),128))]),_:1},8,["collapse","class"])):$("",!0),r(X,{placement:"right",disabled:n(l).canCreateProjects},{content:i(()=>[r(Q,{keypath:"projects.create.limitReached"},{planName:i(()=>[E(_(t.planName),1)]),limit:i(()=>[E(_(n(d).baseText("projects.create.limit",{adjustToNumber:n(l).teamProjectsLimit,interpolate:{num:String(n(l).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(l).hasPermissionToCreateProjects&&n(l).teamProjectsAvailable?(h(),I(B,{key:0,collapse:t.collapsed,class:"pl-xs pr-xs"},{default:i(()=>[r(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(l).hasPermissionToCreateProjects&&n(l).teamProjectsAvailable?(h(),T("hr",vt)):$("",!0)],2)}}}),Tt="_projects_7ap69_1",kt="_projectItems_7ap69_9",xt="_upgradeLink_7ap69_15",Et={projects:Tt,projectItems:kt,upgradeLink:xt},$t={$style:Et},wt=L(yt,[["__cssModules",$t],["__scopeId","data-v-cc7001f7"]]),Mt=R({name:"MainSidebar",components:{GiftNotificationIcon:Be,ExecutionsUsage:Je,MainSidebarSourceControl:Ct,BecomeTemplateCreatorCta:ut,ProjectNavigation:wt},mixins:[ge],setup(){const e=ke(),{callDebounced:t}=be();return{externalHooks:e,callDebounced:t,...he()}},data(){return{basePath:"",fullyExpanded:!1}},computed:{...Ee(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(),u=[{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:"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,...u]},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 u;const e=(u=this.$router.getRoutes().find(d=>d.path==="/settings"))==null?void 0:u.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)}}}),Pt="_sideMenu_1qnza_1",It="_logo_1qnza_8",At="_sideMenuCollapsed_1qnza_19",Nt="_sideMenuCollapseButton_1qnza_26",Bt="_updates_1qnza_45",Ut="_expanded_1qnza_58",Dt="_userArea_1qnza_65",Lt="_userName_1qnza_72",jt="_userActions_1qnza_86",Rt={sideMenu:Pt,logo:It,sideMenuCollapsed:At,sideMenuCollapseButton:Nt,updates:Bt,expanded:Ut,userArea:Dt,userName:Lt,userActions:jt},Ot=["src"],zt={class:"ml-3xs","data-test-id":"main-sidebar-user-menu"};function Wt(e,t,u,d,p,l){const c=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"),N=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(c,{key:0,icon:"chevron-right",size:"xsmall",class:"ml-5xs"})):(h(),I(c,{key:1,icon:"chevron-left",size:"xsmall",class:"mr-5xs"}))],2),r(N,{items:e.mainMenuItems,collapsed:e.isCollapsed,onSelect:e.handleSelect},ae({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,Ot)],2),r(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)},[r(P)],2),r(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),r(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",zt,[r(A,{disabled:!e.isCollapsed,placement:"right-end",trigger:"click",onCommand:e.onUserActionToggle},{dropdown:i(()=>[r(S,null,{default:i(()=>[r(C,{command:"settings"},{default:i(()=>[E(_(e.$locale.baseText("settings")),1)]),_:1}),r(C,{command:"logout"},{default:i(()=>[E(_(e.$locale.baseText("auth.signout")),1)]),_:1})]),_:1})]),default:i(()=>{var v,B;return[b("div",{class:a({[e.$style.avatar]:!0,clickable:e.isCollapsed})},[r(s,{"first-name":(v=e.usersStore.currentUser)==null?void 0:v.firstName,"last-name":(B=e.usersStore.currentUser)==null?void 0:B.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})},[r(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})},[r(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 Vt={$style:Rt},Cs=L(Mt,[["render",Wt],["__cssModules",Vt]]);export{Cs as default};
2
+ //# sourceMappingURL=MainSidebar-CAwsaKp9.js.map